All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.felix.webconsole.SimpleWebConsolePlugin Maven / Gradle / Ivy

/*
 * 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.webconsole;


import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;


/**
 * SimpleWebConsolePlugin is an utility class that provides default
 * implementation of the {@link AbstractWebConsolePlugin} and supports the
 * following features:
 * 
    *
  • Methods for (un)registering the web console plugin service
  • *
  • Default implementation for resource loading
  • *
*/ public abstract class SimpleWebConsolePlugin extends AbstractWebConsolePlugin { // Serializable UID private static final long serialVersionUID = 1500463493078823878L; // used for standard AbstractWebConsolePlugin implementation private final String label; private final String title; private final String category; private final String css[]; private final String labelRes; private final int labelResLen; // used for service registration private final Object regLock = new Object(); private ServiceRegistration reg; // used to obtain services. Structure is: service name -> ServiceTracker private final Map services = new HashMap(); /** * Creates new Simple Web Console Plugin with the default category * ({@code null}) * * @param label the front label. See * {@link AbstractWebConsolePlugin#getLabel()} * @param title the plugin title . See * {@link AbstractWebConsolePlugin#getTitle()} * @param css the additional plugin CSS. See * {@link AbstractWebConsolePlugin#getCssReferences()} */ public SimpleWebConsolePlugin( String label, String title, String css[] ) { this( label, title, null, css ); } /** * Creates new Simple Web Console Plugin with the given category. * * @param label the front label. See * {@link AbstractWebConsolePlugin#getLabel()} * @param title the plugin title . See * {@link AbstractWebConsolePlugin#getTitle()} * @param category the plugin's navigation category. See * {@link AbstractWebConsolePlugin#getCategory()} * @param css the additional plugin CSS. See * {@link AbstractWebConsolePlugin#getCssReferences()} */ public SimpleWebConsolePlugin( String label, String title, String category, String css[] ) { if ( label == null ) { throw new NullPointerException( "Null label" ); } if ( title == null ) { throw new NullPointerException( "Null title" ); } this.label = label; this.title = title; this.category = category; this.css = css; this.labelRes = '/' + label + '/'; this.labelResLen = labelRes.length() - 1; } /** * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel() */ public final String getLabel() { return label; } /** * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle() */ public final String getTitle() { return title; } /** * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getCategory() */ public String getCategory() { return category; } /** * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getCssReferences() */ protected final String[] getCssReferences() { return css; } /** * Called internally by {@link AbstractWebConsolePlugin} to load resources. * * This particular implementation depends on the label. As example, if the * plugin is accessed as /system/console/abc, and the plugin * resources are accessed like /system/console/abc/res/logo.gif, * the code here will try load resource /res/logo.gif from the * bundle, providing the plugin. * * * @param path the path to read. * @return the URL of the resource or null if not found. */ protected URL getResource( String path ) { return ( path != null && path.startsWith( labelRes ) ) ? // getClass().getResource( path.substring( labelResLen ) ) : null; } // -- begin methods for plugin registration/unregistration /** * This is an utility method. It is used to register the plugin service. Don't * forget to call the {@link #unregister()} when the plugin is no longer * needed. * * @param bc the bundle context used for service registration. * @return self */ public final SimpleWebConsolePlugin register( BundleContext bc ) { synchronized ( regLock ) { activate( bc ); // don't know why this is needed! Hashtable props = new Hashtable(); props.put( WebConsoleConstants.PLUGIN_LABEL, getLabel() ); props.put( WebConsoleConstants.PLUGIN_TITLE, getTitle() ); if ( getCategory() != null ) { props.put( WebConsoleConstants.PLUGIN_CATEGORY, getCategory() ); } reg = bc.registerService( "javax.servlet.Servlet", this, props ); //$NON-NLS-1$ } return this; } /** * An utility method that removes the service, registered by the * {@link #register(BundleContext)} method. */ public final void unregister() { synchronized ( regLock ) { deactivate(); // is this needed? if ( reg != null ) reg.unregister(); reg = null; } } // -- end methods for plugin registration/unregistration // -- begin methods for obtaining services /** * Gets the service with the specified class name. Will create a new * {@link ServiceTracker} if the service is not already got. * * @param serviceName the service name to obtain * @return the service or null if missing. */ public final Object getService( String serviceName ) { ServiceTracker serviceTracker = ( ServiceTracker ) services.get( serviceName ); if ( serviceTracker == null ) { serviceTracker = new ServiceTracker( getBundleContext(), serviceName, null ); serviceTracker.open(); services.put( serviceName, serviceTracker ); } return serviceTracker.getService(); } /** * This method will close all service trackers, created by * {@link #getService(String)} method. If you override this method, don't * forget to call the super. * * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#deactivate() */ public void deactivate() { for ( Iterator ti = services.values().iterator(); ti.hasNext(); ) { ServiceTracker tracker = ( ServiceTracker ) ti.next(); tracker.close(); ti.remove(); } super.deactivate(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy