Optimization in GetHabitatInfo command
diff --git a/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/admin/GetHabitatInfo.java b/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/admin/GetHabitatInfo.java index 3e4415d..6f69959 100644 --- a/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/admin/GetHabitatInfo.java +++ b/nucleus/core/kernel/src/main/java/com/sun/enterprise/v3/admin/GetHabitatInfo.java
@@ -1,4 +1,5 @@ /* + * Copyright (c) 2022 Contributors to the Eclipse Foundation * Copyright (c) 2008, 2020 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the @@ -16,8 +17,17 @@ package com.sun.enterprise.v3.admin; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; +import com.sun.enterprise.config.serverbeans.Domain; +import com.sun.enterprise.config.serverbeans.customvalidators.JavaClassName; +import com.sun.enterprise.module.ModulesRegistry; +import com.sun.enterprise.universal.collections.ManifestUtils; +import com.sun.enterprise.v3.common.PropsFileActionReporter; + +import jakarta.inject.Inject; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.Payload; +import jakarta.validation.constraints.Pattern; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -27,18 +37,11 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; -import java.util.SortedSet; -import java.util.TreeSet; - -import jakarta.inject.Inject; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import jakarta.validation.Payload; -import jakarta.validation.constraints.Pattern; - +import java.util.concurrent.atomic.AtomicInteger; import org.glassfish.api.ActionReport; import org.glassfish.api.ActionReport.ExitCode; import org.glassfish.api.Param; +import org.glassfish.api.admin.AccessRequired; import org.glassfish.api.admin.AdminCommand; import org.glassfish.api.admin.AdminCommandContext; import org.glassfish.api.admin.RestEndpoint; @@ -50,12 +53,8 @@ import org.glassfish.hk2.utilities.BuilderHelper; import org.jvnet.hk2.annotations.Service; -import com.sun.enterprise.config.serverbeans.Domain; -import com.sun.enterprise.config.serverbeans.customvalidators.JavaClassName; -import com.sun.enterprise.module.ModulesRegistry; -import com.sun.enterprise.universal.collections.ManifestUtils; -import com.sun.enterprise.v3.common.PropsFileActionReporter; -import org.glassfish.api.admin.AccessRequired; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Dumps a sorted list of all registered Contract's in the Habitat @@ -86,7 +85,7 @@ @Param(primary = true, optional = true) String contract; - @Pattern(regexp="true|false") + @Pattern(regexp="true|false", message = "Valid values: true|false") @Param(optional = true) String started = "false"; @@ -97,8 +96,7 @@ dumpContracts(sb); dumpModules(sb); dumpTypes(sb); - } - else { + } else { dumpInhabitantsImplementingContractPattern(contract, sb); } @@ -114,29 +112,17 @@ } private void dumpContracts(StringBuilder sb) { - // Probably not very efficient but it is not a factor for this rarely-used - // user-called command... - sb.append("\n*********** Sorted List of all Registered Contracts in the Habitat **************\n"); List<ActiveDescriptor<?>> allDescriptors = serviceLocator.getDescriptors(BuilderHelper.allFilter()); - - SortedSet<String> allContracts = new TreeSet<String>(); - for (ActiveDescriptor<?> aDescriptor : allDescriptors) { - allContracts.addAll(aDescriptor.getAdvertisedContracts()); - } - - // now the contracts are sorted... - - Iterator<String> it = allContracts.iterator(); - for (int i = 1; it.hasNext(); i++) { - sb.append("Contract-" + i + ": " + it.next() + "\n"); - } + AtomicInteger counter = new AtomicInteger(0); + allDescriptors.stream().flatMap(desc -> desc.getAdvertisedContracts().stream()).sorted().forEach(contract -> sb + .append("Contract-").append(counter.incrementAndGet()).append(": ").append(contract).append('\n')); } private void dumpInhabitantsImplementingContractPattern(String pattern, StringBuilder sb) { sb.append("\n*********** List of all services for contract named like " + contract + " **************\n"); List<ActiveDescriptor<?>> allDescriptors = serviceLocator.getDescriptors(BuilderHelper.allFilter()); - HashSet<String> allContracts = new HashSet<String>(); + HashSet<String> allContracts = new HashSet<>(); for (ActiveDescriptor<?> aDescriptor : allDescriptors) { allContracts.addAll(aDescriptor.getAdvertisedContracts()); } @@ -144,17 +130,17 @@ Iterator<String> it = allContracts.iterator(); while (it.hasNext()) { String cn = it.next(); - if (cn.toLowerCase(Locale.ENGLISH).indexOf(pattern.toLowerCase(Locale.ENGLISH)) < 0) + if (cn.toLowerCase(Locale.ENGLISH).indexOf(pattern.toLowerCase(Locale.ENGLISH)) < 0) { continue; - sb.append("\n-----------------------------\n"); + } + sb.append("-----------------------------\n"); for ( ActiveDescriptor<?> descriptor : serviceLocator.getDescriptors(BuilderHelper.createContractFilter(cn))) { sb.append("Inhabitant-Metadata: " + descriptor.getMetadata()); sb.append("\n"); boolean isStarted = Boolean.parseBoolean(started); if (isStarted) { - ServiceHandle<?> handle = serviceLocator.getServiceHandle(descriptor); - - sb.append((handle.isActive() ? " started" : " not started")); + ServiceHandle<?> handle = serviceLocator.getServiceHandle(descriptor); + sb.append(handle.isActive() ? " started" : " not started"); } } } @@ -163,40 +149,20 @@ private void dumpTypes(StringBuilder sb) { sb.append("\n\n*********** Sorted List of all Types in the Habitat **************\n\n"); List<ActiveDescriptor<?>> allDescriptors = serviceLocator.getDescriptors(BuilderHelper.allFilter()); - HashSet<String> allTypes = new HashSet<String>(); - for (ActiveDescriptor<?> aDescriptor : allDescriptors) { - allTypes.add(aDescriptor.getImplementation()); - } - - Iterator<String> it = allTypes.iterator(); - - if (it == null) //PP (paranoid programmer) - return; - - SortedSet<String> types = new TreeSet<String>(); - - while (it.hasNext()) { - types.add(it.next()); - } - - // now the types are sorted... - - it = types.iterator(); - - for (int i = 1; it.hasNext(); i++) { - sb.append("Type-" + i + ": " + it.next() + "\n"); - } + AtomicInteger counter = new AtomicInteger(0); + allDescriptors.stream().map(ActiveDescriptor::getImplementation).sorted().forEach( + impl -> sb.append("Type-").append(counter.incrementAndGet()).append(": ").append(impl).append('\n')); } private void dumpModules(StringBuilder sb) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); modulesRegistry.dumpState(new PrintStream(baos)); sb.append("\n\n*********** List of all Registered Modules **************\n\n"); - sb.append(baos.toString()); + sb.append(baos); } - /* - * NOTE: this valdation is here just to test the AdminCommand validation - * implementation. + + /** + * NOTE: this valdation is here just to test the AdminCommand validation implementation. */ @Retention(RUNTIME) @Target({TYPE}) @@ -216,8 +182,9 @@ @Override public boolean isValid(final GetHabitatInfo bean, final ConstraintValidatorContext constraintValidatorContext) { - if (bean.contract.equals("test") && bean.started.equals("true")) + if ("test".equals(bean.contract) && "true".equals(bean.started)) { return false; + } return true; } }