| /******************************************************************************* |
| * 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.util.MultipartFormDataException; |
| import org.eclipse.wst.ws.internal.explorer.platform.util.MultipartFormDataParser; |
| import org.eclipse.wst.ws.internal.explorer.platform.wsdl.constants.FragmentConstants; |
| import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.IXSDFragment; |
| import org.eclipse.wst.ws.internal.explorer.platform.wsdl.fragment.IXSDGroupFragment; |
| 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.XSDComponent; |
| import org.eclipse.xsd.XSDModelGroup; |
| import org.eclipse.xsd.XSDParticle; |
| import org.eclipse.xsd.XSDParticleContent; |
| import org.eclipse.xsd.XSDWildcard; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| |
| public abstract class XSDGroupFragment extends XSDMapFragment implements IXSDGroupFragment { |
| private XSDModelGroup xsdModelGroup_; |
| private Vector groupIDsOrder_; |
| private Hashtable groupIDs_; |
| |
| public XSDGroupFragment(String id, String name, XSDToFragmentConfiguration config, XSDToFragmentController controller, XSDModelGroup xsdModelGroup) { |
| super(id, name, config, controller); |
| xsdModelGroup_ = xsdModelGroup; |
| groupIDsOrder_ = new Vector(); |
| groupIDs_ = new Hashtable(); |
| } |
| |
| public boolean processParameterValues(MultipartFormDataParser parser) throws MultipartFormDataException { |
| boolean valuesValid = true; |
| String[] params = parser.getParameterValues(getID()); |
| Vector frags = new Vector(); |
| Vector groupIDsOrderCopy = new Vector(); |
| Hashtable groupIDsCopy = new Hashtable(); |
| for (int i = 0; params != null && i < params.length; i++) { |
| if (params[i] != null) { |
| groupIDsOrderCopy.add(params[i]); |
| groupIDsCopy.put(params[i], getGroupMemberIDs(params[i])); |
| IXSDFragment[] groupMemberFragments = getGroupMemberFragments(params[i]); |
| for (int j = 0; j < groupMemberFragments.length; j++) { |
| if (groupMemberFragments[j] != null) { |
| frags.add(groupMemberFragments[j]); |
| if (!groupMemberFragments[j].processParameterValues(parser)) |
| valuesValid = false; |
| } |
| } |
| } |
| } |
| groupIDsOrder_ = groupIDsOrderCopy; |
| groupIDs_ = groupIDsCopy; |
| removeAllFragments(); |
| addFragments(frags); |
| return valuesValid; |
| } |
| |
| public boolean setParameterValuesFromInstanceDocuments(Element[] instanceDocuments) { |
| removeGroupIDs(); |
| boolean paramsValid = true; |
| String prevGroupID = null; |
| String currGroupID = null; |
| int groupMemberIndex = 0; |
| for (int i = 0; i < instanceDocuments.length; ) { |
| if (currGroupID == null) { |
| String newGroupID = createInstance(); |
| prevGroupID = currGroupID; |
| currGroupID = newGroupID; |
| } |
| Element[] instancePartition = null; |
| int j = groupMemberIndex; |
| boolean paramsAssigned = false; |
| int wildcardFragIndex = -1; |
| do { |
| IXSDFragment[] groupMemberFrags = getGroupMemberFragments(currGroupID); |
| XSDComponent xsdComponent = groupMemberFrags[j].getXSDToFragmentConfiguration().getXSDComponent(); |
| if (xsdComponent instanceof XSDWildcard) { |
| if (wildcardFragIndex < 0) |
| wildcardFragIndex = j; |
| } |
| else if (groupMemberFrags[j].getName().equals(trimPrefix(instanceDocuments[i].getTagName()))) { |
| instancePartition = getInstanceDocumentPartition(instanceDocuments, i, groupMemberFrags[j].getXSDToFragmentConfiguration().getMaxOccurs()); |
| if (!groupMemberFrags[j].setParameterValuesFromInstanceDocuments(instancePartition)) |
| paramsValid = false; |
| paramsAssigned = true; |
| } |
| if (j == groupMemberFrags.length - 1) { |
| j = 0; |
| String newGroupID; |
| if (!paramsAssigned) |
| newGroupID = createInstance(); |
| else |
| newGroupID = null; |
| prevGroupID = currGroupID; |
| currGroupID = newGroupID; |
| } |
| else |
| j++; |
| } while (!paramsAssigned && j != groupMemberIndex); |
| groupMemberIndex = j; |
| if (!paramsAssigned) { |
| instancePartition = getInstanceDocumentPartition(instanceDocuments, i, FragmentConstants.UNBOUNDED); |
| if (wildcardFragIndex >= 0) { |
| if (wildcardFragIndex >= groupMemberIndex) { |
| removeGroupID(currGroupID); |
| currGroupID = prevGroupID; |
| } |
| groupMemberIndex = wildcardFragIndex; |
| IXSDFragment[] groupMemberFrags = getGroupMemberFragments(currGroupID); |
| if (!groupMemberFrags[wildcardFragIndex].setParameterValuesFromInstanceDocuments(instancePartition)) |
| paramsValid = false; |
| paramsAssigned = true; |
| } |
| else if (currGroupID != null && (prevGroupID == null || !currGroupID.equals(prevGroupID))) { |
| paramsValid = false; |
| removeGroupID(currGroupID); |
| currGroupID = prevGroupID; |
| } |
| } |
| i = i + instancePartition.length; |
| } |
| return paramsValid; |
| } |
| |
| private Element[] getInstanceDocumentPartition(Element[] instanceDocuments, int start, int maxSize) { |
| String tagName = instanceDocuments[start].getTagName(); |
| int size = 1; |
| for (int i = start + 1; i < instanceDocuments.length; i++) { |
| if (maxSize != FragmentConstants.UNBOUNDED && size >= maxSize) |
| break; |
| else if (instanceDocuments[i].getTagName().equals(tagName)) |
| size++; |
| else |
| break; |
| } |
| Element[] subset = new Element[size]; |
| for (int j = 0; j < subset.length; j++) { |
| subset[j] = instanceDocuments[start + j]; |
| } |
| return subset; |
| } |
| |
| public Element[] genInstanceDocumentsFromParameterValues(boolean genXSIType, Hashtable namespaceTable, Document doc) { |
| IXSDFragment[] groupMemberFragments = getAllFragments(); |
| Vector instanceDocumentsCopy = new Vector(); |
| for (int i = 0; i < groupMemberFragments.length; i++) { |
| Element[] fragmentInstances = groupMemberFragments[i].genInstanceDocumentsFromParameterValues(genXSIType, namespaceTable, doc); |
| for (int j = 0; j < fragmentInstances.length; j++) { |
| instanceDocumentsCopy.add(fragmentInstances[j]); |
| } |
| } |
| Element[] instanceDocuments = new Element[instanceDocumentsCopy.size()]; |
| for (int k = 0; k < instanceDocuments.length; k++) { |
| instanceDocuments[k] = (Element)instanceDocumentsCopy.get(k); |
| } |
| return instanceDocuments; |
| } |
| |
| public void setXSDModelGroup(XSDModelGroup xsdModelGroup) { |
| xsdModelGroup_ = xsdModelGroup; |
| } |
| |
| public XSDModelGroup getXSDModelGroup() { |
| return xsdModelGroup_; |
| } |
| |
| public String[] getGroupIDs() { |
| String[] groupIDs = new String[groupIDsOrder_.size()]; |
| for (int i = 0; i < groupIDs.length; i++) { |
| groupIDs[i] = (String)groupIDsOrder_.get(i); |
| } |
| return groupIDs; |
| } |
| |
| protected void removeGroupIDs() { |
| removeAllFragments(); |
| groupIDsOrder_.clear(); |
| groupIDs_.clear(); |
| } |
| |
| protected void removeGroupID(String groupID) { |
| String[] memberFragIDs = getGroupMemberIDs(groupID); |
| removeFragments(memberFragIDs); |
| groupIDsOrder_.remove(groupID); |
| groupIDs_.remove(groupID); |
| } |
| |
| protected void setGroupMemberIDs(String groupID, String[] groupMemberIDs) { |
| if (groupID != null) { |
| if (!groupIDsOrder_.contains(groupID)) |
| groupIDsOrder_.add(groupID); |
| if (groupMemberIDs != null) |
| groupIDs_.put(groupID, groupMemberIDs); |
| else |
| groupIDs_.put(groupID, new String[0]); |
| } |
| } |
| |
| protected void setGroupMemberFragments(String groupID, IXSDFragment[] groupMemberFragments) { |
| addFragments(groupMemberFragments); |
| String[] ids = new String[groupMemberFragments.length]; |
| for (int i = 0; i < ids.length; i++) { |
| ids[i] = groupMemberFragments[i].getID(); |
| } |
| setGroupMemberIDs(groupID, ids); |
| } |
| |
| public String[] getGroupMemberIDs(String groupID) { |
| if (groupID != null) { |
| String[] groupMemberIDs = (String[])groupIDs_.get(groupID); |
| if (groupMemberIDs != null) |
| return groupMemberIDs; |
| } |
| return new String[0]; |
| } |
| |
| public IXSDFragment[] getGroupMemberFragments(String groupID) { |
| String[] groupMemberIDs = getGroupMemberIDs(groupID); |
| IXSDFragment[] groupMemberFragments = new IXSDFragment[groupMemberIDs.length]; |
| for (int i = 0; i < groupMemberFragments.length; i++) { |
| groupMemberFragments[i] = getFragment(groupMemberIDs[i]); |
| } |
| return groupMemberFragments; |
| } |
| |
| protected String createGroupInstance() { |
| String groupID = genID(); |
| EList particles = getXSDModelGroup().getParticles(); |
| String[] groupMemberIDs = new String[particles.size()]; |
| for (int i = 0; i < particles.size(); i++) { |
| XSDParticle xsdParticle = (XSDParticle)particles.get(i); |
| XSDParticleContent xsdParticleContent = xsdParticle.getContent(); |
| XSDToFragmentConfiguration thisConfig = getXSDToFragmentConfiguration(); |
| XSDToFragmentConfiguration xsdConfig = new XSDToFragmentConfiguration(); |
| if (xsdParticleContent instanceof XSDComponent) |
| xsdConfig.setXSDComponent((XSDComponent)xsdParticleContent); |
| else |
| xsdConfig.setXSDComponent(null); |
| xsdConfig.setStyle(thisConfig.getStyle()); |
| xsdConfig.setPartEncoding(thisConfig.getPartEncoding()); |
| xsdConfig.setWSDLPartName(thisConfig.getWSDLPartName()); |
| groupMemberIDs[i] = genID(); |
| addFragment(groupMemberIDs[i], getXSDToFragmentController().getFragment(xsdConfig, groupMemberIDs[i], groupMemberIDs[i])); |
| } |
| setGroupMemberIDs(groupID, groupMemberIDs); |
| return groupID; |
| } |
| } |