Except for a missing unit test and some minor issues (comments inline) this looks great Achim! Thank you :)
Kind regards, Andreas On Tue, May 3, 2011 at 12:16 AM, <[email protected]> wrote: > Author: anierbeck > Date: Mon May 2 22:16:24 2011 > New Revision: 1098814 > > URL: http://svn.apache.org/viewvc?rev=1098814&view=rev > Log: > [KARAF-572] - Command to show all registered servlets and their contexts > > Added: > karaf/trunk/shell/http/ > karaf/trunk/shell/http/pom.xml (with props) > karaf/trunk/shell/http/src/ > karaf/trunk/shell/http/src/main/ > karaf/trunk/shell/http/src/main/java/ > karaf/trunk/shell/http/src/main/java/org/ > karaf/trunk/shell/http/src/main/java/org/apache/ > karaf/trunk/shell/http/src/main/java/org/apache/karaf/ > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/ > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ > > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java > (with props) > > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java > (with props) > karaf/trunk/shell/http/src/main/resources/ > karaf/trunk/shell/http/src/main/resources/OSGI-INF/ > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/ > > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml > (with props) > Modified: > karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml > > Modified: > karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml > URL: > http://svn.apache.org/viewvc/karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml?rev=1098814&r1=1098813&r2=1098814&view=diff > ============================================================================== > --- karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml > (original) > +++ karaf/trunk/assemblies/features/standard/src/main/feature/feature.xml Mon > May 2 22:16:24 2011 > @@ -108,6 +108,7 @@ > <bundle>mvn:org.ops4j.pax.web/pax-web-spi/${pax.web.version}</bundle> > > <bundle>mvn:org.ops4j.pax.web/pax-web-runtime/${pax.web.version}</bundle> > > <bundle>mvn:org.ops4j.pax.web/pax-web-jetty/${pax.web.version}</bundle> > + <bundle > start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.http/${project.version}</bundle> > </feature> > <feature name="http-whiteboard" version="${project.version}" > resolver="(obr)" start-level='30'> > <feature>http</feature> > > Added: karaf/trunk/shell/http/pom.xml > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/http/pom.xml?rev=1098814&view=auto > ============================================================================== > --- karaf/trunk/shell/http/pom.xml (added) > +++ karaf/trunk/shell/http/pom.xml Mon May 2 22:16:24 2011 > @@ -0,0 +1,91 @@ Missing ASF Header > +<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/xsd/maven-4.0.0.xsd"> > + <modelVersion>4.0.0</modelVersion> > + <parent> > + <artifactId>shell</artifactId> > + <groupId>org.apache.karaf.shell</groupId> > + <version>3.0.0-SNAPSHOT</version> > + </parent> > + <groupId>org.apache.karaf.shell</groupId> > + <artifactId>org.apache.karaf.shell.http</artifactId> > + <packaging>bundle</packaging> > + <name>Apache Karaf :: Shell :: Http Commands</name> > + <version>3.0.0-SNAPSHOT</version> > + <description>This bundle provides Karaf shell commands to list > details of the http service.</description> > + > + <properties> > + > <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory> > + </properties> > + > + <dependencies> > + <dependency> > + <groupId>org.apache.karaf.shell</groupId> > + > <artifactId>org.apache.karaf.shell.console</artifactId> Not sure but shouldn't we set this one to provided too? > + </dependency> > + > + <dependency> > + <groupId>org.osgi</groupId> > + <artifactId>org.osgi.core</artifactId> > + <scope>provided</scope> > + </dependency> > + <dependency> > + <groupId>org.apache.felix</groupId> > + <artifactId>org.apache.felix.utils</artifactId> > + <scope>provided</scope> > + </dependency> > + <dependency> > + <groupId>org.ops4j.pax.web</groupId> > + <artifactId>pax-web-spi</artifactId> > + </dependency> Isn't this one provided too? > + <dependency> > + <groupId>javax.servlet</groupId> > + <artifactId>servlet-api</artifactId> > + <version>2.5</version> AFAIK we've decided to use versions only in root pom > + <scope>provided</scope> > + </dependency> > + </dependencies> > + > + <build> > + <resources> > + <resource> > + > <directory>${project.basedir}/src/main/resources</directory> > + <includes> > + <include>**/*</include> > + </includes> > + </resource> > + <resource> > + > <directory>${project.basedir}/src/main/resources</directory> > + <filtering>true</filtering> > + <includes> > + <include>**/*.info</include> > + </includes> > + </resource> > + </resources> > + <plugins> > + <plugin> > + <groupId>org.apache.felix</groupId> > + <artifactId>maven-bundle-plugin</artifactId> > + <configuration> > + <instructions> > + > <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> > + > <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package> > + <Import-Package> > + > !${project.artifactId}*, > + > org.apache.felix.service.command, > + > org.apache.felix.gogo.commands, > + > org.apache.karaf.shell.console, > + * > + </Import-Package> > + <Private-Package> > + > org.apache.felix.utils.version, > + > org.apache.felix.utils.manifest, > + !* > + </Private-Package> > + > <_versionpolicy>${bnd.version.policy}</_versionpolicy> > + </instructions> > + </configuration> > + </plugin> > + </plugins> > + </build> > + > +</project> > \ No newline at end of file > > Propchange: karaf/trunk/shell/http/pom.xml > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Added: > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java?rev=1098814&view=auto > ============================================================================== > --- > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java > (added) > +++ > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java > Mon May 2 22:16:24 2011 > @@ -0,0 +1,47 @@ > +/* Copyright 2011 Achim. > + * > + * Licensed 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.karaf.shell.http; > + > +import java.util.Collection; > +import java.util.HashMap; > +import java.util.Map; > + > +import org.ops4j.pax.web.service.spi.ServletEvent; > +import org.ops4j.pax.web.service.spi.ServletListener; > +import org.osgi.framework.Bundle; > + > +/** > + * @author Achim I think we have an SCM instead of the @Author Tag?! :) > + * > + */ > +public class ServletEventHandler implements ServletListener { > + > + Map<Bundle, ServletEvent> servletEvents = new HashMap<Bundle, > ServletEvent>(); > + > + public void servletEvent(ServletEvent event) { > + servletEvents.put(event.getBundle(), event); > + } > + > + /** > + * @return the servletEvents > + */ > + public Collection<ServletEvent> getServletEvents() { > + return servletEvents.values(); > + } > + > +} > > Propchange: > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletEventHandler.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Added: > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java?rev=1098814&view=auto > ============================================================================== > --- > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java > (added) > +++ > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java > Mon May 2 22:16:24 2011 > @@ -0,0 +1,107 @@ > +/* Copyright 2011 Achim. > + * > + * Licensed 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.karaf.shell.http; > + > +import java.util.Arrays; > + > +import javax.servlet.Servlet; > + > +import org.apache.felix.gogo.commands.Command; > +import org.apache.karaf.shell.console.OsgiCommandSupport; > +import org.ops4j.pax.web.service.spi.ServletEvent; > +import org.ops4j.pax.web.service.spi.WebEvent; > + > + > +@Command(scope = "web", name = "list", description = "Lists details for war > bundles.") > +public class ServletListCommand extends OsgiCommandSupport { > + > + private ServletEventHandler eventHandler; > + > + @Override > + protected Object doExecute() throws Exception { > + > + String headers = " ID Servlet > Servlet-Name State Alias Url "; > + System.out.println(headers); > + for (ServletEvent event : eventHandler.getServletEvents()) { > + Servlet servlet = event.getServlet(); > + String servletClassName = ""; > + if (servlet != null) { > + servletClassName = > servlet.getClass().getName(); > + servletClassName = > servletClassName.substring(servletClassName.lastIndexOf(".")+1, > servletClassName.length()); > + while (servletClassName.length() < 28) { > + servletClassName += " "; > + } > + } else { > + servletClassName = " > "; > + } > + String servletName = event.getServletName() != null ? > event.getServletName() : " "; > + if (servletName.contains(".")) { > + servletName = > servletName.substring(servletName.lastIndexOf(".")+1, servletName.length()); > + } > + > + while (servletName.length() < 23) { > + servletName += " "; > + } should we concat the name if it's longer than 23 chars? > + > + String alias = event.getAlias() != null ? > event.getAlias() : " "; > + while (alias.length() < 16 ) { > + alias += " "; > + } again should we concat alias if it's longer than 16 chars? BTW, maybe using a util method for this "fill" part? Looks quite similar and I'm sure we require this in more places > + String[] urls = (String[]) (event.getUrlParameter() > != null ? event.getUrlParameter() : new String[] {""}); > + String line = "[" + event.getBundle().getBundleId() + > "] [" + servletClassName + "] [" + servletName +"] [" > + + getStateString(event.getType())+ "] [" + alias + "] > [" + Arrays.toString(urls) + "]"; > + System.out.println(line); > + } > + return null; > + } > + > + public String getStateString(int type) > + { > + switch(type) { > + case WebEvent.DEPLOYING: > + return "Deploying "; > + case WebEvent.DEPLOYED: > + return "Deployed "; > + case WebEvent.UNDEPLOYING: > + return "Undeploying"; > + case WebEvent.UNDEPLOYED: > + return "Undeployed "; > + case WebEvent.FAILED: > + return "Failed "; > + case WebEvent.WAITING: > + return "Waiting "; > + default: > + return "Failed "; > + } > + } > + > + /** > + * @return the eventHandler > + */ > + public ServletEventHandler getEventHandler() { > + return eventHandler; > + } > + > + /** > + * @param eventHandler the eventHandler to set > + */ > + public void setEventHandler(ServletEventHandler eventHandler) { > + this.eventHandler = eventHandler; > + } > + > +} > > Propchange: > karaf/trunk/shell/http/src/main/java/org/apache/karaf/shell/http/ServletListCommand.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Added: > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml?rev=1098814&view=auto > ============================================================================== > --- > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml > (added) > +++ > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml > Mon May 2 22:16:24 2011 > @@ -0,0 +1,36 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + > + 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. > + > +--> > +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" > default-activation="lazy"> > + > + <bean id="eaHandler" > class="org.apache.karaf.shell.http.ServletEventHandler" /> > + > + <service id="servletListener" > + interface="org.ops4j.pax.web.service.spi.ServletListener" > + ref="eaHandler" /> > + > + <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0"> > + <command name="http/list-servlet"> > + <action class="org.apache.karaf.shell.http.ServletListCommand"> > + <property name="eventHandler" ref="eaHandler" /> > + </action> > + </command> > + </command-bundle> > + > +</blueprint> > \ No newline at end of file > > Propchange: > karaf/trunk/shell/http/src/main/resources/OSGI-INF/blueprint/shell-http.xml > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > >
