/******************************************************************************* * Copyright (c) 2002, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.impl; import java.util.Hashtable; import java.util.Vector; import org.eclipse.emf.common.util.EList; import org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.FragmentConstants; import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.ISOAPEncArrayFragment; import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.IXSDFragment; import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.XSDToFragmentConfiguration; import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.XSDToFragmentController; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDModelGroup; import org.eclipse.xsd.XSDParticle; import org.eclipse.xsd.XSDParticleContent; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public abstract class SOAPEncArrayFragment extends XSDGroupSeqFragment implements ISOAPEncArrayFragment { public SOAPEncArrayFragment(String id, String name, XSDToFragmentConfiguration config, XSDToFragmentController controller, XSDModelGroup xsdModelGroup) { super(id, name, config, controller, xsdModelGroup); } public boolean setParameterValuesFromInstanceDocuments(Element[] instanceDocuments) { Element[] instanceDocumentsCopy = getInstanceDocumentsByTagName(instanceDocuments, getName()); removeGroupIDs(); boolean paramsValid = internalEquals(instanceDocumentsCopy, instanceDocuments); for (int i = 0; i < instanceDocumentsCopy.length; i++) { IXSDFragment soapEncArrayTypeFrag = (getGroupMemberFragments(createSOAPEncArrayInstance()))[0]; Vector instancesVector = new Vector(); NodeList nl = instanceDocumentsCopy[i].getChildNodes(); for (int j = 0; j < nl.getLength(); j++) { Node node = nl.item(j); if (node instanceof Element) instancesVector.add(node); else paramsValid = false; } Element[] childInstanceDocuments = new Element[instancesVector.size()]; instancesVector.copyInto(childInstanceDocuments); if (!soapEncArrayTypeFrag.setParameterValuesFromInstanceDocuments(setElementsTagName(childInstanceDocuments, soapEncArrayTypeFrag.getName()))) paramsValid = false; } return paramsValid; } public Element[] genInstanceDocumentsFromParameterValues(boolean genXSIType, Hashtable namespaceTable, Document doc) { String[] groupIDs = getGroupIDs(); Element[] instanceDocument = new Element[groupIDs.length]; StringBuffer attrName = new StringBuffer(); StringBuffer attrValue = new StringBuffer(); // StringBuffer attrArrayTypeName = new StringBuffer(); // StringBuffer attrArrayTypeValue = new StringBuffer(); for (int i = 0; i < instanceDocument.length; i++) { int numInstances = 0; instanceDocument[i] = doc.createElement(getInstanceDocumentTagName(namespaceTable)); IXSDFragment fragment = (getGroupMemberFragments(groupIDs[i]))[0]; Element[] fragmentInstanceDocuments = fragment.genInstanceDocumentsFromParameterValues(genXSIType, namespaceTable, doc); for (int j = 0; j < fragmentInstanceDocuments.length; j++) { if (fragmentInstanceDocuments[j] != null) instanceDocument[i].appendChild(fragmentInstanceDocuments[j]); numInstances++; } String soapURI = FragmentConstants.URI_SOAP; String soapPrefix = getPrefixFromNamespaceURI(soapURI, namespaceTable); String soapEncArrayTypeURI = getXSDTypeDefinition().getTargetNamespace(); String soapEncArrayTypePrefix = getPrefixFromNamespaceURI(soapEncArrayTypeURI, namespaceTable); // Set the arrayType attribute attrName.setLength(0); attrName.setLength(0); attrName.append(soapPrefix); attrName.append(FragmentConstants.COLON); attrName.append(FragmentConstants.SOAP_ENC_ARRAY_TYPE); attrValue.setLength(0); attrValue.append(soapEncArrayTypePrefix); attrValue.append(FragmentConstants.COLON); attrValue.append(getXSDTypeDefinition().getName()); attrValue.append(FragmentConstants.LEFT_SQUARE_BRACKET); attrValue.append(numInstances); attrValue.append(FragmentConstants.RIGHT_SQUARE_BRACKET); instanceDocument[i].setAttribute(attrName.toString(), attrValue.toString()); } if (genXSIType) { // TODO: Used to call the plugin's ignoreSchemaForSOAPArrays()method. boolean ignoreSchemaForSOAPArrays = true; if (ignoreSchemaForSOAPArrays) { for (int i = 0; i < instanceDocument.length; i++) { String xsiURI = FragmentConstants.URI_XSI; String xsiPrefix = getPrefixFromNamespaceURI(xsiURI, namespaceTable); String xsiTypeURI = FragmentConstants.URI_SOAP; String xsiTypePrefix = getPrefixFromNamespaceURI(xsiTypeURI, namespaceTable); attrName.setLength(0); attrName.append(xsiPrefix).append(FragmentConstants.COLON).append(FragmentConstants.XSI_TYPE); attrValue.setLength(0); attrValue.append(xsiTypePrefix).append(FragmentConstants.COLON); attrValue.append(FragmentConstants.QNAME_LOCAL_NAME_ARRAY); instanceDocument[i].setAttribute(attrName.toString(), attrValue.toString()); } } else return addXSIType(instanceDocument, namespaceTable); } return instanceDocument; } public String createSOAPEncArrayInstance() { if (getXSDTypeDefinition() != null) { String groupID = genID(); String[] groupMemberID = {genID()}; int minOccurs = 0; int maxOccurs = FragmentConstants.UNBOUNDED; XSDElementDeclaration elementDecl = null; if (getXSDModelGroup() != null) { XSDParticle groupOwner = (XSDParticle)getXSDModelGroup().getContainer(); int groupMin = groupOwner.getMinOccurs(); int groupMax = groupOwner.getMaxOccurs(); int elementMin = 0; int elementMax = FragmentConstants.UNBOUNDED; EList xsdParticles = getXSDModelGroup().getParticles(); if (xsdParticles.size() > 0) { XSDParticleContent xsdParticleContent = ((XSDParticle)xsdParticles.get(0)).getContent(); if (xsdParticleContent instanceof XSDElementDeclaration) { elementDecl = (XSDElementDeclaration)xsdParticleContent; XSDParticle elementOwner = (XSDParticle)elementDecl.getContainer(); elementMin = elementOwner.getMinOccurs(); elementMax = elementOwner.getMaxOccurs(); } } if (groupMin >= 0 && elementMin >= 0) minOccurs = groupMin * elementMin; if (groupMax >= 0 && groupMax != FragmentConstants.UNBOUNDED && elementMax >= 0 && elementMax != FragmentConstants.UNBOUNDED) maxOccurs = groupMax * elementMax; } XSDToFragmentConfiguration thisConfig = getXSDToFragmentConfiguration(); XSDToFragmentConfiguration xsdConfig = new XSDToFragmentConfiguration(); xsdConfig.setXSDComponent(getXSDTypeDefinition()); xsdConfig.setMinOccurs(minOccurs); xsdConfig.setMaxOccurs(maxOccurs); xsdConfig.setStyle(thisConfig.getStyle()); xsdConfig.setPartEncoding(thisConfig.getPartEncoding()); xsdConfig.setWSDLPartName(thisConfig.getWSDLPartName()); String name = (elementDecl != null) ? elementDecl.getName() : getXSDTypeDefinition().getName(); IXSDFragment frag = getXSDToFragmentController().getFragment(xsdConfig, groupMemberID[0], name); addFragment(groupMemberID[0], frag); setGroupMemberIDs(groupID, groupMemberID); return groupID; } else return null; } public String createGroupSeqInstance() { return createSOAPEncArrayInstance(); } public String createInstance() { return createSOAPEncArrayInstance(); } }