blob: c753b833a9d220446c81080bd3b1178214b7dda9 [file] [log] [blame]
/*
* 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;
}
}