package org.jboss.axis.wsdl.toJava;
import org.jboss.axis.Constants;
import org.jboss.axis.enums.Style;
import org.jboss.axis.utils.JavaUtils;
import org.jboss.axis.wsdl.symbolTable.BindingEntry;
import org.jboss.axis.wsdl.symbolTable.CollectionTE;
import org.jboss.axis.wsdl.symbolTable.Element;
import org.jboss.axis.wsdl.symbolTable.MessageEntry;
import org.jboss.axis.wsdl.symbolTable.MimeInfo;
import org.jboss.axis.wsdl.symbolTable.Parameter;
import org.jboss.axis.wsdl.symbolTable.Parameters;
import org.jboss.axis.wsdl.symbolTable.SchemaUtils;
import org.jboss.axis.wsdl.symbolTable.SymbolTable;
import org.jboss.axis.wsdl.symbolTable.TypeEntry;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.wsdl.BindingInput;
import javax.wsdl.BindingOperation;
import javax.wsdl.Input;
import javax.wsdl.Message;
import javax.wsdl.Operation;
import javax.wsdl.Part;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.UnknownExtensibilityElement;
import javax.wsdl.extensions.mime.MIMEMultipartRelated;
import javax.wsdl.extensions.soap.SOAPBody;
import javax.xml.namespace.QName;
import javax.xml.rpc.holders.BooleanHolder;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
public class Utils extends org.jboss.axis.wsdl.symbolTable.Utils
{
public static String holder(MimeInfo mimeInfo, TypeEntry type, Emitter emitter)
{
String mimeType = mimeInfo == null ? null : mimeInfo.getType();
String mimeDimensions = mimeInfo == null ? "" : mimeInfo.getDimensions();
if (mimeType != null)
{
if (mimeType.equals("image/gif") ||
mimeType.equals("image/jpeg"))
{
return "org.jboss.axis.holders.ImageHolder" + mimeDimensions;
}
else if (mimeType.equals("text/plain"))
{
return "javax.xml.rpc.holders.StringHolder" + mimeDimensions;
}
else if (mimeType.startsWith("multipart/"))
{
return "org.jboss.axis.holders.MimeMultipartHolder" + mimeDimensions;
}
else if (mimeType.startsWith("application/octetstream")
|| mimeType.startsWith("application/octet-stream"))
{
return "org.jboss.axis.holders.OctetStreamHolder" + mimeDimensions;
}
else if (mimeType.equals("text/xml") ||
mimeType.equals("application/xml"))
{
return "org.jboss.axis.holders.SourceHolder" + mimeDimensions;
}
}
String typeValue = type.getName();
if (typeValue.equals("byte[]"))
{
return "javax.xml.rpc.holders.ByteArrayHolder";
}
else if (typeValue.endsWith("[]"))
{
String name = emitter.getJavaName(type.getQName());
name = JavaUtils.replace(name, "[]", "Array");
name = addPackageName(name, "holders");
return name + "Holder";
}
else if (typeValue.equals("String"))
{
return "javax.xml.rpc.holders.StringHolder";
}
else if (typeValue.equals("java.lang.String"))
{
return "javax.xml.rpc.holders.StringHolder";
}
else if (typeValue.equals("Object"))
{
return "javax.xml.rpc.holders.ObjectHolder";
}
else if (typeValue.equals("java.lang.Object"))
{
return "javax.xml.rpc.holders.ObjectHolder";
}
else if (typeValue.equals("int")
|| typeValue.equals("long")
|| typeValue.equals("short")
|| typeValue.equals("float")
|| typeValue.equals("double")
|| typeValue.equals("boolean")
|| typeValue.equals("byte"))
{
return "javax.xml.rpc.holders." + capitalizeFirstChar(typeValue) + "Holder";
}
else if (typeValue.startsWith("java.lang."))
{
return "javax.xml.rpc.holders" +
typeValue.substring(typeValue.lastIndexOf(".")) +
"WrapperHolder";
}
else if (typeValue.indexOf(".") < 0)
{
return "javax.xml.rpc.holders" +
typeValue +
"WrapperHolder";
}
else if (typeValue.equals("java.math.BigDecimal"))
{
return "javax.xml.rpc.holders.BigDecimalHolder";
}
else if (typeValue.equals("java.math.BigInteger"))
{
return "javax.xml.rpc.holders.BigIntegerHolder";
}
else if (typeValue.equals("java.util.Date"))
{
return "org.jboss.axis.holders.DateHolder";
}
else if (typeValue.equals("java.util.Calendar"))
{
return "javax.xml.rpc.holders.CalendarHolder";
}
else if (typeValue.equals("javax.xml.namespace.QName"))
{
return "javax.xml.rpc.holders.QNameHolder";
}
else if (typeValue.equals("javax.activation.DataHandler"))
{
return "org.jboss.axis.holders.DataHandlerHolder";
}
else if (typeValue.startsWith("org.jboss.axis.types."))
{
int i = typeValue.lastIndexOf('.');
String t = typeValue.substring(i + 1);
return "org.jboss.axis.holders." + t + "Holder";
}
else
{
return addPackageName(typeValue, "holders") + "Holder";
}
}
public static String addPackageName(String className, String newPkg)
{
int index = className.lastIndexOf(".");
if (index >= 0)
{
return className.substring(0, index)
+ "." + newPkg
+ className.substring(index);
}
else
{
return newPkg + "." + className;
}
}
public static String getFullExceptionName(Message faultMessage,
SymbolTable symbolTable)
{
MessageEntry me = symbolTable.getMessageEntry(faultMessage.getQName());
return (String)me.getDynamicVar(JavaGeneratorFactory.EXCEPTION_CLASS_NAME);
}
public static QName getFaultDataType(Message faultMessage,
SymbolTable symbolTable)
{
MessageEntry me = symbolTable.getMessageEntry(faultMessage.getQName());
return (QName)me.getDynamicVar(JavaGeneratorFactory.EXCEPTION_DATA_TYPE);
}
public static boolean isFaultComplex(Message faultMessage,
SymbolTable symbolTable)
{
MessageEntry me = symbolTable.getMessageEntry(faultMessage.getQName());
Boolean ret = (Boolean)me.getDynamicVar(JavaGeneratorFactory.COMPLEX_TYPE_FAULT);
if (ret != null)
{
return ret.booleanValue();
}
else
{
return false;
}
}
public static Vector getEnumerationBaseAndValues(Node node, SymbolTable symbolTable)
{
if (node == null)
{
return null;
}
QName nodeKind = Utils.getNodeQName(node);
if (nodeKind != null &&
nodeKind.getLocalPart().equals("element") &&
Constants.isSchemaXSD(nodeKind.getNamespaceURI()))
{
NodeList children = node.getChildNodes();
Node simpleNode = null;
for (int j = 0; j < children.getLength() && simpleNode == null; j++)
{
QName simpleKind = Utils.getNodeQName(children.item(j));
if (simpleKind != null &&
simpleKind.getLocalPart().equals("simpleType") &&
Constants.isSchemaXSD(simpleKind.getNamespaceURI()))
{
simpleNode = children.item(j);
node = simpleNode;
}
}
}
nodeKind = Utils.getNodeQName(node);
if (nodeKind != null &&
nodeKind.getLocalPart().equals("simpleType") &&
Constants.isSchemaXSD(nodeKind.getNamespaceURI()))
{
NodeList children = node.getChildNodes();
Node restrictionNode = null;
for (int j = 0; j < children.getLength() && restrictionNode == null; j++)
{
QName restrictionKind = Utils.getNodeQName(children.item(j));
if (restrictionKind != null &&
restrictionKind.getLocalPart().equals("restriction") &&
Constants.isSchemaXSD(restrictionKind.getNamespaceURI()))
restrictionNode = children.item(j);
}
TypeEntry baseEType = null;
if (restrictionNode != null)
{
QName baseType = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
baseEType = symbolTable.getType(baseType);
if (baseEType != null)
{
String javaName = baseEType.getName();
if (javaName.equals("boolean") ||
!SchemaUtils.isSimpleSchemaType(baseEType.getQName()))
{
baseEType = null;
}
}
}
if (baseEType != null && restrictionNode != null)
{
Vector v = new Vector();
NodeList enums = restrictionNode.getChildNodes();
for (int i = 0; i < enums.getLength(); i++)
{
QName enumKind = Utils.getNodeQName(enums.item(i));
if (enumKind != null &&
enumKind.getLocalPart().equals("enumeration") &&
Constants.isSchemaXSD(enumKind.getNamespaceURI()))
{
Node enumNode = enums.item(i);
String value = Utils.getAttribute(enumNode, "value");
if (value != null)
{
v.add(value);
}
}
}
if (v.isEmpty()) return null;
v.add(0, baseEType);
return v;
}
}
return null;
}
public static String capitalizeFirstChar(String name)
{
if (name == null || name.equals(""))
return name;
char start = name.charAt(0);
if (Character.isLowerCase(start))
{
start = Character.toUpperCase(start);
return start + name.substring(1);
}
return name;
}
public static String addUnderscore(String name)
{
if (name == null || name.equals(""))
return name;
return "_" + name;
}
public static String xmlNameToJava(String name)
{
return JavaUtils.xmlNameToJava(name);
}
public static String xmlNameToJavaClass(String name)
{
return capitalizeFirstChar(xmlNameToJava(name));
}
public static String makePackageName(String namespace)
{
String hostname = null;
String path = "";
try
{
URL u = new URL(namespace);
hostname = u.getHost();
path = u.getPath();
}
catch (MalformedURLException e)
{
if (namespace.indexOf(":") > -1)
{
hostname = namespace.substring(namespace.indexOf(":") + 1);
if (hostname.indexOf("/") > -1)
hostname = hostname.substring(0, hostname.indexOf("/"));
}
else
{
hostname = namespace;
}
}
if (hostname == null)
{
return null;
}
hostname = hostname.replace('-', '_');
path = path.replace('-', '_');
if (path.length() > 0 && path.charAt(path.length() - 1) == '/')
{
path = path.substring(0, path.length() - 1);
}
StringTokenizer st = new StringTokenizer(hostname, ".:");
String[] words = new String[st.countTokens()];
for (int i = 0; i < words.length; ++i)
words[i] = st.nextToken();
StringBuffer sb = new StringBuffer(namespace.length());
for (int i = words.length - 1; i >= 0; --i)
{
addWordToPackageBuffer(sb, words[i], (i == words.length - 1));
}
StringTokenizer st2 = new StringTokenizer(path, "/");
while (st2.hasMoreTokens())
{
addWordToPackageBuffer(sb, st2.nextToken(), false);
}
return sb.toString();
}
private static void addWordToPackageBuffer(StringBuffer sb, String word, boolean firstWord)
{
if (JavaUtils.isJavaKeyword(word))
{
word = JavaUtils.makeNonJavaKeyword(word);
}
if (!firstWord)
sb.append('.');
if (Character.isDigit(word.charAt(0)))
sb.append('_');
if (word.indexOf('.') != -1)
{
char[] buf = word.toCharArray();
for (int i = 0; i < word.length(); i++)
{
if (buf[i] == '.')
{
buf[i] = '_';
}
}
word = new String(buf);
}
sb.append(word);
}
public static String getJavaLocalName(String fullName)
{
return fullName.substring(fullName.lastIndexOf('.') + 1);
}
public static String getJavaPackageName(String fullName)
{
if (fullName.lastIndexOf('.') > 0)
{
return fullName.substring(0, fullName.lastIndexOf('.'));
}
else
{
return "";
}
}
public static boolean fileExists(String name, String namespace,
Namespaces namespaces) throws IOException
{
String packageName = namespaces.getAsDir(namespace);
String fullName = packageName + name;
return new File(fullName).exists();
}
private static HashMap TYPES = new HashMap(7);
static
{
TYPES.put("int", "java.lang.Integer");
TYPES.put("float", "java.lang.Float");
TYPES.put("boolean", "java.lang.Boolean");
TYPES.put("double", "java.lang.Double");
TYPES.put("byte", "java.lang.Byte");
TYPES.put("short", "java.lang.Short");
TYPES.put("long", "java.lang.Long");
}
public static String wrapPrimitiveType(TypeEntry type, String var)
{
String objType = type == null ? null : (String)TYPES.get(type.getName());
if (objType != null)
{
return "new " + objType + "(" + var + ")";
}
else if (type != null &&
type.getName().equals("byte[]") &&
type.getQName().getLocalPart().equals("hexBinary"))
{
return "new org.jboss.axis.types.HexBinary(" + var + ")";
}
else
{
return var;
}
}
public static String getResponseString(TypeEntry type, MimeInfo mimeInfo,
String var)
{
String mimeType = mimeInfo == null ? null : mimeInfo.getType();
String mimeDimensions = mimeInfo == null ? "" : mimeInfo.getDimensions();
if (type == null)
{
return ";";
}
else if (mimeType != null)
{
if (mimeType.equals("image/jpeg"))
{
return "(java.awt.Image" + mimeDimensions + ") " + var + ";";
}
else if (mimeType.equals("text/plain"))
{
return "(java.lang.String" + mimeDimensions + ") " + var + ";";
}
else if (mimeType.equals("text/xml") ||
mimeType.equals("application/xml"))
{
return "(javax.xml.transform.Source" + mimeDimensions + ") " + var + ";";
}
else if (mimeType.startsWith("multipart/"))
{
return "(javax.mail.internet.MimeMultipart" + mimeDimensions + ") " + var + ";";
}
else if (mimeType.startsWith("application/octetstream"))
{
return "(org.jboss.axis.attachments.OctetStream" + mimeDimensions + ") " + var + ";";
}
else
{
return "(" + type.getName() + ") " + var + ";";
}
}
else
{
String objType = (String)TYPES.get(type.getName());
if (objType != null)
{
return "((" + objType + ") " + var + ")." + type.getName() + "Value();";
}
else
{
return "(" + type.getName() + ") " + var + ";";
}
}
}
public static boolean isPrimitiveType(TypeEntry type)
{
return TYPES.get(type.getName()) != null;
}
public static QName getOperationQName(BindingOperation bindingOper,
BindingEntry bEntry,
SymbolTable symbolTable)
{
Operation operation = bindingOper.getOperation();
String operationName = operation.getName();
if (bEntry.getBindingStyle() == Style.DOCUMENT &&
symbolTable.isWrapped())
{
Input input = operation.getInput();
if (input != null)
{
Map parts = input.getMessage().getParts();
if (parts != null && !parts.isEmpty())
{
Iterator i = parts.values().iterator();
Part p = (Part)i.next();
return p.getElementName();
}
}
}
String ns = null;
BindingInput bindInput = bindingOper.getBindingInput();
if (bindInput != null)
{
Iterator it = bindInput.getExtensibilityElements().iterator();
while (it.hasNext())
{
ExtensibilityElement elem = (ExtensibilityElement)it.next();
if (elem instanceof SOAPBody)
{
SOAPBody body = (SOAPBody)elem;
ns = body.getNamespaceURI();
break;
}
else if (elem instanceof MIMEMultipartRelated)
{
Object part = null;
javax.wsdl.extensions.mime.MIMEMultipartRelated mpr =
(javax.wsdl.extensions.mime.MIMEMultipartRelated)elem;
List l = mpr.getMIMEParts();
for (int j = 0; l != null && j < l.size() && part == null; j++)
{
javax.wsdl.extensions.mime.MIMEPart mp = (javax.wsdl.extensions.mime.MIMEPart)l.get(j);
List ll = mp.getExtensibilityElements();
for (int k = 0; ll != null && k < ll.size() && part == null; k++)
{
part = ll.get(k);
if (part instanceof SOAPBody)
{
SOAPBody body = (SOAPBody)part;
ns = body.getNamespaceURI();
break;
}
else
{
part = null;
}
}
}
}
else if (elem instanceof UnknownExtensibilityElement)
{
UnknownExtensibilityElement unkElement = (UnknownExtensibilityElement)elem;
QName name = unkElement.getElementType();
if (name.getNamespaceURI().equals(Constants.URI_WSDL12_SOAP) &&
name.getLocalPart().equals("body"))
{
ns = unkElement.getElement().getAttribute("namespace");
}
}
}
}
if (ns == null)
{
ns = "";
}
return new QName(ns, operationName);
}
public static String getNewQName(javax.xml.namespace.QName qname)
{
return "new javax.xml.namespace.QName(\"" +
qname.getNamespaceURI() + "\", \"" +
qname.getLocalPart() + "\")";
}
public static String getParameterTypeName(Parameter parm)
{
String ret;
if (parm.getMIMEInfo() == null)
{
ret = parm.getType().getName();
}
else
{
String mime = parm.getMIMEInfo().getType();
ret = JavaUtils.mimeToJava(mime);
if (ret == null)
{
ret = parm.getType().getName();
}
else
{
ret += parm.getMIMEInfo().getDimensions();
}
}
return ret;
}
public static QName getXSIType(Parameter param)
{
if (param.getMIMEInfo() != null)
{
return getMIMETypeQName(param.getMIMEInfo().getType());
}
return getXSIType(param.getType());
}
public static QName getXSIType(TypeEntry te)
{
QName xmlType = null;
if (te != null &&
te instanceof Element &&
te.getRefType() != null)
{
te = te.getRefType();
}
if (te != null &&
te instanceof CollectionTE &&
te.getRefType() != null)
{
te = te.getRefType();
}
if (te != null)
{
xmlType = te.getQName();
}
return xmlType;
}
public static QName getMIMETypeQName(String mimeName)
{
if ("text/plain".equals(mimeName))
{
return Constants.MIME_PLAINTEXT;
}
else if ("image/gif".equals(mimeName) || "image/jpeg".equals(mimeName))
{
return Constants.MIME_IMAGE;
}
else if ("text/xml".equals(mimeName) || "application/xml".equals(mimeName))
{
return Constants.MIME_SOURCE;
}
else if ("application/octetstream".equals(mimeName))
{
return Constants.MIME_OCTETSTREAM;
}
else if (mimeName != null && mimeName.startsWith("multipart/"))
{
return Constants.MIME_MULTIPART;
}
else
{
return null;
}
}
public static boolean hasMIME(BindingEntry bEntry)
{
List operations = bEntry.getBinding().getBindingOperations();
for (int i = 0; i < operations.size(); ++i)
{
BindingOperation operation = (BindingOperation)operations.get(i);
if (hasMIME(bEntry, operation))
{
return true;
}
}
return false;
}
public static boolean hasMIME(BindingEntry bEntry, BindingOperation operation)
{
Parameters parameters =
bEntry.getParameters(operation.getOperation());
if (parameters != null)
{
for (int idx = 0; idx < parameters.list.size(); ++idx)
{
Parameter p = (Parameter)parameters.list.get(idx);
if (p.getMIMEInfo() != null)
{
return true;
}
}
}
return false;
}
private static HashMap constructorMap = new HashMap(50);
private static HashMap constructorThrowMap = new HashMap(50);
static
{
constructorMap.put("int", "0");
constructorMap.put("float", "0");
constructorMap.put("boolean", "true");
constructorMap.put("double", "0");
constructorMap.put("byte", "(byte)0");
constructorMap.put("short", "(short)0");
constructorMap.put("long", "0");
constructorMap.put("java.lang.Boolean", "new java.lang.Boolean(false)");
constructorMap.put("java.lang.Byte", "new java.lang.Byte((byte)0)");
constructorMap.put("java.lang.Double", "new java.lang.Double(0)");
constructorMap.put("java.lang.Float", "new java.lang.Float(0)");
constructorMap.put("java.lang.Integer", "new java.lang.Integer(0)");
constructorMap.put("java.lang.Long", "new java.lang.Long(0)");
constructorMap.put("java.lang.Short", "new java.lang.Short((short)0)");
constructorMap.put("java.math.BigDecimal", "new java.math.BigDecimal(0)");
constructorMap.put("java.math.BigInteger", "new java.math.BigInteger(\"0\")");
constructorMap.put("java.lang.Object", "new java.lang.String()");
constructorMap.put("byte[]", "new byte[0]");
constructorMap.put("java.util.Calendar", "java.util.Calendar.getInstance()");
constructorMap.put("javax.xml.namespace.QName", "new javax.xml.namespace.QName(\"http://double-double\", \"toil-and-trouble\")");
constructorMap.put("org.jboss.axis.types.NonNegativeInteger", "new org.jboss.axis.types.NonNegativeInteger(\"0\")");
constructorMap.put("org.jboss.axis.types.PositiveInteger", "new org.jboss.axis.types.PositiveInteger(\"1\")");
constructorMap.put("org.jboss.axis.types.NonPositiveInteger", "new org.jboss.axis.types.NonPositiveInteger(\"0\")");
constructorMap.put("org.jboss.axis.types.NegativeInteger", "new org.jboss.axis.types.NegativeInteger(\"-1\")");
constructorThrowMap.put("org.jboss.axis.types.Time", "new org.jboss.axis.types.Time(\"15:45:45.275Z\")");
constructorThrowMap.put("org.jboss.axis.types.UnsignedLong", "new org.jboss.axis.types.UnsignedLong(0)");
constructorThrowMap.put("org.jboss.axis.types.UnsignedInt", "new org.jboss.axis.types.UnsignedInt(0)");
constructorThrowMap.put("org.jboss.axis.types.UnsignedShort", "new org.jboss.axis.types.UnsignedShort(0)");
constructorThrowMap.put("org.jboss.axis.types.UnsignedByte", "new org.jboss.axis.types.UnsignedByte(0)");
constructorThrowMap.put("org.jboss.axis.types.URI", "new org.jboss.axis.types.URI(\"urn:testing\")");
constructorThrowMap.put("org.jboss.axis.types.Year", "new org.jboss.axis.types.Year(2000)");
constructorThrowMap.put("org.jboss.axis.types.Month", "new org.jboss.axis.types.Month(1)");
constructorThrowMap.put("org.jboss.axis.types.Day", "new org.jboss.axis.types.Day(1)");
constructorThrowMap.put("org.jboss.axis.types.YearMonth", "new org.jboss.axis.types.YearMonth(2000,1)");
constructorThrowMap.put("org.jboss.axis.types.MonthDay", "new org.jboss.axis.types.MonthDay(1, 1)");
}
public static String getConstructorForParam(Parameter param,
SymbolTable symbolTable,
BooleanHolder bThrow)
{
String paramType = param.getType().getName();
String mimeType = param.getMIMEInfo() == null ? null : param.getMIMEInfo().getType();
String mimeDimensions = param.getMIMEInfo() == null ? "" : param.getMIMEInfo().getDimensions();
String out = null;
if (mimeType != null)
{
if (mimeType.equals("image/gif") ||
mimeType.equals("image/jpeg"))
{
return "null";
}
else if (mimeType.equals("text/xml") ||
mimeType.equals("application/xml"))
{
if (mimeDimensions.length() <= 0)
return "new javax.xml.transform.stream.StreamSource()";
else
return "new javax.xml.transform.stream.StreamSource[0]";
}
else if (mimeType.equals("application/octetstream"))
{
if (mimeDimensions.length() <= 0)
return "new org.jboss.axis.attachments.OctetStream()";
else
return "new org.jboss.axis.attachments.OctetStream[0]";
}
else
{
return "new " + Utils.getParameterTypeName(param) + "()";
}
}
out = (String)constructorMap.get(paramType);
if (out != null)
{
return out;
}
out = (String)constructorThrowMap.get(paramType);
if (out != null)
{
bThrow.value = true;
return out;
}
if (paramType.endsWith("[]"))
{
return "new " + JavaUtils.replace(paramType, "[]", "[0]");
}
Vector v = Utils.getEnumerationBaseAndValues(param.getType().getNode(), symbolTable);
if (v != null)
{
String enumeration = (String)
JavaEnumTypeWriter.getEnumValueIds(v).get(0);
return paramType + "." + enumeration;
}
return "new " + paramType + "()";
}
}