User: cgjung
Date: 02/04/02 05:48:39
Modified: jboss.net/src/main/org/jboss/net/axis/server Constants.java
EJBProvider.java
Added: jboss.net/src/main/org/jboss/net/axis/server
EJBHomeProvider.java EntityBeanDeserializer.java
EntityBeanDeserializerFactory.java
SerialisationResponseHandler.java
TransactionRequestHandler.java
TransactionResponseHandler.java
Log:
That is the alpha-version together with the .Net sample client
I hacked together at JBossOne ;-)
more to come.
Revision Changes Path
1.10 +4 -2
contrib/jboss.net/src/main/org/jboss/net/axis/server/Constants.java
Index: Constants.java
===================================================================
RCS file:
/cvsroot/jboss/contrib/jboss.net/src/main/org/jboss/net/axis/server/Constants.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Constants.java 15 Mar 2002 10:04:24 -0000 1.9
+++ Constants.java 2 Apr 2002 13:48:39 -0000 1.10
@@ -5,7 +5,7 @@
* See terms of license at gnu.org.
*/
-// $Id: Constants.java,v 1.9 2002/03/15 10:04:24 cgjung Exp $
+// $Id: Constants.java,v 1.10 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
@@ -18,7 +18,7 @@
* </ul>
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @created 28. September 2001
- * @version $Revision: 1.9 $
+ * @version $Revision: 1.10 $
*/
public interface Constants extends org.jboss.net.Constants {
@@ -41,11 +41,13 @@
static final String GET_AXIS_SERVER_METHOD_NAME = "getAxisServer";
static final String AXIS_CONFIGURATION_FILE = "axis-config.xml";
static final String WEB_SERVICE_DESCRIPTOR = "META-INF/web-service.xml";
+ static final String USER_TRANSACTION_JNDI_NAME = "UserTransaction";
/** constants referring to options in the axis messagecontext or handler options
*/
static final String ALLOWED_ROLES_OPTION = "allowedRoles";
static final String DENIED_ROLES_OPTION = "deniedRoles";
static final String SECURITY_DOMAIN_OPTION = "securityDomain";
+ static final String TRANSACTION_PROPERTY = "transaction";
/** message id constants are english raw messages at the same time */
static final String AXIS_DEPLOYMENT_DESCRIPTOR_NOT_FOUND =
1.3 +72 -14
contrib/jboss.net/src/main/org/jboss/net/axis/server/EJBProvider.java
Index: EJBProvider.java
===================================================================
RCS file:
/cvsroot/jboss/contrib/jboss.net/src/main/org/jboss/net/axis/server/EJBProvider.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- EJBProvider.java 12 Mar 2002 11:04:46 -0000 1.2
+++ EJBProvider.java 2 Apr 2002 13:48:39 -0000 1.3
@@ -5,60 +5,74 @@
* See terms of license at gnu.org.
*/
-// $Id: EJBProvider.java,v 1.2 2002/03/12 11:04:46 cgjung Exp $
+// $Id: EJBProvider.java,v 1.3 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
+import org.jboss.net.axis.XMLResourceProvider;
+
+// Axis stuff
import org.apache.axis.Handler;
+import org.apache.axis.EngineConfiguration;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
+// xml messaging
+import javax.xml.rpc.namespace.QName;
+
+// JNDI
import javax.naming.InitialContext;
import javax.naming.Context;
+import javax.naming.NamingException;
+
+// EJB
+import javax.ejb.EJBHome;
+// reflection
import java.lang.reflect.Method;
+// io
+import java.rmi.RemoteException;
+
/**
- * A JBoss compatible EJB Provider.
+ * A JBoss-compatible EJB Provider that exposes the methods of
+ * a stateless bean. Basically its a slimmed downed derivative of
+ * the Axis-EJBProvider without the Corba-stuff that is working under
+ * the presumption that the right classloader has already been set
+ * by the invocation chain (@see org.jboss.net.axis.SetClassLoaderHandler).
* <br>
* <h3>Change History</h3>
* <ul>
+ * <li> jung, 22.03.02: slimmed down and renamed. </li>
* <li> jung, 09.03.02: axis alpha 3 is here. </li>
* </ul>
* <br>
* <h3>To Do</h3>
* <ul>
- * <li> jung, 12.03.02: need to support home methods.</li>
* </ul>
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @created 5. Oktober 2001, 13:02
- * @version $Revision: 1.2 $
+ * @version $Revision: 1.3 $
*/
public class EJBProvider extends org.apache.axis.providers.java.EJBProvider {
+ /** the real remote class we are shielding */
+ protected Class remoteClass;
+
/** Creates new EJBProvider */
public EJBProvider() {
}
/**
- * Invoke the message by delegating to super
- */
- public void invoke(MessageContext msgContext) throws AxisFault {
- super.invoke(msgContext);
- }
-
- /**
- * Return the object which implements the service.
- *
+ * Return the object which implements the service. Makes the usual
+ * lookup->create call wo the PortableRemoteDaDaDa for the sake of Corba.
* @param msgContext the message context
* @param clsName The JNDI name of the EJB home class
* @return an object that implements the service
*/
protected Object getNewServiceObject(MessageContext msgContext, String clsName)
throws Exception {
- Handler serviceHandler = msgContext.getService();
-
// Get the EJB Home object from JNDI
Object ejbHome = new InitialContext().lookup(clsName);
@@ -68,6 +82,50 @@
Object result = createMethod.invoke(ejbHome, empty_object_array);
return result;
+ }
+
+ /**
+ * Return the class name of the service
+ */
+ protected Class getServiceClass(MessageContext msgContext,
+ String beanJndiName) throws Exception
+ {
+ if (remoteClass == null) {
+ try {
+ EJBHome ejbHome =
+ (EJBHome) new InitialContext().lookup(beanJndiName);
+ remoteClass = ejbHome.getEJBMetaData().getRemoteInterfaceClass();
+ } catch (RemoteException e) {
+ throw new RuntimeException("Could not access meta-data through home " +
e);
+ } catch (NamingException e) {
+ throw new RuntimeException("Could not access meta-data through home " +
e);
+ }
+ }
+
+ return remoteClass;
+ }
+
+ /**
+ * Generate the WSDL for this service.
+ * We need to rearrange the classloader stuff for that purpose.
+ */
+ public void generateWSDL(MessageContext msgContext) throws AxisFault {
+ EngineConfiguration engineConfig = msgContext.getAxisEngine().getConfig();
+
+ if (engineConfig instanceof XMLResourceProvider) {
+ XMLResourceProvider config = (XMLResourceProvider) engineConfig;
+ ClassLoader newLoader =
+ config.getMyDeployment().getClassLoader(
+ new QName(null, msgContext.getTargetService()));
+ ClassLoader currentLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(newLoader);
+ super.generateWSDL(msgContext);
+ } finally {
+ Thread.currentThread().setContextClassLoader(currentLoader);
+ }
+ }
+
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/EJBHomeProvider.java
Index: EJBHomeProvider.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: EJBHomeProvider.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.apache.axis.Handler;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.providers.java.RPCProvider;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.ejb.EJBHome;
import java.lang.reflect.Method;
/**
* A JBoss-compatible Provider that exposes the methods of
* a bean�s home, such as a stateless session bean or an entity
* bean. It is working under the presumption that the right classloader
* has already been set by the invocation chain
* (@see org.jboss.net.axis.SetClassLoaderHandler).
* <br>
* <h3>Change History</h3>
* <ul>
* </ul>
* <br>
* <h3>To Do</h3>
* <ul>
* <li> jung, 22.03.02: Service-Reference serialisation. </li>
* </ul>
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @created 22.03.2002
* @version $Revision: 1.1 $
*/
public class EJBHomeProvider extends RPCProvider {
private static final String beanNameOption = "beanJndiName";
private static final String homeInterfaceNameOption = "homeInterfaceName";
/** Creates new EJBProvider */
public EJBHomeProvider() {
}
/**
* Return the object which implements the service. Makes the usual
* JNDI->lookup call wo the PortableRemoteDaDaDa for the sake of Corba.
* @param msgContext the message context
* @param clsName The JNDI name of the EJB home class
* @return an object that implements the service
*/
protected Object getNewServiceObject(MessageContext msgContext, String clsName)
throws Exception {
// Get the EJB Home object from JNDI
Object result = new InitialContext().lookup(clsName);
return result;
}
/**
* Return the option in the configuration that contains the service class
* name. In the EJB case, it is the JNDI name of the bean.
*/
protected String getServiceClassNameOptionName()
{
return beanNameOption;
}
/**
* Get the class description for the EJB Remote Interface, which is what
* we are interested in exposing to the world (i.e. in WSDL).
*
* @param msgContext the message context
* @param beanJndiName the JNDI name of the EJB
* @return the class info of the EJB home interface
*/
protected Class getServiceClass(MessageContext msgContext,
String beanJndiName) throws Exception
{
Handler serviceHandler = msgContext.getService();
Class interfaceClass = null;
// First try to get the interface class from the configuation
String homeName =
(String) serviceHandler.getOption(homeInterfaceNameOption);
if(homeName != null){
interfaceClass = msgContext.getClassLoader().loadClass(homeName);
} else {
// we look into the metadata
EJBHome home=(EJBHome) getNewServiceObject(msgContext,beanJndiName);
interfaceClass=home.getEJBMetaData().getHomeInterfaceClass();
}
// got it, return it
return interfaceClass;
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/EntityBeanDeserializer.java
Index: EntityBeanDeserializer.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: EntityBeanDeserializer.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import javax.xml.rpc.namespace.QName;
import org.apache.axis.encoding.DeserializerImpl;
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.Deserializer;
import org.apache.axis.encoding.ser.SimpleDeserializer;
import org.apache.axis.encoding.Target;
import org.apache.axis.encoding.TypeMapping;
import org.apache.axis.utils.JavaUtils;
import org.apache.axis.Constants;
import org.apache.axis.description.TypeDesc;
import org.apache.axis.message.SOAPHandler;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import javax.naming.InitialContext;
import javax.ejb.EJBHome;
import java.beans.PropertyDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.util.Map;
import java.util.List;
import java.util.Collection;
import java.util.Iterator;
/**
* Server-side deserializer hitting an existing entity bean. Derived
* from the axis BeanDeserializer. Currently relies on some
* silly conventions that must be configurable in the deployment
* descriptor.
* @author jung
* @created 21.03.2002
* @version $Revision: 1.1 $
*/
public class EntityBeanDeserializer extends DeserializerImpl {
//
// Attributes
//
protected EJBHome home;
protected Method findMethod;
protected Class[] findSignature;
protected List findElements = new java.util.ArrayList();
protected Object[] findObjects;
protected TypeDesc typeDesc;
protected QName xmlType;
protected Class javaType;
protected Map propertyMap = new java.util.HashMap();
protected int collectionIndex = -1;
protected Collection fieldSetters=new java.util.ArrayList();
/**
* Construct a new BeanSerializer
* @param homeType home class of the entity bean
* @param remoteType remote interface of the entity bean
* @param findMethodName name of the find method to reconstruct the bean
* @param findSignature signature of the find method
* @param findAttributes the name of the attributes used to call the find method
* @param xmlType fully-qualified xml tag-name of the corresponding xml structure
*/
public EntityBeanDeserializer(
String jndiName,
Class remoteType,
String findMethodName,
Class[] findSignature,
String[] findElements,
QName xmlType)
throws Exception {
// first the default constructor
this.xmlType = xmlType;
this.javaType = remoteType;
// Get a list of the bean properties
BeanPropertyDescriptor[] pd = getPd(javaType);
// loop through properties and grab the names for later
for (int i = 0; i < pd.length; i++) {
BeanPropertyDescriptor descriptor = pd[i];
propertyMap.put(descriptor.getName(), descriptor);
propertyMap.put(JavaUtils.xmlNameToJava(descriptor.getName()), descriptor);
}
typeDesc = TypeDesc.getTypeDescForClass(javaType);
this.findSignature = findSignature;
// then we do the lookup struff
this.home = (EJBHome) new InitialContext().lookup(jndiName);
findMethod = home.getClass().getMethod(findMethodName, findSignature);
for (int count = 0; count < findElements.length; count++) {
if (typeDesc != null) {
this.findElements.add(typeDesc.getAttributeNameForField(findElements[count]));
} else {
this.findElements.add(new QName("", findElements[count]));
}
}
this.findObjects = new Object[findElements.length];
}
public EntityBeanDeserializer(
Class remoteType,
QName xmlType)
throws Exception {
this(remoteType.getName().
substring(remoteType.getName().lastIndexOf(".")+1)
+"Home",remoteType,"findByPrimaryKey",new Class[]
{String.class},
new String[] {"name"},xmlType);
}
/**
* Deserializer interface called on each child element encountered in
* the XML stream.
* @param namespace is the namespace of the child element
* @param localName is the local name of the child element
* @param prefix is the prefix used on the name of the child element
* @param attributes are the attributes of the child element
* @param context is the deserialization context.
* @return is a Deserializer to use to deserialize a child (must be
* a derived class of SOAPHandler) or null if no deserialization should
* be performed.
*/
public SOAPHandler onStartChild(
String namespace,
String localName,
String prefix,
Attributes attributes,
DeserializationContext context)
throws SAXException {
BeanPropertyDescriptor propDesc = null;
if (typeDesc != null) {
QName elemQName = new QName(namespace, localName);
String fieldName = typeDesc.getFieldNameForElement(elemQName);
propDesc = (BeanPropertyDescriptor) propertyMap.get(fieldName);
}
if (propDesc == null) {
// look for a field by this name.
propDesc = (BeanPropertyDescriptor) propertyMap.get(localName);
}
if (propDesc == null) {
// look for a field by the "adjusted" name.
propDesc =
(BeanPropertyDescriptor)
propertyMap.get(JavaUtils.xmlNameToJava(localName));
}
if (propDesc == null) {
// No such field
throw new SAXException(
JavaUtils.getMessage("badElem00", javaType.getName(), localName));
}
// Determine the QName for this child element.
// Look at the type attribute specified. If this fails,
// use the javaType of the property to get the type qname.
QName qn = context.getTypeFromAttributes(namespace, localName, attributes);
// get the deserializer
Deserializer dSer = context.getDeserializerForType(qn);
// If no deserializer, use the base DeserializerImpl.
// There may not be enough information yet to choose the
// specific deserializer.
if (dSer == null) {
dSer = new DeserializerImpl();
// determine a default type for this child element
TypeMapping tm = context.getTypeMapping();
Class type = propDesc.getType();
dSer.setDefaultType(tm.getTypeQName(type));
}
QName elementQName=new QName(namespace,localName);
if (findElements.contains(elementQName)) {
dSer.registerValueTarget(new
FindPropertyTarget(findElements.indexOf(elementQName)));
} else if (propDesc.getWriteMethod().getParameterTypes().length == 1) {
// Success! Register the target and deserializer.
collectionIndex = -1;
dSer.registerValueTarget(new BeanPropertyTarget(propDesc));
} else {
// Success! This is a collection of properties so use the index
collectionIndex++;
dSer.registerValueTarget(
new BeanPropertyTarget(propDesc, collectionIndex));
}
return (SOAPHandler) dSer;
}
/**
* Set the bean properties that correspond to element attributes.
*
* This method is invoked after startElement when the element requires
* deserialization (i.e. the element is not an href and the value is not nil.)
* @param namespace is the namespace of the element
* @param localName is the name of the element
* @param qName is the prefixed qName of the element
* @param attributes are the attributes on the element...used to get the type
* @param context is the DeserializationContext
*/
public void onStartElement(
String namespace,
String localName,
String qName,
Attributes attributes,
DeserializationContext context)
throws SAXException {
if (typeDesc == null)
return;
// loop through the attributes and set bean properties that
// correspond to attributes
for (int i = 0; i < attributes.getLength(); i++) {
QName attrQName = new QName(attributes.getURI(i),
attributes.getLocalName(i));
String fieldName = typeDesc.getFieldNameForAttribute(attrQName);
if (fieldName == null)
continue;
String attrName = attributes.getLocalName(i);
// look for the attribute property
BeanPropertyDescriptor bpd =
(BeanPropertyDescriptor) propertyMap.get(fieldName);
if (bpd != null) {
if (bpd.getWriteMethod() == null)
continue;
// determine the QName for this child element
TypeMapping tm = context.getTypeMapping();
Class type = bpd.getType();
QName qn = tm.getTypeQName(type);
if (qn == null)
throw new SAXException(JavaUtils.getMessage("unregistered00",
type.toString()));
// get the deserializer
Deserializer dSer = context.getDeserializerForType(qn);
if (dSer == null)
throw new SAXException(JavaUtils.getMessage("noDeser00",
type.toString()));
if (!(dSer instanceof SimpleDeserializer))
throw new SAXException(
JavaUtils.getMessage("AttrNotSimpleType00", bpd.getName(),
type.toString()));
if (findElements.contains(attrQName)) {
dSer.registerValueTarget(new
FindPropertyTarget(findElements.indexOf(attrQName)));
} else if (bpd.getWriteMethod().getParameterTypes().length == 1) {
// Success! Create an object from the string and set
// it in the bean
try {
Object val = ((SimpleDeserializer)
dSer).makeValue(attributes.getValue(i));
bpd.getWriteMethod().invoke(value, new Object[] { val });
} catch (Exception e) {
throw new SAXException(e);
}
}
} // if
} // attribute loop
}
public void onEndElement(
String namespace,
String localName,
DeserializationContext context)
throws SAXException {
try {
value = findMethod.invoke(home, findObjects);
Iterator allSetters=fieldSetters.iterator();
while(allSetters.hasNext()) {
((BeanPropertyTarget) allSetters.next()).setReal(value);
}
fieldSetters=null;
} catch (InvocationTargetException e) {
throw new SAXException("Encountered exception "+e.getTargetException());
} catch (IllegalAccessException e) {
throw new SAXException("Encountered exception "+e);
}
super.onEndElement(namespace, localName, context);
}
public class FindPropertyTarget implements Target {
int position;
public FindPropertyTarget(int index) {
this.position = index;
}
public void set(Object value) throws SAXException {
findObjects[position] = value;
}
}
/**
* Class which knows how to update a bean property
*/
public class BeanPropertyTarget implements Target {
private BeanPropertyDescriptor pd;
private int index = -1;
Object value;
/**
* This constructor is used for a normal property.
* @param Object is the bean class
* @param pd is the property
**/
public BeanPropertyTarget(BeanPropertyDescriptor pd) {
this.pd = pd;
this.index = -1; // disable indexing
}
/**
* This constructor is used for an indexed property.
* @param Object is the bean class
* @param pd is the property
* @param i is the index
**/
public BeanPropertyTarget(BeanPropertyDescriptor pd, int i) {
this.pd = pd;
this.index = i;
}
public void set(Object value) throws SAXException {
this.value=value;
if(fieldSetters!=null) {
fieldSetters.add(this);
} else {
setReal(EntityBeanDeserializer.this.value);
}
}
public void setReal(Object target) throws SAXException {
try {
if (index < 0)
pd.getWriteMethod().invoke(target, new Object[] { value });
else
pd.getWriteMethod().invoke(target, new Object[] { new Integer(index),
value });
} catch (Exception e) {
Class type = pd.getReadMethod().getReturnType();
value = JavaUtils.convert(value, type);
try {
if (index < 0)
pd.getWriteMethod().invoke(target, new Object[] { value });
else
pd.getWriteMethod().invoke(target, new Object[] { new
Integer(index), value });
} catch (Exception ex) {
throw new SAXException(ex);
}
}
}
}
static class BeanPropertyDescriptor {
private String name;
private Method getter;
private Method setter;
public BeanPropertyDescriptor(String _name, Method _getter, Method _setter) {
name = _name;
getter = _getter;
setter = _setter;
}
public Method getReadMethod() {
return getter;
}
public Method getWriteMethod() {
return setter;
}
public String getName() {
return name;
}
public Class getType() {
return getter.getReturnType();
}
/**
* This method attempts to sort the property descriptors to match the
* order defined in the class. This is necessary to support
* xsd:sequence processing, which means that the serialized order of
* properties must match the xml element order. (This method assumes that the
* order of the set methods matches the xml element order...the emitter
* will always order the set methods according to the xml order.)
*
* This routine also looks for set(i, type) and get(i) methods and adjusts the
* property to use these methods instead. These methods are generated by the
* emitter for "collection" of properties (i.e. maxOccurs="unbounded" on an
element).
* JAX-RPC is silent on this issue, but web services depend on this kind of
behaviour.
* The method signatures were chosen to match bean indexed properties.
*/
static BeanPropertyDescriptor[] processPropertyDescriptors(
PropertyDescriptor[] rawPd,
Class cls) {
BeanPropertyDescriptor[] myPd = new BeanPropertyDescriptor[rawPd.length];
for (int i = 0; i < rawPd.length; i++) {
myPd[i] =
new BeanPropertyDescriptor(
rawPd[i].getName(),
rawPd[i].getReadMethod(),
rawPd[i].getWriteMethod());
}
try {
// Create a new pd array and index into the array
int index = 0;
// Build a new pd array
// defined by the order of the get methods.
BeanPropertyDescriptor[] newPd = new
BeanPropertyDescriptor[rawPd.length];
Method[] methods = cls.getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if (method.getName().startsWith("set")) {
boolean found = false;
for (int j = 0; j < myPd.length && !found; j++) {
if (myPd[j].getWriteMethod() != null
&& myPd[j].getWriteMethod().equals(method)) {
found = true;
newPd[index] = myPd[j];
index++;
}
}
}
}
// Now if there are any additional property descriptors, add them to the
end.
if (index < myPd.length) {
for (int m = 0; m < myPd.length && index < myPd.length; m++) {
boolean found = false;
for (int n = 0; n < index && !found; n++) {
found = (myPd[m] == newPd[n]);
}
if (!found) {
newPd[index] = myPd[m];
index++;
}
}
}
// If newPd has same number of elements as myPd, use newPd.
if (index == myPd.length) {
myPd = newPd;
}
// Get the methods of the class and look for the special set and
// get methods for property "collections"
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().startsWith("set")
&& methods[i].getParameterTypes().length == 2) {
for (int j = 0; j < methods.length; j++) {
if ((methods[j].getName().startsWith("get")
|| methods[j].getName().startsWith("is"))
&& methods[j].getParameterTypes().length == 1
&& methods[j].getReturnType() ==
methods[i].getParameterTypes()[1]
&& methods[j].getParameterTypes()[0] == int.class
&& methods[i].getParameterTypes()[0] == int.class) {
for (int k = 0; k < myPd.length; k++) {
if (myPd[k].getReadMethod() != null
&& myPd[k].getWriteMethod() != null
&&
myPd[k].getReadMethod().getName().equals(methods[j].getName())
&&
myPd[k].getWriteMethod().getName().equals(methods[i].getName())) {
myPd[k] = new
BeanPropertyDescriptor(myPd[k].getName(), methods[j], methods[i]);
}
}
}
}
}
}
} catch (Exception e) {
// Don't process Property Descriptors if problems occur
return myPd;
}
return myPd;
}
}
/**
* Create a BeanPropertyDescriptor array for the indicated class.
*/
public static BeanPropertyDescriptor[] getPd(Class javaType) {
BeanPropertyDescriptor[] pd;
try {
PropertyDescriptor[] rawPd =
Introspector.getBeanInfo(javaType).getPropertyDescriptors();
pd = BeanPropertyDescriptor.processPropertyDescriptors(rawPd,javaType);
} catch (Exception e) {
// this should never happen
throw new RuntimeException(e.getMessage());
}
return pd;
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/EntityBeanDeserializerFactory.java
Index: EntityBeanDeserializerFactory.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: EntityBeanDeserializerFactory.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.apache.axis.encoding.ser.BaseDeserializerFactory;
import javax.xml.rpc.namespace.QName;
/**
* Factory for server-side Entity Bean Deserialization.
* <br>
* <h3>Change History</h3>
* <ul>
* </ul>
* @created 21.03.2002
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @version $Revision: 1.1 $
*/
public class EntityBeanDeserializerFactory extends BaseDeserializerFactory {
//
// Constructors
//
public EntityBeanDeserializerFactory(Class javaType, QName xmlType) {
super(EntityBeanDeserializer.class,false,xmlType,javaType);
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/SerialisationResponseHandler.java
Index: SerialisationResponseHandler.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: SerialisationResponseHandler.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
/**
* This handler is to force serialisation inside transaction and
* security boundaries.
* <br>
* <h3>Change notes</h3>
* <ul>
* </ul>
* @created 22.03.2002
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @version $Revision: 1.1 $
*/
public class SerialisationResponseHandler extends BasicHandler {
//
// API
//
/**
* force deserialisation by accessing the msgcontext.
* @see Handler#invoke(MessageContext)
*/
public void invoke(MessageContext msgContext) throws AxisFault {
msgContext.getResponseMessage().getContentType();
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/TransactionRequestHandler.java
Index: TransactionRequestHandler.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: TransactionRequestHandler.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.apache.axis.MessageContext;
import org.apache.axis.AxisFault;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.NotSupportedException;
/**
* This handler is to create an artifical "client"-side transaction
* around the web-service request. Useful for interacting with entity beans.
* It should be complemented by a seperate
* <code>org.jboss.net.axis.server.TransactionResponseHandler</code>
* in the response chain to finish the transaction.
* <br>
* <h3>Change notes</h3>
* <ul>
* </ul>
* @created 22.03.2002
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @version $Revision: 1.1 $
*/
public class TransactionRequestHandler extends TransactionResponseHandler {
protected static final Object MARKER = new Object();
public TransactionRequestHandler() throws Exception {
}
//
// API
//
/**
* begins a new transaction if not yet started
* @see Handler#invoke(MessageContext)
*/
public void invoke(MessageContext msgContext) throws AxisFault {
try {
if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION
&& msgContext.getProperty(Constants.TRANSACTION_PROPERTY) == null) {
userTransaction.begin();
msgContext.setProperty(Constants.TRANSACTION_PROPERTY, MARKER);
}
} catch (SystemException e) {
throw new AxisFault("Could not analyze tx setting.", e);
} catch (NotSupportedException e) {
throw new AxisFault("Could not begin tx.", e);
}
}
}
1.1
contrib/jboss.net/src/main/org/jboss/net/axis/server/TransactionResponseHandler.java
Index: TransactionResponseHandler.java
===================================================================
/*
* JBoss, the OpenSource J2EE webOS
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
// $Id: TransactionResponseHandler.java,v 1.1 2002/04/02 13:48:39 cgjung Exp $
package org.jboss.net.axis.server;
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import javax.transaction.Transaction;
import javax.transaction.UserTransaction;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* This handler is to finish a previously opened client-side transaction.
* <br>
* <h3>Change notes</h3>
* <ul>
* </ul>
* @created 22.03.2002
* @author <a href="mailto:[EMAIL PROTECTED]">Christoph G. Jung</a>
* @version $Revision: 1.1 $
*/
public class TransactionResponseHandler extends BasicHandler {
final protected UserTransaction userTransaction;
public TransactionResponseHandler() throws NamingException {
userTransaction =
(UserTransaction) new InitialContext().
lookup(Constants.USER_TRANSACTION_JNDI_NAME);
}
//
// Protected Helpers
//
protected void endTransaction(MessageContext msgContext, boolean commit)
throws AxisFault {
Object tx =
msgContext.getProperty(Constants.TRANSACTION_PROPERTY);
if (tx != null) {
try {
if (commit) {
userTransaction.commit();
} else {
userTransaction.rollback();
}
} catch(RollbackException e) {
throw new AxisFault("Could not rollback tx.",e);
} catch(SystemException e) {
throw new AxisFault("Could not influence tx setting.",e);
} catch(HeuristicMixedException e) {
throw new AxisFault("Could not commit tx.",e);
} catch(HeuristicRollbackException e) {
throw new AxisFault("Could not commit tx.",e);
} finally {
msgContext.setProperty(Constants.TRANSACTION_PROPERTY, null);
}
}
}
//
// API
//
/*
* @see Handler#invoke(MessageContext)
*/
public void invoke(MessageContext msgContext) throws AxisFault {
endTransaction(msgContext,true);
}
/*
* @see Handler#onFault(MessageContext)
*/
public void onFault(MessageContext msgContext) {
try{
endTransaction(msgContext,false);
} catch(AxisFault e) {
}
}
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development