diff options
author | Roberto E. Escobar | 2014-06-12 02:11:13 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2014-08-28 23:58:39 +0000 |
commit | d4a7765ec05b4f124de987004505b5510b50d36a (patch) | |
tree | c9f7e8dca41e9021a4fe9bdcb9659564550493a9 /plugins/org.eclipse.osee.jaxrs.server | |
parent | 87185d728b0628e8562b5046ec092eb44ff5ba8c (diff) | |
download | org.eclipse.osee-d4a7765ec05b4f124de987004505b5510b50d36a.tar.gz org.eclipse.osee-d4a7765ec05b4f124de987004505b5510b50d36a.tar.xz org.eclipse.osee-d4a7765ec05b4f124de987004505b5510b50d36a.zip |
feature[ats_ATS55930]: Upgrade JAX-RS to 2.0 API using Apache CXF
Change JAX-RS endpoints to comply with 2.0 API
Change JAX-RS clients to use JAX-RS 2.0 Client API instead
of using Jersey's client implementation.
Remove all Jersey dependencies.
Integrate Apache CXF with OSEE JAX-RS
Change-Id: I866dff8516b91dbcde07b07819cf0bbc89b5d293
Diffstat (limited to 'plugins/org.eclipse.osee.jaxrs.server')
14 files changed, 324 insertions, 573 deletions
diff --git a/plugins/org.eclipse.osee.jaxrs.server/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.jaxrs.server/META-INF/MANIFEST.MF index e09aee57fe3..7d0eea2cb04 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.jaxrs.server/META-INF/MANIFEST.MF @@ -6,24 +6,30 @@ Bundle-Version: 0.18.0.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Service-Component: OSGI-INF/*.xml Import-Package: com.google.common.io, - com.sun.jersey.api.container.filter;version="1.18.0", - com.sun.jersey.api.container.filter.servlet;version="1.18.0", - com.sun.jersey.api.core;version="1.18.0", - com.sun.jersey.api.model;version="1.18.0", - com.sun.jersey.api.wadl.config;version="1.18.0", - com.sun.jersey.server.wadl;version="1.18.0", - com.sun.jersey.server.wadl.generators;version="1.18.0", - com.sun.jersey.server.wadl.generators.resourcedoc;version="1.18.0", - com.sun.jersey.server.wadl.generators.resourcedoc.model;version="1.18.0", - com.sun.jersey.server.wadl.generators.resourcedoc.xhtml;version="1.18.0", - com.sun.jersey.spi.container;version="1.18.0", - com.sun.jersey.spi.container.servlet;version="1.18.0", javax.annotation.security;version="1.1.0", - javax.servlet;version="2.5.0", - javax.servlet.http;version="2.5.0", - javax.ws.rs, - javax.ws.rs.core, - javax.ws.rs.ext, + javax.servlet;version="2.6.0", + javax.servlet.http;version="2.6.0", + javax.ws.rs;version="2.0.0", + javax.ws.rs.container;version="2.0.0", + javax.ws.rs.core;version="2.0.0", + javax.ws.rs.ext;version="2.0.0", + org.apache.cxf;version="3.0.0", + org.apache.cxf.binding;version="3.0.0", + org.apache.cxf.endpoint;version="3.0.0", + org.apache.cxf.feature;version="3.0.0", + org.apache.cxf.interceptor;version="3.0.0", + org.apache.cxf.interceptor.security;version="3.0.0", + org.apache.cxf.jaxrs;version="3.0.0", + org.apache.cxf.jaxrs.impl;version="3.0.0", + org.apache.cxf.jaxrs.provider.json;version="3.0.0", + org.apache.cxf.jaxrs.utils;version="3.0.0", + org.apache.cxf.jaxrs.validation;version="3.0.0", + org.apache.cxf.service.factory;version="3.0.0", + org.apache.cxf.transport;version="3.0.0", + org.apache.cxf.transport.common.gzip;version="3.0.0", + org.apache.cxf.transport.http;version="3.0.0", + org.apache.cxf.transport.servlet;version="3.0.0", + org.codehaus.jackson.jaxrs;version="1.9.13", org.eclipse.osee.authorization.admin, org.eclipse.osee.framework.jdk.core.type, org.eclipse.osee.framework.jdk.core.util, @@ -32,6 +38,3 @@ Import-Package: com.google.common.io, org.osgi.framework, org.osgi.service.http Bundle-Vendor: Eclipse Open System Engineering Environment -Require-Bundle: org.codehaus.jackson.core, - org.codehaus.jackson.jaxrs, - org.codehaus.jackson.mapper diff --git a/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.application.registry.xml b/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.application.registry.xml index 6cf025dfa7b..7ffe90bbc33 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.application.registry.xml +++ b/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.application.registry.xml @@ -4,7 +4,6 @@ <service> <provide interface="org.eclipse.osee.jaxrs.server.internal.applications.JaxRsApplicationRegistry"/> </service> - <reference bind="setHttpService" cardinality="1..1" interface="org.osgi.service.http.HttpService" name="HttpService" policy="static" /> <reference bind="setLogger" cardinality="1..1" interface="org.eclipse.osee.logger.Log" name="Log" policy="static"/> - <reference bind="setAuthorizationAdmin" cardinality="1..1" interface="org.eclipse.osee.authorization.admin.AuthorizationAdmin" name="AuthorizationAdmin" policy="static"/> + <reference bind="setJaxRsFactory" cardinality="1..1" interface="org.eclipse.osee.jaxrs.server.internal.applications.JaxRsFactory" name="JaxRsFactory" policy="static"/> </scr:component> diff --git a/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.factory.xml b/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.factory.xml new file mode 100644 index 00000000000..de3aec8da1c --- /dev/null +++ b/plugins/org.eclipse.osee.jaxrs.server/OSGI-INF/jaxrs.factory.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop"> + <implementation class="org.eclipse.osee.jaxrs.server.internal.ext.CxfJaxRsFactory" /> + <service> + <provide interface="org.eclipse.osee.jaxrs.server.internal.applications.JaxRsFactory"/> + </service> + <reference bind="setHttpService" cardinality="1..1" interface="org.osgi.service.http.HttpService" name="HttpService" policy="static" /> + <reference bind="setLogger" cardinality="1..1" interface="org.eclipse.osee.logger.Log" name="Log" policy="static"/> + <reference bind="setAuthorizationAdmin" cardinality="1..1" interface="org.eclipse.osee.authorization.admin.AuthorizationAdmin" name="AuthorizationAdmin" policy="static"/> +</scr:component> diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/AbstractJaxRsContainer.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/AbstractJaxRsContainer.java index 15d7c35b8dd..4a497a305d1 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/AbstractJaxRsContainer.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/AbstractJaxRsContainer.java @@ -57,6 +57,10 @@ public abstract class AbstractJaxRsContainer<H extends HttpServlet, C extends Ab return props; } + protected H getBaseServlet() { + return baseJaxsRsServlet; + } + @Override public String getServletContext() { return servletContextName.get(); diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/JaxRsApplicationRegistry.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/JaxRsApplicationRegistry.java index 454aed30496..f30c1b62fe7 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/JaxRsApplicationRegistry.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/applications/JaxRsApplicationRegistry.java @@ -13,17 +13,12 @@ package org.eclipse.osee.jaxrs.server.internal.applications; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import javax.ws.rs.core.Application; -import org.eclipse.osee.authorization.admin.AuthorizationAdmin; import org.eclipse.osee.jaxrs.server.internal.JaxRsConfiguration; import org.eclipse.osee.jaxrs.server.internal.JaxRsConstants; import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitable; import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitor; -import org.eclipse.osee.jaxrs.server.internal.ext.JerseyJaxRsFactory; -import org.eclipse.osee.jaxrs.server.internal.filters.SecurityContextFilter; -import org.eclipse.osee.jaxrs.server.internal.filters.SecurityContextProviderImpl; import org.eclipse.osee.logger.Log; import org.osgi.framework.Bundle; -import org.osgi.service.http.HttpService; /** * @author Roberto E. Escobar @@ -62,35 +57,24 @@ public class JaxRsApplicationRegistry implements JaxRsVisitable { new ConcurrentHashMap<String, JaxRsContainerProvider>(); private Log logger; - private HttpService httpService; - private AuthorizationAdmin authorizationAdmin; - private JaxRsFactory factory; - private String baseContext = JaxRsConstants.DEFAULT_JAXRS_BASE_CONTEXT; - public void setHttpService(HttpService httpService) { - this.httpService = httpService; - } + private String baseContext = JaxRsConstants.DEFAULT_JAXRS_BASE_CONTEXT; public void setLogger(Log logger) { this.logger = logger; } - public void setAuthorizationAdmin(AuthorizationAdmin authorizationAdmin) { - this.authorizationAdmin = authorizationAdmin; + public void setJaxRsFactory(JaxRsFactory factory) { + this.factory = factory; } public void start() { logger.trace("Starting [%s]...", getClass().getSimpleName()); - SecurityContextProviderImpl provider = new SecurityContextProviderImpl(logger, authorizationAdmin); - SecurityContextFilter filter = new SecurityContextFilter(provider); - - factory = new JerseyJaxRsFactory(logger, httpService, filter); } public void stop() { logger.trace("Stopping [%s]...", getClass().getSimpleName()); - this.factory = null; } public String getBaseContext() { diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/CxfJaxRsFactory.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/CxfJaxRsFactory.java new file mode 100644 index 00000000000..7ee24a05fa5 --- /dev/null +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/CxfJaxRsFactory.java @@ -0,0 +1,264 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.jaxrs.server.internal.ext; + +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.RuntimeDelegate; +import org.apache.cxf.Bus; +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.feature.Feature; +import org.apache.cxf.feature.LoggingFeature; +import org.apache.cxf.jaxrs.JAXRSBindingFactory; +import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; +import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper; +import org.apache.cxf.jaxrs.utils.ResourceUtils; +import org.apache.cxf.transport.common.gzip.GZIPFeature; +import org.apache.cxf.transport.servlet.CXFNonSpringServlet; +import org.eclipse.osee.authorization.admin.AuthorizationAdmin; +import org.eclipse.osee.jaxrs.JacksonFeature; +import org.eclipse.osee.jaxrs.OseeWebApplicationException; +import org.eclipse.osee.jaxrs.server.internal.JaxRsUtils; +import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitable; +import org.eclipse.osee.jaxrs.server.internal.applications.AbstractJaxRsApplicationContainer; +import org.eclipse.osee.jaxrs.server.internal.applications.AbstractJaxRsContainer; +import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsApplicationRegistry.JaxRsContainer; +import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsApplicationRegistry.JaxRsContainerProvider; +import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsContainerProviderImpl; +import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsFactory; +import org.eclipse.osee.jaxrs.server.internal.exceptions.GenericExceptionMapper; +import org.eclipse.osee.jaxrs.server.internal.filters.SecurityContextFilter; +import org.eclipse.osee.jaxrs.server.internal.filters.SecurityContextProviderImpl; +import org.eclipse.osee.logger.Log; +import org.osgi.service.http.HttpService; + +/** + * @author Roberto E. Escobar + */ +public final class CxfJaxRsFactory implements JaxRsFactory { + + private static final String APACHE_CXF_LOGGER = "org.apache.cxf.Logger"; + private static final String DEFAULT_CXF_LOGGING_IMPL = "org.apache.cxf.common.logging.Slf4jLogger"; + + private Log logger; + private HttpService httpService; + private AuthorizationAdmin authorizationAdmin; + + private List<Feature> features; + private List<? extends Object> providers; + private Map<String, Object> properties; + private Map<Object, Object> extensionMappings; + + public void setLogger(Log logger) { + this.logger = logger; + } + + public void setHttpService(HttpService httpService) { + this.httpService = httpService; + } + + public void setAuthorizationAdmin(AuthorizationAdmin authorizationAdmin) { + this.authorizationAdmin = authorizationAdmin; + } + + public void start(Map<String, Object> props) { + logger.debug("Starting [%s]...", getClass().getSimpleName()); + + System.setProperty(APACHE_CXF_LOGGER, DEFAULT_CXF_LOGGING_IMPL); + + // Ensure CXF JAX-RS implementation is loaded + RuntimeDelegate runtimeDelegate = new org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl(); + RuntimeDelegate.setInstance(runtimeDelegate); + + SecurityContextProviderImpl provider = new SecurityContextProviderImpl(logger, authorizationAdmin); + SecurityContextFilter filter = new SecurityContextFilter(provider); + + List<Object> providers = new ArrayList<Object>(); + WebApplicationExceptionMapper waem = new WebApplicationExceptionMapper(); + waem.setPrintStackTrace(true); + waem.setAddMessageToResponse(true); + + providers.add(waem); + providers.add(new GenericExceptionMapper(logger)); + providers.addAll(JacksonFeature.getProviders()); + providers.add(filter); + this.providers = providers; + + List<Feature> features = new ArrayList<Feature>(); + LoggingFeature loggingFeature = new LoggingFeature(); + loggingFeature.setPrettyLogging(true); + + features.add(loggingFeature); + features.add(new GZIPFeature()); + this.features = features; + + Map<Object, Object> extensionMappings = new HashMap<Object, Object>(4); + extensionMappings.put("xml", MediaType.APPLICATION_XML); + extensionMappings.put("json", MediaType.APPLICATION_JSON); + extensionMappings.put("gzip", "application/gzip"); + extensionMappings.put("zip", "application/zip"); + this.extensionMappings = extensionMappings; + this.properties = props; + } + + public void stop() { + RuntimeDelegate.setInstance(null); + if (providers != null) { + providers.clear(); + providers = null; + } + if (features != null) { + features.clear(); + features = null; + } + if (extensionMappings != null) { + extensionMappings.clear(); + extensionMappings = null; + } + properties = null; + } + + private Map<Object, Object> getExtensionMappings() { + return extensionMappings; + } + + private List<? extends Object> getProviders() { + return providers; + } + + private List<Feature> getFeatures() { + return features; + } + + private Map<String, Object> getProperties() { + return properties; + } + + @Override + public JaxRsContainerProvider newJaxRsContainerProvider(String contextName) { + return new JaxRsContainerProviderImpl(this, contextName); + } + + @Override + public JaxRsContainer newJaxRsContainer(String contextName) { + Dictionary<String, Object> props = new Hashtable<String, Object>(); + CxfJaxRsContainer container = new CxfJaxRsContainer(logger, httpService, props); + container.setServletContext(contextName); + logger.trace("Create - [%s]", container); + return container; + } + + private CxfJaxRsApplicationContainer newApplicationContainer(String applicationContext) { + return new CxfJaxRsApplicationContainer(applicationContext); + } + + private CXFNonSpringServlet newBaseJaxsRsServlet(JaxRsVisitable visitable) { + return new CXFNonSpringServlet(); + } + + public Server newCxfServer(CXFNonSpringServlet servlet, String applicationPath, Application application) { + String contextName = servlet.getServletName(); + Bus bus = servlet.getBus(); + if (bus == null) { + throw new OseeWebApplicationException(Status.INTERNAL_SERVER_ERROR, + "Error initializing [%s] for application [%s] - bus was null", contextName, application); + } + + boolean ignoreApplicationPath = true; + boolean staticSubresourceResolution = true; + JAXRSServerFactoryBean bean = + ResourceUtils.createApplication(application, ignoreApplicationPath, staticSubresourceResolution); + + if (JaxRsUtils.hasPath(applicationPath)) { + String subAddress = JaxRsUtils.normalize(applicationPath); + bean.setAddress(subAddress); + } + + bean.setProviders(getProviders()); + bean.setFeatures(getFeatures()); + bean.setProperties(getProperties()); + bean.setExtensionMappings(getExtensionMappings()); + + bean.setBindingId(JAXRSBindingFactory.JAXRS_BINDING_ID); + bean.setTransportId("http://cxf.apache.org/transports/http"); + + bean.setBus(bus); + bean.setStart(false); + + Server server = bean.create(); + return server; + } + + private final class CxfJaxRsContainer extends AbstractJaxRsContainer<CXFNonSpringServlet, CxfJaxRsApplicationContainer> { + + public CxfJaxRsContainer(Log logger, HttpService httpService, Dictionary<String, Object> props) { + super(logger, httpService, props); + } + + @Override + protected CxfJaxRsApplicationContainer createApplicationContainer(String applicationContext) { + return newApplicationContainer(applicationContext); + } + + @Override + protected CXFNonSpringServlet createBaseJaxsRsServlet(JaxRsVisitable visitable) { + return newBaseJaxsRsServlet(visitable); + } + + @Override + protected void startContainer(CxfJaxRsApplicationContainer container) { + CXFNonSpringServlet baseServlet = getBaseServlet(); + container.startContainer(baseServlet); + } + + @Override + protected void stopContainer(CxfJaxRsApplicationContainer container) { + container.stopContainer(); + } + + }; + + private final class CxfJaxRsApplicationContainer extends AbstractJaxRsApplicationContainer { + + private final AtomicBoolean isRegistered = new AtomicBoolean(false); + private volatile Server server; + + public CxfJaxRsApplicationContainer(String applicationContext) { + super(applicationContext); + } + + public void startContainer(CXFNonSpringServlet servlet) { + if (!isRegistered.getAndSet(true)) { + Server newServer = newCxfServer(servlet, getApplicationContext(), getApplication()); + newServer.start(); + server = newServer; + } + } + + public void stopContainer() { + if (isRegistered.getAndSet(false)) { + if (server != null) { + server.stop(); + server.destroy(); + } + } + } + } + +} diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyJaxRsFactory.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyJaxRsFactory.java deleted file mode 100644 index a18e890b776..00000000000 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyJaxRsFactory.java +++ /dev/null @@ -1,210 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.jaxrs.server.internal.ext; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Dictionary; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import javax.servlet.http.HttpServlet; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response.Status; -import org.eclipse.osee.jaxrs.OseeWebApplicationException; -import org.eclipse.osee.jaxrs.server.internal.JaxRsUtils; -import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitable; -import org.eclipse.osee.jaxrs.server.internal.applications.AbstractJaxRsApplicationContainer; -import org.eclipse.osee.jaxrs.server.internal.applications.AbstractJaxRsContainer; -import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsApplicationRegistry.JaxRsContainer; -import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsApplicationRegistry.JaxRsContainerProvider; -import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsContainerProviderImpl; -import org.eclipse.osee.jaxrs.server.internal.applications.JaxRsFactory; -import org.eclipse.osee.jaxrs.server.internal.exceptions.GenericExceptionMapper; -import org.eclipse.osee.jaxrs.server.internal.filters.SecureResourceFilterFactory; -import org.eclipse.osee.jaxrs.server.internal.filters.SecurityContextFilter; -import org.eclipse.osee.jaxrs.server.internal.resources.ServicesResource; -import org.eclipse.osee.logger.Log; -import org.osgi.service.http.HttpService; -import com.sun.jersey.api.container.filter.UriConnegFilter; -import com.sun.jersey.api.core.DefaultResourceConfig; -import com.sun.jersey.api.core.ResourceConfig; -import com.sun.jersey.spi.container.ResourceFilterFactory; -import com.sun.jersey.spi.container.servlet.ServletContainer; - -/** - * @author Roberto E. Escobar - */ -public final class JerseyJaxRsFactory implements JaxRsFactory { - - private final Log logger; - private final HttpService httpService; - private final SecurityContextFilter securityContextFilter; - - private List<Object> singletons; - private List<Object> requestFilters; - - public JerseyJaxRsFactory(Log logger, HttpService httpService, SecurityContextFilter securityContextFilter) { - super(); - this.logger = logger; - this.httpService = httpService; - this.securityContextFilter = securityContextFilter; - } - - @Override - public JaxRsContainerProvider newJaxRsContainerProvider(String contextName) { - return new JaxRsContainerProviderImpl(this, contextName); - } - - @Override - public JaxRsContainer newJaxRsContainer(String contextName) { - Dictionary<String, Object> props = new Hashtable<String, Object>(); - JerseyJaxRsContainer container = new JerseyJaxRsContainer(logger, httpService, props); - container.setServletContext(contextName); - logger.trace("Create - [%s]", container); - return container; - } - - private List<Object> getResourceSingletons() { - if (singletons == null) { - List<Object> resources = new ArrayList<Object>(); - resources.add(new GenericExceptionMapper(logger)); - singletons = resources; - } - return singletons; - } - - private List<Object> getRequestFilters() { - if (requestFilters == null) { - List<Object> resources = new ArrayList<Object>(); - Map<String, MediaType> mappings = new HashMap<String, MediaType>(); - mappings.put("xml", MediaType.APPLICATION_XML_TYPE); - mappings.put("json", MediaType.APPLICATION_JSON_TYPE); - UriConnegFilter filter1 = new UriConnegFilter(mappings); - resources.add(filter1); - requestFilters = resources; - } - return requestFilters; - } - - private List<ResourceFilterFactory> getResourceFilterFactories() { - SecureResourceFilterFactory filterFactory = new SecureResourceFilterFactory(logger, securityContextFilter); - return Collections.<ResourceFilterFactory> singletonList(filterFactory); - } - - private JerseyJaxRsApplicationContainer newApplicationContainer(String applicationContext) { - return new JerseyJaxRsApplicationContainer(applicationContext); - } - - private DefaultResourceConfig newResourceConfig() { - DefaultResourceConfig config = new DefaultResourceConfig(); - Map<String, Object> properties = config.getProperties(); - properties.put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, getRequestFilters()); - properties.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, getResourceFilterFactories()); - for (Object resource : getResourceSingletons()) { - config.getSingletons().add(resource); - } - return config; - } - - private HttpServlet newBaseJaxsRsServlet(JaxRsVisitable visitable) { - DefaultResourceConfig config = newResourceConfig(); - config.getSingletons().add(new ServicesResource(visitable)); - return new ServletContainer(config); - } - - private HttpServlet newApplicationServlet(JaxRsVisitable visitable, Application application) { - DefaultResourceConfig config = newResourceConfig(); - config.add(application); - JerseyWadlGeneratorConfig wadl = new JerseyWadlGeneratorConfig(logger, visitable); - Map<String, Object> properties = config.getProperties(); - if (wadl.hasExtendedWadl()) { - properties.put(ResourceConfig.PROPERTY_WADL_GENERATOR_CONFIG, wadl); - } else { - properties.remove(ResourceConfig.PROPERTY_WADL_GENERATOR_CONFIG); - } - return new ServletContainer(config); - } - - private final class JerseyJaxRsContainer extends AbstractJaxRsContainer<HttpServlet, JerseyJaxRsApplicationContainer> { - - public JerseyJaxRsContainer(Log logger, HttpService httpService, Dictionary<String, Object> props) { - super(logger, httpService, props); - } - - @Override - protected JerseyJaxRsApplicationContainer createApplicationContainer(String applicationContext) { - return newApplicationContainer(applicationContext); - } - - @Override - protected HttpServlet createBaseJaxsRsServlet(JaxRsVisitable visitable) { - return newBaseJaxsRsServlet(visitable); - } - - @Override - protected void startContainer(JerseyJaxRsApplicationContainer container) { - String baseContext = getServletContext(); - Dictionary<String, Object> properties = getServletProperties(); - HttpService httpService = getHttpService(); - container.startContainer(httpService, baseContext, properties); - } - - @Override - protected void stopContainer(JerseyJaxRsApplicationContainer container) { - String baseContext = getServletContext(); - HttpService httpService = getHttpService(); - container.stopContainer(httpService, baseContext); - } - - }; - - private final class JerseyJaxRsApplicationContainer extends AbstractJaxRsApplicationContainer { - - private final AtomicBoolean isRegistered = new AtomicBoolean(false); - - public JerseyJaxRsApplicationContainer(String applicationContext) { - super(applicationContext); - } - - public void startContainer(HttpService httpService, String baseContext, Dictionary<String, Object> props) { - if (!isRegistered.getAndSet(true)) { - String contextName = getAbsoluteContext(baseContext); - Application application = getApplication(); - HttpServlet servlet = newApplicationServlet(this, application); - try { - httpService.registerServlet(contextName, servlet, props, null); - } catch (Exception ex) { - throw new OseeWebApplicationException(ex, Status.INTERNAL_SERVER_ERROR, - "Error registering servlet [%s] ", contextName); - } - } - } - - public void stopContainer(HttpService httpService, String baseContext) { - if (isRegistered.getAndSet(false)) { - String contextName = getAbsoluteContext(baseContext); - httpService.unregister(contextName); - } - } - - private String getAbsoluteContext(String baseContext) { - String appPath = JaxRsUtils.normalize(getApplicationContext()); - String path = String.format("%s%s", baseContext, appPath); - path = path.replaceAll("//", "/"); - return path; - } - } - -} diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyWadlGeneratorConfig.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyWadlGeneratorConfig.java deleted file mode 100644 index 8a9b431c946..00000000000 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/ext/JerseyWadlGeneratorConfig.java +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.jaxrs.server.internal.ext; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import javax.ws.rs.core.Application; -import org.eclipse.osee.framework.jdk.core.util.Lib; -import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitable; -import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitor; -import org.eclipse.osee.logger.Log; -import org.osgi.framework.Bundle; -import com.google.common.io.InputSupplier; -import com.sun.jersey.api.wadl.config.WadlGeneratorConfig; -import com.sun.jersey.api.wadl.config.WadlGeneratorDescription; -import com.sun.jersey.server.wadl.generators.WadlGeneratorApplicationDoc; -import com.sun.jersey.server.wadl.generators.WadlGeneratorGrammarsSupport; -import com.sun.jersey.server.wadl.generators.resourcedoc.WadlGeneratorResourceDocSupport; - -/** - * @author Roberto E. Escobar - */ -public class JerseyWadlGeneratorConfig extends WadlGeneratorConfig { - - private final Log logger; - private final JaxRsVisitable visitable; - - public JerseyWadlGeneratorConfig(Log logger, JaxRsVisitable visitable) { - this.logger = logger; - this.visitable = visitable; - } - - private Iterable<Bundle> getBundles() { - final List<Bundle> bundles = new ArrayList<Bundle>(); - visitable.accept(new JaxRsVisitor() { - - @Override - public void onApplication(String applicationContext, String componentName, Bundle bundle, Application application) { - bundles.add(bundle); - } - }); - return bundles; - } - - public boolean hasExtendedWadl() { - boolean result = false; - Iterable<Bundle> bundles = getBundles(); - for (Bundle bundle : bundles) { - result = hasExtendedWadl(bundle); - if (result) { - break; - } - } - return result; - } - - @Override - public List<WadlGeneratorDescription> configure() { - List<WadlGeneratorDescription> toReturn; - - InputStream appDocsStream = null; - InputStream grammarsStream = null; - InputStream resourceDocStream = null; - try { - appDocsStream = getAsInputStream("REST-INF/application-doc.xml", "applicationDocs"); - grammarsStream = getAsInputStream("REST-INF/application-grammars.xml", "grammars"); - resourceDocStream = getAsInputStream("REST-INF/resourcedoc.xml", "resourceDoc"); - - toReturn = generator(WadlGeneratorApplicationDoc.class) // - .prop("applicationDocsStream", appDocsStream) // - .generator(WadlGeneratorGrammarsSupport.class) // - .prop("grammarsStream", grammarsStream) // - .generator(WadlGeneratorResourceDocSupport.class) // - .prop("resourceDocStream", resourceDocStream) // - .descriptions(); - } catch (Exception ex) { - logger.error(ex, "Error generating wadl"); - toReturn = Collections.emptyList(); - } finally { - Lib.close(appDocsStream); - Lib.close(grammarsStream); - Lib.close(resourceDocStream); - } - return toReturn; - } - - private static InputSupplier<InputStream> newSupplier(final URL url) { - return new InputSupplier<InputStream>() { - @Override - public InputStream getInput() throws IOException { - return url.openStream(); - } - }; - } - - private InputStream getAsInputStream(String path, String xmlRoot) throws Exception { - RestResourceConcatenator concat = new RestResourceConcatenator(); - concat.initialize(xmlRoot); - Iterable<Bundle> bundles = getBundles(); - for (Bundle bundle : bundles) { - if (hasExtendedWadl(bundle)) { - URL url = bundle.getResource(path); - concat.addResource(newSupplier(url)); - } - } - return concat.getAsInputStream(); - } - - private boolean hasEntries(Bundle bundle, String... paths) { - // if you don't pass in any paths, this will return true - for (String path : paths) { - if (!hasEntry(bundle, path)) { - return false; - } - } - return true; - } - - private boolean hasExtendedWadl(Bundle bundle) { - return hasEntries(bundle, "REST-INF/application-doc.xml", "REST-INF/application-grammars.xml", - "REST-INF/resourcedoc.xml"); - } - - private boolean hasEntry(Bundle bundle, String path) { - return bundle.getEntry(path) != null; - } -} diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecureResourceFilterFactory.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecureResourceFilterFactory.java deleted file mode 100644 index 3aafaa82778..00000000000 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecureResourceFilterFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.jaxrs.server.internal.filters; - -import java.util.ArrayList; -import java.util.List; -import org.eclipse.osee.jaxrs.NoSecurityFilter; -import org.eclipse.osee.logger.Log; -import com.sun.jersey.api.container.filter.servlet.RolesAllowedResourceFilterFactory; -import com.sun.jersey.api.model.AbstractMethod; -import com.sun.jersey.spi.container.ResourceFilter; - -/** - * Ensures the security context filter {@link SecurityContextFilter} is always the first filter in the chain. - * - * @author Roberto E. Escobar - */ -public class SecureResourceFilterFactory extends RolesAllowedResourceFilterFactory { - - private static final String SECURE = "SECURE"; - private static final String INSECURE = "SKIPPED"; - - private final Log logger; - private final SecurityContextFilter securityContextFilter; - - public SecureResourceFilterFactory(Log logger, SecurityContextFilter securityContextFilter) { - super(); - this.logger = logger; - this.securityContextFilter = securityContextFilter; - } - - @Override - public List<ResourceFilter> create(AbstractMethod am) { - List<ResourceFilter> securityFilters = super.create(am); - if (securityFilters == null) { - securityFilters = new ArrayList<ResourceFilter>(); - } else { - securityFilters = new ArrayList<ResourceFilter>(securityFilters); - } - - boolean secure = isSecured(am); - if (secure) { - securityFilters.add(0, securityContextFilter); - } - logger.info("REST Security Filter: [%s] [%s]", secure ? SECURE : INSECURE, am); - return securityFilters; - } - - private boolean isSecured(AbstractMethod am) { - return !am.isAnnotationPresent(NoSecurityFilter.class) && // - !am.getResource().isAnnotationPresent(NoSecurityFilter.class); - } -}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextFilter.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextFilter.java index d63babbd6b9..5218f8f665a 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextFilter.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextFilter.java @@ -10,18 +10,16 @@ *******************************************************************************/ package org.eclipse.osee.jaxrs.server.internal.filters; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.ext.Provider; -import com.sun.jersey.spi.container.ContainerRequest; -import com.sun.jersey.spi.container.ContainerRequestFilter; -import com.sun.jersey.spi.container.ContainerResponseFilter; -import com.sun.jersey.spi.container.ResourceFilter; /** * @author Roberto E. Escobar */ @Provider -public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter { +public class SecurityContextFilter implements ContainerRequestFilter { private final SecurityContextProvider contextProvider; @@ -31,22 +29,11 @@ public class SecurityContextFilter implements ResourceFilter, ContainerRequestFi } @Override - public ContainerRequest filter(ContainerRequest request) { + public void filter(ContainerRequestContext request) { SecurityContext securityContext = contextProvider.getSecurityContext(request); if (securityContext != null) { request.setSecurityContext(securityContext); } - return request; - } - - @Override - public ContainerRequestFilter getRequestFilter() { - return this; - } - - @Override - public ContainerResponseFilter getResponseFilter() { - return null; } } diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProvider.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProvider.java index e6a6e60d03c..0329308490a 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProvider.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProvider.java @@ -10,14 +10,14 @@ *******************************************************************************/ package org.eclipse.osee.jaxrs.server.internal.filters; +import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.core.SecurityContext; -import com.sun.jersey.api.core.HttpRequestContext; /** * @author Roberto E. Escobar */ public interface SecurityContextProvider { - SecurityContext getSecurityContext(HttpRequestContext requestContext); + SecurityContext getSecurityContext(ContainerRequestContext requestContext); } diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProviderImpl.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProviderImpl.java index c4703a6192a..b6db993d006 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProviderImpl.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/filters/SecurityContextProviderImpl.java @@ -14,8 +14,10 @@ import java.security.Principal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriInfo; import org.eclipse.osee.authorization.admin.Authorization; import org.eclipse.osee.authorization.admin.AuthorizationAdmin; import org.eclipse.osee.authorization.admin.AuthorizationRequest; @@ -23,7 +25,6 @@ import org.eclipse.osee.authorization.admin.AuthorizationRequestBuilder; import org.eclipse.osee.framework.jdk.core.util.Strings; import org.eclipse.osee.jaxrs.OseeWebApplicationException; import org.eclipse.osee.logger.Log; -import com.sun.jersey.api.core.HttpRequestContext; /** * @author Roberto E. Escobar @@ -44,11 +45,12 @@ public class SecurityContextProviderImpl implements SecurityContextProvider { } @Override - public SecurityContext getSecurityContext(HttpRequestContext request) { - boolean isSecure = request.isSecure(); - Date requestDate = asDate(request.getHeaderValue(DATE_HEADER)); - String authType = request.getHeaderValue(AUTHORIZATION_HEADER); - String path = request.getPath(); + public SecurityContext getSecurityContext(ContainerRequestContext request) { + UriInfo uriInfo = request.getUriInfo(); + boolean isSecure = isSecure(uriInfo); + Date requestDate = asDate(request.getHeaderString(DATE_HEADER)); + String authType = request.getHeaderString(AUTHORIZATION_HEADER); + String path = uriInfo.getPath(); String method = request.getMethod(); AuthorizationRequest authRequest = AuthorizationRequestBuilder.newBuilder()// @@ -63,6 +65,10 @@ public class SecurityContextProviderImpl implements SecurityContextProvider { return new SecurityContextImpl(authorized); } + private boolean isSecure(UriInfo uriInfo) { + return uriInfo.getAbsolutePath().toASCIIString().startsWith("https"); + } + private Date asDate(String value) { Date toReturn = null; if (Strings.isValid(value)) { diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ApplicationResource.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ApplicationResource.java index 2cefbedf407..51211216649 100644 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ApplicationResource.java +++ b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ApplicationResource.java @@ -65,7 +65,7 @@ public class ApplicationResource { String absolutePath = getServletPath(); - URI build = UriBuilder.fromPath(absolutePath).path(applicationContext).path("application.wadl").build(); + URI build = UriBuilder.fromPath(absolutePath).path(applicationContext).queryParam("_wadl").build(); String path = build.toASCIIString(); info.setUri(path); toReturn.add(info); diff --git a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ServicesResource.java b/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ServicesResource.java deleted file mode 100644 index 2342c48520d..00000000000 --- a/plugins/org.eclipse.osee.jaxrs.server/src/org/eclipse/osee/jaxrs/server/internal/resources/ServicesResource.java +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.jaxrs.server.internal.resources; - -import javax.annotation.security.PermitAll; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; -import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitable; -import org.eclipse.osee.jaxrs.server.internal.JaxRsVisitor; -import org.osgi.framework.Bundle; - -/** - * @author Roberto E. Escobar - */ -@Path("services") -public class ServicesResource { - - private static final String CSS = "<style>" + "@CHARSET \"ISO-8859-1\"; " + // - ".heading { font-size: large; } " + // - ".field { font-weight: bold; } " + // - ".value { font-weight: normal; } " + // - ".porttypename { font-weight: bold; } " + // - "table { border: solid; border-collapse: collapse; border-width: 2px; } " + // - "td { border: solid; border-width: 1px; vertical-align: text-top; padding: 5px; } " + // - "</style>"; - - private final JaxRsVisitable visitable; - - public ServicesResource(JaxRsVisitable visitable) { - super(); - this.visitable = visitable; - } - - @PermitAll - @GET - @Produces(MediaType.TEXT_HTML) - public String getServices(final @Context UriInfo uriInfo) { - final StringBuilder builder = new StringBuilder(); - builder.append("<html>"); - builder.append("<head>"); - builder.append(CSS); - builder.append("<meta http-equiv=content-type content=\"text/html; charset=UTF-8\">"); - builder.append("<title>JAX-RS - Service list</title>"); - builder.append("</head>"); - builder.append("<br/><span class=\"heading\">Available RESTful services:</span><br/>"); - builder.append("<table cellpadding=\"1\" cellspacing=\"1\" border=\"1\" width=\"100%\">"); - - visitable.accept(new JaxRsVisitor() { - - @Override - public void onApplication(String applicationContext, String componentName, Bundle bundle, Application application) { - String absolutePath = getServletPath(); - UriBuilder uriBuilder = UriBuilder.fromPath(absolutePath).path(applicationContext); - String baseApplicationPath = uriBuilder.build().toASCIIString(); - String wadlPath = uriBuilder.path("application.wadl").build().toASCIIString(); - - builder.append("<tr><td>"); - builder.append("<span class=\"field\">Endpoint address:</span>"); - builder.append("<span class=\"value\">"); - builder.append(baseApplicationPath); - builder.append("</span>"); - builder.append("<br />"); - builder.append("<span class=\"field\">WADL :</span>"); - builder.append("<a href=\""); - builder.append(wadlPath); - builder.append("\">"); - builder.append(wadlPath); - builder.append("</a></td></tr>"); - } - - private String getServletPath() { - String absolutePath = uriInfo.getAbsolutePath().toASCIIString(); - absolutePath = absolutePath.replaceAll("/services", ""); - return absolutePath; - } - }); - builder.append("</table>"); - builder.append("</html>"); - return builder.toString(); - } - -} |