/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.uima.pear.tools;

import java.io.File;
import java.io.IOException;
import java.util.jar.JarFile;

import org.apache.uima.UIMAFramework;
import org.apache.uima.pear.util.MessageRouter;
import org.apache.uima.util.Level;
import org.xml.sax.SAXException;



/**
 * The <code>PackageInstaller</code> class is the main user API for installing PEAR packages.
 * The class has a static method <code>installPackage</code> to install PEAR packages that returns a 
 * <code>PackageBrowser</code> object containing all the needed information about the installed
 * PEAR package. 
 * 
 * @see org.apache.uima.pear.tools.PackageBrowser
 *
 */
public class PackageInstaller {

  private static final String PEAR_MESSAGE_RESOURCE_BUNDLE = "org.apache.uima.pear.pear_messages";

  /**
   * Installs the specified PEAR package to the specified install location.
   * After the installation is completed, an optional installation verification
   * step can be executed. This verification uses the main component descriptor
   * to instantiate the UIMA resource, encapsulated in the PEAR package, and may
   * run some additional tests, if applicable
   * 
   * @param installDir
   *          PEAR package install location
   * @param pearPackage
   *          PEAR package file location to install
   * @param verify
   *          If true the PEAR package verification is done after the installation
   * 
   * @return Returns a <code>PackageBrowser</code> object containing all PEAR package install settings
   * 
   * @throws PackageInstallerException
   *           If an error occured during the pear installation or verification.
   */
  public static PackageBrowser installPackage(File installDir, File pearPackage, boolean verify)
          throws PackageInstallerException {
    return PackageInstaller.installPackage(installDir, pearPackage, verify, true);
    
  }
  /**
   * Installs the specified PEAR package to the specified install location.
   * After the installation is completed, an optional installation verification
   * step can be executed. This verification uses the main component descriptor
   * to instantiate the UIMA resource, encapsulated in the PEAR package, and may
   * run some additional tests, if applicable
   * 
   * @param installDir
   *          PEAR package install location
   * @param pearPackage
   *          PEAR package file location to install
   * @param verify
   *          If true the PEAR package verification is done after the installation
   * @param cleanInstallDir
   *          If <code>true</code>, the target installation directory will be cleaned before the
   *          PEAR file is installed.
   * @return Returns a <code>PackageBrowser</code> object containing all PEAR package install settings
   * 
   * @throws PackageInstallerException
   *           If an error occured during the pear installation or verification.
   */
  public static PackageBrowser installPackage(File installDir, File pearPackage, boolean verify, boolean cleanInstallDir)
          throws PackageInstallerException {

    // componentId for the given pear pacakge
    String componentId;

    // get componentId from the given pear package, componentId needed to install the package
    // correctly
    try {
      // get installDescriptor from pear file
      JarFile jarFile = new JarFile(pearPackage);
      InstallationDescriptorHandler insdHandler = new InstallationDescriptorHandler();
      insdHandler.parseInstallationDescriptor(jarFile);
      InstallationDescriptor instObj = insdHandler.getInstallationDescriptor();
      if (instObj != null) {
        componentId = instObj.getMainComponentId();
      } else {
        throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                "error_parsing_pear_package_desc", new Object[] { pearPackage.getAbsolutePath() });
      }
    } catch (IOException ex) {
      throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
              "error_parsing_pear_package_desc", new Object[] { pearPackage.getAbsolutePath() }, ex);
    } catch (SAXException ex) {
      throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
              "error_parsing_pear_package_desc", new Object[] { pearPackage.getAbsolutePath() }, ex);
    }

    // create message listener for the pear installer
    MessageRouter.StdChannelListener msgListener = new MessageRouter.StdChannelListener() {
      public void errMsgPosted(String errMsg) {
        UIMAFramework.getLogger(PackageInstaller.class).logrb(Level.SEVERE, "PackageInstaller",
                "installPackage", PEAR_MESSAGE_RESOURCE_BUNDLE, "package_installer_error", errMsg);
      }

      public void outMsgPosted(String outMsg) {
        UIMAFramework.getLogger(PackageInstaller.class)
                .logrb(Level.INFO, "PackageInstaller", "installPackage",
                        PEAR_MESSAGE_RESOURCE_BUNDLE, "package_installer_message", outMsg);
      }
    };

    // create installation controller and to install the pear package
    InstallationController controller = new InstallationController(componentId, pearPackage,
            installDir, false, msgListener, cleanInstallDir);

    // install main component
    if (controller.installComponent() == null) {

      // installation failed
      String errorMessage = controller.getInstallationMsg();

      // stop controller messaging service
      controller.terminate();

      if (errorMessage != null) {
        throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                "error_installing_main_component", new Object[] { componentId, errorMessage });
      } else {
        throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                "error_installing_main_component_unknown", new Object[] { componentId });
      }
    }

    // installation now complete !!

    // save modified installation descriptor file
    try {
      controller.saveInstallationDescriptorFile();
    } catch (IOException ex) {

      // stop controller messaging service
      controller.terminate();

      throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
              "error_installing_main_component", new Object[] { componentId, ex.getMessage() }, ex);
    }

    // create package browser object with the installed pear
    PackageBrowser pkgBrowser = null;

    try {
      // initialze package browser object
      pkgBrowser = new PackageBrowser(new File(installDir, componentId));

      // check if package browser could be initialized
      if (pkgBrowser == null) {
        
        // stop controller messaging service
        controller.terminate();

        throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                "error_reading_installed_pear_settings", new Object[] { componentId });
      }
    } catch (IOException ex) {
      // stop controller messaging service
      controller.terminate();

      throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
              "error_reading_installed_pear_settings", new Object[] { componentId }, ex);
    }

    // installation verification
    if (verify) {
      if (!controller.verifyComponent()) {

        // verification failed
        String errorMessage = controller.getVerificationMsg();
        
        // stop controller messaging service
        controller.terminate();

        if (errorMessage != null) {
          throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                  "error_verify_installation", new Object[] { componentId, errorMessage });
        } else {
          throw new PackageInstallerException(PEAR_MESSAGE_RESOURCE_BUNDLE,
                  "error_verify_installation_unknown", new Object[] { componentId });
        }
      } else {
        UIMAFramework.getLogger(PackageInstaller.class).logrb(Level.INFO, "PackageInstaller",
                "installPackage", PEAR_MESSAGE_RESOURCE_BUNDLE,
                "installation_verification_completed", componentId);
      }
    }

    // stop controller messaging service
    controller.terminate();

    return pkgBrowser;
  }
}
