| /******************************************************************************* |
| * 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.fragment.IXSDFragment; |
| import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.IXSDSimpleUnionFragment; |
| 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.XSDSimpleTypeDefinition; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| |
| public abstract class XSDSimpleUnionFragment extends XSDMapFragment implements IXSDSimpleUnionFragment { |
| private XSDSimpleTypeDefinition[] memberTypes_; |
| |
| public XSDSimpleUnionFragment(String id, String name, XSDToFragmentConfiguration config, XSDToFragmentController controller) { |
| super(id, name, config, controller); |
| memberTypes_ = null; |
| } |
| |
| public void setName(String name) { |
| super.setName(name); |
| IXSDFragment[] fragments = getAllFragments(); |
| for (int i = 0; i < fragments.length; i++) { |
| fragments[i].setName(name); |
| } |
| } |
| |
| public boolean setParameterValuesFromInstanceDocuments(Element[] instanceDocuments) { |
| Element[] instanceDocumentsCopy = getInstanceDocumentsByTagName(instanceDocuments, getName()); |
| int numTypes = getMemberTypeDefinitions().length; |
| boolean paramsValid = internalEquals(instanceDocumentsCopy, instanceDocuments); |
| Vector memberFragments = new Vector(); |
| for (int i = 0; i < instanceDocumentsCopy.length; i++) { |
| IXSDFragment compatibleFrag = null; |
| for (int j = 0; j < numTypes; j++) { |
| IXSDFragment memberFrag = getFragment(createUnionInstance(j)); |
| Element[] memberInstanceDocument = new Element[1]; |
| memberInstanceDocument[0] = setElementTagName(instanceDocumentsCopy[i], memberFrag.getName()); |
| if (memberFrag.setParameterValuesFromInstanceDocuments(memberInstanceDocument)) { |
| if (memberFrag.validateAllParameterValues()) { |
| compatibleFrag = memberFrag; |
| break; |
| } |
| else if (compatibleFrag == null) |
| compatibleFrag = memberFrag; |
| } |
| } |
| if (compatibleFrag != null) |
| memberFragments.add(compatibleFrag); |
| else |
| paramsValid = false; |
| } |
| removeAllFragments(); |
| addFragments(memberFragments); |
| return paramsValid; |
| } |
| |
| public Element[] genInstanceDocumentsFromParameterValues(boolean genXSIType, Hashtable namespaceTable, Document doc) { |
| IXSDFragment[] fragments = getAllFragments(); |
| Vector instanceDocumentsCopy = new Vector(); |
| for (int i = 0; i < fragments.length; i++) { |
| Element[] fragmentInstances = fragments[i].genInstanceDocumentsFromParameterValues(genXSIType, namespaceTable, doc); |
| if (fragmentInstances.length > 0) |
| instanceDocumentsCopy.add(fragmentInstances[0]); |
| } |
| Element[] instanceDocuments = new Element[instanceDocumentsCopy.size()]; |
| for (int i = 0; i < instanceDocuments.length; i++) { |
| instanceDocuments[i] = (Element)instanceDocumentsCopy.get(i); |
| } |
| return setElementsTagName(instanceDocuments, getInstanceDocumentTagName(namespaceTable)); |
| } |
| |
| public XSDSimpleTypeDefinition[] getMemberTypeDefinitions() { |
| if (memberTypes_ == null) { |
| EList memberTypes = ((XSDSimpleTypeDefinition)getXSDTypeDefinition()).getMemberTypeDefinitions(); |
| memberTypes_ = new XSDSimpleTypeDefinition[memberTypes.size()]; |
| for (int i = 0; i < memberTypes_.length; i++) { |
| memberTypes_[i] = (XSDSimpleTypeDefinition)memberTypes.get(i); |
| } |
| } |
| return memberTypes_; |
| } |
| |
| public String createUnionInstance(int memberTypeIndex) { |
| getMemberTypeDefinitions(); |
| if (memberTypeIndex < 0 || memberTypeIndex > memberTypes_.length - 1) |
| return null; |
| String newID = genID(); |
| XSDToFragmentConfiguration thisConfig = getXSDToFragmentConfiguration(); |
| XSDToFragmentConfiguration xsdConfig = new XSDToFragmentConfiguration(); |
| xsdConfig.setXSDComponent(memberTypes_[memberTypeIndex]); |
| xsdConfig.setStyle(thisConfig.getStyle()); |
| xsdConfig.setPartEncoding(thisConfig.getPartEncoding()); |
| xsdConfig.setWSDLPartName(thisConfig.getWSDLPartName()); |
| IXSDFragment frag = getXSDToFragmentController().getFragment(xsdConfig, newID, getName()); |
| frag.setID(newID); |
| frag.setName(getName()); |
| addFragment(newID, frag); |
| return newID; |
| } |
| |
| public String createInstance() { |
| return createUnionInstance(0); |
| } |
| |
| } |