/*******************************************************************************
 * 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 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.XSDModelGroup;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDWildcard;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDParticleContent;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.Hashtable;
import java.util.Vector;

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;
  }
}
