org.kawanfw.file.reflection.ClassPathUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.kawanfw.file.reflection.ClassPathUtil.java

Source

/*
 * This file is part of Awake FILE. 
 * Awake file: Easy file upload & download over HTTP with Java.                                    
 * Copyright (C) 2015,  KawanSoft SAS
 * (http://www.kawansoft.com). All rights reserved.                                
 *                                                                               
 * Awake FILE is free software; you can redistribute it and/or                 
 * modify it under the terms of the GNU Lesser General Public                    
 * License as published by the Free Software Foundation; either                  
 * version 2.1 of the License, or (at your option) any later version.            
 *                                                                               
 * Awake FILE is distributed in the hope that it will be useful,               
 * but WITHOUT ANY WARRANTY; without even the implied warranty of                
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             
 * Lesser General Public License for more details.                               
 *                                                                               
 * You should have received a copy of the GNU Lesser General Public              
 * License along with this library; if not, write to the Free Software           
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  
 * 02110-1301  USA
 *
 * Any modifications to this file must keep this entire header
 * intact.
 */
package org.kawanfw.file.reflection;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.kawanfw.commons.util.FrameworkDebug;
import org.kawanfw.commons.util.FrameworkFileUtil;

/**
 * @author Nicolas de Pomereu
 *
 */
public class ClassPathUtil {

    private static boolean DEBUG = FrameworkDebug.isSet(ClassPathUtil.class);

    /**
     * Protected constructor
     */
    protected ClassPathUtil() {
    }

    /**
     * Returns user.home/.kawansoft/.classpath
     * 
     * @returns user.home/.kawansoft/.classpath
     */
    public static String getUserHomeDotKawansoftDotClasspath() {

        String userHomeDotKawansoftDotClasspath = FrameworkFileUtil.getUserHomeDotKawansoftDir() + File.separator
                + ".classpath" + File.separator;
        return userHomeDotKawansoftDotClasspath;
    }

    /**
     * Returns user.home/.kawansoft/.classpath/.usernames/username/
     * 
     * @returns user.home/.kawansoft/.classpath/.usernames/username/
     */
    public static String getUsernameClasspath(String username) {

        if (username == null) {
            throw new IllegalArgumentException("username is null");
        }

        return getUserHomeDotKawansoftDotClasspath() + ".usernames" + File.separator + username + File.separator;
    }

    /**
     * Add to our dynamic FileFilter FilenameFilter classpath the files located
     * in user.home/.classpath/lib & user.home/lib & same for each username
     * 
     * @param username
     *            the username to add the classpath for
     * 
     * @throws IOException
     */
    public static void addUserClasspath(String username) throws IOException {

        if (username == null) {
            throw new IllegalArgumentException("username is null");
        }

        String userHome = getUserHomeDotKawansoftDotClasspath();
        File userHomeFile = new File(userHome);
        userHomeFile.mkdirs();

        // 1) Commons classpath:
        // user.home/.kawansoft/.classpath/classes &
        // user.home/.kawansoft/.classpath/lib
        File classesDir = new File(userHome + "classes");
        File libDir = new File(userHome + "lib");

        ClassPathHacker.addFile(classesDir);
        AddJarsToClasspath(libDir);

        // 2) Private username classpath
        // user.home/.kawansoft/.classpath/.usernames/username/classes &
        // user.home/.kawansoft/.classpath/.usernames/username/lib
        //
        String usernameClasspath = getUsernameClasspath(username);
        File usernameClasspathFile = new File(userHome);
        usernameClasspathFile.mkdirs();
        usernameClasspathFile.deleteOnExit();

        classesDir = new File(usernameClasspath + "classes");
        libDir = new File(usernameClasspath + "lib");

        ClassPathHacker.addFile(classesDir);
        AddJarsToClasspath(libDir);

    }

    /**
     * Add the jars located in dir to classpath
     * 
     * @param libDir
     *            the lib direcotry
     * @throws IOException
     */
    private static void AddJarsToClasspath(File libDir) throws IOException {

        if (libDir == null) {
            throw new IllegalArgumentException("libDir is null");
        }

        File[] libs = libDir.listFiles();
        if (libs != null) {
            for (File file : libs) {
                if (file.toString().endsWith(".jar")) {
                    ClassPathHacker.addFile(file);
                }
            }
        }
    }

    /**
     * Displays the classpath
     */
    public static void displayClasspath() {

        System.out.println();
        System.out.println(new Date());
        ClassLoader cl = ClassLoader.getSystemClassLoader();

        URL[] urls = ((URLClassLoader) cl).getURLs();

        for (URL url : urls) {
            System.out.println(url.getFile());
        }

    }

    /**
     * Move the filter file from the upload zone to the final ou of server
     * classpath
     * 
     * @param username
     * @param filterFile
     * @param filterClassname
     * @throws IOException
     */
    public static void moveToFinalClasspath(String username, File filterFile, String filterClassname)
            throws IOException {

        File destFile = null;

        try {
            // Move the file to the final classpath, outside erver root
            String usernameClasspath = getUsernameClasspath(username);

            debug("usernameClasspath: " + usernameClasspath);

            if (filterFile.toString().endsWith(".class")) {
                String classFolder = usernameClasspath + "classes";
                String classSubDirPath = ClassFileLocatorNew.getClassSubdirectories(filterClassname);
                classSubDirPath = classSubDirPath.replace("/", File.separator);
                classFolder += classSubDirPath;
                File classFolderDir = new File(classFolder);
                boolean doneMkdirs = classFolderDir.mkdirs();
                debug("doneMkdirs: " + doneMkdirs);
                destFile = new File(classFolder + filterFile.getName());
                FileUtils.copyFile(filterFile, destFile);

                debug("classFolder: " + classFolder);
                debug("destFile   : " + destFile);

            } else {
                String libDir = usernameClasspath + "lib" + File.separator;
                destFile = new File(libDir + filterFile.getName());
                FileUtils.copyFile(filterFile, destFile);
                destFile.deleteOnExit();
            }
        } finally {
            // Clean upload area
            filterFile.delete();

            if (destFile != null) {
                destFile.deleteOnExit(); // Keep a trace for debug
            }

        }
    }

    private static void debug(String s) {
        if (DEBUG) {
            System.out.println(s);
        }
    }

}