/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.config.xml; import org.apache.axiom.om.OMElement; import org.apache.synapse.Mediator; import org.apache.synapse.mediators.bean.BeanConstants; import org.apache.synapse.mediators.bean.BeanUtils; import org.apache.synapse.mediators.bean.Target; import org.apache.synapse.mediators.bean.enterprise.EJBConstants; import org.apache.synapse.mediators.bean.enterprise.EJBMediator; import javax.xml.namespace.QName; import java.lang.reflect.Method; import java.util.Iterator; import java.util.Properties; public class EJBMediatorFactory extends AbstractMediatorFactory { private static final QName EJB_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "ejb"); public Mediator createSpecificMediator(OMElement elem, Properties properties) { EJBMediator mediator = new EJBMediator(); processAuditStatus(mediator, elem); String attributeValue; attributeValue = elem.getAttributeValue(new QName(EJBConstants.BEANSTALK)); if (attributeValue != null) { mediator.setBeanstalkName(attributeValue.trim()); } else { handleException("'beanstalk' attribute of callEjb mediator is required"); } attributeValue = elem.getAttributeValue(new QName(BeanConstants.CLASS)); if (attributeValue != null) { mediator.setClassName(attributeValue.trim()); } else { handleException("'class' attribute of callEjb mediator is required"); } attributeValue = elem.getAttributeValue(new QName(EJBConstants.STATEFUL)); if (Boolean.valueOf(attributeValue)) { attributeValue = elem.getAttributeValue(new QName(EJBConstants.BEAN_ID)); if (attributeValue != null) { mediator.setBeanId(new ValueFactory().createValue(EJBConstants.BEAN_ID, elem)); } else { handleException("'id' attribute is required for stateful session bean " + "invocations."); } } boolean remove; attributeValue = elem.getAttributeValue(new QName(EJBConstants.REMOVE)); remove = Boolean.valueOf(attributeValue); if (remove) { mediator.setRemove(true); } if (elem.getAttributeValue(new QName(BeanConstants.TARGET)) != null) { mediator.setTarget(new Target(BeanConstants.TARGET, elem)); } attributeValue = elem.getAttributeValue(new QName(EJBConstants.JNDI_NAME)); if (attributeValue != null) { mediator.setJndiName(attributeValue); } OMElement argumentsElem = elem.getFirstChildWithName( new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, EJBConstants.ARGS)); if (argumentsElem != null) { Iterator itr = argumentsElem.getChildrenWithName( new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, EJBConstants.ARG)); while (itr.hasNext()) { OMElement argElem = (OMElement) itr.next(); if (argElem.getAttributeValue(ATT_VALUE) != null) { mediator.addArgument( new ValueFactory().createValue(BeanConstants.VALUE, argElem)); } else { handleException("'value' attribute of 'arg' element is required."); } } } attributeValue = elem.getAttributeValue(new QName(EJBConstants.METHOD)); if (attributeValue != null) { Method method = null; try { method = BeanUtils.resolveMethod( Class.forName(mediator.getClassName()), attributeValue, mediator.getArgumentList().size()); } catch (ClassNotFoundException e) { handleException("Could not load '" + mediator.getClassName() + "' class.", e); } mediator.setMethod(method); } else if (!remove) { handleException("'method' attribute of EJB mediator is optional only when it's a " + "bean removal."); } return mediator; } public QName getTagQName() { return EJB_Q; } }