Package org.rioproject.impl.opstring

Source Code of org.rioproject.impl.opstring.OARUtil

/*
* Copyright 2008 the original author or authors.
*
* Licensed 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.rioproject.impl.opstring;

import org.rioproject.deploy.DownloadRecord;
import org.rioproject.deploy.StagedData;
import org.rioproject.impl.util.DownloadManager;
import org.rioproject.impl.util.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.jar.JarFile;

/**
* Utilities for working with OperationalString Archives (OARs)
*
* @author Dennis Reedy
*/
public class OARUtil {
    private static final Logger logger = LoggerFactory.getLogger(OARUtil.class.getName());

    /**
     * Install an OAR
     *
     * @param archive The URL of the archive
     * @param installDir The parent directory to install the archive into
     * @return A {@link org.rioproject.deploy.DownloadRecord}
     * detailing the installation specifics
     *
     * @throws OARException If the manifest cannot be read
     * @throws IOException If there are errors accessing the file system or the
     * archive parameter
     */
    public static DownloadRecord install(URL archive, File installDir)
        throws IOException, OARException {

        if(archive.toExternalForm().endsWith("jar") ||
           archive.toExternalForm().endsWith("oar")) {
            OAR oar = new OAR(archive);
            String dirName = oar.getCompoundName();
            if(dirName==null)
                throw new IOException("Not an OAR");
            StagedData artifact = new StagedData();
            artifact.setLocation(archive.toExternalForm());
            artifact.setInstallRoot(dirName);
            artifact.setUnarchive(true);
            DownloadManager downloadMgr =
                new DownloadManager(FileUtils.getFilePath(installDir), artifact);
            DownloadRecord record = downloadMgr.download();
            return(record);
        } else {
            throw new IOException("Installation must be a .jar or an .oar");
        }
    }

    /**
     * Install an OAR
     *
     * @param oarFile The OAR File
     * @param installDir The parent directory to install the archive into
     *
     * @throws OARException If the manifest cannot be read
     * @throws IOException If there are errors accessing the file system or the
     * archive parameter
     */
    public static void install(File oarFile, File installDir)
        throws IOException, OARException {

        if(oarFile.getName().endsWith("jar") ||
           oarFile.getName().endsWith("oar")) {

            JarFile jarFile = new JarFile(oarFile);
            OAR oar;
            try {
                if(jarFile.getManifest()!=null)
                    oar = new OAR(jarFile.getManifest());
                else
                    throw new IOException("No manifest in "+oarFile.getName()+", unable to create OAR");
            } finally {
                jarFile.close();
            }
           
            String dirName = oar.getCompoundName();
            if(dirName==null)
                throw new IOException("Not an OAR");
            File oarInstallDir = new File(installDir, dirName);
            if(!oarInstallDir.exists()) {
                if(oarInstallDir.mkdirs()) {
                    logger.info("Created {}", oarInstallDir.getPath());
                }
            }
            File installed = new File(oarInstallDir, oarFile.getName());
            if(installed.exists()) {
                if(installed.delete())
                   logger.info("Removed older OAR {}", installed.getName());
            }
            if(oarFile.renameTo(installed)) {
                logger.info("Installed OAR to {}", installed.getPath());
                DownloadManager.extract(oarInstallDir, installed);               
            } else {
                throw new IOException("Could not install OAR to "+installed.getPath()+". This may be a permissions problem");
            }
        } else {
            throw new IOException("Installation must be a .jar or an .oar");
        }
    }

    /**
     * Find the OAR file and return an OAR object
     *
     * @param dir The directory to search
     *
     * @return If an OAR file is found, return an OAR object
     *
     * @throws OARException If the manifest cannot be read
     * @throws IOException if there are errors accessing the file system
     */
    public static OAR getOAR(File dir) throws IOException, OARException {
        OAR oar  = null;
        if(dir.isDirectory()) {
            File[] files = dir.listFiles();
            if(files!=null) {
                for (File file : files) {
                    if (file.getName().endsWith("oar")) {
                        oar = new OAR(file);
                        oar.setDeployDir(FileUtils.getFilePath(file.getParentFile()));
                        break;
                    }
                }
            }
        }
        return(oar);
    }

    /**
     * Find a file in an extracted OAR directory
     *
     * @param name The filename to find. If the first character of the
     * name is '*', then the match will be the first file that ends with the
     * remaining string
     * @param dir The parent directory to start the search from
     *
     * @return The file, or null if not found
     */
    public static File find(String name, File dir) {
        File found = null;
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    found = find(name, file);
                    if (found != null)
                        break;
                }
                if (name.startsWith("*")) {
                    if (file.getName().endsWith(name)) {
                        found = file;
                        break;
                    }
                } else {
                    if (file.getName().equals(name)) {
                        found = file;
                        break;
                    }
                }
            }
        }

        return found;
    }
}
TOP

Related Classes of org.rioproject.impl.opstring.OARUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.