/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * 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:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.sdk.ws.jaxws.util;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.pde.core.plugin.IPluginAttribute;
import org.eclipse.pde.core.plugin.IPluginElement;
import org.eclipse.scout.commons.StringUtility;
import org.eclipse.scout.commons.xmlparser.ScoutXmlDocument;
import org.eclipse.scout.commons.xmlparser.ScoutXmlDocument.ScoutXmlElement;
import org.eclipse.scout.sdk.util.pde.PluginModelHelper;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
import org.eclipse.scout.sdk.workspace.IScoutBundleFilter;
import org.eclipse.scout.sdk.ws.jaxws.JaxWsConstants;
import org.eclipse.scout.sdk.ws.jaxws.JaxWsRuntimeClasses;
import org.eclipse.scout.sdk.ws.jaxws.resource.ResourceFactory;

public final class ServletRegistrationUtility {

  public static final String XML_SERVLET_BUNDLE = "servlet-bundle";
  public static final String XML_NAME = "name";

  private ServletRegistrationUtility() {
  }

  public static String getBuildJaxServletRegistrationBundleName(IScoutBundle bundle) {
    if (bundle == null) {
      return null;
    }
    if (bundle.getType() != IScoutBundle.BUNDLE_SERVER) {
      return null;
    }

    ScoutXmlDocument document = ResourceFactory.getBuildJaxWsResource(bundle).loadXml();
    if (document == null || document.getRoot() == null) {
      return null;
    }

    ScoutXmlElement xml = document.getRoot().getChild(XML_SERVLET_BUNDLE);
    if (xml == null) {
      return null;
    }
    if (!xml.hasAttribute(XML_NAME)) {
      return null;
    }
    final String bundleName = xml.getAttribute(XML_NAME);
    if (!StringUtility.hasText(bundleName)) {
      return null;
    }

    return bundleName;
  }

  public static Registration getServletRegistration(IScoutBundle bundle) {
    final String bundleName = getBuildJaxServletRegistrationBundleName(bundle);

    Registration[] registrations = getJaxWsServletRegistrationsOnClasspath(bundle);
    for (Registration registration : registrations) {
      if (registration.getBundle().getBundleName().equals(bundleName)) {
        return registration;
      }
    }
    return null;
  }

  public static IScoutBundle[] getJaxWsBundlesOnClasspath(IScoutBundle bundle) {
    // get bundles on classpath with JAX-WS dependency installed
    if (bundle == null) {
      return new IScoutBundle[0];
    }

    // find required bundles with JAX-WS on classpath
    return bundle.getRequiredBundles(new IScoutBundleFilter() {

      @Override
      public boolean accept(IScoutBundle candidate) {
        // ensure server bundle
        if (candidate.getType() != IScoutBundle.BUNDLE_SERVER) {
          return false;
        }
        // check whether JAX-WS dependency is installed on bundle
        if (!TypeUtility.exists(TypeUtility.getType(JaxWsRuntimeClasses.JaxWsActivator)) || !TypeUtility.isOnClasspath(TypeUtility.getType(JaxWsRuntimeClasses.JaxWsActivator), candidate.getJavaProject())) {
          return false;
        }
        return true;
      }
    }, true);
  }

  /**
   * All JAX-WS servlet registrations on the classpath of the given bundle
   * 
   * @param bundle
   * @return
   */
  public static Registration[] getJaxWsServletRegistrationsOnClasspath(IScoutBundle bundle) {
    // filter bundles with JAX-WS servlet registration in plugin.xml
    Set<Registration> bundles = new HashSet<Registration>();
    for (IScoutBundle candidate : getJaxWsBundlesOnClasspath(bundle)) {
      String extensionPoint = JaxWsConstants.SERVER_EXTENSION_POINT_SERVLETS;
      HashMap<String, String> attributes = new HashMap<String, String>();
      attributes.put("class", TypeUtility.getType(JaxWsRuntimeClasses.JaxWsServlet).getFullyQualifiedName());
      PluginModelHelper h = new PluginModelHelper(candidate.getProject());
      IPluginElement ex = h.PluginXml.getSimpleExtension(extensionPoint, "servlet", attributes);
      if (ex == null) {
        continue;
      }
      IPluginAttribute a = ex.getAttribute("alias");
      if (a == null) {
        continue;
      }
      bundles.add(new Registration(candidate, a.getValue()));
    }

    return bundles.toArray(new Registration[bundles.size()]);
  }

  public static String getAlias(IScoutBundle bundle) {
    Registration registration = ServletRegistrationUtility.getServletRegistration(bundle);
    if (registration == null) {
      return null;
    }
    return registration.getAlias();
  }

  public static class Registration {
    private IScoutBundle m_bundle;
    private String m_alias;

    private Registration(IScoutBundle bundle, String alias) {
      m_bundle = bundle;
      m_alias = alias;
    }

    public IScoutBundle getBundle() {
      return m_bundle;
    }

    public void setBundle(IScoutBundle bundle) {
      m_bundle = bundle;
    }

    public String getAlias() {
      return m_alias;
    }

    public void setAlias(String alias) {
      m_alias = alias;
    }
  }
}
