/*******************************************************************************
 * Copyright (c) 2000, 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.jst.ws.internal.consumption.ui.wsrt;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.ws.internal.consumption.ui.wizard.WebServiceTypeImpl;
import org.eclipse.wst.ws.internal.provisional.wsrt.WebServiceScenario;

public class WebServiceRuntimeExtensionRegistry
{

  private static WebServiceRuntimeExtensionRegistry instance_;

  HashMap webServiceTypes_;
  
  ArrayList webServiceTypesList_;
  
  ArrayList webServiceClientTypesList_;

  Hashtable webServiceImpls_;

  Hashtable webServiceClientImpls_;

  Hashtable serviceTypes_;

  Hashtable clientTypes_;

  Hashtable webServiceRuntimes_;

  /**
   * Returns a singleton instance of this class.
   * 
   * @return A singleton WebServiceRuntimeExtensionRegistry object.
   */
  public static WebServiceRuntimeExtensionRegistry getInstance()
  {
    if (instance_ == null)
    {
      instance_ = new WebServiceRuntimeExtensionRegistry();
      instance_.load();
    }
    return instance_;
  }

  private void load()
  {
    // Can't get rid of webServiceTypes in M4
    webServiceTypes_ = new HashMap();
    webServiceTypesList_ = new ArrayList();
    webServiceClientTypesList_ = new ArrayList();
    webServiceImpls_ = new Hashtable();
    webServiceClientImpls_ = new Hashtable();
    serviceTypes_ = new Hashtable();
    clientTypes_ = new Hashtable();
    webServiceRuntimes_ = new Hashtable();

    IExtensionRegistry reg = Platform.getExtensionRegistry();
  
    //Load WebServiceTypes
    IConfigurationElement[] config = reg.getConfigurationElementsFor(
                                     "org.eclipse.jst.ws.consumption.ui",
                                     "webServiceServerRuntimeType");
    
    for(int idx=0; idx<config.length; idx++) 
    {
      IConfigurationElement elem = config[idx];

        if (elem.getName().equals("webServiceType"))
        {
          WebServiceTypeImpl wst = new WebServiceTypeImpl(elem);
          webServiceTypes_.put(elem.getAttribute("id"), wst);
        }        
    }

    //Load WebServiceImpls
    IConfigurationElement[] wsImplExts = reg.getConfigurationElementsFor(
        "org.eclipse.jst.ws.consumption.ui", "wsImpl");
    
    for(int idx=0; idx<wsImplExts.length; idx++) 
    {
      IConfigurationElement elem = wsImplExts[idx];

        if (elem.getName().equals("webServiceImpl"))
        {
          WebServiceImpl wsimpl = new WebServiceImpl(elem);
          webServiceImpls_.put(elem.getAttribute("id"), wsimpl);
        }        
    }
    
    //Load WebServiceClientImpls
    IConfigurationElement[] wsClientImplExts = reg.getConfigurationElementsFor(
        "org.eclipse.jst.ws.consumption.ui", "wsClientImpl");
    
    for(int idx=0; idx<wsClientImplExts.length; idx++) 
    {
      IConfigurationElement elem = wsClientImplExts[idx];

        if (elem.getName().equals("webServiceClientImpl"))
        {
          WebServiceClientImpl wsClientImpl = new WebServiceClientImpl(elem);
          webServiceClientImpls_.put(elem.getAttribute("id"), wsClientImpl);
        }        
    }
    
    //Load ServiceTypes
    IConfigurationElement[] serviceTypeExts = reg.getConfigurationElementsFor(
        "org.eclipse.jst.ws.consumption.ui", "serviceType");
    
    for(int idx=0; idx<serviceTypeExts.length; idx++) 
    {
      IConfigurationElement elem = serviceTypeExts[idx];

        if (elem.getName().equals("serviceType"))
        {
          ServiceType st = new ServiceType(elem,webServiceImpls_,webServiceTypes_);
          serviceTypes_.put(elem.getAttribute("id"), st);
        }        
    }
    
    //Load ClientTypes
    IConfigurationElement[] clientTypeExts = reg.getConfigurationElementsFor(
        "org.eclipse.jst.ws.consumption.ui", "clientType");
    
    for(int idx=0; idx<clientTypeExts.length; idx++) 
    {
      IConfigurationElement elem = clientTypeExts[idx];

        if (elem.getName().equals("clientType"))
        {
          ClientType ct = new ClientType(elem,webServiceClientImpls_);
          clientTypes_.put(elem.getAttribute("id"), ct);
        }        
    }
    
    //Load WebSerivceRuntimes
    IConfigurationElement[] wsrtExts = reg.getConfigurationElementsFor(
        "org.eclipse.jst.ws.consumption.ui", "webServiceRuntime");
    
    for(int idx=0; idx<wsrtExts.length; idx++) 
    {
      IConfigurationElement elem = wsrtExts[idx];

        if (elem.getName().equals("webServiceRuntime"))
        {
          WebServiceRuntimeInfo wsrtInfo = new WebServiceRuntimeInfo(elem, serviceTypes_, clientTypes_);
          webServiceRuntimes_.put(elem.getAttribute("id"), wsrtInfo);
          
          //Update the type lists
          updateWebServiceTypeList(wsrtInfo);
          updateWebServiceClientTypeList(wsrtInfo);
          
        }        
    }
  }  
    
  private void updateWebServiceTypeList(WebServiceRuntimeInfo wsrtInfo)
  {
    ServiceType[] sts = wsrtInfo.getServiceTypes();
    if (sts != null)
    {
      for (int j = 0; j < sts.length; j++)
      {
        String implId = sts[j].getWebServiceImpl().getId();
        String[] bus = sts[j].getBottomUpModuleTypesInclude();
        String[] tds = sts[j].getTopDownModuleTypesInclude();
        if (bus != null)
        {
          StringBuffer entrybuff = new StringBuffer();
          entrybuff.append(String.valueOf(WebServiceScenario.BOTTOMUP));
          entrybuff.append("/");
          entrybuff.append(implId);
          String entry = entrybuff.toString();
          if (!webServiceTypesList_.contains(entry))
          {
            webServiceTypesList_.add(entry);
          }
        }
        if (tds != null)
        {
          StringBuffer entrybuff = new StringBuffer();
          entrybuff.append(String.valueOf(WebServiceScenario.TOPDOWN));
          entrybuff.append("/");
          entrybuff.append(implId);
          String entry = entrybuff.toString();
          if (!webServiceTypesList_.contains(entry))
          {
            webServiceTypesList_.add(entry);
          }
        }
      }
    }
  }
  
  private void updateWebServiceClientTypeList(WebServiceRuntimeInfo wsrtInfo)
  {
    ClientType[] cts = wsrtInfo.getClientTypes();
    if (cts != null)
    {
      for (int j = 0; j < cts.length; j++)
      {
        String implId = cts[j].getWebServiceClientImpl().getId();
        String[] mods = cts[j].getModuleTypesInclude();
        if (mods != null)
        {
          StringBuffer entrybuff = new StringBuffer();
          entrybuff.append(String.valueOf(WebServiceScenario.CLIENT));
          entrybuff.append("/");
          entrybuff.append(implId);
          String entry = entrybuff.toString();
          if (!webServiceClientTypesList_.contains(entry))
          {
            webServiceClientTypesList_.add(entry);
          }
        }
      }
    }
  }
  
}
