IDEMPIERE-546 Integrate Apache Felix Web Console. Accessible at osgi/system/console using the administrator login.

This commit is contained in:
Heng Sin Low 2013-01-11 11:49:46 +08:00
parent 1bcccc6431
commit f830e2c469
34 changed files with 949 additions and 204 deletions

View File

@ -2,7 +2,7 @@
<?artifactRepository version='1.1.0'?> <?artifactRepository version='1.1.0'?>
<repository name='file:/home/hengsin/workspace/idempiere-trekglobal/lib/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'> <repository name='file:/home/hengsin/workspace/idempiere-trekglobal/lib/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
<properties size='2'> <properties size='2'>
<property name='p2.timestamp' value='1353402021279'/> <property name='p2.timestamp' value='1357720877759'/>
<property name='p2.compressed' value='false'/> <property name='p2.compressed' value='false'/>
</properties> </properties>
<mappings size='3'> <mappings size='3'>
@ -10,7 +10,14 @@
<rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/> <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
<rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/> <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
</mappings> </mappings>
<artifacts size='3'> <artifacts size='6'>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole.plugins.packageadmin' version='1.0.0'>
<properties size='3'>
<property name='artifact.size' value='26195'/>
<property name='download.size' value='26195'/>
<property name='download.md5' value='0d0b1172a4bb948dc62b8fca8310c179'/>
</properties>
</artifact>
<artifact classifier='osgi.bundle' id='org.apache.poi' version='3.7.0'> <artifact classifier='osgi.bundle' id='org.apache.poi' version='3.7.0'>
<properties size='3'> <properties size='3'>
<property name='artifact.size' value='1651480'/> <property name='artifact.size' value='1651480'/>
@ -18,6 +25,20 @@
<property name='download.md5' value='982062b95e5299e63d25de5144f5b136'/> <property name='download.md5' value='982062b95e5299e63d25de5144f5b136'/>
</properties> </properties>
</artifact> </artifact>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole.plugins.memoryusage' version='1.0.4'>
<properties size='3'>
<property name='artifact.size' value='50278'/>
<property name='download.size' value='50278'/>
<property name='download.md5' value='4efb370c95ffb8c3202bf5634208c313'/>
</properties>
</artifact>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole' version='4.0.0'>
<properties size='3'>
<property name='artifact.size' value='591992'/>
<property name='download.size' value='591992'/>
<property name='download.md5' value='8f1ea912ae02473b9fd84389ec6f647f'/>
</properties>
</artifact>
<artifact classifier='osgi.bundle' id='com.springsource.javax.mail' version='1.4.5'> <artifact classifier='osgi.bundle' id='com.springsource.javax.mail' version='1.4.5'>
<properties size='3'> <properties size='3'>
<property name='artifact.size' value='570498'/> <property name='artifact.size' value='570498'/>

View File

@ -2,10 +2,10 @@
<?metadataRepository version='1.1.0'?> <?metadataRepository version='1.1.0'?>
<repository name='file:/home/hengsin/workspace/idempiere-trekglobal/lib/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'> <repository name='file:/home/hengsin/workspace/idempiere-trekglobal/lib/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
<properties size='2'> <properties size='2'>
<property name='p2.timestamp' value='1353402021281'/> <property name='p2.timestamp' value='1357720877761'/>
<property name='p2.compressed' value='false'/> <property name='p2.compressed' value='false'/>
</properties> </properties>
<units size='3'> <units size='6'>
<unit id='com.springsource.javax.mail' version='1.4.5' singleton='false'> <unit id='com.springsource.javax.mail' version='1.4.5' singleton='false'>
<update id='com.springsource.javax.mail' range='[0.0.0,1.4.5)' severity='0'/> <update id='com.springsource.javax.mail' range='[0.0.0,1.4.5)' severity='0'/>
<properties size='4'> <properties size='4'>
@ -57,6 +57,132 @@
</instructions> </instructions>
</touchpointData> </touchpointData>
</unit> </unit>
<unit id='org.apache.felix.webconsole' version='4.0.0' singleton='false'>
<update id='org.apache.felix.webconsole' range='[0.0.0,4.0.0)' severity='0'/>
<properties size='4'>
<property name='org.eclipse.equinox.p2.name' value='Apache Felix Web Management Console'/>
<property name='org.eclipse.equinox.p2.description' value='Web Based Management Console for OSGi Frameworks. See http://felix.apache.org/site/apache-felix-web-console.html for more information on this bundle.'/>
<property name='org.eclipse.equinox.p2.provider' value='The Apache Software Foundation'/>
<property name='org.eclipse.equinox.p2.doc.url' value='http://felix.apache.org/site/apache-felix-web-console.html'/>
</properties>
<provides size='10'>
<provided namespace='org.eclipse.equinox.p2.iu' name='org.apache.felix.webconsole' version='4.0.0'/>
<provided namespace='osgi.bundle' name='org.apache.felix.webconsole' version='4.0.0'/>
<provided namespace='java.package' name='org.apache.felix.webconsole' version='3.1.2'/>
<provided namespace='java.package' name='org.json' version='0.0.0'/>
<provided namespace='java.package' name='org.apache.commons.io' version='1.4.0'/>
<provided namespace='java.package' name='org.apache.commons.io.output' version='1.4.0'/>
<provided namespace='java.package' name='org.apache.commons.io.input' version='1.4.0'/>
<provided namespace='java.package' name='org.apache.commons.io.filefilter' version='1.4.0'/>
<provided namespace='java.package' name='org.apache.commons.io.comparator' version='1.4.0'/>
<provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
</provides>
<requires size='21'>
<required namespace='java.package' name='org.apache.felix.bundlerepository' range='[2.0.0,3.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.obr' range='[1.0.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.cm' range='[1.2.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.condpermadmin' range='[1.0.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.log' range='[1.3.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.metatype' range='[1.1.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.permissionadmin' range='[1.2.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.prefs' range='[1.1.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.wireadmin' range='[1.0.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='javax.servlet' range='2.4.0'/>
<required namespace='java.package' name='javax.servlet.http' range='2.4.0'/>
<required namespace='java.package' name='org.apache.commons.fileupload' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.apache.commons.fileupload.disk' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.apache.commons.fileupload.servlet' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.apache.felix.webconsole' range='[3.1.0,3.2.0)'/>
<required namespace='java.package' name='org.osgi.framework' range='[1.4.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.service.http' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.service.metatype' range='[1.1.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.packageadmin' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.service.startlevel' range='[1.1.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.util.tracker' range='[1.3.0,2.0.0)'/>
</requires>
<artifacts size='1'>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole' version='4.0.0'/>
</artifacts>
<touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
<touchpointData size='1'>
<instructions size='1'>
<instruction key='manifest'>
Bundle-SymbolicName: org.apache.felix.webconsole&#xA;Bundle-Version: 4.0.0&#xA;
</instruction>
</instructions>
</touchpointData>
</unit>
<unit id='org.apache.felix.webconsole.plugins.packageadmin' version='1.0.0' singleton='false'>
<update id='org.apache.felix.webconsole.plugins.packageadmin' range='[0.0.0,1.0.0)' severity='0'/>
<properties size='4'>
<property name='org.eclipse.equinox.p2.name' value='Apache Felix Web Console Package Admin Service Plugin'/>
<property name='org.eclipse.equinox.p2.description' value='Plugin providing support to query the Package Admin service for various details; e.g. finding duplicate package exports or finding bundles exporting given packages'/>
<property name='org.eclipse.equinox.p2.provider' value='The Apache Software Foundation'/>
<property name='org.eclipse.equinox.p2.doc.url' value='http://www.apache.org/'/>
</properties>
<provides size='3'>
<provided namespace='org.eclipse.equinox.p2.iu' name='org.apache.felix.webconsole.plugins.packageadmin' version='1.0.0'/>
<provided namespace='osgi.bundle' name='org.apache.felix.webconsole.plugins.packageadmin' version='1.0.0'/>
<provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
</provides>
<requires size='8'>
<required namespace='java.package' name='javax.servlet' range='0.0.0'/>
<required namespace='java.package' name='javax.servlet.http' range='0.0.0'/>
<required namespace='java.package' name='org.apache.commons.io' range='[1.4.0,2.0.0)'/>
<required namespace='java.package' name='org.apache.felix.webconsole' range='[3.1.0,4.0.0)'/>
<required namespace='java.package' name='org.json' range='0.0.0'/>
<required namespace='java.package' name='org.osgi.framework' range='[1.3.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.service.packageadmin' range='[1.2.0,2.0.0)'/>
<required namespace='java.package' name='org.osgi.util.tracker' range='[1.3.0,2.0.0)'/>
</requires>
<artifacts size='1'>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole.plugins.packageadmin' version='1.0.0'/>
</artifacts>
<touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
<touchpointData size='1'>
<instructions size='1'>
<instruction key='manifest'>
Bundle-SymbolicName: org.apache.felix.webconsole.plugins.packageadmin&#xA;Bundle-Version: 1.0.0&#xA;
</instruction>
</instructions>
</touchpointData>
</unit>
<unit id='org.apache.felix.webconsole.plugins.memoryusage' version='1.0.4' singleton='false'>
<update id='org.apache.felix.webconsole.plugins.memoryusage' range='[0.0.0,1.0.4)' severity='0'/>
<properties size='4'>
<property name='org.eclipse.equinox.p2.name' value='Apache Felix Web Console Memory Usage Plugin'/>
<property name='org.eclipse.equinox.p2.description' value='Plugin providing plugins to the Felix Shell and Web Console to observe the VMs memory use and cause try to get thread dumps etc.'/>
<property name='org.eclipse.equinox.p2.provider' value='The Apache Software Foundation'/>
<property name='org.eclipse.equinox.p2.doc.url' value='http://www.apache.org/'/>
</properties>
<provides size='3'>
<provided namespace='org.eclipse.equinox.p2.iu' name='org.apache.felix.webconsole.plugins.memoryusage' version='1.0.4'/>
<provided namespace='osgi.bundle' name='org.apache.felix.webconsole.plugins.memoryusage' version='1.0.4'/>
<provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
</provides>
<requires size='9'>
<required namespace='java.package' name='org.osgi.service.log' range='[1.3.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.cm' range='[1.2.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='org.osgi.service.metatype' range='[1.1.0,2.0.0)' optional='true'/>
<required namespace='java.package' name='javax.servlet' range='[2.3.0,4.0.0)' optional='true'/>
<required namespace='java.package' name='javax.servlet.http' range='[2.3.0,4.0.0)' optional='true'/>
<required namespace='java.package' name='org.apache.felix.webconsole' range='[3.0.0,3.2.0)' optional='true'/>
<required namespace='java.package' name='org.apache.felix.shell' range='[1.0.0,1.1.0)' optional='true'/>
<required namespace='java.package' name='javax.management' range='0.0.0'/>
<required namespace='java.package' name='org.osgi.framework' range='[1.3.0,2.0.0)'/>
</requires>
<artifacts size='1'>
<artifact classifier='osgi.bundle' id='org.apache.felix.webconsole.plugins.memoryusage' version='1.0.4'/>
</artifacts>
<touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
<touchpointData size='1'>
<instructions size='1'>
<instruction key='manifest'>
Bundle-SymbolicName: org.apache.felix.webconsole.plugins.memoryusage&#xA;Bundle-Version: 1.0.4&#xA;
</instruction>
</instructions>
</touchpointData>
</unit>
<unit id='com.springsource.javax.activation' version='1.1.1' singleton='false'> <unit id='com.springsource.javax.activation' version='1.1.1' singleton='false'>
<update id='com.springsource.javax.activation' range='[0.0.0,1.1.1)' severity='0'/> <update id='com.springsource.javax.activation' range='[0.0.0,1.1.1)' severity='0'/>
<properties size='2'> <properties size='2'>

View File

@ -13,7 +13,6 @@
package org.eclipse.equinox.http.servlet.internal; package org.eclipse.equinox.http.servlet.internal;
import java.util.*; import java.util.*;
import javax.servlet.ServletConfig;
import org.eclipse.equinox.http.servlet.ExtendedHttpService; import org.eclipse.equinox.http.servlet.ExtendedHttpService;
import org.osgi.framework.*; import org.osgi.framework.*;
import org.osgi.service.http.HttpService; import org.osgi.service.http.HttpService;
@ -25,52 +24,22 @@ public class Activator implements BundleActivator {
private static final String[] HTTP_SERVICES_CLASSES = new String[] {HttpService.class.getName(), ExtendedHttpService.class.getName()}; private static final String[] HTTP_SERVICES_CLASSES = new String[] {HttpService.class.getName(), ExtendedHttpService.class.getName()};
private static BundleContext context; private static BundleContext context;
private static Map<Object, ServiceRegistration<?>> serviceRegistrations = new HashMap<Object, ServiceRegistration<?>>(); private static ServiceRegistration<?> serviceRegistration;
public void start(BundleContext bundleContext) throws Exception { public void start(BundleContext bundleContext) throws Exception {
startHttpServiceProxy(bundleContext); context = bundleContext;
serviceRegistration = startHttpServiceProxy(bundleContext);
} }
public void stop(BundleContext bundleContext) throws Exception { public void stop(BundleContext bundleContext) throws Exception {
stopHttpServiceProxy(bundleContext); stopHttpServiceProxy(bundleContext);
}
private static synchronized void startHttpServiceProxy(BundleContext bundleContext) {
context = bundleContext;
Object[] proxyServlets = serviceRegistrations.keySet().toArray();
for (int i = 0; i < proxyServlets.length; ++i) {
ServiceRegistration<?> registration = registerHttpService((ProxyServlet) proxyServlets[i]);
serviceRegistrations.put(proxyServlets[i], registration);
}
}
private static synchronized void stopHttpServiceProxy(BundleContext bundleContext) {
Object[] proxyServlets = serviceRegistrations.keySet().toArray();
for (int i = 0; i < proxyServlets.length; ++i) {
ServiceRegistration<?> registration = serviceRegistrations.put(proxyServlets[i], null);
registration.unregister();
}
context = null; context = null;
} }
static synchronized void addProxyServlet(ProxyServlet proxyServlet) { private static synchronized ServiceRegistration<?> startHttpServiceProxy(BundleContext bundleContext) {
ServiceRegistration<?> registration = null; HttpServiceProxyFactory factory = new HttpServiceProxyFactory();
if (context != null)
registration = registerHttpService(proxyServlet);
serviceRegistrations.put(proxyServlet, registration);
}
private static ServiceRegistration<?> registerHttpService(ProxyServlet proxyServlet) {
HttpServiceFactory factory = new HttpServiceFactory(proxyServlet);
Dictionary<String, String> serviceProperties = new Hashtable<String, String>(2); Dictionary<String, String> serviceProperties = new Hashtable<String, String>(2);
ServletConfig config = proxyServlet.getServletConfig();
Enumeration<String> initparameterNames = config.getInitParameterNames();
while (initparameterNames.hasMoreElements()) {
String name = (String) initparameterNames.nextElement();
serviceProperties.put(name, config.getInitParameter(name));
}
if (serviceProperties.get(Constants.SERVICE_VENDOR) == null) if (serviceProperties.get(Constants.SERVICE_VENDOR) == null)
serviceProperties.put(Constants.SERVICE_VENDOR, DEFAULT_SERVICE_VENDOR); serviceProperties.put(Constants.SERVICE_VENDOR, DEFAULT_SERVICE_VENDOR);
@ -80,9 +49,15 @@ public class Activator implements BundleActivator {
return context.registerService(HTTP_SERVICES_CLASSES, factory, serviceProperties); return context.registerService(HTTP_SERVICES_CLASSES, factory, serviceProperties);
} }
private static synchronized void stopHttpServiceProxy(BundleContext bundleContext) {
serviceRegistration.unregister();
}
static synchronized void addProxyServlet(ProxyServlet proxyServlet) {
HttpServiceProxyFactory.registerServletDelegate(proxyServlet.getHttpContext(), proxyServlet);
}
//
static synchronized void removeProxyServlet(ProxyServlet proxyServlet) { static synchronized void removeProxyServlet(ProxyServlet proxyServlet) {
ServiceRegistration<?> registration = serviceRegistrations.remove(proxyServlet); HttpServiceProxyFactory.unregisterServletDelegate(proxyServlet);
if (registration != null)
registration.unregister();
} }
} }

View File

@ -0,0 +1,223 @@
/******************************************************************************
* Copyright (C) 2013 Heng Sin Low *
* Copyright (C) 2013 Trek Global *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.eclipse.equinox.http.servlet.internal;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.eclipse.equinox.http.servlet.ExtendedHttpService;
import org.osgi.framework.Bundle;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;
/**
* @author hengsin
*
*/
public class HttpServiceProxy implements HttpService, ExtendedHttpService {
private Bundle bundle;
private Map<Filter, ExtendedHttpService> filterMap = new HashMap<Filter, ExtendedHttpService>();
private HttpServiceProxyFactory factory;
private List<FilterEntry> filters = new ArrayList<HttpServiceProxy.FilterEntry>();
private List<ServletEntry> servlets = new ArrayList<HttpServiceProxy.ServletEntry>();
private List<ResourceEntry> resources = new ArrayList<HttpServiceProxy.ResourceEntry>();
public HttpServiceProxy(Bundle bundle, HttpServiceProxyFactory httpServiceProxyFactory) {
this.bundle = bundle;
this.factory = httpServiceProxyFactory;
}
/* (non-Javadoc)
* @see org.eclipse.equinox.http.servlet.ExtendedHttpService#registerFilter(java.lang.String, javax.servlet.Filter, java.util.Dictionary, org.osgi.service.http.HttpContext)
*/
@Override
public void registerFilter(String alias, Filter filter,
Dictionary<String, String> initparams, HttpContext context)
throws ServletException, NamespaceException {
String httpContextClass = context != null ? context.getClass().getName() : DefaultHttpContext.class.getName();
HttpService delegate = factory.getHttpServiceDelegate(bundle, httpContextClass);
if (delegate != null && delegate instanceof ExtendedHttpService) {
((ExtendedHttpService)delegate).registerFilter(alias, filter, initparams, context);
filterMap.put(filter, (ExtendedHttpService) delegate);
} else {
filters.add(new FilterEntry(alias, filter, initparams, context));
}
}
/* (non-Javadoc)
* @see org.eclipse.equinox.http.servlet.ExtendedHttpService#unregisterFilter(javax.servlet.Filter)
*/
@Override
public void unregisterFilter(Filter filter) {
ExtendedHttpService service = filterMap.get(filter);
if (service != null) {
service.unregisterFilter(filter);
}
}
/* (non-Javadoc)
* @see org.osgi.service.http.HttpService#registerServlet(java.lang.String, javax.servlet.Servlet, java.util.Dictionary, org.osgi.service.http.HttpContext)
*/
@SuppressWarnings("rawtypes")
@Override
public void registerServlet(String alias, Servlet servlet,
Dictionary initparams, HttpContext context)
throws ServletException, NamespaceException {
String httpContextClass = context != null ? context.getClass().getName() : DefaultHttpContext.class.getName();
HttpService delegate = factory.getHttpServiceDelegate(bundle, httpContextClass);
if (delegate != null ) {
delegate.registerServlet(alias, servlet, initparams, context);
} else {
servlets.add(new ServletEntry(alias, servlet, initparams, context));
}
}
/* (non-Javadoc)
* @see org.osgi.service.http.HttpService#registerResources(java.lang.String, java.lang.String, org.osgi.service.http.HttpContext)
*/
@Override
public void registerResources(String alias, String name, HttpContext context)
throws NamespaceException {
String httpContextClass = context != null ? context.getClass().getName() : DefaultHttpContext.class.getName();
HttpService delegate = factory.getHttpServiceDelegate(bundle, httpContextClass);
if (delegate != null ) {
delegate.registerResources(alias, name, context);
} else {
resources.add(new ResourceEntry(alias, name, context));
}
}
/**
* process registration that happens before the start of http service delegate
* @param httpContext
* @throws ServletException
* @throws NamespaceException
*/
protected void processPendingRegistration(String httpContext) throws ServletException, NamespaceException {
if (!filters.isEmpty()) {
List<FilterEntry> list = new ArrayList<HttpServiceProxy.FilterEntry>();
list.addAll(filters);
filters.clear();
for (FilterEntry e : list) {
if (e.getHttpContext().equals(httpContext)) {
registerFilter(e.alias, e.filter, e.initparams, e.context);
} else {
filters.add(e);
}
}
}
if (!servlets.isEmpty()) {
List<ServletEntry> list = new ArrayList<HttpServiceProxy.ServletEntry>();
list.addAll(servlets);
servlets.clear();
for (ServletEntry e : list) {
if (e.getHttpContext().equals(httpContext)) {
registerServlet(e.alias, e.servlet, e.initparams, e.context);
} else {
servlets.add(e);
}
}
}
if (!resources.isEmpty()) {
List<ResourceEntry> list = new ArrayList<HttpServiceProxy.ResourceEntry>();
list.addAll(resources);
resources.clear();
for (ResourceEntry e : list) {
if (e.getHttpContext().equals(httpContext)) {
registerResources(e.alias, e.name, e.context);
} else {
resources.add(e);
}
}
}
}
/* (non-Javadoc)
* @see org.osgi.service.http.HttpService#unregister(java.lang.String)
*/
@Override
public void unregister(String alias) {
}
/* (non-Javadoc)
* @see org.osgi.service.http.HttpService#createDefaultHttpContext()
*/
@Override
public HttpContext createDefaultHttpContext() {
return new DefaultHttpContext(bundle);
}
class Entry {
protected HttpContext context;
protected Entry(HttpContext context) {
this.context = context;
}
protected String getHttpContext() {
return context != null ? context.getClass().getName() : DefaultHttpContext.class.getName();
}
}
class FilterEntry extends Entry {
protected String alias;
protected Filter filter;
protected Dictionary<String, String> initparams;
protected FilterEntry(String alias, Filter filter,
Dictionary<String, String> initparams, HttpContext context) {
super(context);
this.alias = alias;
this.filter = filter;
this.initparams = initparams;
}
}
class ServletEntry extends Entry {
protected String alias;
protected Servlet servlet;
protected Dictionary<?,?> initparams;
protected ServletEntry(String alias, Servlet servlet,
Dictionary<?, ?> initparams, HttpContext context) {
super(context);
this.alias = alias;
this.servlet = servlet;
this.initparams = initparams;
this.context = context;
}
}
class ResourceEntry extends Entry {
protected String alias;
protected String name;
protected ResourceEntry(String alias, String name, HttpContext context) {
super(context);
this.alias = alias;
this.name = name;
}
}
}

View File

@ -0,0 +1,89 @@
/******************************************************************************
* Copyright (C) 2013 Heng Sin Low *
* Copyright (C) 2013 Trek Global *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.eclipse.equinox.http.servlet.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.http.HttpService;
/**
*
* @author hengsin
*
*/
public class HttpServiceProxyFactory implements ServiceFactory<HttpService> {
private static Map<String, ProxyServlet> delegateMap = new HashMap<String, ProxyServlet>();
private static List<HttpServiceProxy> proxies = new ArrayList<HttpServiceProxy>();
@Override
public HttpService getService(Bundle bundle,
ServiceRegistration<HttpService> registration) {
HttpServiceProxy service = new HttpServiceProxy(bundle, this);
proxies.add(service);
return service;
}
@Override
public void ungetService(Bundle bundle,
ServiceRegistration<HttpService> registration, HttpService service) {
proxies.remove(service);
}
/**
*
* @param httpContext
* @param proxy
* @return the previous value associated with the key or null if there was no mapping for key
*/
public static synchronized ProxyServlet registerServletDelegate(String httpContext, ProxyServlet proxy) {
ProxyServlet old = delegateMap.put(httpContext, proxy);
for(HttpServiceProxy p : proxies) {
try {
p.processPendingRegistration(httpContext);
} catch (Exception e) {
}
}
return old;
}
/**
* @param proxy
* @return the proxy if it have been register previously
*/
public static synchronized ProxyServlet unregisterServletDelegate(ProxyServlet proxy) {
return delegateMap.remove(proxy.getHttpContext());
}
/**
*
* @param bundle
* @param httpContext
* @return http service delegate for httpContext ( if any )
*/
public HttpService getHttpServiceDelegate(Bundle bundle, String httpContext) {
ProxyServlet proxy = delegateMap.get(httpContext);
if (proxy != null)
return new HttpServiceImpl(bundle, proxy);
else
return null;
}
}

View File

@ -35,10 +35,14 @@ public class ProxyServlet extends HttpServlet implements Filter {
private Map<Filter, FilterRegistration> filterRegistrations = new HashMap<Filter, FilterRegistration>(); //filter --> filter registration; private Map<Filter, FilterRegistration> filterRegistrations = new HashMap<Filter, FilterRegistration>(); //filter --> filter registration;
private ProxyContext proxyContext; private ProxyContext proxyContext;
private String httpContext;
public void init(ServletConfig config) throws ServletException { public void init(ServletConfig config) throws ServletException {
super.init(config); super.init(config);
proxyContext = new ProxyContext(config.getServletContext()); proxyContext = new ProxyContext(config.getServletContext());
httpContext = config.getInitParameter("HttpContext.ClassName");
if (httpContext == null)
httpContext = DefaultHttpContext.class.getName();
Activator.addProxyServlet(this); Activator.addProxyServlet(this);
} }
@ -317,4 +321,7 @@ public class ProxyServlet extends HttpServlet implements Filter {
} }
public String getHttpContext() {
return httpContext;
}
} }

View File

@ -11,22 +11,14 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.equinox.http.servletbridge.internal; package org.eclipse.equinox.http.servletbridge.internal;
import org.eclipse.equinox.http.servlet.HttpServiceServlet;
import org.eclipse.equinox.servletbridge.BridgeServlet;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
private HttpServiceServlet httpServiceServlet;
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
httpServiceServlet = new HttpServiceServlet();
BridgeServlet.registerServletDelegate(httpServiceServlet);
} }
public void stop(BundleContext context) throws Exception { public void stop(BundleContext context) throws Exception {
BridgeServlet.unregisterServletDelegate(httpServiceServlet);
httpServiceServlet = null;
} }
} }

View File

@ -9,6 +9,7 @@ Eclipse-SourceReferences: scm:cvs:pserver:dev.eclipse.org:/cvsroot/rt:
idge;tag=v20100503 idge;tag=v20100503
Bundle-Version: 1.2.0.v20100503 Bundle-Version: 1.2.0.v20100503
Export-Package: org.eclipse.equinox.servletbridge;version="1.1.0" Export-Package: org.eclipse.equinox.servletbridge;version="1.1.0"
Import-Package: javax.servlet;version="2.3.0",javax.servlet.http;versi Import-Package: javax.servlet;version="2.3.0",
on="2.3.0" javax.servlet.http;version="2.3.0",
org.eclipse.equinox.http.servlet;version="1.1.0"
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2

View File

@ -17,6 +17,8 @@ import java.io.IOException;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.*; import javax.servlet.http.*;
import org.eclipse.equinox.http.servlet.HttpServiceServlet;
/** /**
* The BridgeServlet provides a means to bridge the servlet and OSGi * The BridgeServlet provides a means to bridge the servlet and OSGi
* runtimes. This class has 3 main responsibilities: * runtimes. This class has 3 main responsibilities:
@ -31,12 +33,9 @@ public class BridgeServlet extends HttpServlet {
static final String INCLUDE_PATH_INFO_ATTRIBUTE = "javax.servlet.include.path_info"; //$NON-NLS-1$ static final String INCLUDE_PATH_INFO_ATTRIBUTE = "javax.servlet.include.path_info"; //$NON-NLS-1$
private static final long serialVersionUID = 2825667412474494674L; private static final long serialVersionUID = 2825667412474494674L;
private static BridgeServlet instance;
private static HttpServlet servletDelegateInstance;
private HttpServlet delegate; private HttpServlet delegate;
// true if current HttpServlet is an HTTP Filter and false otherwise. // true if current HttpServlet is an HTTP Filter and false otherwise.
private static boolean delegateIsFilter; private boolean delegateIsFilter;
private int delegateReferenceCount;
/** /**
* init() is called by the Servlet Container and used to instantiate the frameworkLauncher which MUST be an instance of FrameworkLauncher. * init() is called by the Servlet Container and used to instantiate the frameworkLauncher which MUST be an instance of FrameworkLauncher.
@ -44,14 +43,17 @@ public class BridgeServlet extends HttpServlet {
*/ */
public void init() throws ServletException { public void init() throws ServletException {
super.init(); super.init();
setInstance(this); initDelegate();
} }
/** /**
* destroy() is called by the Servlet Container and used to first stop and then destroy the framework. * destroy() is called by the Servlet Container and used to first stop and then destroy the framework.
*/ */
public void destroy() { public void destroy() {
setInstance(null); try {
initDelegate();
} catch (ServletException e) {
}
super.destroy(); super.destroy();
} }
@ -94,7 +96,7 @@ public class BridgeServlet extends HttpServlet {
} }
} }
HttpServlet servletReference = acquireDelegateReference(); HttpServlet servletReference = delegate;
if (servletReference == null) { if (servletReference == null) {
// Cannot find the HttpServletService from OSGi registry services : // Cannot find the HttpServletService from OSGi registry services :
if (chain != null) { if (chain != null) {
@ -106,15 +108,11 @@ public class BridgeServlet extends HttpServlet {
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "BridgeServlet: " + req.getRequestURI()); //$NON-NLS-1$ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "BridgeServlet: " + req.getRequestURI()); //$NON-NLS-1$
} }
} else { } else {
try {
if (delegateIsFilter && chain != null) { if (delegateIsFilter && chain != null) {
((Filter) servletReference).doFilter(req, resp, chain); ((Filter) servletReference).doFilter(req, resp, chain);
} else { } else {
servletReference.service(req, resp); servletReference.service(req, resp);
} }
} finally {
releaseDelegateReference();
}
} }
} }
@ -130,93 +128,10 @@ public class BridgeServlet extends HttpServlet {
return lastSegment.indexOf('.') != -1; return lastSegment.indexOf('.') != -1;
} }
private static synchronized void setInstance(BridgeServlet servlet) { private void initDelegate() throws ServletException {
if ((instance != null) && (servlet != null)) delegate = new HttpServiceServlet();
throw new IllegalStateException("instance already set"); //$NON-NLS-1$ delegate.init(getServletConfig());
instance = servlet; delegateIsFilter = (delegate instanceof Filter);
if (instance == null)
servletDelegateInstance = null;
else if (servletDelegateInstance != null)
registerServletDelegate(servletDelegateInstance);
}
private synchronized void releaseDelegateReference() {
--delegateReferenceCount;
notifyAll();
}
private synchronized HttpServlet acquireDelegateReference() {
if (delegate != null)
++delegateReferenceCount;
return delegate;
}
/**
* registerServletDelegate is the hook method called from inside the OSGi runtime to register
* a servlet for which all future servlet calls will be delegated. If not null and no delegate
* is currently registered, init(ServletConfig) will be called on the servletDelegate before
* returning.
* @param servletDelegate - the servlet to register for delegation
*/
public static synchronized void registerServletDelegate(HttpServlet servletDelegate) {
if (instance == null) {
servletDelegateInstance = servletDelegate;
return;
}
servletDelegateInstance = null;
if (servletDelegate == null)
throw new NullPointerException("cannot register a null servlet delegate"); //$NON-NLS-1$
synchronized (instance) {
if (instance.delegate != null)
throw new IllegalStateException("A Servlet Proxy is already registered"); //$NON-NLS-1$
try {
// cache the flag if HttpServlet servlet delegate is an HTTP Filter.
BridgeServlet.delegateIsFilter = (servletDelegate instanceof Filter);
// initialize the servlet delegate.
servletDelegate.init(instance.getServletConfig());
} catch (ServletException e) {
instance.getServletContext().log("Error initializing servlet delegate", e); //$NON-NLS-1$
return;
}
instance.delegate = servletDelegate;
}
}
/**
* unregisterServletDelegate is the hook method called from inside the OSGi runtime to unregister a delegate.
* If the servletDelegate matches the current registered delegate destroy() is called on the servletDelegate.
* destroy() will not be called until the delegate is finished servicing any previous requests.
* @param servletDelegate - the servlet to unregister
*/
public static synchronized void unregisterServletDelegate(HttpServlet servletDelegate) {
if (instance == null) {
// shutdown already
return;
}
synchronized (instance) {
if (instance.delegate == null)
throw new IllegalStateException("No servlet delegate is registered"); //$NON-NLS-1$
if (instance.delegate != servletDelegate)
throw new IllegalStateException("Servlet delegate does not match registered servlet delegate"); //$NON-NLS-1$
HttpServlet oldProxy = instance.delegate;
instance.delegate = null;
BridgeServlet.delegateIsFilter = false;
while (instance.delegateReferenceCount != 0) {
try {
instance.wait();
} catch (InterruptedException e) {
// keep waiting for all requests to finish
}
}
oldProxy.destroy();
}
} }
static class ExtensionMappingRequest extends HttpServletRequestWrapper { static class ExtensionMappingRequest extends HttpServletRequestWrapper {

View File

@ -34,6 +34,10 @@
id="org.eclipse.gemini.web.feature" id="org.eclipse.gemini.web.feature"
version="0.0.0"/> version="0.0.0"/>
<includes
id="org.idempiere.felix.webconsole"
version="0.0.0"/>
<requires> <requires>
<import feature="org.adempiere.base" version="1.0.0" match="compatible"/> <import feature="org.adempiere.base" version="1.0.0" match="compatible"/>
</requires> </requires>
@ -322,4 +326,11 @@
version="1.4.5" version="1.4.5"
unpack="false"/> unpack="false"/>
<plugin
id="org.eclipse.equinox.cm"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature> </feature>

View File

@ -35,9 +35,9 @@
<configurations> <configurations>
<plugin id="org.adempiere.base" autoStart="true" startLevel="4" /> <plugin id="org.adempiere.base" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.eclipse.equinox.http.servlet" autoStart="true" startLevel="0" /> <plugin id="org.adempiere.eclipse.equinox.http.servlet" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.eclipse.equinox.http.servletbridge" autoStart="true" startLevel="0" /> <plugin id="org.adempiere.eclipse.equinox.http.servletbridge" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.eclipse.equinox.servletbridge" autoStart="true" startLevel="0" /> <plugin id="org.adempiere.eclipse.equinox.servletbridge" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.install" autoStart="true" startLevel="4" /> <plugin id="org.adempiere.install" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.replication.server" autoStart="true" startLevel="4" /> <plugin id="org.adempiere.replication.server" autoStart="true" startLevel="4" />
<plugin id="org.adempiere.report.jasper.webapp" autoStart="true" startLevel="4" /> <plugin id="org.adempiere.report.jasper.webapp" autoStart="true" startLevel="4" />
@ -53,6 +53,8 @@
<plugin id="org.eclipse.gemini.web.extender" autoStart="true" startLevel="4" /> <plugin id="org.eclipse.gemini.web.extender" autoStart="true" startLevel="4" />
<plugin id="org.eclipse.gemini.web.tomcat" autoStart="true" startLevel="4" /> <plugin id="org.eclipse.gemini.web.tomcat" autoStart="true" startLevel="4" />
<plugin id="org.eclipse.osgi.services" autoStart="true" startLevel="3" /> <plugin id="org.eclipse.osgi.services" autoStart="true" startLevel="3" />
<plugin id="org.idempiere.felix.webconsole" autoStart="true" startLevel="0" />
<plugin id="org.apache.felix.webconsole" autoStart="true" startLevel="0" />
<plugin id="org.idempiere.hazelcast.service" autoStart="true" startLevel="0" /> <plugin id="org.idempiere.hazelcast.service" autoStart="true" startLevel="0" />
<plugin id="org.restlet" autoStart="true" startLevel="3" /> <plugin id="org.restlet" autoStart="true" startLevel="3" />
<property name="org.eclipse.update.reconcile" value="false" /> <property name="org.eclipse.update.reconcile" value="false" />

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3,100 +3,120 @@
<plugin> <plugin>
<extension <extension
point="org.eclipse.equinox.http.registry.servlets"> point="org.eclipse.equinox.http.registry.servlets">
<serviceSelector
filter="(bundleSymbolicName=org.adempiere.webstore)">
</serviceSelector>
<servlet <servlet
alias="/advertisementServlet" alias="/advertisementServlet"
class="org.compiere.wstore.AdvertisementServlet"> class="org.compiere.wstore.AdvertisementServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/assetServlet" alias="/assetServlet"
class="org.compiere.wstore.AssetServlet"> class="org.compiere.wstore.AssetServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/basketServlet" alias="/basketServlet"
class="org.compiere.wstore.BasketServlet"> class="org.compiere.wstore.BasketServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/checkOutServlet" alias="/checkOutServlet"
class="org.compiere.wstore.CheckOutServlet"> class="org.compiere.wstore.CheckOutServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/click" alias="/click"
class="org.compiere.wstore.Click"> class="org.compiere.wstore.Click"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/expenseServlet" alias="/expenseServlet"
class="org.compiere.wstore.ExpenseServlet"> class="org.compiere.wstore.ExpenseServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/counter" alias="/counter"
class="org.compiere.wstore.Counter"> class="org.compiere.wstore.Counter"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/infoServlet" alias="/infoServlet"
class="org.compiere.wstore.InfoServlet"> class="org.compiere.wstore.InfoServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/invoiceServlet" alias="/invoiceServlet"
class="org.compiere.wstore.InvoiceServlet"> class="org.compiere.wstore.InvoiceServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/locationServlet" alias="/locationServlet"
class="org.compiere.wstore.LocationServlet"> class="org.compiere.wstore.LocationServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/loginServlet" alias="/loginServlet"
class="org.compiere.wstore.LoginServlet"> class="org.compiere.wstore.LoginServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/noteServlet" alias="/noteServlet"
class="org.compiere.wstore.NoteServlet"> class="org.compiere.wstore.NoteServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/orderServlet" alias="/orderServlet"
class="org.compiere.wstore.OrderServlet"> class="org.compiere.wstore.OrderServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/paymentServlet" alias="/paymentServlet"
class="org.compiere.wstore.PaymentServlet"> class="org.compiere.wstore.PaymentServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/productServlet" alias="/productServlet"
class="org.compiere.wstore.ProductServlet"> class="org.compiere.wstore.ProductServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/registrationServlet" alias="/registrationServlet"
class="org.compiere.wstore.RegistrationServlet"> class="org.compiere.wstore.RegistrationServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/requestServlet" alias="/requestServlet"
class="org.compiere.wstore.RequestServlet"> class="org.compiere.wstore.RequestServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/rfqServlet" alias="/rfqServlet"
class="org.compiere.wstore.RfQServlet"> class="org.compiere.wstore.RfQServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/searchServlet" alias="/searchServlet"
class="org.compiere.wstore.SearchServlet"> class="org.compiere.wstore.SearchServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/updateServlet" alias="/updateServlet"
class="org.compiere.wstore.UpdateServlet"> class="org.compiere.wstore.UpdateServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/workflowServlet" alias="/workflowServlet"
class="org.compiere.wstore.WorkflowServlet"> class="org.compiere.wstore.WorkflowServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/emailServlet" alias="/emailServlet"
class="org.compiere.wstore.EMailServlet"> class="org.compiere.wstore.EMailServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
<servlet <servlet
alias="/issueReportServlet" alias="/issueReportServlet"
class="org.compiere.wstore.IssueReportServlet"> class="org.compiere.wstore.IssueReportServlet"
httpcontextId="org.adempiere.webstore">
</servlet> </servlet>
</extension> </extension>

View File

@ -49,4 +49,7 @@ Import-Package: javax.servlet;version="2.5.0",
org.apache.taglibs.standard.tlv;version="1.1.2", org.apache.taglibs.standard.tlv;version="1.1.2",
org.eclipse.equinox.http.registry;version="1.0.0", org.eclipse.equinox.http.registry;version="1.0.0",
org.eclipse.equinox.http.servlet;version="1.1.0", org.eclipse.equinox.http.servlet;version="1.1.0",
org.eclipse.equinox.servletbridge;version="1.1.0" org.eclipse.equinox.servletbridge;version="1.1.0",
org.osgi.framework;version="1.6.0",
org.osgi.service.http;version="1.2.1"
Bundle-Activator: org.adempiere.webstore.Activator

View File

@ -21,8 +21,8 @@
<filter-name>equinoxBridgeFilter</filter-name> <filter-name>equinoxBridgeFilter</filter-name>
<filter-class>org.eclipse.equinox.servletbridge.BridgeFilter</filter-class> <filter-class>org.eclipse.equinox.servletbridge.BridgeFilter</filter-class>
<init-param> <init-param>
<param-name>bundleSymbolicName</param-name> <param-name>HttpContext.ClassName</param-name>
<param-value>org.adempiere.webstore</param-value> <param-value>org.adempiere.webstore.DefaultHttpContext</param-value>
</init-param> </init-param>
</filter> </filter>
<filter-mapping> <filter-mapping>

View File

@ -1,9 +1,12 @@
output.. = build/
bin.includes = META-INF/,\ bin.includes = META-INF/,\
*.*,\ *.*,\
WEB-INF/ WEB-INF/,\
plugin.xml
bin.excludes = src/**,\ bin.excludes = src/**,\
build/**,\ build/**,\
.settings/**,\ .settings/**,\
.classpath,\ .classpath,\
.project,\ .project,\
build.properties build.properties
source.. = src/

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.equinox.http.registry.httpcontexts">
<httpcontext
class="org.adempiere.webstore.DefaultHttpContext"
id="org.adempiere.webstore">
</httpcontext>
</extension>
</plugin>

View File

@ -0,0 +1,39 @@
/**
*
*/
package org.adempiere.webstore;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/**
* @author hengsin
*
*/
public class Activator implements BundleActivator {
static BundleContext bundleContext;
/**
* default constructor
*/
public Activator() {
}
/* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
bundleContext = context;
}
/* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
bundleContext = null;
}
}

View File

@ -0,0 +1,33 @@
package org.adempiere.webstore;
import java.io.IOException;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.service.http.HttpContext;
public class DefaultHttpContext implements HttpContext {
public DefaultHttpContext() {
}
@Override
public boolean handleSecurity(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// default behaviour assumes the container has already performed authentication
return true;
}
@Override
public URL getResource(String name) {
return Activator.bundleContext.getBundle().getResource(name);
}
@Override
public String getMimeType(String name) {
return null;
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.idempiere.felix.webconsole-feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.pde.FeatureBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.FeatureNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1 @@
bin.includes = feature.xml

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="org.idempiere.felix.webconsole"
label="Felix Web Console Feature"
version="1.0.0.qualifier">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<plugin
id="org.apache.felix.webconsole"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="org.apache.felix.webconsole.plugins.memoryusage"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="org.apache.felix.webconsole.plugins.packageadmin"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="org.idempiere.felix.webconsole"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.idempiere.felix.webconsole</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ds.core.builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6

View File

@ -0,0 +1,3 @@
eclipse.preferences.version=1
pluginProject.extensions=false
resolve.requirebundle=false

View File

@ -0,0 +1,29 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Web Console
Bundle-SymbolicName: org.idempiere.felix.webconsole
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: org.idempiere.felix.webconsole.Activator
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: javax.servlet;version="2.5.0",
javax.servlet.http;version="2.5.0",
javax.servlet.jsp;version="2.1.0",
javax.servlet.jsp.el;version="2.1.0",
javax.servlet.jsp.jstl.core;version="1.1.2",
javax.servlet.jsp.jstl.fmt;version="1.1.2",
javax.servlet.jsp.jstl.sql;version="1.1.2",
javax.servlet.jsp.jstl.tlv;version="1.1.2",
javax.servlet.jsp.resources;version="2.1.0",
javax.servlet.jsp.tagext;version="2.1.0",
javax.servlet.resources;version="2.5.0",
org.apache.felix.webconsole;version="3.1.2",
org.compiere.model,
org.compiere.util,
org.eclipse.equinox.http.registry;version="1.0.0",
org.eclipse.equinox.http.servlet;version="1.1.0",
org.eclipse.equinox.servletbridge;version="1.1.0",
org.osgi.framework;version="1.6.0",
org.osgi.service.http;version="1.2.1"
Web-ContextPath: osgi
Service-Component: OSGI-INF/securityprovider.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.idempiere.felix.webconsole.security.provider">
<implementation class="org.idempiere.felix.webconsole.SecurityProviderImpl"/>
<service>
<provide interface="org.apache.felix.webconsole.WebConsoleSecurityProvider"/>
</service>
</scr:component>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>Web Console</display-name>
<description></description>
<filter id="bridge">
<filter-name>equinoxBridgeFilter</filter-name>
<filter-class>org.eclipse.equinox.servletbridge.BridgeFilter</filter-class>
<init-param>
<param-name>HttpContext.ClassName</param-name>
<param-value>org.apache.felix.webconsole.internal.servlet.OsgiManagerHttpContext</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>equinoxBridgeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
This is required if your application bundles expose JSPs.
-->
<filter-mapping>
<filter-name>equinoxBridgeFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<mime-mapping>
<extension>css</extension>
<mime-type>text/css</mime-type>
</mime-mapping>
</web-app>

View File

@ -0,0 +1,7 @@
output.. = bin/
bin.includes = META-INF/,\
.,\
WEB-INF/,\
OSGI-INF/securityprovider.xml
src.includes = WEB-INF/
source.. = src/

View File

@ -0,0 +1,30 @@
package org.idempiere.felix.webconsole;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private static BundleContext context;
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
}
}

View File

@ -0,0 +1,48 @@
/**
*
*/
package org.idempiere.felix.webconsole;
import org.apache.felix.webconsole.WebConsoleSecurityProvider;
import org.compiere.model.MUser;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
/**
* @author hengsin
*
*/
public class SecurityProviderImpl implements WebConsoleSecurityProvider {
/** Logger */
protected CLogger log = CLogger.getCLogger(getClass());
/* (non-Javadoc)
* @see org.apache.felix.webconsole.WebConsoleSecurityProvider#authenticate(java.lang.String, java.lang.String)
*/
@Override
public Object authenticate(String username, String password) {
MUser user = MUser.get(Env.getCtx(), username, password);
if (user == null)
{
log.warning ("User not found: '" + username);
return null;
}
if (!user.isAdministrator())
{
log.warning ("Not a Sys Admin = " + username);
return null;
}
log.info ("Name=" + username);
return Boolean.TRUE;
}
/* (non-Javadoc)
* @see org.apache.felix.webconsole.WebConsoleSecurityProvider#authorize(java.lang.Object, java.lang.String)
*/
@Override
public boolean authorize(Object resource, String role) {
return true;
}
}

View File

@ -236,15 +236,15 @@ Export-Package: Lib,
optparse, optparse,
org.apache.commons.el, org.apache.commons.el,
org.apache.commons.el.parser, org.apache.commons.el.parser,
org.apache.commons.fileupload, org.apache.commons.fileupload;version="1.2.2",
org.apache.commons.fileupload.disk, org.apache.commons.fileupload.disk;version="1.2.2",
org.apache.commons.fileupload.portlet, org.apache.commons.fileupload.portlet;version="1.2.2",
org.apache.commons.fileupload.servlet, org.apache.commons.fileupload.servlet;version="1.2.2",
org.apache.commons.fileupload.util, org.apache.commons.fileupload.util;version="1.2.2",
org.apache.commons.io, org.apache.commons.io;version="2.1.0",
org.apache.commons.io.filefilter, org.apache.commons.io.filefilter;version="2.1.0",
org.apache.commons.io.input, org.apache.commons.io.input;version="2.1.0",
org.apache.commons.io.output, org.apache.commons.io.output;version="2.1.0",
org.apache.html.dom, org.apache.html.dom,
org.apache.wml, org.apache.wml,
org.apache.wml.dom, org.apache.wml.dom,