You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/07/25 19:51:23 UTC
svn commit: r1150809 - in /openejb/trunk/openejb3:
container/openejb-core/src/main/java/org/apache/openejb/
container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/
container/openejb-core/src/main/java/org/apache/openejb/config/ conta...
Author: rmannibucau
Date: Mon Jul 25 17:51:16 2011
New Revision: 1150809
URL: http://svn.apache.org/viewvc?rev=1150809&view=rev
Log:
OPENEJB-1237 starting work on REST EJBs, all injections doesn't work yet but it starts to be useable
Added:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Mon Jul 25 17:51:16 2011
@@ -1221,7 +1221,7 @@ public class BeanContext extends Deploym
// Create bean instance
- final InjectionProcessor injectionProcessor = new InjectionProcessor(beanConstructor.create(creationalContext), this.getInjections(), InjectionProcessor.unwrap(ctx));
+ final InjectionProcessor injectionProcessor = new InjectionProcessor(beanConstructor.create(creationalContext), this.getInjections(), InjectionProcessor.unwrap(ctx));
final Object beanInstance = injectionProcessor.createInstance();
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Mon Jul 25 17:51:16 2011
@@ -16,29 +16,6 @@
*/
package org.apache.openejb.assembler.classic;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.naming.Binding;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameAlreadyBoundException;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
-import javax.validation.ValidationException;
-import javax.validation.ValidatorFactory;
import org.apache.geronimo.connector.work.GeronimoWorkManager;
import org.apache.geronimo.connector.work.TransactionContextHandler;
import org.apache.geronimo.connector.work.WorkContextHandler;
@@ -80,6 +57,7 @@ import org.apache.openejb.loader.SystemI
import org.apache.openejb.persistence.JtaEntityManagerRegistry;
import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
+import org.apache.openejb.rest.ThreadLocalContextManager;
import org.apache.openejb.spi.ApplicationServer;
import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.spi.SecurityService;
@@ -98,6 +76,29 @@ import org.apache.xbean.recipe.ObjectRec
import org.apache.xbean.recipe.Option;
import org.apache.xbean.recipe.UnsetPropertiesRecipe;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.validation.ValidationException;
+import javax.validation.ValidatorFactory;
import java.io.File;
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
@@ -753,7 +754,7 @@ public class Assembler extends Assembler
// Debug.printContext(context);
- containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId, context);
+ containerSystemContext.bind("openejb/client/" + clientInfo.moduleId, context);
if (clientInfo.path != null) {
context.bind("info/path", clientInfo.path);
@@ -767,15 +768,24 @@ public class Assembler extends Assembler
context.bind("info/injections", injections);
for (String clientClassName : clientInfo.remoteClients) {
- containerSystem.getJNDIContext().bind("openejb/client/" + clientClassName, clientInfo.moduleId);
+ containerSystemContext.bind("openejb/client/" + clientClassName, clientInfo.moduleId);
}
for (String clientClassName : clientInfo.localClients) {
- containerSystem.getJNDIContext().bind("openejb/client/" + clientClassName, clientInfo.moduleId);
+ containerSystemContext.bind("openejb/client/" + clientClassName, clientInfo.moduleId);
logger.getChildLogger("client").info("createApplication.createLocalClient", clientClassName, clientInfo.moduleId);
}
}
+ // REST context resources
+ containerSystemContext.bind("openejb/Resource/rest/context/Request", ThreadLocalContextManager.REQUEST);
+ containerSystemContext.bind("openejb/Resource/rest/context/UriInfo", ThreadLocalContextManager.URI_INFO);
+ containerSystemContext.bind("openejb/Resource/rest/context/HttpHeaders", ThreadLocalContextManager.HTTP_HEADERS);
+ containerSystemContext.bind("openejb/Resource/rest/context/SecurityContext", ThreadLocalContextManager.SECURITY_CONTEXT);
+ // TODO:
+ // containerSystemContext.bind("openejb/Resource/rest/context/ContextResolver", ThreadLocalContextManager.CONTEXT_RESOLVER);
+ // containerSystemContext.bind("openejb/Resource/rest/context/Application", ThreadLocalContextManager.APPLICATION);
+
SystemInstance systemInstance = SystemInstance.get();
// WebApp
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Mon Jul 25 17:51:16 2011
@@ -119,6 +119,7 @@ import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.WebServiceRef;
@@ -3140,6 +3141,14 @@ public class AnnotationDeployer implemen
}
//
+ // @Context (REST)
+ //
+ for (Annotated<Field> field : annotationFinder.findMetaAnnotatedFields(Context.class)) {
+ Member member = new FieldMember(field.get());
+ buildContext(consumer, member);
+ }
+
+ //
// @WebServiceRef
//
@@ -3235,6 +3244,19 @@ public class AnnotationDeployer implemen
}
+ private void buildContext(JndiConsumer consumer, Member member) {
+ ResourceRef ref = new ResourceRef();
+ ref.setName(member.getDeclaringClass().getName() + "/" + member.getName());
+ ref.setLookupName("java:openejb/Resource/rest/context/" + member.getType().getSimpleName());
+
+ InjectionTarget target = new InjectionTarget();
+ target.setInjectionTargetClass(member.getDeclaringClass().getName());
+ target.setInjectionTargetName(member.getName());
+ ref.getInjectionTarget().add(target);
+
+ consumer.getResourceRef().add(ref);
+ }
+
/**
* Process @EJB into <ejb-ref> or <ejb-local-ref> for the specified member (field or method)
*
@@ -4592,8 +4614,9 @@ public class AnnotationDeployer implemen
Collection<String> classes = new HashSet<String>();
// annotations on classes
- List<Class<?>> annotatedClasses = finder.findAnnotatedClasses(Path.class);
- for (Class<?> clazz : annotatedClasses) {
+ List<Annotated<Class<?>>> annotatedClasses = finder.findMetaAnnotatedClasses(Path.class);
+ for (Annotated<Class<?>> aClazz : annotatedClasses) {
+ Class<?> clazz = aClazz.get();
int modifiers = clazz.getModifiers();
if (!Modifier.isAbstract(modifiers)) {
if (!isEJB(clazz)) {
@@ -4605,9 +4628,9 @@ public class AnnotationDeployer implemen
}
// methods annotations: inheritance is managed like it to be more efficient
- List<Method> methods = new ArrayList<Method>();
- methods.addAll(finder.findAnnotatedMethods(Path.class));
- for (Method method : methods) {
+ List<Annotated<Method>> methods = finder.findMetaAnnotatedMethods(Path.class);
+ for (Annotated<Method> aMethod : methods) {
+ Method method = aMethod.get();
Class<?> clazz = method.getDeclaringClass();
int modifiers = clazz.getModifiers();
if (!Modifier.isAbstract(modifiers)) {
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Mon Jul 25 17:51:16 2011
@@ -17,6 +17,12 @@
*/
package org.apache.openejb.config;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ContextResolver;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.assembler.classic.ContainerInfo;
import org.apache.openejb.assembler.classic.ResourceInfo;
@@ -101,6 +107,13 @@ public class AutoConfig implements Dynam
// Bean Validation is automatically handled
ignoredReferenceTypes.add(Validator.class.getName());
ignoredReferenceTypes.add(ValidatorFactory.class.getName());
+ // REST injections done via @Context and bound into a resource env...
+ ignoredReferenceTypes.add(Request.class.getName());
+ ignoredReferenceTypes.add(UriInfo.class.getName());
+ ignoredReferenceTypes.add(HttpHeaders.class.getName());
+ ignoredReferenceTypes.add(SecurityContext.class.getName());
+ ignoredReferenceTypes.add(ContextResolver.class.getName());
+ ignoredReferenceTypes.add(Application.class.getName());
}
private final ConfigurationFactory configFactory;
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.core.ivm.naming;
+
+/**
+ * taken from CXF to be able to bind it into JNDI managing the value in lazy mode (request time).
+ */
+public class AbstractThreadLocalProxy<T> {
+
+ private ThreadLocal<T> infos = new ThreadLocal<T>();
+
+ protected AbstractThreadLocalProxy() {
+ // no-op
+ }
+
+ public T get() {
+ return infos.get();
+ }
+
+ public void remove() {
+ infos.remove();
+ }
+
+ public void set(T value) {
+ infos.set(value);
+ }
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,26 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.rest;
+
+import javax.ws.rs.core.Application;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalApplication extends AbstractThreadLocalProxy<Application> {
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,24 @@
+package org.apache.openejb.rest;
+
+import javax.ws.rs.core.Application;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class ThreadLocalContextManager {
+ public static final ThreadLocalRequest REQUEST = new ThreadLocalRequest();
+ public static final ThreadLocalUriInfo URI_INFO = new ThreadLocalUriInfo();
+ public static final ThreadLocalHttpHeaders HTTP_HEADERS = new ThreadLocalHttpHeaders();
+ public static final ThreadLocalSecurityContext SECURITY_CONTEXT = new ThreadLocalSecurityContext();
+ public static final ThreadLocalContextResolver CONTEXT_RESOLVER = new ThreadLocalContextResolver();
+ public static final ThreadLocalApplication APPLICATION = new ThreadLocalApplication();
+
+ public static void reset() {
+ REQUEST.remove();
+ URI_INFO.remove();
+ HTTP_HEADERS.remove();
+ SECURITY_CONTEXT.remove();
+ CONTEXT_RESOLVER.remove();
+ APPLICATION.remove();
+ }
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.rest;
+
+import javax.ws.rs.ext.ContextResolver;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalContextResolver extends AbstractThreadLocalProxy<ContextResolver>
+ implements ContextResolver {
+
+ @SuppressWarnings("unchecked")
+ public Object getContext(Class type) {
+ return get() != null ? get().getContext(type) : null;
+ }
+
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache.openejb.rest;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalHttpHeaders extends AbstractThreadLocalProxy<HttpHeaders>
+ implements HttpHeaders {
+
+ public List<MediaType> getAcceptableMediaTypes() {
+ return get().getAcceptableMediaTypes();
+ }
+
+ public Map<String, Cookie> getCookies() {
+ return get().getCookies();
+ }
+
+ public Locale getLanguage() {
+ return get().getLanguage();
+ }
+
+ public MediaType getMediaType() {
+ return get().getMediaType();
+ }
+
+ public MultivaluedMap<String, String> getRequestHeaders() {
+ return get().getRequestHeaders();
+ }
+
+ public List<Locale> getAcceptableLanguages() {
+ return get().getAcceptableLanguages();
+ }
+
+ public List<String> getRequestHeader(String name) {
+ return get().getRequestHeader(name);
+ }
+
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.rest;
+
+import java.util.Date;
+import java.util.List;
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Variant;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalRequest extends AbstractThreadLocalProxy<Request>
+ implements Request {
+
+ public ResponseBuilder evaluatePreconditions(EntityTag eTag) {
+ return get().evaluatePreconditions(eTag);
+ }
+
+ public ResponseBuilder evaluatePreconditions(Date lastModified) {
+ return get().evaluatePreconditions(lastModified);
+ }
+
+ public ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag) {
+ return get().evaluatePreconditions(lastModified, eTag);
+ }
+
+ public Variant selectVariant(List<Variant> vars) throws IllegalArgumentException {
+ return get().selectVariant(vars);
+ }
+
+ public String getMethod() {
+ return get().getMethod();
+ }
+
+ public ResponseBuilder evaluatePreconditions() {
+ return get().evaluatePreconditions();
+ }
+
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.rest;
+
+import java.security.Principal;
+import javax.ws.rs.core.SecurityContext;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalSecurityContext extends AbstractThreadLocalProxy<SecurityContext>
+ implements SecurityContext {
+
+ public String getAuthenticationScheme() {
+ return get().getAuthenticationScheme();
+ }
+
+ public Principal getUserPrincipal() {
+ return get().getUserPrincipal();
+ }
+
+ public boolean isSecure() {
+ return get().isSecure();
+ }
+
+ public boolean isUserInRole(String role) {
+ return get().isUserInRole(role);
+ }
+
+}
Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,103 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.openejb.rest;
+
+import java.net.URI;
+import java.util.List;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalUriInfo extends AbstractThreadLocalProxy<UriInfo>
+ implements UriInfo {
+
+
+ public URI getAbsolutePath() {
+ return get().getAbsolutePath();
+ }
+
+ public UriBuilder getAbsolutePathBuilder() {
+ return get().getAbsolutePathBuilder();
+ }
+
+
+ public URI getBaseUri() {
+ return get().getBaseUri();
+ }
+
+ public UriBuilder getBaseUriBuilder() {
+ return get().getBaseUriBuilder();
+ }
+
+ public String getPath() {
+ return get().getPath();
+ }
+
+ public String getPath(boolean decode) {
+ return get().getPath(decode);
+ }
+
+ public List<PathSegment> getPathSegments() {
+ return get().getPathSegments();
+ }
+
+ public List<PathSegment> getPathSegments(boolean decode) {
+ return get().getPathSegments(decode);
+ }
+
+ public MultivaluedMap<String, String> getQueryParameters() {
+ return get().getQueryParameters();
+ }
+
+ public MultivaluedMap<String, String> getQueryParameters(boolean decode) {
+ return get().getQueryParameters(decode);
+ }
+
+ public URI getRequestUri() {
+ return get().getRequestUri();
+ }
+
+ public UriBuilder getRequestUriBuilder() {
+ return get().getRequestUriBuilder();
+ }
+
+ public MultivaluedMap<String, String> getPathParameters() {
+ return get().getPathParameters();
+ }
+
+ public MultivaluedMap<String, String> getPathParameters(boolean decode) {
+ return get().getPathParameters(decode);
+ }
+
+ public List<Object> getMatchedResources() {
+ return get().getMatchedResources();
+ }
+
+ public List<String> getMatchedURIs() {
+ return get().getMatchedURIs();
+ }
+
+ public List<String> getMatchedURIs(boolean decode) {
+ return get().getMatchedURIs(decode);
+ }
+
+}
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Mon Jul 25 17:51:16 2011
@@ -70,7 +70,6 @@ public class CxfRsHttpListener implement
}
}
}, httpResponse);
-
}
@Override public void deploySingleton(String fullContext, Object o, Application appInstance) {
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java Mon Jul 25 17:51:16 2011
@@ -1,8 +1,28 @@
package org.apache.openejb.server.cxf.rs;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ContextResolver;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxrs.JAXRSInvoker;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.MessageContentsList;
import org.apache.openejb.BeanContext;
+import org.apache.openejb.Injection;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.RpcContainer;
+import org.apache.openejb.rest.ThreadLocalContextManager;
/**
* @author Romain Manni-Bucau
@@ -15,7 +35,59 @@ public class OpenEJBEJBInvoker extends J
}
@Override public Object invoke(Exchange exchange, Object request, Object resourceObject) {
- throw new UnsupportedOperationException("to implement...");
+ final OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
+ final ClassResourceInfo cri = ori.getClassResourceInfo();
+ final Method method = cri.getMethodDispatcher().getMethod(ori);
+ final RpcContainer container = RpcContainer.class.cast(context.getContainer());
+
+ List<?> params;
+ if (request instanceof List) {
+ params = CastUtils.cast((List<?>) request);
+ } else if (request != null) {
+ params = new MessageContentsList(request);
+ } else {
+ params = new ArrayList<Object>();
+ }
+ Object[] parameters = params.toArray(new Object[params.size()]);
+
+ // injecting context parameters
+ super.insertExchange(method, parameters, exchange);
+
+ // binding context fields
+ for (Field field : cri.getContextFields()) {
+ Class<?> type = field.getType();
+ if (Request.class.equals(type)) {
+ Request binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, Request.class);
+ ThreadLocalContextManager.REQUEST.set(binding);
+ } else if (UriInfo.class.equals(type)) {
+ UriInfo binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, UriInfo.class);
+ ThreadLocalContextManager.URI_INFO.set(binding);
+ } else if (HttpHeaders.class.equals(type)) {
+ HttpHeaders binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, HttpHeaders.class);
+ ThreadLocalContextManager.HTTP_HEADERS.set(binding);
+ } else if (SecurityContext.class.equals(type)) {
+ SecurityContext binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, SecurityContext.class);
+ ThreadLocalContextManager.SECURITY_CONTEXT.set(binding);
+ } else if (Application.class.equals(type)) {
+ Application binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, Application.class);
+ ThreadLocalContextManager.APPLICATION.set(binding);
+ } else if (ContextResolver.class.equals(type)) {
+ // TODO
+ }
+ }
+
+ // invoking the EJB
+ try {
+ Object result = container.invoke(context.getDeploymentID(),
+ context.getInterfaceType(method.getDeclaringClass()),
+ method.getDeclaringClass(), method, parameters, null);
+ return new MessageContentsList(result);
+ } catch (OpenEJBException e) {
+ Response excResponse = JAXRSUtils.convertFaultToResponse(e, exchange.getInMessage());
+ return new MessageContentsList(excResponse);
+ } finally {
+ ThreadLocalContextManager.reset();
+ }
}
@Override public Object getServiceObject(Exchange exchange) {
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java Mon Jul 25 17:51:16 2011
@@ -21,20 +21,17 @@ import java.util.Properties;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.embeddable.EJBContainer;
-import javax.enterprise.inject.Default;
import javax.naming.Context;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Request;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.openejb.OpenEjbContainer;
import org.apache.openejb.server.cxf.rs.beans.SimpleEJB;
import org.junit.AfterClass;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
@@ -60,28 +57,49 @@ public class EjbDeploymentTest {
}
}
- @Ignore("to be implemented")
- @Test public void deploy() {
- // service works
+ @Test public void normal() {
assertNotNull(service);
- assertEquals("ok", service.ok(true));
+ assertEquals("ok", service.normal());
+ }
- // rest invocation works
+ @Test public void rest() {
String response = WebClient.create("http://localhost:4204").path("/ejb/rest").get(String.class);
assertEquals("ok", response);
}
- @Path("/ejb")
+ @Test public void restParameterInjected() {
+ String response = WebClient.create("http://localhost:4204").path("/ejb/param").get(String.class);
+ assertEquals("true", response);
+
+ response = WebClient.create("http://localhost:4204").path("/ejb/param").query("arg", "foo").get(String.class);
+ assertEquals("foo", response);
+ }
+
+ @Test public void restFieldInjected() {
+ Boolean response = WebClient.create("http://localhost:4204").path("/ejb/field").get(Boolean.class);
+ assertEquals(true, response.booleanValue());
+ }
+
@Stateless
+ @Path("/ejb")
public static class RESTIsCool {
- @javax.ws.rs.core.Context private UriInfo uriInfo;
@EJB private SimpleEJB simpleEJB;
+ @javax.ws.rs.core.Context Request request;
- @Path("/rest") @GET public String ok(@QueryParam("force") @DefaultValue("false") boolean force) {
- /*if (!(uriInfo != null || force)) {
- return "ko";
- }*/
+ @Path("/normal") @GET public String normal() {
return simpleEJB.ok();
}
+
+ @Path("/rest") @GET public String rest() {
+ return simpleEJB.ok();
+ }
+
+ @Path("/param") @GET public String param(@QueryParam("arg") @DefaultValue("true") String p) {
+ return p;
+ }
+
+ @Path("/field") @GET public boolean field() {
+ return "GET".equals(request.getMethod());
+ }
}
}
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java Mon Jul 25 17:51:16 2011
@@ -19,6 +19,8 @@ package org.apache.openejb.server.cxf.rs
import javax.ejb.EJB;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
/**
* @author Romain Manni-Bucau
@@ -26,8 +28,9 @@ import javax.ws.rs.Path;
@Path("/inject")
public class RestWithInjections {
@EJB private SimpleEJB simple;
+ @Context UriInfo uriInfo;
@Path("/ejb") @GET public boolean ejb() {
- return simple != null && "ok".equals(simple.ok());
+ return simple != null && "ok".equals(simple.ok()) && uriInfo != null;
}
}