/*******************************************************************************
 * Copyright (c) 2001, 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.wsdl.ui.internal.xsd;      

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
import org.eclipse.wst.wsdl.ui.internal.extension.IModelQueryContributor;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
import org.eclipse.wst.xsd.ui.internal.AbstractXSDDataTypeValueExtension;
import org.eclipse.wst.xsd.ui.internal.AbstractXSDModelQueryContributor;
import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDSchema;
import org.w3c.dom.Element;

public class XSDModelQueryContributor extends AbstractXSDModelQueryContributor implements IModelQueryContributor
{ 
  protected WSDLEditor wsdlEditor;

  public XSDModelQueryContributor(WSDLEditor wsdlEditor)
  {
    this.wsdlEditor = wsdlEditor;
  }
  
  public AbstractXSDDataTypeValueExtension createXSDDataTypeValueExtension(ModelQuery modelQuery)
  {
    return new XSDDataTypeValueExtension(modelQuery); 
  }

  class XSDDataTypeValueExtension extends AbstractXSDDataTypeValueExtension
  {                             
    public XSDDataTypeValueExtension(ModelQuery modelQuery)
    {
      super(modelQuery);
    }

    public String getId()
    {
      return "WSDL-XSDDataTypeValueExtension";
    }
     
    protected XSDSchema getEnclosingXSDSchema(Element element)
    {        
      XSDSchema result = null;
      Object o = WSDLEditorUtil.getInstance().findModelObjectForElement(wsdlEditor.getDefinition(), element);
      if (o instanceof XSDConcreteComponent)
      {                  
        result = ((XSDConcreteComponent)o).getSchema();
      }
      return result;
    }   

	  protected TypesHelper createTypesHelper(XSDSchema schema)
	  { 
		  return new TypesHelper(schema)
		  {
			  protected List getPrefixesForNamespace(String namespace)
			  {
			  	List list = super.getPrefixesForNamespace(namespace);
			  	Map map = wsdlEditor.getDefinition().getNamespaces();
			  	for (Iterator i = map.keySet().iterator(); i.hasNext();)
			  	{
			  		String prefix = (String)i.next();
			  		String ns = (String)map.get(prefix);
			   		if (ns != null && ns.equals(namespace))
				  	{					
				  	  if (!list.contains(prefix))
				  	  {
				  		list.add(prefix);
				  	  }
				  	}  
	  			}	
	  			return list;
	  		}				
	  	};		
  	}  
  }
}