This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-console.git
commit 595a9f2640d8fde9dbab33f85bf50e00f7fafab4 Author: Carsten Ziegeler <[email protected]> AuthorDate: Thu Aug 23 16:38:20 2012 +0000 SLING-2568 : Move webconsole plugin into separate bundle git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1376582 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 86 +++++++ .../console/OsgiInstallerWebConsolePlugin.java | 284 +++++++++++++++++++++ 2 files changed, 370 insertions(+) diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bd79404 --- /dev/null +++ b/pom.xml @@ -0,0 +1,86 @@ +<?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. +--> +<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.sling</groupId> + <artifactId>sling</artifactId> + <version>13</version> + <relativePath>../../parent/pom.xml</relativePath> + </parent> + + <artifactId>org.apache.sling.installer.console</artifactId> + <version>0.9.0-SNAPSHOT</version> + <packaging>bundle</packaging> + + <name>Apache Sling Installer WebConsole Plugin</name> + <description> + Provides a web console plugin for the OSGi installer + </description> + + <scm> + <connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/installer/console</connection> + <developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/installer/console</developerConnection> + <url>http://svn.apache.org/viewvc/sling/installer/console</url> + </scm> + + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-scr-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Private-Package> + org.apache.sling.installer.core.impl.console + </Private-Package> + </instructions> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.installer.core</artifactId> + <version>3.3.8</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.scr.annotations</artifactId> + </dependency> + </dependencies> +</project> diff --git a/src/main/java/org/apache/sling/installer/core/impl/console/OsgiInstallerWebConsolePlugin.java b/src/main/java/org/apache/sling/installer/core/impl/console/OsgiInstallerWebConsolePlugin.java new file mode 100644 index 0000000..53a3374 --- /dev/null +++ b/src/main/java/org/apache/sling/installer/core/impl/console/OsgiInstallerWebConsolePlugin.java @@ -0,0 +1,284 @@ +/* + * 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.sling.installer.core.impl.console; + +import java.io.IOException; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; + +import javax.servlet.GenericServlet; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; +import org.apache.sling.installer.api.InstallableResource; +import org.apache.sling.installer.api.info.InfoProvider; +import org.apache.sling.installer.api.info.InstallationState; +import org.apache.sling.installer.api.info.Resource; +import org.apache.sling.installer.api.info.ResourceGroup; +import org.apache.sling.installer.api.tasks.RegisteredResource; +import org.apache.sling.installer.api.tasks.ResourceState; +import org.osgi.framework.Constants; + + +@Component +@Service(value=javax.servlet.Servlet.class) +@Properties({ + @Property(name=Constants.SERVICE_DESCRIPTION, value="Apache Sling OSGi Installer Web Console Plugin"), + @Property(name="felix.webconsole.label", value="osgi-installer"), + @Property(name="felix.webconsole.title", value="OSGi Installer"), + @Property(name="felix.webconsole.configprinter.modes", value={"zip", "txt"}) +}) +@SuppressWarnings("serial") +public class OsgiInstallerWebConsolePlugin extends GenericServlet { + + @Reference + private InfoProvider installer; + + private String getType(final RegisteredResource rsrc) { + final String type = rsrc.getType(); + if ( type.equals(InstallableResource.TYPE_BUNDLE) ) { + return "Bundles"; + } else if ( type.equals(InstallableResource.TYPE_CONFIG) ) { + return "Configurations"; + } else if ( type.equals(InstallableResource.TYPE_FILE) ) { + return "Files"; + } else if ( type.equals(InstallableResource.TYPE_PROPERTIES) ) { + return "Properties"; + } + return type; + } + + private String getEntityId(final RegisteredResource rsrc, String alias) { + String id = rsrc.getEntityId(); + final int pos = id.indexOf(':'); + if ( pos != -1 ) { + id = id.substring(pos + 1); + } + return (alias == null ? id : id + '\n' + alias); + } + + private String getURL(final Resource rsrc) { + if ( rsrc.getVersion() != null ) { + return rsrc.getURL() + " (" + rsrc.getVersion() + ")"; + } + return rsrc.getURL(); + } + + private String getInfo(final RegisteredResource rsrc) { + return rsrc.getDigest() + '/' + String.valueOf(rsrc.getPriority()); + } + + /** Default date format used. */ + private final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSS yyyy-MMM-dd"); + + /** + * Format a date + */ + private synchronized String formatDate(final long time) { + if ( time == -1 ) { + return "-"; + } + final Date d = new Date(time); + return dateFormat.format(d); + } + + @Override + public void service(final ServletRequest req, final ServletResponse res) + throws IOException { + final PrintWriter pw = res.getWriter(); + + final InstallationState state = this.installer.getInstallationState(); + pw.print("<p class='statline ui-state-highlight'>Apache Sling OSGi Installer"); + if ( state.getActiveResources().size() == 0 && state.getInstalledResources().size() == 0 && state.getUntransformedResources().size() == 0 ) { + pw.print(" - no resources registered."); + } + pw.print("</p>"); + + String rt = null; + for(final ResourceGroup group : state.getActiveResources()) { + final Resource toActivate = group.getResources().get(0); + if ( !toActivate.getType().equals(rt) ) { + if ( rt != null ) { + pw.println("</tbody></table>"); + } + pw.println("<div class='ui-widget-header ui-corner-top buttonGroup' style='height: 15px;'>"); + pw.printf("<span style='float: left; margin-left: 1em;'>Active Resources - %s</span>", getType(toActivate)); + pw.println("</div>"); + pw.println("<table class='nicetable'><tbody>"); + pw.printf("<tr><th>Entity ID</th><th>Digest/Priority</th><th>URL (Version)</th><th>State</th></tr>"); + rt = toActivate.getType(); + } + pw.printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>", + getEntityId(toActivate, group.getAlias()), + getInfo(toActivate), + getURL(toActivate), + toActivate.getState()); + } + if ( rt != null ) { + pw.println("</tbody></table>"); + } + rt = null; + + for(final ResourceGroup group : state.getInstalledResources()) { + final Collection<Resource> resources = group.getResources(); + if (resources.size() > 0) { + final Iterator<Resource> iter = resources.iterator(); + final Resource first = iter.next(); + if ( !first.getType().equals(rt) ) { + if ( rt != null ) { + pw.println("</tbody></table>"); + } + pw.println("<div class='ui-widget-header ui-corner-top buttonGroup' style='height: 15px;'>"); + pw.printf("<span style='float: left; margin-left: 1em;'>Processed Resources - %s</span>", getType(first)); + pw.println("</div>"); + pw.println("<table class='nicetable'><tbody>"); + pw.printf("<tr><th>Entity ID</th><th>Digest/Priority</th><th>URL (Version)</th><th>State</th></tr>"); + rt = first.getType(); + } + pw.print("<tr><td>"); + pw.print(getEntityId(first, group.getAlias())); + pw.print("</td><td>"); + pw.print(getInfo(first)); + pw.print("</td><td>"); + pw.print(getURL(first)); + pw.print("</td><td>"); + pw.print(first.getState()); + if ( first.getState() == ResourceState.INSTALLED ) { + final long lastChange = first.getLastChange(); + if ( lastChange > 0 ) { + pw.print("<br/>"); + pw.print(formatDate(lastChange)); + } + } + pw.print("</td></tr>"); + + while ( iter.hasNext() ) { + final Resource resource = iter.next(); + pw.printf("<tr><td></td><td>%s</td><td>%s</td><td>%s</td></tr>", + getInfo(resource), + getURL(resource), + resource.getState()); + } + } + } + if ( rt != null ) { + pw.println("</tbody></table>"); + } + + rt = null; + for(final RegisteredResource registeredResource : state.getUntransformedResources()) { + if ( !registeredResource.getType().equals(rt) ) { + if ( rt != null ) { + pw.println("</tbody></table>"); + } + pw.println("<div class='ui-widget-header ui-corner-top buttonGroup' style='height: 15px;'>"); + pw.printf("<span style='float: left; margin-left: 1em;'>Untransformed Resources - %s</span>", getType(registeredResource)); + pw.println("</div>"); + pw.println("<table class='nicetable'><tbody>"); + pw.printf("<tr><th>Digest/Priority</th><th>URL</th></tr>"); + + rt = registeredResource.getType(); + } + pw.printf("<tr><td>%s</td><td>%s</td></tr>", + getInfo(registeredResource), + registeredResource.getURL()); + } + if ( rt != null ) { + pw.println("</tbody></table>"); + } + } + + /** + * Method for the configuration printer. + */ + public void printConfiguration(final PrintWriter pw, final String mode) { + if ( !"zip".equals(mode) && !"txt".equals(mode) ) { + return; + } + pw.println("Apache Sling OSGi Installer"); + pw.println("==========================="); + final InstallationState state = this.installer.getInstallationState(); + pw.println("Active Resources"); + pw.println("----------------"); + String rt = null; + for(final ResourceGroup group : state.getActiveResources()) { + final Resource toActivate = group.getResources().get(0); + if ( !toActivate.getType().equals(rt) ) { + pw.printf("%s:%n", getType(toActivate)); + rt = toActivate.getType(); + } + pw.printf("- %s: %s, %s, %s%n", + getEntityId(toActivate, group.getAlias()), + getInfo(toActivate), + getURL(toActivate), + toActivate.getState()); + } + pw.println(); + + pw.println("Processed Resources"); + pw.println("-------------------"); + rt = null; + for(final ResourceGroup group : state.getInstalledResources()) { + final Collection<Resource> resources = group.getResources(); + if (resources.size() > 0) { + final Iterator<Resource> iter = resources.iterator(); + final Resource first = iter.next(); + if ( !first.getType().equals(rt) ) { + pw.printf("%s:%n", getType(first)); + rt = first.getType(); + } + pw.printf("* %s: %s, %s, %s%n", + getEntityId(first, group.getAlias()), + getInfo(first), + getURL(first), + first.getState()); + while ( iter.hasNext() ) { + final Resource resource = iter.next(); + pw.printf(" - %s, %s, %s%n", + getInfo(resource), + getURL(resource), + resource.getState()); + } + } + } + pw.println(); + + pw.println("Untransformed Resources"); + pw.println("-----------------------"); + rt = null; + for(final RegisteredResource registeredResource : state.getUntransformedResources()) { + if ( !registeredResource.getType().equals(rt) ) { + pw.printf("%s:%n", getType(registeredResource)); + rt = registeredResource.getType(); + } + pw.printf("- %s, %s%n", + getInfo(registeredResource), + registeredResource.getURL()); + } + } +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
