/* JFox, the OpenSource J2EE Application Server
*
* Copyright (C) 2002 huihoo.com
* Distributable under GNU LGPL license
* See the GNU Lesser General Public License for more details.
*/

package org.jfox.ejb.deploy;

import org.huihoo.jfox.system.ComponentSupport;
import org.jfox.ejb.meta.EJBDescriptionException;
import org.jfox.ejb.meta.EJBDescriptor;

import java.util.Map;
import java.util.HashMap;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.IOException;

/**
 * Deployer 的超类
 *
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public abstract class DeployerSupport extends ComponentSupport implements Deployer {

  /**
   * 纪录已经被 deploy 的 url, url=> EJBMetaInfo[]
   */
  private Map deployments = new HashMap();

  public void deploy (URL url) throws MalformedURLException, IOException {
    logger.info("depoying " + url.toString());
    synchronized (deployments) {
      if (deployments.containsKey(url)) {
        try {
          undeploy(url);
        }
        catch (Throwable t) {
          logger.warn("undeploy failure", t);
        }
      }
      try {
        EJBDescriptor[] infos = doDeploy(url);
        if(infos != null && infos.length !=0) {
          deployments.put(url, infos);
        }
      }
      catch (Throwable t) {
        logger.warn("deploy failure", t);
      }
    }
  }

  public void undeploy (URL url) throws MalformedURLException, IOException,EJBDescriptionException {
    logger.info("undeploy " + url.toString());
    synchronized (deployments) {
      if (deployments.containsKey(url)) {
        EJBDescriptor[] info = (EJBDescriptor[])deployments.remove(url);
        doUndeploy(info);
      }
    }
  }

  public boolean isDeployed (URL url) throws MalformedURLException {
    synchronized (deployments) {
      return deployments.containsKey(url);
    }
  }

  protected Object getInfo(URL url) {
    return deployments.get(url);
  }

  protected Map getDeployments() {
    Map ret = new HashMap();
    synchronized (deployments) {
      ret.putAll(deployments);
    }
    return ret;
  }

  protected abstract EJBDescriptor[] doDeploy(URL url) throws IOException,EJBDescriptionException;

  protected abstract void doUndeploy(EJBDescriptor[] deployments) throws IOException,EJBDescriptionException;

}