Added: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBConstants.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBConstants.java?rev=1361639&view=auto ============================================================================== --- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBConstants.java (added) +++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBConstants.java Sun Jul 15 07:17:49 2012 @@ -0,0 +1,41 @@ +/* + * 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.synapse.mediators.bean.enterprise; + +/** + * Defines constants used by EJB mediator configuration. + */ +public interface EJBConstants { + + public static final String BEANSTALK = "beanstalk"; + + public static final String METHOD = "method"; + + public static final String SESSION_ID = "sessionId"; + + public static final String JNDI_NAME = "jndiName"; + + public static final String REMOVE = "remove"; + + public static final String ARGS = "args"; + + public static final String ARG = "arg"; + +}
Added: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBMediator.java URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBMediator.java?rev=1361639&view=auto ============================================================================== --- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBMediator.java (added) +++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/bean/enterprise/EJBMediator.java Sun Jul 15 07:17:49 2012 @@ -0,0 +1,235 @@ +/* + * 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.synapse.mediators.bean.enterprise; + +import org.apache.synapse.ManagedLifecycle; +import org.apache.synapse.MessageContext; +import org.apache.synapse.SynapseException; +import org.apache.synapse.commons.beanstalk.enterprise.EnterpriseBeanstalk; +import org.apache.synapse.commons.beanstalk.enterprise.EnterpriseBeanstalkConstants; +import org.apache.synapse.commons.beanstalk.enterprise.EnterpriseBeanstalkManager; +import org.apache.synapse.core.SynapseEnvironment; +import org.apache.synapse.mediators.AbstractMediator; +import org.apache.synapse.mediators.Value; +import org.apache.synapse.mediators.bean.BeanUtils; +import org.apache.synapse.mediators.bean.Target; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * EJB mediator calls an external Enterprise JavaBean(EJB) and stores the result in the message + * payload or in a message context property. + * This mediator supports EJB3 Stateless and Stateful Session Beans. + */ +public class EJBMediator extends AbstractMediator implements ManagedLifecycle { + + /** + * Name of the beanstalk to be used for this invocation. + */ + private String beanstalkName; + + /** + * Fully qualified name of the remote interface of the EJB. + */ + private String className; + + /** + * Session id of the stateful session bean call, null for stateless session bean calls. + */ + private Value sessionId; + + /** + * Target to store the result of the EJB method call. + */ + private Target target; + + /** + * JNDI name of the bean. Could be null if this bean is already cached in the beanstalk. + */ + private String jndiName; + + /** + * Whether or not this bean is removed from the beanstalk after the method invocation. + */ + private boolean remove; + + /** + * Argument list for the remote method invocation. + */ + private List<Value> argumentList = new ArrayList<Value>(); + + /** + * EnterpriseBeanstalk retrieved from the Synapse environment. + */ + private volatile EnterpriseBeanstalk beanstalk; + + /** + * Resolved method. This is inferred by looking at the method name and the argument count. + */ + private volatile Method method; + + /** + * + * @param se SynapseEnvironment to be used for initialization + */ + public void init(SynapseEnvironment se) { + + EnterpriseBeanstalkManager beanstalkManager = + (EnterpriseBeanstalkManager) se.getServerContextInformation().getProperty( + EnterpriseBeanstalkConstants.ENTERPRISE_BEANSTALK_MANAGER_PROP_NAME); + + if (beanstalkManager == null) { + throw new SynapseException("Initialization failed. EnterpriseBeanstalkManager not " + + "found."); + } + + beanstalk = beanstalkManager.getEnterpriseBeanstalk(beanstalkName); + + if (beanstalk == null) { + throw new SynapseException("Initialization failed. '" + beanstalkName + + "' beanstalk not found in EnterpriseBeanstalkManager."); + } + } + + /** + * Calls an external EJB according to the supplied semantics and attaches the result into the + * message/message context. + * @param synCtx The current message for mediation + * @return true If mediation should continue + */ + public boolean mediate(MessageContext synCtx) { + + Object ejb = beanstalk.getEnterpriseBean( + className, + sessionId == null ? null : sessionId.evaluateValue(synCtx), + jndiName); + + if (ejb == null) { + handleException("EJB not found. class: " + className + ", bean id: " + sessionId + + ", jndi name: " + jndiName + ".", synCtx); + } + + Object result = null; + try { + result = BeanUtils.invokeInstanceMethod(ejb, method, buildArguments(synCtx)); + } catch (SynapseException e) { + handleException("Failed to invoke method: " + method + " on EJB object of " + + "type: " + className + ".", e, synCtx); + } + + if (target != null) { + target.insert(synCtx, result); + } + + if (remove) { + beanstalk.removeEnterpriseBean(className, + sessionId == null ? null : sessionId.evaluateValue(synCtx)); + } + + return true; + } + + public void destroy() { + } + + /** + * Builds the argument values using the current message context. + * @param synCtx Current message context + * @return Built argument list + */ + private Object[] buildArguments(MessageContext synCtx) { + + Object[] args = new Object[argumentList.size()]; + for (int i = 0; i < args.length; ++i) { + args[i] = argumentList.get(i).evaluateObjectValue(synCtx); + } + return args; + } + + + //-------------------------- Getters & Setters --------------------------// + + public String getBeanstalkName() { + return beanstalkName; + } + + public void setBeanstalkName(String beanstalkName) { + this.beanstalkName = beanstalkName; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Value getSessionId() { + return sessionId; + } + + public void setSessionId(Value sessionId) { + this.sessionId = sessionId; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public Target getTarget() { + return target; + } + + public void setTarget(Target target) { + this.target = target; + } + + public String getJndiName() { + return jndiName; + } + + public void setJndiName(String jndiName) { + this.jndiName = jndiName; + } + + public boolean isRemove() { + return remove; + } + + public void setRemove(boolean remove) { + this.remove = remove; + } + + public List<Value> getArgumentList() { + return argumentList; + } + + public void addArgument(Value argument) { + argumentList.add(argument); + } + +}
