You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@karaf.apache.org by Andreas Pieber <an...@gmail.com> on 2011/05/03 04:37:51 UTC

Re: svn commit: r1098814 - in /karaf/trunk: assemblies/features/standard/src/main/feature/ shell/http/ shell/http/src/ shell/http/src/main/ shell/http/src/main/java/ shell/http/src/main/java/org/ shell/http/src/main/java/org/apache/ shell/http/src/ma

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,  <an...@apache.org> 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
>
>
>