diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java index 038cb2d37fb44124f2c7279268ab0424e88c9be9..5b2ddad1b97fb882183221f7122010781a55e1fe 100644 --- a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java +++ b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.felix.http.base.internal.console.HttpServicePlugin; import org.apache.felix.http.base.internal.context.ExtServletContext; import org.apache.felix.http.base.internal.handler.FilterHandler; import org.apache.felix.http.base.internal.handler.HttpServiceServletHandler; @@ -111,8 +110,6 @@ public final class WhiteboardManager private final List<ServiceTracker<?, ?>> trackers = new ArrayList<>(); - private final HttpServicePlugin plugin; - /** A map containing all servlet context registrations. Mapped by context name */ private final Map<String, List<WhiteboardContextHandler>> contextMap = new HashMap<>(); @@ -146,7 +143,6 @@ public final class WhiteboardManager this.httpServiceFactory = httpServiceFactory; this.registry = registry; this.serviceRuntime = new HttpServiceRuntimeImpl(registry, this, bundleContext); - this.plugin = new HttpServicePlugin(bundleContext, this.serviceRuntime); } /** @@ -241,8 +237,6 @@ public final class WhiteboardManager addTracker(new JavaxServletTracker(httpBundleContext, this)); addTracker(new JavaxListenersTracker(httpBundleContext, this)); addTracker(new JavaxPreprocessorTracker(httpBundleContext, this)); - - this.plugin.register(); } /** @@ -260,7 +254,6 @@ public final class WhiteboardManager */ public void stop() { - this.plugin.unregister(); for(final ServiceTracker<?, ?> t : this.trackers) { t.close(); diff --git a/http/inventoryprinter/pom.xml b/http/inventoryprinter/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d77967e4d1216dd0fcdee233679e8882bb1c2e85 --- /dev/null +++ b/http/inventoryprinter/pom.xml @@ -0,0 +1,81 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.http.parent</artifactId> + <version>13</version> + <relativePath>../parent/pom.xml</relativePath> + </parent> + + <name>Apache Felix Http Inventory Printer</name> + <artifactId>org.apache.felix.http.inventoryprinter</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>bundle</packaging> + + <scm> + <connection>scm:git:https://github.com/apache/felix-dev.git</connection> + <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection> + <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</url> + </scm> + + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <version>5.1.4</version> + <extensions>true</extensions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.annotation.bundle</artifactId> + <version>1.1.1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.servlet</artifactId> + <version>2.0.0-RC1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.inventory</artifactId> + <version>1.1.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>jakarta.json</groupId> + <artifactId>jakarta.json-api</artifactId> + <version>2.0.2</version> + <scope>provided</scope> + </dependency> + </dependencies> +</project> diff --git a/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/Activator.java b/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/Activator.java new file mode 100644 index 0000000000000000000000000000000000000000..0c2ab42d3fc081f30df5fc59b1969fd88139de34 --- /dev/null +++ b/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/Activator.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.felix.http.inventoryprinter.impl; + +import java.util.Dictionary; +import java.util.Hashtable; + +import org.apache.felix.inventory.Format; +import org.apache.felix.inventory.InventoryPrinter; +import org.osgi.annotation.bundle.Header; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.servlet.runtime.HttpServiceRuntime; +import org.osgi.service.servlet.whiteboard.annotations.RequireHttpWhiteboard; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; + +@Header(name = Constants.BUNDLE_ACTIVATOR, value = "${@class}") +@RequireHttpWhiteboard +public class Activator implements BundleActivator { + + private volatile ServiceTracker<HttpServiceRuntime, HttpServiceRuntime> tracker; + + private volatile ServiceRegistration<InventoryPrinter> serviceReg; + + private void register(final BundleContext context, final HttpServiceRuntime runtime) { + final HttpInventoryPrinter plugin = new HttpInventoryPrinter(context, runtime); + final Dictionary<String, Object> props = new Hashtable<>(); + props.put(InventoryPrinter.NAME, "httpservice"); + props.put(InventoryPrinter.TITLE, "HTTP Service"); + props.put(InventoryPrinter.FORMAT, new String[] {Format.JSON.toString(), Format.TEXT.toString()}); + this.serviceReg = context.registerService(InventoryPrinter.class, plugin, props); + } + + @Override + public void start(final BundleContext context) throws Exception { + final ServiceTracker<HttpServiceRuntime, HttpServiceRuntime> tracker = new ServiceTracker<>(context, HttpServiceRuntime.class, new ServiceTrackerCustomizer<HttpServiceRuntime,HttpServiceRuntime>() { + + @Override + public HttpServiceRuntime addingService(final ServiceReference<HttpServiceRuntime> reference) { + final HttpServiceRuntime runtime = context.getService(reference); + if ( runtime != null ) { + register(context, runtime); + } + return runtime; + } + + @Override + public void modifiedService(final ServiceReference<HttpServiceRuntime> reference, final HttpServiceRuntime service) { + // ignore + } + + @Override + public void removedService(final ServiceReference<HttpServiceRuntime> reference, final HttpServiceRuntime service) { + if ( serviceReg != null ) { + try { + serviceReg.unregister(); + } catch ( final IllegalStateException ignore) { + // ignore + } + serviceReg = null; + } + } + + }); + tracker.open(); + } + + @Override + public void stop(final BundleContext context) throws Exception { + if ( tracker != null ) { + tracker.close(); + tracker = null; + } + } +} diff --git a/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/HttpInventoryPrinter.java b/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/HttpInventoryPrinter.java new file mode 100644 index 0000000000000000000000000000000000000000..a17a500a0d5484de6568b92d597cb926b92dd39d --- /dev/null +++ b/http/inventoryprinter/src/main/java/org/apache/felix/http/inventoryprinter/impl/HttpInventoryPrinter.java @@ -0,0 +1,595 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.felix.http.inventoryprinter.impl; + +import java.io.PrintWriter; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.felix.inventory.Format; +import org.apache.felix.inventory.InventoryPrinter; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.servlet.runtime.HttpServiceRuntime; +import org.osgi.service.servlet.runtime.dto.DTOConstants; +import org.osgi.service.servlet.runtime.dto.ErrorPageDTO; +import org.osgi.service.servlet.runtime.dto.FailedErrorPageDTO; +import org.osgi.service.servlet.runtime.dto.FailedFilterDTO; +import org.osgi.service.servlet.runtime.dto.FailedListenerDTO; +import org.osgi.service.servlet.runtime.dto.FailedResourceDTO; +import org.osgi.service.servlet.runtime.dto.FailedServletContextDTO; +import org.osgi.service.servlet.runtime.dto.FailedServletDTO; +import org.osgi.service.servlet.runtime.dto.FilterDTO; +import org.osgi.service.servlet.runtime.dto.ListenerDTO; +import org.osgi.service.servlet.runtime.dto.ResourceDTO; +import org.osgi.service.servlet.runtime.dto.RuntimeDTO; +import org.osgi.service.servlet.runtime.dto.ServletContextDTO; +import org.osgi.service.servlet.runtime.dto.ServletDTO; + +import jakarta.json.Json; +import jakarta.json.stream.JsonGenerator; + +/** + * This is a web console plugin. + */ +public class HttpInventoryPrinter implements InventoryPrinter { + + private final BundleContext context; + + private final HttpServiceRuntime runtime; + + public HttpInventoryPrinter(final BundleContext context, final HttpServiceRuntime runtime) { + this.context = context; + this.runtime = runtime; + } + + @Override + public void print(final PrintWriter printWriter, final Format format, final boolean isZip) { + if ( format == Format.TEXT ) { + this.printConfiguration(printWriter); + } else if ( format == Format.JSON ) { + this.printConfigurationJSON(printWriter); + } + } + + private String getValueAsString(final Object value) { + if ( value.getClass().isArray() ) { + if (value instanceof long[]) { + return Arrays.toString((long[])value); + } else if (value instanceof int[]) { + return Arrays.toString((int[])value); + } else if (value instanceof double[]) { + return Arrays.toString((double[])value); + } else if (value instanceof byte[]) { + return Arrays.toString((byte[])value); + } else if (value instanceof float[]) { + return Arrays.toString((float[])value); + } else if (value instanceof short[]) { + return Arrays.toString((short[])value); + } else if (value instanceof boolean[]) { + return Arrays.toString((boolean[])value); + } else if (value instanceof char[]) { + return Arrays.toString((char[])value); + } else { + return Arrays.toString((Object[])value); + } + } + return value.toString(); + } + + private String getContextPath(final String path) { + if ( path.length() == 0 ) { + return "<root>"; + } + return path; + } + + private String getErrorText(final int reason) { + switch ( reason ) { + case DTOConstants.FAILURE_REASON_EXCEPTION_ON_INIT : return "Exception on init"; + case DTOConstants.FAILURE_REASON_NO_SERVLET_CONTEXT_MATCHING : return "No match"; + case DTOConstants.FAILURE_REASON_SERVICE_IN_USE : return "In use"; + case DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE : return "Not gettable"; + case DTOConstants.FAILURE_REASON_SERVLET_CONTEXT_FAILURE : return "Context failure"; + case DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE : return "Shadowed"; + case DTOConstants.FAILURE_REASON_VALIDATION_FAILED : return "Invalid"; + default: return "unknown (".concat(String.valueOf(reason)).concat(")"); + } + } + + private ServiceReference<?> getServiceReference(final long serviceId) { + if ( serviceId > 0 ) { + try { + final ServiceReference<?>[] ref = this.context.getServiceReferences((String)null, "(" + Constants.SERVICE_ID + "=" + String.valueOf(serviceId) + ")"); + if ( ref != null && ref.length > 0 ) { + return ref[0]; + } + } catch (final InvalidSyntaxException e) { + // ignore + } + } + return null; + } + private void printServiceIdAndRanking(final PrintWriter pw, final ServiceReference<?> ref, final long serviceId) { + pw.print("Service ID : "); + pw.println(String.valueOf(serviceId)); + int ranking = 0; + if ( ref != null ) { + final Object obj = ref.getProperty(Constants.SERVICE_RANKING); + if ( obj instanceof Integer) { + ranking = (Integer)obj; + } + } + pw.print("Ranking : "); + pw.println(String.valueOf(ranking)); + if ( ref != null ) { + pw.print("Bundle : "); + pw.print(ref.getBundle().getSymbolicName()); + pw.print(" <"); + pw.print(String.valueOf(ref.getBundle().getBundleId())); + pw.println(">"); + } + } + + private void printConfiguration(final PrintWriter pw) { + final RuntimeDTO dto = this.runtime.getRuntimeDTO(); + + pw.println("HTTP Service Details"); + pw.println("===================="); + pw.println(); + pw.println("Runtime Properties"); + pw.println("------------------"); + + for(final Map.Entry<String, Object> prop : dto.serviceDTO.properties.entrySet()) { + pw.print(prop.getKey()); + pw.print(" : "); + pw.println(getValueAsString(prop.getValue())); + } + pw.println(); + for(final ServletContextDTO ctxDto : dto.servletContextDTOs ) { + pw.print("Servlet Context "); + pw.println(ctxDto.name); + pw.println("-----------------------------------------------"); + + pw.print("Path : "); + pw.println(getContextPath(ctxDto.contextPath)); + printServiceIdAndRanking(pw, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); + pw.println(); + if ( ctxDto.servletDTOs.length > 0 ) { + pw.println("Servlets"); + for (final ServletDTO servlet : ctxDto.servletDTOs) { + pw.print("Patterns : "); + pw.println(getValueAsString(servlet.patterns)); + pw.print("Name : "); + pw.println(servlet.name); + pw.print("async : "); + pw.println(String.valueOf(servlet.asyncSupported)); + printServiceIdAndRanking(pw, this.getServiceReference(servlet.serviceId), servlet.serviceId); + pw.println(); + } + pw.println(); + } + + if ( ctxDto.filterDTOs.length > 0 ) { + pw.println("Filters"); + for (final FilterDTO filter : ctxDto.filterDTOs) { + final List<String> patterns = new ArrayList<>(); + patterns.addAll(Arrays.asList(filter.patterns)); + patterns.addAll(Arrays.asList(filter.regexs)); + for(final String name : filter.servletNames) { + patterns.add("Servlet : " + name); + } + Collections.sort(patterns); + + pw.print("Patterns : "); + pw.println(patterns); + pw.print("Name : "); + pw.println(filter.name); + pw.print("async : "); + pw.println(String.valueOf(filter.asyncSupported)); + pw.print("dispatcher : "); + pw.println(getValueAsString(filter.dispatcher)); + printServiceIdAndRanking(pw, this.getServiceReference(filter.serviceId), filter.serviceId); + pw.println(); + } + pw.println(); + } + if ( ctxDto.resourceDTOs.length > 0 ) { + pw.println("Resources"); + for (final ResourceDTO rsrc : ctxDto.resourceDTOs) { + pw.print("Patterns : "); + pw.println(getValueAsString(rsrc.patterns)); + pw.print("Prefix : "); + pw.println(rsrc.prefix); + printServiceIdAndRanking(pw, this.getServiceReference(rsrc.serviceId), rsrc.serviceId); + pw.println(); + } + pw.println(); + + } + if ( ctxDto.errorPageDTOs.length > 0 ) { + pw.println("Error Pages"); + for (final ErrorPageDTO ep : ctxDto.errorPageDTOs) { + final List<String> patterns = new ArrayList<>(); + for(final long p : ep.errorCodes) { + patterns.add(String.valueOf(p)); + } + for(final String p : ep.exceptions) { + patterns.add(p); + } + pw.print("Patterns : "); + pw.println(patterns); + pw.print("Name : "); + pw.println(ep.name); + pw.print("async : "); + pw.println(String.valueOf(ep.asyncSupported)); + printServiceIdAndRanking(pw, this.getServiceReference(ep.serviceId), ep.serviceId); + pw.println(); + } + pw.println(); + } + + if ( ctxDto.listenerDTOs.length > 0 ) { + pw.println("Listeners"); + for (final ListenerDTO ep : ctxDto.listenerDTOs) { + pw.print("Types : "); + pw.println(getValueAsString(ep.types)); + printServiceIdAndRanking(pw, this.getServiceReference(ep.serviceId), ep.serviceId); + pw.println(); + } + pw.println(); + } + pw.println(); + } + + if ( dto.failedServletContextDTOs.length > 0 ) { + for(final FailedServletContextDTO ctxDto : dto.failedServletContextDTOs ) { + pw.print("Failed Servlet Context "); + pw.println(ctxDto.name); + pw.println("-----------------------------------------------"); + + pw.print("Reason : "); + pw.println(getErrorText(ctxDto.failureReason)); + pw.print("Path : "); + pw.println(getContextPath(ctxDto.contextPath)); + printServiceIdAndRanking(pw, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); + pw.println(); + } + } + if ( dto.failedServletDTOs.length > 0 ) { + pw.println("Failed Servlets"); + for (final FailedServletDTO servlet : dto.failedServletDTOs) { + pw.print("Patterns : "); + pw.println(getValueAsString(servlet.patterns)); + pw.print("Reason : "); + pw.println(getErrorText(servlet.failureReason)); + pw.print("Name : "); + pw.println(servlet.name); + pw.print("async : "); + pw.println(String.valueOf(servlet.asyncSupported)); + printServiceIdAndRanking(pw, this.getServiceReference(servlet.serviceId), servlet.serviceId); + pw.println(); + } + pw.println(); + } + + if ( dto.failedFilterDTOs.length > 0 ) { + pw.println("Failed Filters"); + for (final FailedFilterDTO filter : dto.failedFilterDTOs) { + final List<String> patterns = new ArrayList<>(); + patterns.addAll(Arrays.asList(filter.patterns)); + patterns.addAll(Arrays.asList(filter.regexs)); + for(final String name : filter.servletNames) { + patterns.add("Servlet : " + name); + } + Collections.sort(patterns); + + pw.print("Patterns : "); + pw.println(patterns); + pw.print("Reason : "); + pw.println(getErrorText(filter.failureReason)); + pw.print("Name : "); + pw.println(filter.name); + pw.print("async : "); + pw.println(String.valueOf(filter.asyncSupported)); + pw.print("dispatcher : "); + pw.println(getValueAsString(filter.dispatcher)); + printServiceIdAndRanking(pw, this.getServiceReference(filter.serviceId), filter.serviceId); + pw.println(); + } + pw.println(); + } + if ( dto.failedResourceDTOs.length > 0 ) { + pw.println("Failed Resources"); + for (final FailedResourceDTO rsrc : dto.failedResourceDTOs) { + pw.print("Patterns : "); + pw.println(getValueAsString(rsrc.patterns)); + pw.print("Reason : "); + pw.println(getErrorText(rsrc.failureReason)); + pw.print("Prefix : "); + pw.println(rsrc.prefix); + printServiceIdAndRanking(pw, this.getServiceReference(rsrc.serviceId), rsrc.serviceId); + pw.println(); + } + pw.println(); + + } + if ( dto.failedErrorPageDTOs.length > 0 ) { + pw.println("Failed Error Pages"); + for (final FailedErrorPageDTO ep : dto.failedErrorPageDTOs) { + final List<String> patterns = new ArrayList<>(); + for(final long p : ep.errorCodes) { + patterns.add(String.valueOf(p)); + } + for(final String p : ep.exceptions) { + patterns.add(p); + } + pw.print("Patterns : "); + pw.println(patterns); + pw.print("Reason : "); + pw.println(getErrorText(ep.failureReason)); + pw.print("Name : "); + pw.println(ep.name); + pw.print("async : "); + pw.println(String.valueOf(ep.asyncSupported)); + printServiceIdAndRanking(pw, this.getServiceReference(ep.serviceId), ep.serviceId); + pw.println(); + } + pw.println(); + } + + if ( dto.failedListenerDTOs.length > 0 ) { + pw.println("Failed Listeners"); + for (final FailedListenerDTO ep : dto.failedListenerDTOs) { + pw.print("Types : "); + pw.println(getValueAsString(ep.types)); + pw.print("Reason : "); + pw.println(getErrorText(ep.failureReason)); + printServiceIdAndRanking(pw, this.getServiceReference(ep.serviceId), ep.serviceId); + pw.println(); + } + pw.println(); + } + pw.println(); + } + + private void writeServiceIdAndRanking(final JsonGenerator gen, final ServiceReference<?> ref, final long serviceId) { + gen.write("service.id", serviceId); + int ranking = 0; + if ( ref != null ) { + final Object obj = ref.getProperty(Constants.SERVICE_RANKING); + if ( obj instanceof Integer) { + ranking = (Integer)obj; + } + } + gen.write("service.ranking", ranking); + if ( ref != null ) { + gen.write("bundle.id", ref.getBundle().getBundleId()); + } + } + + private void writeValueAsStringOrStringArray(final JsonGenerator gen, final String name, final Object value) { + if ( value.getClass().isArray() ) { + gen.writeStartArray(name); + for(int i=0; i<Array.getLength(value); i++) { + final Object v = Array.get(value, i); + if (v instanceof Long) { + gen.write((long)v); + } else if (v instanceof Integer) { + gen.write((int)v); + } else if (v instanceof Double) { + gen.write((double)v); + } else if (v instanceof Byte) { + gen.write((byte)v); + } else if (v instanceof Float) { + gen.write((float)v); + } else if (v instanceof Short) { + gen.write((short)v); + } else if (v instanceof Boolean) { + gen.write((boolean)v); + } else if (v instanceof Character) { + gen.write((char)v); + } else { + gen.write(v.toString()); + } + } + gen.writeEnd(); + } else { + gen.write(name, value.toString()); + } + } + + private void writeRuntime(final JsonGenerator gen, final RuntimeDTO dto) { + gen.writeStartObject("runtime"); + gen.writeStartObject("properties"); + for(final Map.Entry<String, Object> prop : dto.serviceDTO.properties.entrySet()) { + writeValueAsStringOrStringArray(gen, prop.getKey(), prop.getValue()); + } + gen.writeEnd(); + gen.writeEnd(); + } + + private void writeContext(final JsonGenerator gen, final ServletContextDTO ctxDto) { + gen.writeStartObject(); + gen.write("name", ctxDto.name); + gen.write("path", ctxDto.contextPath); + + writeServiceIdAndRanking(gen, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); + + gen.writeStartArray("servlets"); + for (final ServletDTO servlet : ctxDto.servletDTOs) { + gen.writeStartObject(); + gen.write("name", servlet.name); + writeValueAsStringOrStringArray(gen, "patterns", servlet.patterns); + gen.write("asyncSupported", servlet.asyncSupported); + + writeServiceIdAndRanking(gen, this.getServiceReference(servlet.serviceId), servlet.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("filters"); + for (final FilterDTO filter : ctxDto.filterDTOs) { + gen.writeStartObject(); + gen.write("name", filter.name); + writeValueAsStringOrStringArray(gen, "patterns", filter.patterns); + writeValueAsStringOrStringArray(gen, "regexs", filter.regexs); + writeValueAsStringOrStringArray(gen, "servletNames", filter.servletNames); + gen.write("asyncSupported", filter.asyncSupported); + writeValueAsStringOrStringArray(gen, "dispatcher", filter.dispatcher); + writeServiceIdAndRanking(gen, this.getServiceReference(filter.serviceId), filter.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("resources"); + for (final ResourceDTO rsrc : ctxDto.resourceDTOs) { + gen.writeStartObject(); + writeValueAsStringOrStringArray(gen, "patterns", rsrc.patterns); + gen.write("prefix", rsrc.prefix); + writeServiceIdAndRanking(gen, this.getServiceReference(rsrc.serviceId), rsrc.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("errorPages"); + for (final ErrorPageDTO ep : ctxDto.errorPageDTOs) { + gen.writeStartObject(); + gen.write("name", ep.name); + writeValueAsStringOrStringArray(gen, "exceptions", ep.exceptions); + writeValueAsStringOrStringArray(gen, "errorCodes", ep.errorCodes); + gen.write("asyncSupported", ep.asyncSupported); + writeServiceIdAndRanking(gen, this.getServiceReference(ep.serviceId), ep.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("listeners"); + for (final ListenerDTO l : ctxDto.listenerDTOs) { + gen.writeStartObject(); + writeValueAsStringOrStringArray(gen, "types", l.types); + writeServiceIdAndRanking(gen, this.getServiceReference(l.serviceId), l.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + gen.writeEnd(); + } + + private void printConfigurationJSON(final PrintWriter pw) { + final RuntimeDTO dto = this.runtime.getRuntimeDTO(); + + try (final JsonGenerator gen = Json.createGenerator(pw)) { + gen.writeStartObject(); + + writeRuntime(gen, dto); + + gen.writeStartArray("contexts"); + for(final ServletContextDTO ctxDto : dto.servletContextDTOs ) { + writeContext(gen, ctxDto); + } + gen.writeEnd(); + + gen.writeStartArray("failedContexts"); + for(final FailedServletContextDTO ctxDto : dto.failedServletContextDTOs ) { + gen.writeStartObject(); + gen.write("name", ctxDto.name); + gen.write("path", ctxDto.contextPath); + gen.write("failureReason", ctxDto.failureReason); + gen.write("failureReasonText", getErrorText(ctxDto.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("failedServlets"); + for (final FailedServletDTO servlet : dto.failedServletDTOs) { + gen.writeStartObject(); + gen.write("name", servlet.name); + writeValueAsStringOrStringArray(gen, "patterns", servlet.patterns); + gen.write("asyncSupported", servlet.asyncSupported); + gen.write("failureReason", servlet.failureReason); + gen.write("failureReasonText", getErrorText(servlet.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(servlet.serviceId), servlet.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("failedFilters"); + for (final FailedFilterDTO filter : dto.failedFilterDTOs) { + gen.writeStartObject(); + gen.write("name", filter.name); + writeValueAsStringOrStringArray(gen, "patterns", filter.patterns); + writeValueAsStringOrStringArray(gen, "regexs", filter.regexs); + writeValueAsStringOrStringArray(gen, "servletNames", filter.servletNames); + gen.write("asyncSupported", filter.asyncSupported); + writeValueAsStringOrStringArray(gen, "dispatcher", filter.dispatcher); + gen.write("failureReason", filter.failureReason); + gen.write("failureReasonText", getErrorText(filter.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(filter.serviceId), filter.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("failedResources"); + for (final FailedResourceDTO rsrc : dto.failedResourceDTOs) { + gen.writeStartObject(); + writeValueAsStringOrStringArray(gen, "patterns", rsrc.patterns); + gen.write("prefix", rsrc.prefix); + gen.write("failureReason", rsrc.failureReason); + gen.write("failureReasonText", getErrorText(rsrc.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(rsrc.serviceId), rsrc.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("failedErrorPages"); + for (final FailedErrorPageDTO ep : dto.failedErrorPageDTOs) { + gen.writeStartObject(); + gen.write("name", ep.name); + writeValueAsStringOrStringArray(gen, "exceptions", ep.exceptions); + writeValueAsStringOrStringArray(gen, "errorCodes", ep.errorCodes); + gen.write("asyncSupported", ep.asyncSupported); + gen.write("failureReason", ep.failureReason); + gen.write("failureReasonText", getErrorText(ep.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(ep.serviceId), ep.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeStartArray("failedListeners"); + for (final FailedListenerDTO l : dto.failedListenerDTOs) { + gen.writeStartObject(); + writeValueAsStringOrStringArray(gen, "types", l.types); + gen.write("failureReason", l.failureReason); + gen.write("failureReasonText", getErrorText(l.failureReason)); + writeServiceIdAndRanking(gen, this.getServiceReference(l.serviceId), l.serviceId); + gen.writeEnd(); + } + gen.writeEnd(); + + gen.writeEnd(); + } + } +} diff --git a/http/pom.xml b/http/pom.xml index 370fc488d166b9437cb542d443953782f8c517eb..6479bdce3359bbbcd80e8d9435a0ea0fa00ff0d8 100644 --- a/http/pom.xml +++ b/http/pom.xml @@ -46,7 +46,9 @@ <module>parent</module> <module>proxy</module> <module>itest</module> - <module>samples/bridge</module> + <module>webconsoleplugin</module> + <module>inventoryprinter</module> + <module>sslfilter</module> <module>samples/whiteboard</module> </modules> </project> diff --git a/http/webconsoleplugin/pom.xml b/http/webconsoleplugin/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b4bb2afaff22a2f72e2ee9cd72570ff706bcbaa8 --- /dev/null +++ b/http/webconsoleplugin/pom.xml @@ -0,0 +1,75 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.http.parent</artifactId> + <version>13</version> + <relativePath>../parent/pom.xml</relativePath> + </parent> + + <name>Apache Felix Http Webconsole Plugin</name> + <artifactId>org.apache.felix.http.webconsoleplugin</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>bundle</packaging> + + <scm> + <connection>scm:git:https://github.com/apache/felix-dev.git</connection> + <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection> + <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</url> + </scm> + + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <version>5.1.4</version> + <extensions>true</extensions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.annotation.bundle</artifactId> + <version>1.1.1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.servlet</artifactId> + <version>2.0.0-RC1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.0.1</version> + <scope>provided</scope> + </dependency> + </dependencies> +</project> diff --git a/http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/Activator.java b/http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/Activator.java new file mode 100644 index 0000000000000000000000000000000000000000..87eb3ad43da751cb0b6f30b9c2512d298db919b2 --- /dev/null +++ b/http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/Activator.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.felix.http.webconsoleplugin.impl; + +import java.util.Dictionary; +import java.util.Hashtable; + +import javax.servlet.Servlet; + +import org.osgi.annotation.bundle.Header; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.service.servlet.runtime.HttpServiceRuntime; +import org.osgi.service.servlet.whiteboard.annotations.RequireHttpWhiteboard; +import org.osgi.util.tracker.ServiceTracker; +import org.osgi.util.tracker.ServiceTrackerCustomizer; + +@Header(name = Constants.BUNDLE_ACTIVATOR, value = "${@class}") +@RequireHttpWhiteboard +public class Activator implements BundleActivator { + + private volatile ServiceTracker<HttpServiceRuntime, HttpServiceRuntime> tracker; + + private volatile ServiceRegistration<Servlet> serviceReg; + + private void register(final BundleContext context, final HttpServiceRuntime runtime) { + final HttpServicePlugin plugin = new HttpServicePlugin(context, runtime); + final Dictionary<String, Object> props = new Hashtable<>(); + props.put("felix.webconsole.label", "httpservice"); + props.put("felix.webconsole.title", "HTTP Service"); + this.serviceReg = context.registerService(Servlet.class, plugin, props); + } + + @Override + public void start(final BundleContext context) throws Exception { + final ServiceTracker<HttpServiceRuntime, HttpServiceRuntime> tracker = new ServiceTracker<>(context, HttpServiceRuntime.class, new ServiceTrackerCustomizer<HttpServiceRuntime,HttpServiceRuntime>() { + + @Override + public HttpServiceRuntime addingService(final ServiceReference<HttpServiceRuntime> reference) { + final HttpServiceRuntime runtime = context.getService(reference); + if ( runtime != null ) { + register(context, runtime); + } + return runtime; + } + + @Override + public void modifiedService(final ServiceReference<HttpServiceRuntime> reference, final HttpServiceRuntime service) { + // ignore + } + + @Override + public void removedService(final ServiceReference<HttpServiceRuntime> reference, final HttpServiceRuntime service) { + if ( serviceReg != null ) { + try { + serviceReg.unregister(); + } catch ( final IllegalStateException ignore) { + // ignore + } + serviceReg = null; + } + } + + }); + tracker.open(); + } + + @Override + public void stop(final BundleContext context) throws Exception { + if ( tracker != null ) { + tracker.close(); + tracker = null; + } + } +} diff --git a/http/base/src/main/java/org/apache/felix/http/base/internal/console/HttpServicePlugin.java b/http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/HttpServicePlugin.java similarity index 59% rename from http/base/src/main/java/org/apache/felix/http/base/internal/console/HttpServicePlugin.java rename to http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/HttpServicePlugin.java index 7d8342b3b01b54dd3ceeb793839bb3d75cd735dc..accdf78ba1b916ab6cfc7022f37111a6b752ccad 100644 --- a/http/base/src/main/java/org/apache/felix/http/base/internal/console/HttpServicePlugin.java +++ b/http/webconsoleplugin/src/main/java/org/apache/felix/http/webconsoleplugin/impl/HttpServicePlugin.java @@ -16,8 +16,7 @@ * specific language governing permissions and limitations * under the License. */ - -package org.apache.felix.http.base.internal.console; +package org.apache.felix.http.webconsoleplugin.impl; import java.io.IOException; import java.io.PrintWriter; @@ -26,12 +25,9 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Dictionary; -import java.util.Hashtable; import java.util.List; import java.util.Map; -import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -41,7 +37,6 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; import org.osgi.framework.dto.ServiceReferenceDTO; import org.osgi.service.servlet.runtime.HttpServiceRuntime; import org.osgi.service.servlet.runtime.dto.DTOConstants; @@ -63,33 +58,18 @@ import org.osgi.service.servlet.runtime.dto.ServletDTO; /** * This is a web console plugin. */ -public class HttpServicePlugin extends HttpServlet -{ +public class HttpServicePlugin extends HttpServlet { private static final String ATTR_TEST = "test"; private static final String ATTR_MSG = "msg"; private static final String ATTR_SUBMIT = "resolve"; - - private final HttpServiceRuntime runtime; private final BundleContext context; - private volatile ServiceRegistration<Servlet> serviceReg; + private final HttpServiceRuntime runtime; - public HttpServicePlugin(final BundleContext context, final HttpServiceRuntime runtime) - { - this.runtime = runtime; + public HttpServicePlugin(final BundleContext context, final HttpServiceRuntime runtime) { this.context = context; - } - - public void register() - { - final Dictionary<String, Object> props = new Hashtable<>(); - props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation"); - props.put(Constants.SERVICE_DESCRIPTION, "HTTP Service Web Console Plugin"); - props.put("felix.webconsole.label", "httpservice"); - props.put("felix.webconsole.title", "HTTP Service"); - props.put("felix.webconsole.configprinter.modes", "always"); - this.serviceReg = context.registerService(Servlet.class, this, props); + this.runtime = runtime; } /** Escape xml text */ @@ -129,8 +109,7 @@ public class HttpServicePlugin extends HttpServlet final RequestInfoDTO dto = this.runtime.calculateRequestInfoDTO(test); final StringBuilder sb = new StringBuilder(); - if ( dto.servletDTO != null ) - { + if ( dto.servletDTO != null ) { sb.append("Servlet: "); sb.append(getValueAsString(dto.servletDTO.patterns)); sb.append(" ("); @@ -138,22 +117,16 @@ public class HttpServicePlugin extends HttpServlet sb.append(String.valueOf(dto.servletDTO.serviceId)); sb.append("), Filters: ["); boolean first = true; - for(final FilterDTO f : dto.filterDTOs) - { - if ( first ) - { + for(final FilterDTO f : dto.filterDTOs) { + if ( first ) { first = false; - } - else - { + } else { sb.append(", "); } sb.append(f.serviceId); } sb.append("]"); - } - else if ( dto.resourceDTO != null ) - { + } else if ( dto.resourceDTO != null ) { sb.append("Resource: "); sb.append(getValueAsString(dto.resourceDTO.patterns)); sb.append(" ("); @@ -161,22 +134,16 @@ public class HttpServicePlugin extends HttpServlet sb.append(String.valueOf(dto.resourceDTO.serviceId)); sb.append("), Filters: ["); boolean first = true; - for(final FilterDTO f : dto.filterDTOs) - { - if ( first ) - { + for(final FilterDTO f : dto.filterDTOs) { + if ( first ) { first = false; - } - else - { + } else { sb.append(", "); } sb.append(f.serviceId); } sb.append("]"); - } - else - { + } else { sb.append("<404>"); } msg = sb.toString(); @@ -205,8 +172,7 @@ public class HttpServicePlugin extends HttpServlet } @Override - protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException - { + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException { final RuntimeDTO dto = this.runtime.getRuntimeDTO(); final PrintWriter pw = resp.getWriter(); @@ -219,12 +185,10 @@ public class HttpServicePlugin extends HttpServlet printRuntimeDetails(pw, dto.serviceDTO); - for(final ServletContextDTO ctxDto : dto.servletContextDTOs ) - { + for(final ServletContextDTO ctxDto : dto.servletContextDTOs ) { printContextDetails(pw, ctxDto); } - for(final FailedServletContextDTO ctxDto : dto.failedServletContextDTOs ) - { + for(final FailedServletContextDTO ctxDto : dto.failedServletContextDTOs ) { printFailedContextDetails(pw, ctxDto); } printFailedServletDetails(pw, dto); @@ -236,8 +200,7 @@ public class HttpServicePlugin extends HttpServlet pw.println("<br/>"); } - private void printForm(final PrintWriter pw, final String value, final String msg, final String path) - { + private void printForm(final PrintWriter pw, final String value, final String msg, final String path) { pw.println("<table class='content' cellpadding='0' cellspacing='0' width='100%'>"); separatorHtml(pw); @@ -276,8 +239,7 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void titleHtml(PrintWriter pw, String title, String description) - { + private void titleHtml(PrintWriter pw, String title, String description) { pw.println("<tr class='content'>"); pw.println("<th colspan='3'class='content container'>" + title + "</th>"); @@ -291,59 +253,38 @@ public class HttpServicePlugin extends HttpServlet } } - private void separatorHtml(PrintWriter pw) - { + private void separatorHtml(PrintWriter pw) { pw.println("<tr class='content'>"); pw.println("<td class='content' colspan='3'> </td>"); pw.println("</tr>"); } - private String getValueAsString(final Object value) - { - if ( value.getClass().isArray() ) - { - if (value instanceof long[]) - { + private String getValueAsString(final Object value) { + if ( value.getClass().isArray() ) { + if (value instanceof long[]) { return Arrays.toString((long[])value); - } - else if (value instanceof int[]) - { + } else if (value instanceof int[]) { return Arrays.toString((int[])value); - } - else if (value instanceof double[]) - { + } else if (value instanceof double[]) { return Arrays.toString((double[])value); - } - else if (value instanceof byte[]) - { + } else if (value instanceof byte[]) { return Arrays.toString((byte[])value); - } - else if (value instanceof float[]) - { + } else if (value instanceof float[]) { return Arrays.toString((float[])value); - } - else if (value instanceof short[]) - { + } else if (value instanceof short[]) { return Arrays.toString((short[])value); - } - else if (value instanceof boolean[]) - { + } else if (value instanceof boolean[]) { return Arrays.toString((boolean[])value); - } - else if (value instanceof char[]) - { + } else if (value instanceof char[]) { return Arrays.toString((char[])value); - } - else - { + } else { return Arrays.toString((Object[])value); } } return value.toString(); } - private void printRuntimeDetails(final PrintWriter pw, final ServiceReferenceDTO dto) - { + private void printRuntimeDetails(final PrintWriter pw, final ServiceReferenceDTO dto) { pw.println("<p class=\"statline ui-state-highlight\">${Runtime Properties}</p>"); pw.println("<table class=\"nicetable\">"); pw.println("<thead><tr>"); @@ -351,29 +292,24 @@ public class HttpServicePlugin extends HttpServlet pw.println("<th class=\"header\">${Value}</th>"); pw.println("</tr></thead>"); boolean odd = true; - for(final Map.Entry<String, Object> prop : dto.properties.entrySet()) - { + for(final Map.Entry<String, Object> prop : dto.properties.entrySet()) { odd = printRow(pw, odd, prop.getKey(), getValueAsString(prop.getValue())); } pw.println("</table>"); pw.println("<br/>"); } - private boolean printRow(final PrintWriter pw, final boolean odd, final String...columns) - { + private boolean printRow(final PrintWriter pw, final boolean odd, final String...columns) { pw.print("<tr class=\""); if ( odd ) pw.print("odd"); else pw.print("even"); pw.println(" ui-state-default\">"); - for(final String val : columns) - { + for(final String val : columns) { pw.print("<td>"); - if ( val != null ) - { + if ( val != null ) { String text = escapeXml(val).replace("\n", "<br/>"); int pos; - while ( (pos = text.indexOf("${#link:")) != -1) - { + while ( (pos = text.indexOf("${#link:")) != -1) { final int endPos = text.indexOf("}", pos); final int bundleId = Integer.valueOf(text.substring(pos + 8, endPos)); final int tokenEndPos = text.indexOf("${link#}", pos); @@ -390,21 +326,17 @@ public class HttpServicePlugin extends HttpServlet return !odd; } - private String getContextPath(final String path) - { - if ( path.length() == 0 ) - { + private String getContextPath(final String path) { + if ( path.length() == 0 ) { return "<root>"; } return path; } - private boolean printServiceRankingRow(final PrintWriter pw, final long serviceId, final boolean odd) - { + private boolean printServiceRankingRow(final PrintWriter pw, final long serviceId, final boolean odd) { int ranking = 0; final ServiceReference<?> ref = this.getServiceReference(serviceId); - if ( ref != null ) - { + if ( ref != null ) { final Object obj = ref.getProperty(Constants.SERVICE_RANKING); if ( obj instanceof Integer) { @@ -414,8 +346,7 @@ public class HttpServicePlugin extends HttpServlet return printRow(pw, odd, "${ranking}", String.valueOf(ranking)); } - private void printContextDetails(final PrintWriter pw, final ServletContextDTO dto) - { + private void printContextDetails(final PrintWriter pw, final ServletContextDTO dto) { pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); pw.print(escapeXml(dto.name)); pw.println("'</p>"); @@ -441,8 +372,7 @@ public class HttpServicePlugin extends HttpServlet pw.println("<br/>"); } - private void printFailedContextDetails(final PrintWriter pw, final FailedServletContextDTO dto) - { + private void printFailedContextDetails(final PrintWriter pw, final FailedServletContextDTO dto) { pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); pw.print(escapeXml(dto.name)); pw.println("'</p>"); @@ -461,24 +391,19 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void appendServiceRanking(final StringBuilder sb, final ServiceReference<?> ref) - { + private void appendServiceRanking(final StringBuilder sb, final ServiceReference<?> ref) { int ranking = 0; - if ( ref != null ) - { + if ( ref != null ) { final Object obj = ref.getProperty(Constants.SERVICE_RANKING); - if ( obj instanceof Integer) - { + if ( obj instanceof Integer) { ranking = (Integer)obj; } } sb.append("${ranking} : ").append(String.valueOf(ranking)).append("\n"); } - private void printFilterDetails(final PrintWriter pw, final ServletContextDTO dto) - { - if ( dto.filterDTOs.length == 0 ) - { + private void printFilterDetails(final PrintWriter pw, final ServletContextDTO dto) { + if ( dto.filterDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); @@ -493,16 +418,14 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FilterDTO filter : dto.filterDTOs) - { + for (final FilterDTO filter : dto.filterDTOs) { final ServiceReference<?> ref = this.getServiceReference(filter.serviceId); final StringBuilder sb = new StringBuilder(); sb.append("${service.id} : ").append(String.valueOf(filter.serviceId)).append("\n"); appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(filter.asyncSupported)).append("\n"); sb.append("${dispatcher} : ").append(getValueAsString(filter.dispatcher)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -514,14 +437,12 @@ public class HttpServicePlugin extends HttpServlet final List<String> patterns = new ArrayList<>(); patterns.addAll(Arrays.asList(filter.patterns)); patterns.addAll(Arrays.asList(filter.regexs)); - for(final String name : filter.servletNames) - { + for(final String name : filter.servletNames) { patterns.add("Servlet : " + name); } Collections.sort(patterns); final StringBuilder psb = new StringBuilder(); - for(final String p : patterns) - { + for(final String p : patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), filter.name, sb.toString()); @@ -529,10 +450,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private String getErrorText(final int reason) - { - switch ( reason ) - { + private String getErrorText(final int reason) { + switch ( reason ) { case DTOConstants.FAILURE_REASON_EXCEPTION_ON_INIT : return "Exception on init"; case DTOConstants.FAILURE_REASON_NO_SERVLET_CONTEXT_MATCHING : return "No match"; case DTOConstants.FAILURE_REASON_SERVICE_IN_USE : return "In use"; @@ -543,10 +462,8 @@ public class HttpServicePlugin extends HttpServlet default: return "unknown"; } } - private void printFailedFilterDetails(final PrintWriter pw, final RuntimeDTO dto) - { - if ( dto.failedFilterDTOs.length == 0 ) - { + private void printFailedFilterDetails(final PrintWriter pw, final RuntimeDTO dto) { + if ( dto.failedFilterDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Failed Filter Services}</p>"); @@ -559,8 +476,7 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FailedFilterDTO filter : dto.failedFilterDTOs) - { + for (final FailedFilterDTO filter : dto.failedFilterDTOs) { final StringBuilder sb = new StringBuilder(); sb.append("${reason} : ").append(getErrorText(filter.failureReason)).append("\n"); final ServiceReference<?> ref = this.getServiceReference(filter.serviceId); @@ -568,8 +484,7 @@ public class HttpServicePlugin extends HttpServlet appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(filter.asyncSupported)).append("\n"); sb.append("${dispatcher} : ").append(getValueAsString(filter.dispatcher)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -581,14 +496,12 @@ public class HttpServicePlugin extends HttpServlet final List<String> patterns = new ArrayList<>(); patterns.addAll(Arrays.asList(filter.patterns)); patterns.addAll(Arrays.asList(filter.regexs)); - for(final String name : filter.servletNames) - { + for(final String name : filter.servletNames) { patterns.add("Servlet : " + name); } Collections.sort(patterns); final StringBuilder psb = new StringBuilder(); - for(final String p : patterns) - { + for(final String p : patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), filter.name, sb.toString()); @@ -596,30 +509,22 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private ServiceReference<?> getServiceReference(final long serviceId) - { - if ( serviceId > 0 ) - { - try - { + private ServiceReference<?> getServiceReference(final long serviceId) { + if ( serviceId > 0 ) { + try { final ServiceReference<?>[] ref = this.context.getServiceReferences((String)null, "(" + Constants.SERVICE_ID + "=" + String.valueOf(serviceId) + ")"); - if ( ref != null && ref.length > 0 ) - { + if ( ref != null && ref.length > 0 ) { return ref[0]; } - } - catch (final InvalidSyntaxException e) - { + } catch (final InvalidSyntaxException e) { // ignore } } return null; } - private void printServletDetails(final PrintWriter pw, final ServletContextDTO dto) - { - if ( dto.servletDTOs.length == 0 ) - { + private void printServletDetails(final PrintWriter pw, final ServletContextDTO dto) { + if ( dto.servletDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); @@ -634,15 +539,13 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final ServletDTO servlet : dto.servletDTOs) - { + for (final ServletDTO servlet : dto.servletDTOs) { final StringBuilder sb = new StringBuilder(); final ServiceReference<?> ref = this.getServiceReference(servlet.serviceId); sb.append("${service.id} : ").append(String.valueOf(servlet.serviceId)).append("\n"); appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(servlet.asyncSupported)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -652,8 +555,7 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final String p : servlet.patterns) - { + for(final String p : servlet.patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), servlet.name, sb.toString()); @@ -661,10 +563,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printFailedServletDetails(final PrintWriter pw, final RuntimeDTO dto) - { - if ( dto.failedServletDTOs.length == 0 ) - { + private void printFailedServletDetails(final PrintWriter pw, final RuntimeDTO dto) { + if ( dto.failedServletDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Failed Servlet Services}</p>"); @@ -677,16 +577,14 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FailedServletDTO servlet : dto.failedServletDTOs) - { + for (final FailedServletDTO servlet : dto.failedServletDTOs) { final StringBuilder sb = new StringBuilder(); sb.append("${reason} : ").append(getErrorText(servlet.failureReason)).append("\n"); final ServiceReference<?> ref = this.getServiceReference(servlet.serviceId); sb.append("${service.id} : ").append(String.valueOf(servlet.serviceId)).append("\n"); appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(servlet.asyncSupported)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -696,8 +594,7 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final String p : servlet.patterns) - { + for(final String p : servlet.patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), servlet.name, sb.toString()); @@ -705,10 +602,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printResourceDetails(final PrintWriter pw, final ServletContextDTO dto) - { - if ( dto.resourceDTOs.length == 0 ) - { + private void printResourceDetails(final PrintWriter pw, final ServletContextDTO dto) { + if ( dto.resourceDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); @@ -723,14 +618,12 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final ResourceDTO rsrc : dto.resourceDTOs) - { + for (final ResourceDTO rsrc : dto.resourceDTOs) { final StringBuilder sb = new StringBuilder(); final ServiceReference<?> ref = this.getServiceReference(rsrc.serviceId); sb.append("${service.id} : ").append(String.valueOf(rsrc.serviceId)).append("\n"); appendServiceRanking(sb, ref); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -740,8 +633,7 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final String p : rsrc.patterns) - { + for(final String p : rsrc.patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), rsrc.prefix, sb.toString()); @@ -749,10 +641,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printFailedResourceDetails(final PrintWriter pw, final RuntimeDTO dto) - { - if ( dto.failedResourceDTOs.length == 0 ) - { + private void printFailedResourceDetails(final PrintWriter pw, final RuntimeDTO dto) { + if ( dto.failedResourceDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Failed Resource Services}</p>"); @@ -765,15 +655,13 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FailedResourceDTO rsrc : dto.failedResourceDTOs) - { + for (final FailedResourceDTO rsrc : dto.failedResourceDTOs) { final StringBuilder sb = new StringBuilder(); sb.append("${reason} : ").append(getErrorText(rsrc.failureReason)).append("\n"); final ServiceReference<?> ref = this.getServiceReference(rsrc.serviceId); sb.append("${service.id} : ").append(String.valueOf(rsrc.serviceId)).append("\n"); appendServiceRanking(sb, ref); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -783,8 +671,7 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final String p : rsrc.patterns) - { + for(final String p : rsrc.patterns) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), rsrc.prefix, sb.toString()); @@ -792,10 +679,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printErrorPageDetails(final PrintWriter pw, final ServletContextDTO dto) - { - if ( dto.errorPageDTOs.length == 0 ) - { + private void printErrorPageDetails(final PrintWriter pw, final ServletContextDTO dto) { + if ( dto.errorPageDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); @@ -810,15 +695,13 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final ErrorPageDTO ep : dto.errorPageDTOs) - { + for (final ErrorPageDTO ep : dto.errorPageDTOs) { final StringBuilder sb = new StringBuilder(); final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); sb.append("${service.id} : ").append(String.valueOf(ep.serviceId)).append("\n"); appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(ep.asyncSupported)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -828,12 +711,10 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final long p : ep.errorCodes) - { + for(final long p : ep.errorCodes) { psb.append(p).append('\n'); } - for(final String p : ep.exceptions) - { + for(final String p : ep.exceptions) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), ep.name, sb.toString()); @@ -841,10 +722,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printFailedErrorPageDetails(final PrintWriter pw, final RuntimeDTO dto) - { - if ( dto.failedErrorPageDTOs.length == 0 ) - { + private void printFailedErrorPageDetails(final PrintWriter pw, final RuntimeDTO dto) { + if ( dto.failedErrorPageDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Registered Error Pages}</p>"); @@ -857,16 +736,14 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FailedErrorPageDTO ep : dto.failedErrorPageDTOs) - { + for (final FailedErrorPageDTO ep : dto.failedErrorPageDTOs) { final StringBuilder sb = new StringBuilder(); sb.append("${reason} : ").append(getErrorText(ep.failureReason)).append("\n"); final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); sb.append("${service.id} : ").append(String.valueOf(ep.serviceId)).append("\n"); appendServiceRanking(sb, ref); sb.append("${async} : ").append(String.valueOf(ep.asyncSupported)).append("\n"); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -876,12 +753,10 @@ public class HttpServicePlugin extends HttpServlet } final StringBuilder psb = new StringBuilder(); - for(final long p : ep.errorCodes) - { + for(final long p : ep.errorCodes) { psb.append(p).append('\n'); } - for(final String p : ep.exceptions) - { + for(final String p : ep.exceptions) { psb.append(p).append('\n'); } odd = printRow(pw, odd, psb.toString(), ep.name, sb.toString()); @@ -889,10 +764,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printListenerDetails(final PrintWriter pw, final ServletContextDTO dto) - { - if ( dto.listenerDTOs.length == 0 ) - { + private void printListenerDetails(final PrintWriter pw, final ServletContextDTO dto) { + if ( dto.listenerDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Servlet Context} '"); @@ -906,14 +779,12 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final ListenerDTO ep : dto.listenerDTOs) - { + for (final ListenerDTO ep : dto.listenerDTOs) { final StringBuilder sb = new StringBuilder(); final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); sb.append("${service.id} : ").append(String.valueOf(ep.serviceId)).append("\n"); appendServiceRanking(sb, ref); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -922,8 +793,7 @@ public class HttpServicePlugin extends HttpServlet sb.append("${link#}\n"); } final StringBuilder tsb = new StringBuilder(); - for(final String t : ep.types) - { + for(final String t : ep.types) { tsb.append(t).append('\n'); } odd = printRow(pw, odd, tsb.toString(), sb.toString()); @@ -931,10 +801,8 @@ public class HttpServicePlugin extends HttpServlet pw.println("</table>"); } - private void printFailedListenerDetails(final PrintWriter pw, final RuntimeDTO dto) - { - if ( dto.failedListenerDTOs.length == 0 ) - { + private void printFailedListenerDetails(final PrintWriter pw, final RuntimeDTO dto) { + if ( dto.failedListenerDTOs.length == 0 ) { return; } pw.print("<p class=\"statline ui-state-highlight\">${Failed Listeners}</p>"); @@ -946,15 +814,13 @@ public class HttpServicePlugin extends HttpServlet pw.println("</tr></thead>"); boolean odd = true; - for (final FailedListenerDTO ep : dto.failedListenerDTOs) - { + for (final FailedListenerDTO ep : dto.failedListenerDTOs) { final StringBuilder sb = new StringBuilder(); sb.append("${reason} : ").append(getErrorText(ep.failureReason)).append("\n"); final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); sb.append("${service.id} : ").append(String.valueOf(ep.serviceId)).append("\n"); appendServiceRanking(sb, ref); - if ( ref != null ) - { + if ( ref != null ) { sb.append("${bundle} : "); sb.append("${#link:"); sb.append(ref.getBundle().getBundleId()); @@ -963,384 +829,11 @@ public class HttpServicePlugin extends HttpServlet sb.append("${link#}\n"); } final StringBuilder tsb = new StringBuilder(); - for(final String t : ep.types) - { + for(final String t : ep.types) { tsb.append(t).append('\n'); } odd = printRow(pw, odd, tsb.toString(), sb.toString()); } pw.println("</table>"); } - - private void printServiceIdAndRanking(final PrintWriter pw, final ServiceReference<?> ref, final long serviceId) - { - pw.print("service.id : "); - pw.println(String.valueOf(serviceId)); - int ranking = 0; - if ( ref != null ) - { - final Object obj = ref.getProperty(Constants.SERVICE_RANKING); - if ( obj instanceof Integer) - { - ranking = (Integer)obj; - } - } - pw.print("Ranking : "); - pw.println(String.valueOf(ranking)); - } - - /** - * @see org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter) - */ - public void printConfiguration(final PrintWriter pw) - { - final RuntimeDTO dto = this.runtime.getRuntimeDTO(); - - pw.println("HTTP Service Details"); - pw.println("===================="); - pw.println(); - pw.println("Runtime Properties"); - pw.println("------------------"); - - for(final Map.Entry<String, Object> prop : dto.serviceDTO.properties.entrySet()) - { - pw.print(prop.getKey()); - pw.print(" : "); - pw.println(getValueAsString(prop.getValue())); - } - pw.println(); - for(final ServletContextDTO ctxDto : dto.servletContextDTOs ) - { - pw.print("Servlet Context "); - pw.println(ctxDto.name); - pw.println("-----------------------------------------------"); - - pw.print("Path : "); - pw.println(getContextPath(ctxDto.contextPath)); - printServiceIdAndRanking(pw, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); - pw.println(); - if ( ctxDto.servletDTOs.length > 0 ) - { - pw.println("Servlets"); - for (final ServletDTO servlet : ctxDto.servletDTOs) - { - pw.print("Patterns : "); - pw.println(getValueAsString(servlet.patterns)); - pw.print("Name : "); - pw.println(servlet.name); - final ServiceReference<?> ref = this.getServiceReference(servlet.serviceId); - printServiceIdAndRanking(pw, ref, servlet.serviceId); - pw.print("async : "); - pw.println(String.valueOf(servlet.asyncSupported)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - - if ( ctxDto.filterDTOs.length > 0 ) - { - pw.println("Filters"); - for (final FilterDTO filter : ctxDto.filterDTOs) - { - final List<String> patterns = new ArrayList<>(); - patterns.addAll(Arrays.asList(filter.patterns)); - patterns.addAll(Arrays.asList(filter.regexs)); - for(final String name : filter.servletNames) - { - patterns.add("Servlet : " + name); - } - Collections.sort(patterns); - - pw.print("Patterns : "); - pw.println(patterns); - pw.print("Name : "); - pw.println(filter.name); - final ServiceReference<?> ref = this.getServiceReference(filter.serviceId); - printServiceIdAndRanking(pw, ref, filter.serviceId); - pw.print("async : "); - pw.println(String.valueOf(filter.asyncSupported)); - pw.print("dispatcher : "); - pw.println(getValueAsString(filter.dispatcher)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - if ( ctxDto.resourceDTOs.length > 0 ) - { - pw.println("Resources"); - for (final ResourceDTO rsrc : ctxDto.resourceDTOs) - { - pw.print("Patterns : "); - pw.println(getValueAsString(rsrc.patterns)); - pw.print("Prefix : "); - pw.println(rsrc.prefix); - final ServiceReference<?> ref = this.getServiceReference(rsrc.serviceId); - printServiceIdAndRanking(pw, ref, rsrc.serviceId); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - - } - if ( ctxDto.errorPageDTOs.length > 0 ) - { - pw.println("Error Pages"); - for (final ErrorPageDTO ep : ctxDto.errorPageDTOs) - { - final List<String> patterns = new ArrayList<>(); - for(final long p : ep.errorCodes) - { - patterns.add(String.valueOf(p)); - } - for(final String p : ep.exceptions) - { - patterns.add(p); - } - pw.print("Patterns : "); - pw.println(patterns); - pw.print("Name : "); - pw.println(ep.name); - final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); - printServiceIdAndRanking(pw, ref, ep.serviceId); - pw.print("async : "); - pw.println(String.valueOf(ep.asyncSupported)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - - if ( ctxDto.listenerDTOs.length > 0 ) - { - pw.println("Listeners"); - for (final ListenerDTO ep : ctxDto.listenerDTOs) - { - pw.print("Types : "); - pw.println(getValueAsString(ep.types)); - final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); - printServiceIdAndRanking(pw, ref, ep.serviceId); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - pw.println(); - } - - if ( dto.failedServletContextDTOs.length > 0 ) - { - for(final FailedServletContextDTO ctxDto : dto.failedServletContextDTOs ) - { - pw.print("Failed Servlet Context "); - pw.println(ctxDto.name); - pw.println("-----------------------------------------------"); - - pw.print("Reason : "); - pw.println(getErrorText(ctxDto.failureReason)); - pw.print("Path : "); - pw.println(getContextPath(ctxDto.contextPath)); - printServiceIdAndRanking(pw, this.getServiceReference(ctxDto.serviceId), ctxDto.serviceId); - pw.println(); - } - } - if ( dto.failedServletDTOs.length > 0 ) - { - pw.println("Failed Servlets"); - for (final FailedServletDTO servlet : dto.failedServletDTOs) - { - pw.print("Patterns : "); - pw.println(getValueAsString(servlet.patterns)); - pw.print("Reason : "); - pw.println(getErrorText(servlet.failureReason)); - pw.print("Name : "); - pw.println(servlet.name); - final ServiceReference<?> ref = this.getServiceReference(servlet.serviceId); - printServiceIdAndRanking(pw, ref, servlet.serviceId); - pw.print("async : "); - pw.println(String.valueOf(servlet.asyncSupported)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - - if ( dto.failedFilterDTOs.length > 0 ) - { - pw.println("Failed Filters"); - for (final FailedFilterDTO filter : dto.failedFilterDTOs) - { - final List<String> patterns = new ArrayList<>(); - patterns.addAll(Arrays.asList(filter.patterns)); - patterns.addAll(Arrays.asList(filter.regexs)); - for(final String name : filter.servletNames) - { - patterns.add("Servlet : " + name); - } - Collections.sort(patterns); - - pw.print("Patterns : "); - pw.println(patterns); - pw.print("Reason : "); - pw.println(getErrorText(filter.failureReason)); - pw.print("Name : "); - pw.println(filter.name); - final ServiceReference<?> ref = this.getServiceReference(filter.serviceId); - printServiceIdAndRanking(pw, ref, filter.serviceId); - pw.print("async : "); - pw.println(String.valueOf(filter.asyncSupported)); - pw.print("dispatcher : "); - pw.println(getValueAsString(filter.dispatcher)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - if ( dto.failedResourceDTOs.length > 0 ) - { - pw.println("Failed Resources"); - for (final FailedResourceDTO rsrc : dto.failedResourceDTOs) - { - pw.print("Patterns : "); - pw.println(getValueAsString(rsrc.patterns)); - pw.print("Reason : "); - pw.println(getErrorText(rsrc.failureReason)); - pw.print("Prefix : "); - pw.println(rsrc.prefix); - final ServiceReference<?> ref = this.getServiceReference(rsrc.serviceId); - printServiceIdAndRanking(pw, ref, rsrc.serviceId); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - - } - if ( dto.failedErrorPageDTOs.length > 0 ) - { - pw.println("Failed Error Pages"); - for (final FailedErrorPageDTO ep : dto.failedErrorPageDTOs) - { - final List<String> patterns = new ArrayList<>(); - for(final long p : ep.errorCodes) - { - patterns.add(String.valueOf(p)); - } - for(final String p : ep.exceptions) - { - patterns.add(p); - } - pw.print("Patterns : "); - pw.println(patterns); - pw.print("Reason : "); - pw.println(getErrorText(ep.failureReason)); - pw.print("Name : "); - pw.println(ep.name); - final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); - printServiceIdAndRanking(pw, ref, ep.serviceId); - pw.print("async : "); - pw.println(String.valueOf(ep.asyncSupported)); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - - if ( dto.failedListenerDTOs.length > 0 ) - { - pw.println("Listeners"); - for (final FailedListenerDTO ep : dto.failedListenerDTOs) - { - pw.print("Types : "); - pw.println(getValueAsString(ep.types)); - pw.print("Reason : "); - pw.println(getErrorText(ep.failureReason)); - final ServiceReference<?> ref = this.getServiceReference(ep.serviceId); - printServiceIdAndRanking(pw, ref, ep.serviceId); - if ( ref != null ) - { - pw.print("Bundle : "); - pw.print(ref.getBundle().getSymbolicName()); - pw.print(" <"); - pw.print(String.valueOf(ref.getBundle().getBundleId())); - pw.println(">"); - } - pw.println(); - } - pw.println(); - } - pw.println(); - } - - public void unregister() - { - if (this.serviceReg != null) - { - this.serviceReg.unregister(); - this.serviceReg = null; - } - } }