/* * 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.plugins.obr.internal; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.felix.webconsole.DefaultVariableResolver; import org.apache.felix.webconsole.SimpleWebConsolePlugin; import org.apache.felix.webconsole.WebConsoleUtil; /** * This class provides a plugin for rendering the available OSGi Bundle Repositories * and the resources they provide. */ class WebConsolePlugin extends SimpleWebConsolePlugin { private static final String LABEL = "obr"; //$NON-NLS-1$ private static final String TITLE = "%obr.pluginTitle"; //$NON-NLS-1$ private static final String CATEGORY = "OSGi"; //$NON-NLS-1$ private static final String CSS[] = { "/" + LABEL + "/res/plugin.css" }; //$NON-NLS-1$ //$NON-NLS-2$ // templates private final String TEMPLATE; private AbstractBundleRepositoryRenderHelper helper; /** * */ public WebConsolePlugin() { super( LABEL, TITLE, CSS ); // load templates TEMPLATE = readTemplateFile("/res/plugin.html"); //$NON-NLS-1$ } public String getCategory() { return CATEGORY; } /** * @see org.apache.felix.webconsole.SimpleWebConsolePlugin#deactivate() */ public void deactivate() { if ( helper != null ) { helper.dispose(); helper = null; } super.deactivate(); } /** * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected void renderContent( HttpServletRequest request, HttpServletResponse response ) throws IOException { // prepare variables DefaultVariableResolver vars = ( ( DefaultVariableResolver ) WebConsoleUtil.getVariableResolver( request ) ); vars.put( "__data__", getData( request ) ); //$NON-NLS-1$ response.getWriter().print( TEMPLATE ); } /** * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { if ( !hasRepositoryAdmin() ) { response.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "RepositoryAdmin service is missing" ); return; } final String action = request.getParameter( "action" ); //$NON-NLS-1$ final String deploy = request.getParameter( "deploy" ); //$NON-NLS-1$ final String deploystart = request.getParameter( "deploystart" ); //$NON-NLS-1$ final String optional = request.getParameter( "optional" ); //$NON-NLS-1$ if ( action != null ) { doAction( action, request.getParameter( "url" ) ); //$NON-NLS-1$ response.getWriter().print( getData( request ) ); return; } if ( deploy != null || deploystart != null ) { doDeploy( request.getParameterValues( "bundle" ), deploystart != null, optional != null ); //$NON-NLS-1$ doGet( request, response ); return; } super.doPost( request, response ); } AbstractBundleRepositoryRenderHelper getHelper() { if ( helper == null ) { try { helper = new FelixBundleRepositoryRenderHelper( this, getBundleContext() ); } catch ( Throwable felixt ) { // ClassNotFoundException, ClassDefNotFoundError try { helper = new OsgiBundleRepositoryRenderHelper( this, getBundleContext() ); } catch ( Throwable osgit ) { // ClassNotFoundException, ClassDefNotFoundError } } } return helper; } private boolean hasRepositoryAdmin() { AbstractBundleRepositoryRenderHelper helper = getHelper(); return helper != null && helper.hasRepositoryAdmin(); } private String getData( final HttpServletRequest request ) { AbstractBundleRepositoryRenderHelper helper = getHelper(); if ( helper == null || !helper.hasRepositoryAdmin() ) { return "{}"; //$NON-NLS-1$ } RequestInfo info = new RequestInfo( request ); final String filter; String list = info.getList(); if ( list != null ) { if ( "-".equals( list ) ) //$NON-NLS-1$ { StringBuffer sb = new StringBuffer( "(!(|" ); //$NON-NLS-1$ for ( int c = 0; c < 26; c++ ) { sb.append( "(presentationname=" ).append( ( char ) ( 'a' + c ) ) //$NON-NLS-1$ .append( "*)(presentationname=" ).append( ( char ) ( 'A' + c ) ) //$NON-NLS-1$ .append( "*)" ); //$NON-NLS-1$ } sb.append( "))" ); //$NON-NLS-1$ filter = sb.toString(); } else { filter = "(|(presentationname=" + list.toLowerCase() //$NON-NLS-1$ + "*)(presentationname=" + list.toUpperCase() + "*))"; //$NON-NLS-1$ //$NON-NLS-2$ } } else { String query = info.getQuery(); if ( query != null ) { if ( query.indexOf( '=' ) > 0 ) { if ( query.startsWith( "(" ) ) //$NON-NLS-1$ { filter = query; } else { filter = "(" + query + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } } else { filter = "(|(presentationame=*" + query + "*)(symbolicname=*" + query + "*))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } else { StringBuffer sb = new StringBuffer( "(&" ); //$NON-NLS-1$ for ( Enumeration e = request.getParameterNames(); e.hasMoreElements(); ) { String k = ( String ) e.nextElement(); String v = request.getParameter( k ); if ( v != null && v.length() > 0 && !"details".equals( k ) //$NON-NLS-1$ && !"deploy".equals( k ) //$NON-NLS-1$ && !"deploystart".equals( k ) //$NON-NLS-1$ && !"bundle".equals( k ) //$NON-NLS-1$ && !"optional".equals( k ) ) //$NON-NLS-1$ { sb.append( '(' ).append( k ).append( '=' ).append( v ).append( ')' ); } } sb.append( ')' ); filter = (sb.length() > 3) ? sb.toString() : null; } } return helper.getData( filter, info.showDetails(), getBundleContext().getBundles() ); } private void doAction( String action, String urlParam ) throws IOException, ServletException { AbstractBundleRepositoryRenderHelper helper = getHelper(); if ( helper != null ) { helper.doAction( action, urlParam ); } } private void doDeploy( String[] bundles, boolean start, boolean optional ) { AbstractBundleRepositoryRenderHelper helper = getHelper(); if ( helper != null ) { helper.doDeploy( bundles, start, optional ); } } private static class RequestInfo { private final HttpServletRequest request; private boolean details; private String query; private String list; RequestInfo( final HttpServletRequest request ) { this.request = request; } boolean showDetails() { getQuery(); return details; } String getQuery() { if ( query == null ) { String query = WebConsoleUtil.urlDecode( request.getParameter( "query" ) ); //$NON-NLS-1$ boolean details = false; if ( query == null && request.getPathInfo().length() > 5 ) { // cut off "/obr/" prefix (might want to use getTitle ??) String path = request.getPathInfo().substring( 5 ); int slash = path.indexOf( '/' ); if ( slash < 0 ) { // symbolic name only, version ?? query = "(symbolicname=" + path + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } else { query = "(&(symbolicname=" + path.substring( 0, slash ) //$NON-NLS-1$ + ")(version=" + path.substring( slash + 1 ) + "))"; //$NON-NLS-1$ //$NON-NLS-2$ details = true; } } this.query = query; this.details = details; } return query; } String getList() { if ( list == null ) { list = WebConsoleUtil.urlDecode( request.getParameter( "list" ) ); //$NON-NLS-1$ if ( list == null && !request.getParameterNames().hasMoreElements() && getQuery() == null ) { list = "a"; //$NON-NLS-1$ } } return list; } } }