blob: e244accf90bbca14f15043217ef1720a475b6be2 [file] [log] [blame]
/*
* 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.uima.adapter.soap;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import org.apache.axis.AxisFault;
import org.apache.axis.attachments.AttachmentUtils;
import org.apache.axis.encoding.Base64;
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.DeserializerImpl;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.axis.soap.SOAPConstants;
import org.apache.axis.utils.Messages;
import org.apache.uima.internal.util.SerializationUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* An Axis deserializer for {@link Serializable} objects. The serialized bytes are Base-64 encoded
* for transport via SOAP.
*
*
*/
public class BinaryDeserializer extends DeserializerImpl {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1351090281481173811L;
/** The buf. */
private StringBuffer buf = new StringBuffer();
/* (non-Javadoc)
* @see org.apache.axis.encoding.DeserializerImpl#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes, org.apache.axis.encoding.DeserializationContext)
*/
@Override
public void startElement(String namespace, String localName, String prefix,
Attributes attributes, DeserializationContext context) throws SAXException {
// System.out.println("startElement(" + namespace + "," + localName + "," + prefix + ")");
if (!context.isDoneParsing()) {
if (myElement == null) {
try {
myElement = makeNewElement(namespace, localName, prefix, attributes, context);
} catch (AxisFault axisFault) {
throw new SAXException(axisFault);
}
context.pushNewElement(myElement);
}
}
SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants();
QName type = context.getTypeFromAttributes(namespace, localName, attributes);
if (log.isDebugEnabled()) {
log.debug(Messages.getMessage("gotType00", "Deser", "" + type));
}
String href = attributes.getValue(soapConstants.getAttrHref());
// System.out.println(soapConstants.getAttrHref() + " = " + href);
if (href != null) {
Object ref = context.getObjectByRef(href);
// System.out.println(ref.getClass().getName());
// System.out.println(ref);
if (ref instanceof SOAPBodyElement) // multiref, deref. again
{
SOAPBodyElement bodyElem = (SOAPBodyElement) ref;
href = bodyElem.getAttributeValue(soapConstants.getAttrHref());
ref = context.getObjectByRef(href);
// System.out.println(ref.getClass().getName());
// System.out.println(ref);
}
if (ref instanceof org.apache.axis.Part) {
try {
DataHandler dataHandler = AttachmentUtils
.getActivationDataHandler((org.apache.axis.Part) ref);
Object content = dataHandler.getContent();
// System.out.println(content.getClass().getName());
ObjectInputStream objStream = new ObjectInputStream((InputStream) content);
try {
setValue(objStream.readObject());
} finally {
objStream.close();
}
} catch (org.apache.axis.AxisFault e) {
throw new SAXException(e.getMessage());
} catch (java.io.IOException e) {
throw new SAXException(e.getMessage());
} catch (ClassNotFoundException e) {
throw new SAXException(e.getMessage());
}
}
}
// if we didn't set a value, call default implementation
if (getValue() == null) {
super.startElement(namespace, localName, prefix, attributes, context);
}
// buf.setLength(0);
}
/**
* On start element.
*
* @param namespace the namespace
* @param localName the local name
* @param prefix the prefix
* @param attributes the attributes
* @param context the context
* @throws SAXException the SAX exception
* @see org.apache.axis.message.SOAPHandler#onStartChild(String, String, String, Attributes, DeserializationContext)
*/
@Override
public void onStartElement(String namespace, String localName, String prefix,
Attributes attributes, DeserializationContext context) throws SAXException {
buf.setLength(0);
}
/**
* On end element.
*
* @param arg0 the arg 0
* @param arg1 the arg 1
* @param arg2 the arg 2
* @throws SAXException the SAX exception
* @see org.apache.axis.encoding.Deserializer#onEndElement(java.lang.String, java.lang.String,
* org.apache.axis.encoding.DeserializationContext)
*/
@Override
public void onEndElement(String arg0, String arg1, DeserializationContext arg2)
throws SAXException {
try {
// System.out.println("onEndElement(" + arg0 + "," + arg1 + ")");
// deserialize (if not done already via attachments)
if (this.getValue() == null) {
// System.out.println("deserializing - no attachments found"); //DEBUG
String base64str = buf.toString();
// System.out.println("Base64str: " + base64str);
if (base64str.length() > 0) {
byte[] bytes = Base64.decode(base64str);
setValue(SerializationUtils.deserialize(bytes));
}
}
} catch (Exception e) {
e.printStackTrace();
throw new SAXException(e);
}
}
/**
* Characters.
*
* @param ch the ch
* @param start the start
* @param length the length
* @throws SAXException the SAX exception
* @see org.xml.sax.ContentHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// System.out.println("characters(" + new String(ch,start,length) + ")");
buf.append(ch, start, length);
}
}