Author: rmannibucau Date: Tue Jul 9 09:52:40 2013 New Revision: 1501172 URL: http://svn.apache.org/r1501172 Log: TOMEE-1000 openejb-hessian module - cdi integration + client through an HessianInitialContext
Added: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/Hessian.java tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/HessianExtension.java tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/HessianInitialContextFactory.java tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/ tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianCdiTest.java - copied, changed from r1500981, tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianInitialContextTest.java - copied, changed from r1500981, tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianServer.java tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianService.java tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java?rev=1501172&r1=1501171&r2=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java Tue Jul 9 09:52:40 2013 @@ -19,6 +19,7 @@ package org.apache.openejb.cdi; import org.apache.openejb.AppContext; import org.apache.openejb.BeanContext; import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.LogCategory; @@ -56,6 +57,7 @@ import java.util.concurrent.TimeUnit; * @version $Rev:$ $Date:$ */ public class OpenEJBLifecycle implements ContainerLifecycle { + public static final ThreadLocal<AppInfo> CURRENT_APP_INFO = new ThreadLocal<AppInfo>(); //Logger instance private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_CDI, OpenEJBLifecycle.class); @@ -178,11 +180,16 @@ public class OpenEJBLifecycle implements //Scan this.scannerService.scan(); + // just to let us write custom CDI Extension using our internals easily + CURRENT_APP_INFO.set(StartupObject.class.cast(startupObject).getAppInfo()); + //Deploy bean from XML. Also configures deployments, interceptors, decorators. deployer.deploy(scannerService); } catch (Exception e1) { Assembler.logger.error("CDI Beans module deployment failed", e1); throw new OpenEJBRuntimeException(e1); + } finally { + CURRENT_APP_INFO.remove(); } for (final BeanContext bc : stuff.getBeanContexts()) { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java?rev=1501172&r1=1501171&r2=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/WebContext.java Tue Jul 9 09:52:40 2013 @@ -187,7 +187,7 @@ public class WebContext { || ServletRequestAttributeListener.class.isAssignableFrom(beanClass); } - private WebBeansContext getWebBeansContext() { + public WebBeansContext getWebBeansContext() { if (webbeansContext == null) { return getAppContext().getWebBeansContext(); } Added: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/Hessian.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/Hessian.java?rev=1501172&view=auto ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/Hessian.java (added) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/api/Hessian.java Tue Jul 9 09:52:40 2013 @@ -0,0 +1,32 @@ +/* + * 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.cdi.api; + +import com.caucho.hessian.io.SerializerFactory; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Hessian { + String path() default ""; + boolean sendCollectionType() default true; + Class<? extends SerializerFactory> serializerFactory() default SerializerFactory.class; +} Added: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/HessianExtension.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/HessianExtension.java?rev=1501172&view=auto ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/HessianExtension.java (added) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/cdi/internal/HessianExtension.java Tue Jul 9 09:52:40 2013 @@ -0,0 +1,179 @@ +/* + * 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.cdi.internal; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.openejb.AppContext; +import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.assembler.classic.AppInfo; +import org.apache.openejb.cdi.OpenEJBLifecycle; +import org.apache.openejb.cdi.api.Hessian; +import org.apache.openejb.core.WebContext; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.server.hessian.HessianRegistry; +import org.apache.openejb.server.hessian.HessianServer; +import org.apache.openejb.server.hessian.HessianService; +import org.apache.openejb.spi.ContainerSystem; +import org.apache.webbeans.config.WebBeansContext; +import org.apache.webbeans.container.BeanManagerImpl; +import org.apache.webbeans.container.InjectableBeanManager; + +import javax.enterprise.context.Dependent; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.AfterDeploymentValidation; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.BeforeShutdown; +import javax.enterprise.inject.spi.Extension; +import javax.enterprise.inject.spi.ProcessBean; +import javax.enterprise.inject.spi.ProcessSessionBean; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Logger; + +public class HessianExtension implements Extension { + private static final Logger LOGGER = Logger.getLogger(HessianExtension.class.getName()); + + private final Collection<Pair<Class<?>, Bean<?>>> toDeploy = new ArrayList<Pair<Class<?>, Bean<?>>>(); + private final Collection<DeployedEndpoint> deployed = new ArrayList<DeployedEndpoint>(); + + protected <X> void findHessianWebServices(final @Observes ProcessBean<X> processBean) { + if (ProcessSessionBean.class.isInstance(processBean)) { + return; + } + + final Bean<X> bean = processBean.getBean(); + for (final Class<?> itf : bean.getBeanClass().getInterfaces()) { + final Hessian hessian = itf.getAnnotation(Hessian.class); + if (hessian != null) { + toDeploy.add(new ImmutablePair<Class<?>, Bean<?>>(itf, bean)); + } + } + } + + protected void deploy(final @Observes AfterDeploymentValidation afterDeploymentValidation, final BeanManager bm) { + final HessianService service = SystemInstance.get().getComponent(HessianService.class); + if (service == null) { + LOGGER.severe("HessianService not yet started, no hessian CDI webservices will be deployed"); + return; + } + + final HessianRegistry registry = service.getRegistry(); + + for (final Pair<Class<?>, Bean<?>> pair : toDeploy) { + final Class<?> itf = pair.getKey(); + final Hessian hessian = itf.getAnnotation(Hessian.class); + final Bean<?> bean = pair.getValue(); + final HessianServer server = new HessianServer(bean.getBeanClass().getClassLoader()); + try { + if (!hessian.serializerFactory().isInstance(server.getSerializerFactory())) { + server.serializerFactory(hessian.serializerFactory().newInstance()); + } + } catch (final Exception e) { + throw new OpenEJBRuntimeException(e); + } + server.sendCollectionType(hessian.sendCollectionType()); + if (Dependent.class.equals(bean.getScope())) { + LOGGER.warning("@Dependent can lead to memory leaks ATM"); + } + server.createSkeleton(bm.getReference(bean, itf, null), itf); + + final String name = getName(itf); + final String appName = findAppName(bm); + try { + LOGGER.info("Hessian(url=" + registry.deploy(itf.getClassLoader(), server, + service.getVirtualHost(), appName, + service.getAuthMethod(), service.getTransportGuarantee(), + service.getRealmName(), name) + ", interface=" + name + ")"); + deployed.add(new DeployedEndpoint(appName, name)); + } catch (final URISyntaxException e) { + throw new OpenEJBRuntimeException(e); + } + } + toDeploy.clear(); + } + + private static String findAppName(final BeanManager bm) { + final AppInfo currentApp = OpenEJBLifecycle.CURRENT_APP_INFO.get(); + if (currentApp == null) { + throw new IllegalStateException("Without OpenEJBLifecycle this Extension can't work correctly"); + } + + if (currentApp.webAppAlone) { + return currentApp.webApps.iterator().next().contextRoot; + } + + for (final AppContext app : SystemInstance.get().getComponent(ContainerSystem.class).getAppContexts()) { + for (final WebContext webContext : app.getWebContexts()) { + if (isSameContext(bm, webContext.getWebBeansContext())) { + String contextRoot = webContext.getContextRoot(); + if (contextRoot != null) { + if (contextRoot.startsWith("/")) { + return contextRoot.substring(1); + } + return contextRoot; + } + return webContext.getId(); + } + } + if (isSameContext(bm, app.getWebBeansContext())) { + return app.getId(); + } + } + throw new IllegalArgumentException("Can't find application matching bean manager " + bm); + } + + private static boolean isSameContext(final BeanManager bm, WebBeansContext app) { + return InjectableBeanManager.class.isInstance(bm) && app == InjectableBeanManager.class.cast(bm).getWebBeansContext() + || BeanManagerImpl.class.isInstance(bm) && app == BeanManagerImpl.class.cast(bm).getWebBeansContext(); + } + + protected void shutdown(final @Observes BeforeShutdown unused) { + final HessianService service = SystemInstance.get().getComponent(HessianService.class); + if (service == null) { + return; + } + + final HessianRegistry registry = service.getRegistry(); + for (final DeployedEndpoint pair : deployed) { + registry.undeploy(service.getVirtualHost(), pair.app, pair.name); + LOGGER.info("Undeployed CDI hessian service " + pair.name); + } + deployed.clear(); + } + + private static String getName(final Class<?> itf) { + final Hessian hessian = itf.getAnnotation(Hessian.class); + final String name = hessian.path(); + if (name.isEmpty()) { + return itf.getName(); + } + return name; + } + + protected static class DeployedEndpoint { + private final String app; + private final String name; + + protected DeployedEndpoint(final String app, final String name) { + this.app = app; + this.name = name; + } + } +} Added: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/HessianInitialContextFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/HessianInitialContextFactory.java?rev=1501172&view=auto ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/HessianInitialContextFactory.java (added) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/client/hessian/HessianInitialContextFactory.java Tue Jul 9 09:52:40 2013 @@ -0,0 +1,123 @@ +/* + * 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.client.hessian; + +import com.caucho.hessian.client.HessianProxyFactory; +import com.caucho.hessian.io.SerializerFactory; +import org.apache.openejb.OpenEJBRuntimeException; +import org.apache.openejb.core.ivm.naming.ContextWrapper; + +import javax.naming.Context; +import javax.naming.Name; +import javax.naming.NamingException; +import javax.naming.spi.InitialContextFactory; +import java.util.Hashtable; + +public class HessianInitialContextFactory implements InitialContextFactory { + public static final String API = "openejb.hessian.client.api"; + public static final String FORCE_SERIALIZABLE = "openejb.hessian.client.force-serializable"; + public static final String CHUNKED = "openejb.hessian.client.chunked"; + public static final String DEBUG = "openejb.hessian.client.debug"; + public static final String READ_TIMEOUT = "openejb.hessian.client.read-timeout"; + public static final String CONNECT_TIMEOUT = "openejb.hessian.client.connect-timeout"; + + @Override + public Context getInitialContext(final Hashtable<?, ?> environment) throws NamingException { + return new HessianContext(environment); + } + + private static class HessianContext extends ContextWrapper { + private final Hashtable<?, ?> environment; + private final ClassLoader loader; + private final String url; + private final Class<?> api; + private final boolean allowNonSerializable; + private final String user; + private final String password; + private final boolean chunked; + private final boolean debug; + private final int readTimeout; + private final int connectTimeout; + + public HessianContext(final Hashtable<?, ?> environment) { + super(null); // will lead to NPE if used but shouldn't be used in practise + this.environment = environment; + + String baseUrl = String.class.cast(environment.get(Context.PROVIDER_URL)); + if (baseUrl == null) { + throw new IllegalArgumentException("provider url should be set"); + } + if (!baseUrl.endsWith("/")) { + baseUrl += '/'; + } + + this.url = baseUrl; + + this.loader = Thread.currentThread().getContextClassLoader(); + this.user = String.class.cast(environment.get(Context.SECURITY_PRINCIPAL)); + this.password = String.class.cast(environment.get(Context.SECURITY_CREDENTIALS)); + this.allowNonSerializable = environment.get(FORCE_SERIALIZABLE) == null || !"true".equals(String.class.cast(environment.get(FORCE_SERIALIZABLE))); + this.chunked = environment.get(CHUNKED) == null || "true".equals(String.class.cast(environment.get(CHUNKED))); + this.debug = "true".equals(String.class.cast(environment.get(DEBUG))); + this.readTimeout = environment.get(READ_TIMEOUT) == null ? -1 : Integer.parseInt(String.class.cast(environment.get(READ_TIMEOUT))); + this.connectTimeout = environment.get(CONNECT_TIMEOUT) == null ? -1 : Integer.parseInt(String.class.cast(environment.get(CONNECT_TIMEOUT))); + + final String apiClassname = String.class.cast(environment.get(API)); + if (apiClassname != null) { + try { + api = loader.loadClass(apiClassname); + } catch (final ClassNotFoundException e) { + throw new OpenEJBRuntimeException(e); + } + } else { + api = null; + } + } + + @Override + public Object lookup(final Name name) throws NamingException { + return lookup(name.toString()); + } + + @Override + public Object lookup(final String name) throws NamingException { + final HessianProxyFactory clientFactory = new HessianProxyFactory(loader); + final SerializerFactory factory = new SerializerFactory(loader); + factory.setAllowNonSerializable(allowNonSerializable); + clientFactory.setSerializerFactory(factory); + if (user != null) { + clientFactory.setUser(user); + clientFactory.setPassword(password); + } + clientFactory.setChunkedPost(chunked); + clientFactory.setDebug(debug); + clientFactory.setReadTimeout(readTimeout); + clientFactory.setConnectTimeout(connectTimeout); + + final String completeUrl = url + name; + try { + if (api != null) { // just use it + return clientFactory.create(api, completeUrl, loader); + } + + return clientFactory.create(completeUrl); // will do a remote call to get the api + } catch (final Exception e) { + throw new NamingException(e.getMessage()); + } + } + } +} Modified: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianServer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianServer.java?rev=1501172&r1=1501171&r2=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianServer.java (original) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianServer.java Tue Jul 9 09:52:40 2013 @@ -71,6 +71,10 @@ public class HessianServer { return this; } + public SerializerFactory getSerializerFactory() { + return serializerFactory; + } + public void invoke(final InputStream inputStream, final OutputStream outputStream) throws Throwable { InputStream isToUse = inputStream; OutputStream osToUse = outputStream; Modified: tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianService.java?rev=1501172&r1=1501171&r2=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianService.java (original) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/java/org/apache/openejb/server/hessian/HessianService.java Tue Jul 9 09:52:40 2013 @@ -70,11 +70,11 @@ public class HessianService implements S continue; } - final HessianServer server = new HessianServer(beanContext.getClassLoader()) - .debug(debug) - .sendCollectionType(sendCollectionType); + final HessianServer server = new HessianServer(beanContext.getClassLoader()).debug(debug); if (serializerFactory != null) { - server.serializerFactory(serializerFactory); + server.serializerFactory(serializerFactory).sendCollectionType(sendCollectionType); + } else { + server.sendCollectionType(sendCollectionType); } server.createSkeleton(ProxyEJB.simpleProxy(beanContext, new Class<?>[]{ remoteItf }), remoteItf); @@ -89,7 +89,19 @@ public class HessianService implements S @Override public void start() throws ServiceException { SystemInstance.get().addObserver(this); - registry = SystemInstance.get().getComponent(HessianRegistry.class); + SystemInstance.get().setComponent(HessianService.class, this); + registry = setRegistry(); + + final Assembler assembler = SystemInstance.get().getComponent(Assembler.class); + if (assembler != null) { + for (final AppInfo appInfo : assembler.getDeployedApplications()) { + afterApplicationCreated(new AssemblerAfterApplicationCreated(appInfo, SystemInstance.get().getComponent(ContainerSystem.class).getAppContext(appInfo.appId).getBeanContexts())); + } + } + } + + private HessianRegistry setRegistry() { + HessianRegistry registry = SystemInstance.get().getComponent(HessianRegistry.class); if (registry == null) { try { // if tomcat HessianService.class.getClassLoader().loadClass("org.apache.catalina.Context"); @@ -103,13 +115,11 @@ public class HessianService implements S } SystemInstance.get().setComponent(HessianRegistry.class, registry); } + return registry; + } - final Assembler assembler = SystemInstance.get().getComponent(Assembler.class); - if (assembler != null) { - for (final AppInfo appInfo : assembler.getDeployedApplications()) { - afterApplicationCreated(new AssemblerAfterApplicationCreated(appInfo, SystemInstance.get().getComponent(ContainerSystem.class).getAppContext(appInfo.appId).getBeanContexts())); - } - } + public HessianRegistry getRegistry() { + return registry; } @Override @@ -153,7 +163,7 @@ public class HessianService implements S } } - private static String appName(final AppInfo app, final BeanContext beanContext) { + public static String appName(final AppInfo app, final BeanContext beanContext) { if (!app.webApps.isEmpty()) { for (final EjbJarInfo ejbJar : app.ejbJars) { for (final EnterpriseBeanInfo bean : ejbJar.enterpriseBeans) { @@ -183,6 +193,62 @@ public class HessianService implements S return -1; } + public boolean isDisabled() { + return disabled; + } + + public void setDisabled(final boolean disabled) { + this.disabled = disabled; + } + + public boolean isDebug() { + return debug; + } + + public void setDebug(final boolean debug) { + this.debug = debug; + } + + public boolean isSendCollectionType() { + return sendCollectionType; + } + + public void setSendCollectionType(final boolean sendCollectionType) { + this.sendCollectionType = sendCollectionType; + } + + public String getRealmName() { + return realmName; + } + + public void setRealmName(final String realmName) { + this.realmName = realmName; + } + + public String getVirtualHost() { + return virtualHost; + } + + public void setVirtualHost(final String virtualHost) { + this.virtualHost = virtualHost; + } + + public String getTransportGuarantee() { + return transportGuarantee; + } + + public void setTransportGuarantee(final String transportGuarantee) { + this.transportGuarantee = transportGuarantee; + } + + public String getAuthMethod() { + return authMethod; + } + + public void setAuthMethod(final String authMethod) { + this.authMethod = authMethod; + } + @Override public void init(final Properties props) throws Exception { disabled = Boolean.parseBoolean(props.getProperty("disabled", "false")); Added: tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1501172&view=auto ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added) +++ tomee/tomee/trunk/server/openejb-hessian/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Tue Jul 9 09:52:40 2013 @@ -0,0 +1 @@ +org.apache.openejb.cdi.internal.HessianExtension Copied: tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianCdiTest.java (from r1500981, tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java) URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianCdiTest.java?p2=tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianCdiTest.java&p1=tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java&r1=1500981&r2=1501172&rev=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java (original) +++ tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianCdiTest.java Tue Jul 9 09:52:40 2013 @@ -1,27 +1,49 @@ +/* + * 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.server.hessian; import com.caucho.hessian.client.HessianProxyFactory; import com.caucho.hessian.io.SerializerFactory; +import org.apache.openejb.cdi.api.Hessian; +import org.apache.openejb.jee.WebApp; import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Classes; import org.apache.openejb.testing.EnableServices; import org.apache.openejb.testing.Module; import org.junit.Test; import org.junit.runner.RunWith; -import javax.ejb.Remote; -import javax.ejb.Singleton; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import java.beans.Beans; import java.net.MalformedURLException; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @EnableServices({ "hessian", "httpejbd" }) @RunWith(ApplicationComposer.class) -public class HessianServiceTest { +public class HessianCdiTest { @Module - public Class<?>[] classes() { - return new Class<?>[] { MyHessianWebService.class }; + @Classes(cdi = true, value = { MyCdiHessianService.class, CdiBean.class }) + public WebApp webApp() { + return new WebApp().contextRoot("web"); } @Test @@ -31,22 +53,26 @@ public class HessianServiceTest { final SerializerFactory factory = new SerializerFactory(loader); factory.setAllowNonSerializable(true); clientFactory.setSerializerFactory(factory); - final HessianWebService client = HessianWebService.class.cast(clientFactory.create(HessianWebService.class, "http://127.0.0.1:4204/HessianServiceTest/hessian/" + MyHessianWebService.class.getSimpleName())); + final CdiService client = CdiService.class.cast(clientFactory.create(CdiService.class, "http://127.0.0.1:4204/web/hessian/service")); final Out out = client.call(new In("test")); assertThat(out, instanceOf(Out.class)); assertEquals("test", out.value); } - @Remote - public static interface HessianWebService { - Out call(In in); + @Hessian(path = "service") + public static interface CdiService { + Out call(In in); } - @Singleton - public static class MyHessianWebService implements HessianWebService { + @ApplicationScoped + public static class MyCdiHessianService implements CdiService { + @Inject + private CdiBean bean; + @Override public Out call(final In in) { + assertNotNull(bean); return new Out(in.value); } } @@ -66,4 +92,8 @@ public class HessianServiceTest { this.value = value; } } + + public static class CdiBean { + + } } Copied: tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianInitialContextTest.java (from r1500981, tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java) URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianInitialContextTest.java?p2=tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianInitialContextTest.java&p1=tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java&r1=1500981&r2=1501172&rev=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java (original) +++ tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianInitialContextTest.java Tue Jul 9 09:52:40 2013 @@ -1,16 +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.server.hessian; -import com.caucho.hessian.client.HessianProxyFactory; -import com.caucho.hessian.io.SerializerFactory; +import org.apache.openejb.client.hessian.HessianInitialContextFactory; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.testing.EnableServices; import org.apache.openejb.testing.Module; +import org.apache.openejb.testng.PropertiesBuilder; import org.junit.Test; import org.junit.runner.RunWith; import javax.ejb.Remote; import javax.ejb.Singleton; -import java.net.MalformedURLException; +import javax.naming.Context; +import javax.naming.InitialContext; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertEquals; @@ -18,20 +35,20 @@ import static org.junit.Assert.assertTha @EnableServices({ "hessian", "httpejbd" }) @RunWith(ApplicationComposer.class) -public class HessianServiceTest { +public class HessianInitialContextTest { @Module public Class<?>[] classes() { - return new Class<?>[] { MyHessianWebService.class }; + return new Class<?>[] { Server.class }; } @Test - public void client() throws MalformedURLException { - final ClassLoader loader = Thread.currentThread().getContextClassLoader(); - final HessianProxyFactory clientFactory = new HessianProxyFactory(loader); - final SerializerFactory factory = new SerializerFactory(loader); - factory.setAllowNonSerializable(true); - clientFactory.setSerializerFactory(factory); - final HessianWebService client = HessianWebService.class.cast(clientFactory.create(HessianWebService.class, "http://127.0.0.1:4204/HessianServiceTest/hessian/" + MyHessianWebService.class.getSimpleName())); + public void client() throws Exception { + final MyApi client = MyApi.class.cast( + new InitialContext(new PropertiesBuilder() + .p(Context.INITIAL_CONTEXT_FACTORY, HessianInitialContextFactory.class.getName()) + .p(Context.PROVIDER_URL, "http://127.0.0.1:4204/HessianInitialContextTest/hessian/") + .build()) + .lookup("Server")); final Out out = client.call(new In("test")); assertThat(out, instanceOf(Out.class)); @@ -39,12 +56,12 @@ public class HessianServiceTest { } @Remote - public static interface HessianWebService { - Out call(In in); + public static interface MyApi { + Out call(In in); } @Singleton - public static class MyHessianWebService implements HessianWebService { + public static class Server implements MyApi { @Override public Out call(final In in) { return new Out(in.value); @@ -54,7 +71,7 @@ public class HessianServiceTest { public static class In { private String value; - public In(String value) { + public In(final String value) { this.value = value; } } @@ -62,7 +79,7 @@ public class HessianServiceTest { public static class Out { private String value; - public Out(String value) { + public Out(final String value) { this.value = value; } } Modified: tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java?rev=1501172&r1=1501171&r2=1501172&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java (original) +++ tomee/tomee/trunk/server/openejb-hessian/src/test/java/org/apache/openejb/server/hessian/HessianServiceTest.java Tue Jul 9 09:52:40 2013 @@ -1,3 +1,19 @@ +/* + * 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.server.hessian; import com.caucho.hessian.client.HessianProxyFactory;