Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » JDOM User »

[jdom-interest] Re: JDOM w/ Apache Axis (Jerry Jalenak)

Charles Robinson

2004-04-14



I have had no problem using JDOM with Apache/AXIS although I do all my deployment through jws files. Note: I am trying to write services that the lowest common denominator (cf Visual Basic) can understand. Thus, for the most part, my interface is String in, String out where the strings are either just simple parameters or XML object trees represented as a string. (This may in fact be your problem: you don't want to send an Element across the wire but rather a String whose content is the XML for the Element.)

I enclose the complete client super class which does the work. The encode methods take an appropriate Java class tree (all of whose members are subclasses of XMLType) and, using JDOM converts it to XML: see in particular encodeAsString. The analyze methods do the inverse: take an XML tree as represented by JDOM, parse it and return an object of type XMLType (which is probably a tree of objects of type XMLType).

The method getResponseFromServer does the actual transmission to the server.

Hope this all helps.

package  com.abbott.pprd.hts.sirna.xmlobjects;

import java.io.*;
import java.util.*;
import java.lang.reflect.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import java.net.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;


/**
 * The <code>XMLType</code> class is an abstract base class
 * performing creation and manipulation of java classes from stringified XML sent from the axis/siRNA server.
 * @version     0.01; 1/28/04
 * @author      C. Robinson
 */

 abstract class XMLType {
         
 /** The path of the objects from this package */
 static final String objectPath = "xmlobjects.";
 /** A Log4J logging instance for this class  */
 static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(XMLType.class);
 
 /** The URL of the SOAP service supplying the muscle  */
 static final String urlString = "http://ppdapf07.northamerica.intra.abbott.com:8071/axis/SIRNARelationalService.jws";

 /** The XML attributes representing variable data for this class  */
 protected Hashtable attributes = new Hashtable();
 /** The children of this class if this is a standard container class  */
 protected ArrayList children = null;

    /**
     * Generate an instance of the class represented by this XML element
     *
     * @param el an XML element
     *
     * @return an instantion of the class represented by the Element
     *
     */
 public XMLType analyze(Element el) throws Exception,Throwable {
        analyzeAttributes(el);
        analyzeChildren(el);
        dirty = false;
             return this;
 }

 /** Dirty is true if the object has been modified since fetch. Initialized to true. */
 boolean dirty = true;
    /**
     * Return the state of dirtyness
     *
     * @return the dirtyness state
     *
     */
 public boolean isDirty() {return dirty;}

 /**
  * Set the state of dirtyness
  *
  * @param x the dirtyness state
  *
  */
 public void setDirty(boolean x) {dirty = x;}
 /**
  * Get the attributes (name/value pairs)
  *
  * @return the Hashtable of attributes
  *
  */

 protected Hashtable getAttributes() {return attributes;}
 protected void setAttributes(Hashtable h) {attributes=h;}
 
 /**
  * Save an attribute in the set of attribute (remove same if null or "")
  * set dirty = true if old attribute and the new one disaagree
  *
  * @param attri the name of the attribute to be set
  * @param value the value of the attribute to be set (null is represented by null or "")
  *
  */
 public void putAttribute(String attri,String value) {
         String x = getAttribute(attri);
         if (x==null) {
                 if ((value == null) || value.equals("")) return;
         } else if (x.equals(value)) {
                 return;
         }
         if ((value == null) || value.equals("")) {
                 attributes.remove(attri);
         } else {
                 attributes.put(attri,value);
         }
         dirty = true;
 }

 public String getAttribute(String attri) {
         return (String)attributes.get(attri);
 }
 
 public String encodeAsString() throws Exception {
        StringWriter sw = new StringWriter();
        Document outdoc = new Document(encode());
        XMLOutputter outputter = new XMLOutputter("",true);
        outputter.setIndent(" ");
        outputter.output(outdoc, sw);
        return sw.toString();      
 }
 
 protected Element encode() throws Exception {
//         LOG.info("encode "+this.getClass().getName());                
         StringTokenizer st = new StringTokenizer(getClass().getName(),".");
         String lastName ="?";
         while (st.hasMoreTokens()) lastName=st.nextToken();
         Element el = new Element(lastName);
        encodeAttributes(el);
        encodeChildren(el);
        return el;
 }
 
 protected void encodeAttributes(Element el) {
         for (Iterator i = attributes.keySet().iterator();i.hasNext();) {
                 String a = (String)i.next();
                 el.setAttribute(a,getAttribute(a));
         }
 }

 protected void encodeChildren(Element el)  throws Exception {
         if (children != null) for (Iterator i = children.iterator();i.hasNext();) {
                 XMLType child = (XMLType)i.next();
                 el.addContent(child.encode());
         }
 }

 protected void analyzeAttributes(Element el) throws Exception {
         List t = el.getAttributes();
         for (Iterator i = t.iterator();i.hasNext();) {
                 Attribute a = (Attribute)i.next();
                 attributes.put(a.getName(),a.getValue());
        }
 }

 protected void analyzeChildren(Element el) throws Exception, Throwable {
         children = new ArrayList(); // all of type XMLType
        List t = el.getChildren();
         for (Iterator i = t.iterator();i.hasNext();) {
                Element e = (Element)i.next();
                     String name = e.getName();
                XMLType x = (XMLType)Class.forName(objectPath+e.getName()).newInstance();
                children.add(x.analyze(e));
        }
 }

 public void putChild(XMLType x) throws Exception,Throwable {
         if (children==null) children = getChildren(); // in case we are only partially fetched
         children.add(x);
 }
 
 public ArrayList getChildren() throws Exception {
         if (children==null) children = new ArrayList(); // we have no current chilren --> create a list for same
         return children;
 }

 protected static String getResponseFromServer(String meth, Object[] args) throws Exception {
 //         LOG.info("Processing "+meth);                
        Call call = (Call)new Service().createCall();
        call.setOperationName(new javax.xml.namespace.QName("http://soapinterop.org/", meth));
        call.setTargetEndpointAddress(new URL(urlString));
        return (String)call.invoke(args);
 }

 protected static int getIntResponseFromServer(String meth, Object[] args) throws Exception {
 //         LOG.info("Processing "+meth);                
        Call call = (Call)new Service().createCall();
        call.setOperationName(new javax.xml.namespace.QName("http://soapinterop.org/", meth));
        call.setTargetEndpointAddress(new URL(urlString));
        Integer i = (Integer)call.invoke(args);
        return i.intValue();
 }

}



jdom-interest-request@jdom.org
Sent by: jdom-interest-admin@jdom.org

04/14/2004 01:01 AM
Please respond to jdom-interest

       
        To:        jdom-interest@jdom.org
        cc:        
        Subject:        jdom-interest digest, Vol 1 #1463 - 1 msg



Send jdom-interest mailing list submissions to
                jdom-interest@jdom.org

To subscribe or unsubscribe via the World Wide Web, visit
                http://lists.denveronline.net/mailman/listinfo/jdom-interest
or, via email, send a message with subject or body 'help' to
                jdom-interest-request@jdom.org

You can reach the person managing the list at
                jdom-interest-admin@jdom.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of jdom-interest digest..."


Today's Topics:

  1. JDOM w/ Apache Axis (Jerry Jalenak)

--__--__--

Message: 1
From: "Jerry Jalenak" <Jerry.Jalenak@LABONE.com>
To: "'jdom-interest@jdom.org'" <jdom-interest@jdom.org>
Date: Tue, 13 Apr 2004 11:25:14 -0500
Subject: [jdom-interest] JDOM w/ Apache Axis

Greetings All!

I'm fairly new to using JDOM to generate XML, so bear with me.  I'm in the
processing of writing a web service using Apache Axis.  As part of my
'learning' process, I've been able to have a dotNet client hit my web
service and retrieve a basic String, a basic JavaBean, and an Array object
from the JavaBean.  I'm now trying to generate a XML document using JDOM,
and pass it back to the client.  Here's my basic 'HelloWorld'
implementation:

package ws;

import org.jdom.Element;

/**
* @author jjalenak
*
*/
public class HelloWorldImpl implements HelloWorld
{
                /* (non-Javadoc)
                 * @see ws.HelloWorld#hello()
                 */
                public Document hello() throws Exception
                {
                                 Document _d = new Document();
                                 
                                                  Element _e = new Element("root");
                                                  _e.setText("Hi There!");

                                 _d.setRootElement(_e);
                                 return _d;
                }

                /* (non-Javadoc)
                 * @see ws.HelloWorld#goodbye()
                 */
                public Document goodbye() throws Exception
                {
                                 Document _d = new Document();
                                 
                                                  Element _e = new Element("root");
                                                  _e.setText("Good Bye!");

                                 _d.setRootElement(_e);
                                 return _d;
                }
}

When I ran the WSDL2JAVA emitter, it created a 'Document' bean in my 'ws'
package, and removed the import for the org.jdom.Document.  The web service
deploys on Tomcat (5.0.18) without any problems.  When I try to call the web
service from my test Java web app, I get the following exception:

exception is (500)Internal Server Error
AxisFault
faultCode: {http://xml.apache.org/axis/}HTTP
faultSubcode:
faultString: (500)Internal Server Error
faultActor:
faultNode:
faultDetail:
                {}string: return code:  500

Digging into this, I found what I think is the 'true' problem :
java.io.IOException: No serializer found for class org.jdom.Element in
registry org.apache.axis.encoding.TypeMappingImpl@6c2308.  It appears that
although WSDL2JAVA converted the Document object to a proper bean, it didn't
do the Element object.  I not quite sure where to go from here, so if anyone
has some guidance, I'd sure appreciate it.  Better yet, if someone has a
working example of an Axis-based webservice using JDOM that they can share,
I'd also appreciate being able to get a look at it.

Thanks!

Jerry Jalenak
Development Manager, Web Publishing
LabOne, Inc.
10101 Renner Blvd.
Lenexa, KS  66219
(913) 577-1496

jerry.jalenak@labone.com


This transmission (and any information attached to it) may be confidential and
is intended solely for the use of the individual or entity to which it is
addressed. If you are not the intended recipient or the person responsible for
delivering the transmission to the intended recipient, be advised that you
have received this transmission in error and that any use, dissemination,
forwarding, printing, or copying of this information is strictly prohibited.
If you have received this transmission in error, please immediately notify
LabOne at the following email address: securityincidentreporting@labone.com



--__--__--

_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com

End of jdom-interest Digest


©2008 junlu.com - Jax Systems, LLC, U.S.A.