You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Rolando Pablos Sánchez <rp...@tid.es> on 2003/01/15 11:34:06 UTC
Attachments with atributtes
I made this question time ago, but nobody answered.
I need attachments, and now I am specifying the attachment in the wsdl file like this:
<xs:element name="Content" type="apachesoap:DataHandler" minOccurs="0" maxOccurs="unbounded"/>
But I need to specify more attributes in this element, because I don´t know how to write the element description to include attributes and besides that the WSDL2Java generates the correct stubs.
May be there is another form of doing attachments; if you know, please, let me know.
So my question is how can I get a element that is an attachment and also has attributes. The result would be similar to this:
<Content href="cid:XXX" myatt1="XXX" myatt2="XXX"/>
P.D.:
I tried:
<xs:element name="Content" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="apachesoap:DataHandler">
<xs:attribute name="type" type="tns:ContentQuality"/>
<xs:attribute name="allowAdaptations" type="xs:boolean" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
But it didn't work.
It generates a class extending SimpleType, and axis thinks that always is possible the String representation of the value. In few words, what you get is a call to the toString() method in the DataHandler class.
Thank you in advance
Re: Attachments with atributtes
Posted by Rolando Pablos Sánchez <rp...@tid.es>.
I created my own serializer based on your code and it works. Thanks for that.
But I have problems with the server side. I modified the wsdd to include my de/serializers and I modified my skeleton stub to remove the DataHandler type and put my Attachment_attribute class type. I must have modified the skeleton incorrectly because now the there is a exception: No such operation: "myoperation". I didn´t modified the name. Do you know something about this.
----- Original Message -----
From: cmchenry@integro.com
To: axis-user@xml.apache.org
Sent: Wednesday, January 15, 2003 3:49 PM
Subject: Re: Attachments with atributtes
I wrote a custom serializer to do something similar. I needed a referenced attachment to be serialized within a bean. The <content> element needed to support byte[] content or just be empty and reference the attachment if available. You need to do some additional stuff like write a Serializer Factory and setup type mappings in your server-config.wsdd. Look at the encoding samples for more complete information on this. Also take a look at the source for org.apache.axis.encoding.ser.Simple*. I think I started with these classes as the basis for my custom serializer.
Hope this helps!
Here is the Serializer:
package com.integro.neien.node.ser;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.message.SOAPHandler;
import org.apache.axis.Constants;
import org.apache.axis.Message;
import org.apache.axis.attachments.AttachmentPart;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.SAXException;
import org.apache.axis.Constants;
import org.apache.axis.wsdl.fromJava.Types;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.util.Hashtable;
import javax.activation.DataHandler;
import com.integro.neien.node.CdxDocument;
public class CdxDocSerializer implements Serializer
{
public static final String NAME = "name";
public static final String TYPE = "type";
public static final String CONTENT = "content";
public static final QName myTypeQName = new QName("http://www.neien.org/schema/v0.9/cdx.xsd", "cdxDocument");
/** SERIALIZER STUFF
*/
/**
* Serialize an element named name, with the indicated attributes
* and value.
* @param name is the element name
* @param attributes are the attributes...serialize is free to add more.
* @param value is the value
* @param context is the SerializationContext
*/
public void serialize(QName name,
Attributes attributes,
Object value,
SerializationContext context)
throws IOException
{
if (!(value instanceof CdxDocument))
throw new IOException("Can't serialize a " + value.getClass().getName() + " with a DataSerializer.");
CdxDocument doc = (CdxDocument)value;
context.startElement(name, attributes);
context.serialize(new QName("", NAME), null, doc.getName());
context.serialize(new QName("", TYPE), null, doc.getType());
// if datahandler is not null
DataHandler dh = doc.getDh();
String apCID = null;
AttributesImpl conAttribs = null;
if(dh != null)
{
// get response message and create an attachment
Message msg = context.getCurrentMessage();
AttachmentPart ap = (AttachmentPart) msg.createAttachmentPart();
ap.setContent(dh.getInputStream(), "");
// get the attachment content id
apCID = ap.getContentIdRef();
msg.addAttachmentPart(ap);
conAttribs = new AttributesImpl();
conAttribs.addAttribute("",
"href",
"",
"String",
apCID);
}
// Create an href attribute with the attachment id
context.serialize(new QName("", CONTENT), conAttribs, doc.getContent());
context.endElement();
}
public String getMechanismType() { return Constants.AXIS_SAX; }
public boolean writeSchema(Types types) throws Exception
{
return false;
}
}
Here is the bean:
/**
* CdxDocument.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/
package com.integro.neien.node;
import javax.activation.DataHandler;
public class CdxDocument implements java.io.Serializable {
public java.lang.String name;
public com.integro.neien.node.DocumentType type;
public byte[] content;
public DataHandler dh;
public CdxDocument() {
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public com.integro.neien.node.DocumentType getType() {
return type;
}
public void setType(com.integro.neien.node.DocumentType type) {
this.type = type;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public DataHandler getDh() {
return dh;
}
public void setDh(DataHandler dh) {
this.dh = dh;
}
private java.lang.Object __equalsCalc = null;
public synchronized boolean equals(java.lang.Object obj) {
if (!(obj instanceof CdxDocument)) return false;
CdxDocument other = (CdxDocument) obj;
if (obj == null) return false;
if (this == obj) return true;
if (__equalsCalc != null) {
return (__equalsCalc == obj);
}
__equalsCalc = obj;
boolean _equals;
_equals = true &&
((name==null && other.getName()==null) ||
(name!=null &&
name.equals(other.getName()))) &&
((type==null && other.getType()==null) ||
(type!=null &&
type.equals(other.getType()))) &&
((content==null && other.getContent()==null) ||
(content!=null &&
java.util.Arrays.equals(content, other.getContent())));
__equalsCalc = null;
return _equals;
}
private boolean __hashCodeCalc = false;
public synchronized int hashCode() {
if (__hashCodeCalc) {
return 0;
}
__hashCodeCalc = true;
int _hashCode = 1;
if (getName() != null) {
_hashCode += getName().hashCode();
}
if (getType() != null) {
_hashCode += getType().hashCode();
}
if (getContent() != null) {
for (int i=0;
i<java.lang.reflect.Array.getLength(getContent());
i++) {
java.lang.Object obj = java.lang.reflect.Array.get(getContent(), i);
if (obj != null &&
!obj.getClass().isArray()) {
_hashCode += obj.hashCode();
}
}
}
__hashCodeCalc = false;
return _hashCode;
}
// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
new org.apache.axis.description.TypeDesc(CdxDocument.class);
static {
org.apache.axis.description.FieldDesc field = new org.apache.axis.description.ElementDesc();
field.setFieldName("name");
field.setXmlName(new javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd", "name"));
field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
typeDesc.addFieldDesc(field);
field = new org.apache.axis.description.ElementDesc();
field.setFieldName("type");
field.setXmlName(new javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd", "type"));
field.setXmlType(new javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd", "DocumentType"));
typeDesc.addFieldDesc(field);
field = new org.apache.axis.description.ElementDesc();
field.setFieldName("content");
field.setXmlName(new javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd", "content"));
field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "base64Binary"));
typeDesc.addFieldDesc(field);
};
/**
* Return type metadata object
*/
public static org.apache.axis.description.TypeDesc getTypeDesc() {
return typeDesc;
}
/**
* Get Custom Serializer
*/
//public static org.apache.axis.encoding.Serializer getSerializer(
// java.lang.String mechType,
// java.lang.Class _javaType,
// javax.xml.namespace.QName _xmlType) {
// return
// new com.integro.neien.node.ser.CdxDocSerializer(
// _javaType, _xmlType, typeDesc);
//}
/**
* Get Custom Deserializer
*/
//public static org.apache.axis.encoding.Deserializer getDeserializer(
// java.lang.String mechType,
// java.lang.Class _javaType,
// javax.xml.namespace.QName _xmlType) {
// return
// new com.integro.neien.node.ser.CdxDocDeserializer(
// _javaType, _xmlType, typeDesc);
//}
}
Rolando Pablos Sánchez <rp...@tid.es>
01/15/2003 03:34 AM
Please respond to axis-user
To: "axis-user" <ax...@xml.apache.org>
cc:
Subject: Attachments with atributtes
I made this question time ago, but nobody answered.
I need attachments, and now I am specifying the attachment in the wsdl file like this:
<xs:element name="Content" type="apachesoap:DataHandler" minOccurs="0" maxOccurs="unbounded"/>
But I need to specify more attributes in this element, because I don´t know how to write the element description to include attributes and besides that the WSDL2Java generates the correct stubs.
May be there is another form of doing attachments; if you know, please, let me know.
So my question is how can I get a element that is an attachment and also has attributes. The result would be similar to this:
<Content href="cid:XXX" myatt1="XXX" myatt2="XXX"/>
P.D.:
I tried:
<xs:element name="Content" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="apachesoap:DataHandler">
<xs:attribute name="type" type="tns:ContentQuality"/>
<xs:attribute name="allowAdaptations" type="xs:boolean" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
But it didn't work.
It generates a class extending SimpleType, and axis thinks that always is possible the String representation of the value. In few words, what you get is a call to the toString() method in the DataHandler class.
Thank you in advance
Re: Attachments with atributtes
Posted by cm...@integro.com.
I wrote a custom serializer to do something similar. I needed a
referenced attachment to be serialized within a bean. The <content>
element needed to support byte[] content or just be empty and reference
the attachment if available. You need to do some additional stuff like
write a Serializer Factory and setup type mappings in your
server-config.wsdd. Look at the encoding samples for more complete
information on this. Also take a look at the source for
org.apache.axis.encoding.ser.Simple*. I think I started with these
classes as the basis for my custom serializer.
Hope this helps!
Here is the Serializer:
package com.integro.neien.node.ser;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.message.SOAPHandler;
import org.apache.axis.Constants;
import org.apache.axis.Message;
import org.apache.axis.attachments.AttachmentPart;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.SAXException;
import org.apache.axis.Constants;
import org.apache.axis.wsdl.fromJava.Types;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.util.Hashtable;
import javax.activation.DataHandler;
import com.integro.neien.node.CdxDocument;
public class CdxDocSerializer implements Serializer
{
public static final String NAME = "name";
public static final String TYPE = "type";
public static final String CONTENT = "content";
public static final QName myTypeQName = new
QName("http://www.neien.org/schema/v0.9/cdx.xsd", "cdxDocument");
/** SERIALIZER STUFF
*/
/**
* Serialize an element named name, with the indicated attributes
* and value.
* @param name is the element name
* @param attributes are the attributes...serialize is free to add
more.
* @param value is the value
* @param context is the SerializationContext
*/
public void serialize(QName name,
Attributes attributes,
Object value,
SerializationContext context)
throws IOException
{
if (!(value instanceof CdxDocument))
throw new IOException("Can't serialize a " +
value.getClass().getName() + " with a DataSerializer.");
CdxDocument doc = (CdxDocument)value;
context.startElement(name, attributes);
context.serialize(new QName("", NAME), null, doc.getName());
context.serialize(new QName("", TYPE), null, doc.getType());
// if datahandler is not null
DataHandler dh = doc.getDh();
String apCID = null;
AttributesImpl conAttribs = null;
if(dh != null)
{
// get response message and create an attachment
Message msg = context.getCurrentMessage();
AttachmentPart ap = (AttachmentPart)
msg.createAttachmentPart();
ap.setContent(dh.getInputStream(), "");
// get the attachment content id
apCID = ap.getContentIdRef();
msg.addAttachmentPart(ap);
conAttribs = new AttributesImpl();
conAttribs.addAttribute("",
"href",
"",
"String",
apCID);
}
// Create an href attribute with the attachment id
context.serialize(new QName("", CONTENT), conAttribs,
doc.getContent());
context.endElement();
}
public String getMechanismType() { return Constants.AXIS_SAX; }
public boolean writeSchema(Types types) throws Exception
{
return false;
}
}
Here is the bean:
/**
* CdxDocument.java
*
* This file was auto-generated from WSDL
* by the Apache Axis WSDL2Java emitter.
*/
package com.integro.neien.node;
import javax.activation.DataHandler;
public class CdxDocument implements java.io.Serializable {
public java.lang.String name;
public com.integro.neien.node.DocumentType type;
public byte[] content;
public DataHandler dh;
public CdxDocument() {
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public com.integro.neien.node.DocumentType getType() {
return type;
}
public void setType(com.integro.neien.node.DocumentType type) {
this.type = type;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public DataHandler getDh() {
return dh;
}
public void setDh(DataHandler dh) {
this.dh = dh;
}
private java.lang.Object __equalsCalc = null;
public synchronized boolean equals(java.lang.Object obj) {
if (!(obj instanceof CdxDocument)) return false;
CdxDocument other = (CdxDocument) obj;
if (obj == null) return false;
if (this == obj) return true;
if (__equalsCalc != null) {
return (__equalsCalc == obj);
}
__equalsCalc = obj;
boolean _equals;
_equals = true &&
((name==null && other.getName()==null) ||
(name!=null &&
name.equals(other.getName()))) &&
((type==null && other.getType()==null) ||
(type!=null &&
type.equals(other.getType()))) &&
((content==null && other.getContent()==null) ||
(content!=null &&
java.util.Arrays.equals(content, other.getContent())));
__equalsCalc = null;
return _equals;
}
private boolean __hashCodeCalc = false;
public synchronized int hashCode() {
if (__hashCodeCalc) {
return 0;
}
__hashCodeCalc = true;
int _hashCode = 1;
if (getName() != null) {
_hashCode += getName().hashCode();
}
if (getType() != null) {
_hashCode += getType().hashCode();
}
if (getContent() != null) {
for (int i=0;
i<java.lang.reflect.Array.getLength(getContent());
i++) {
java.lang.Object obj =
java.lang.reflect.Array.get(getContent(), i);
if (obj != null &&
!obj.getClass().isArray()) {
_hashCode += obj.hashCode();
}
}
}
__hashCodeCalc = false;
return _hashCode;
}
// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
new org.apache.axis.description.TypeDesc(CdxDocument.class);
static {
org.apache.axis.description.FieldDesc field = new
org.apache.axis.description.ElementDesc();
field.setFieldName("name");
field.setXmlName(new
javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd",
"name"));
field.setXmlType(new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
typeDesc.addFieldDesc(field);
field = new org.apache.axis.description.ElementDesc();
field.setFieldName("type");
field.setXmlName(new
javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd",
"type"));
field.setXmlType(new
javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd",
"DocumentType"));
typeDesc.addFieldDesc(field);
field = new org.apache.axis.description.ElementDesc();
field.setFieldName("content");
field.setXmlName(new
javax.xml.namespace.QName("http://node.neien.integro.com/schema/cdx.xsd",
"content"));
field.setXmlType(new
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema",
"base64Binary"));
typeDesc.addFieldDesc(field);
};
/**
* Return type metadata object
*/
public static org.apache.axis.description.TypeDesc getTypeDesc() {
return typeDesc;
}
/**
* Get Custom Serializer
*/
//public static org.apache.axis.encoding.Serializer getSerializer(
// java.lang.String mechType,
// java.lang.Class _javaType,
// javax.xml.namespace.QName _xmlType) {
// return
// new com.integro.neien.node.ser.CdxDocSerializer(
// _javaType, _xmlType, typeDesc);
//}
/**
* Get Custom Deserializer
*/
//public static org.apache.axis.encoding.Deserializer getDeserializer(
// java.lang.String mechType,
// java.lang.Class _javaType,
// javax.xml.namespace.QName _xmlType) {
// return
// new com.integro.neien.node.ser.CdxDocDeserializer(
// _javaType, _xmlType, typeDesc);
//}
}
Rolando Pablos Sánchez <rp...@tid.es>
01/15/2003 03:34 AM
Please respond to axis-user
To: "axis-user" <ax...@xml.apache.org>
cc:
Subject: Attachments with atributtes
I made this question time ago, but nobody answered.
I need attachments, and now I am specifying the attachment in the wsdl
file like this:
<xs:element name="Content" type="apachesoap:DataHandler" minOccurs="0"
maxOccurs="unbounded"/>
But I need to specify more attributes in this element, because I don´t
know how to write the element description to include attributes and
besides that the WSDL2Java generates the correct stubs.
May be there is another form of doing attachments; if you know, please,
let me know.
So my question is how can I get a element that is an attachment and also
has attributes. The result would be similar to this:
<Content href="cid:XXX" myatt1="XXX" myatt2="XXX"/>
P.D.:
I tried:
<xs:element name="Content" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="apachesoap:DataHandler">
<xs:attribute name="type" type="tns:ContentQuality"/>
<xs:attribute name="allowAdaptations" type="xs:boolean"
use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
But it didn't work.
It generates a class extending SimpleType, and axis thinks that always is
possible the String representation of the value. In few words, what you
get is a call to the toString() method in the DataHandler class.
Thank you in advance