net.rim.ejde.internal.util.WorkspaceDependencyUtils.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.util.WorkspaceDependencyUtils.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import net.rim.ejde.internal.core.IConstants;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.UserLibrary;
import org.eclipse.jdt.internal.core.UserLibraryClasspathContainer;
import org.eclipse.jdt.internal.core.UserLibraryManager;

/**
 */
public class WorkspaceDependencyUtils implements IConstants {

    static private Logger _log = Logger.getLogger(WorkspaceDependencyUtils.class);
    public static final String NET_RIM_API_JAR = "net_rim_api.jar";
    public static final String BLACIBERRY_LIB_PREFIX = "BlackBerry_Library_";

    /**
    *
    */
    static public IClasspathEntry[] toClasspathEntries(File[] jarFiles) {
        // check the bounds
        if (null == jarFiles || 0 == jarFiles.length) {
            return new IClasspathEntry[] {};
        }

        /*
         * business rule; enforcement for the jdw files who's import section is tagged as '<none>'
         */
        if (1 == jarFiles.length && NONE_CLASSPATH_STRING.equalsIgnoreCase(jarFiles[0].getName())) {
            return new IClasspathEntry[] {};
        }

        String importJarPath;
        IAccessRule[] accessRules = null;
        IPath importJarLocation;
        IClasspathAttribute[] classpathAttributes = {};
        String jdeDocsLocation = null;
        File docFile;
        IClasspathAttribute javadocClasspathAttribute;
        IClasspathEntry entry;

        List<IClasspathEntry> classpathEntries = new ArrayList<IClasspathEntry>();
        // jdeDocsLocation = RimCore.MetaContext.getLegacyJDEDocs();

        if (StringUtils.isNotBlank(jdeDocsLocation)) {
            docFile = new File(jdeDocsLocation);
            javadocClasspathAttribute = JavaCore.newClasspathAttribute(
                    IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, docFile.toURI().toString());
            classpathAttributes = new IClasspathAttribute[] { javadocClasspathAttribute };
        }

        for (File importJar : jarFiles) {
            // filter out "<none>" and "net_rim_api.jar"
            if (importJar.getName().equalsIgnoreCase(NONE_CLASSPATH_STRING)
                    || importJar.getName().equalsIgnoreCase(NET_RIM_API_JAR)) {
                continue;
            }
            importJarPath = EnvVarUtils.replaceRIAEnvVars(importJar.getPath());
            importJarLocation = new Path(importJarPath);
            IPath sourceJarPath = ImportUtils.getSourceJarPath(importJarLocation);
            if (sourceJarPath == null || sourceJarPath.isEmpty() || !sourceJarPath.toFile().exists()) {
                entry = JavaCore.newLibraryEntry(importJarLocation, null, null, accessRules, classpathAttributes,
                        false);
            } else {
                entry = JavaCore.newLibraryEntry(importJarLocation, sourceJarPath, null, accessRules,
                        classpathAttributes, false);
            }
            classpathEntries.add(entry);
        }
        return classpathEntries.toArray(new IClasspathEntry[classpathEntries.size()]);
    }

    /**
     * Generates a valid name of the BlackBerry user library for the given <code>workspaceName</code>.
     *
     * @param workspaceName
     * @return
     */
    static public String generateBBLibName(String workspaceName) {
        UserLibraryManager userLibMgr = JavaModelManager.getUserLibraryManager();
        UserLibrary rimLibs;
        String libName = BLACIBERRY_LIB_PREFIX + workspaceName;
        for (int i = 1; i < 100; i++) {
            rimLibs = userLibMgr.getUserLibrary(libName);
            if (rimLibs != null) {
                libName = BLACIBERRY_LIB_PREFIX + workspaceName + "_" + i;
            } else {
                return libName;
            }
        }

        return IConstants.EMPTY_STRING;
    }

    /**
     * @throws CoreException
     *
     */
    static public void storeDependenciesAsUserLibrary(File[] jarFiles, String userLibrary) throws CoreException {
        if (null == jarFiles || 0 == jarFiles.length) {
            return;
        }

        if (null == userLibrary)
            throw new IllegalArgumentException();

        IClasspathEntry[] classPathEntries = toClasspathEntries(jarFiles);

        storeDependenciesAsUserLibrary(classPathEntries, userLibrary);
    }

    /**
     *
     * @param classPathEntries
     * @param userLibrary
     * @throws CoreException
     *
     */
    static public void storeDependenciesAsUserLibrary(IClasspathEntry[] classPathEntries, String userLibrary)
            throws CoreException {
        if (classPathEntries == null || classPathEntries.length == 0) {
            return;
        }
        UserLibraryManager userLibMgr = JavaModelManager.getUserLibraryManager();
        UserLibrary rimLibs = userLibMgr.getUserLibrary(userLibrary);

        boolean isSysLib = false;

        if (rimLibs != null) {
            // this should not happen
            throw new CoreException(StatusFactory.createErrorStatus("BlackBerry user library already exist."));
        }

        String classpathEntriesSequence = "";

        for (IClasspathEntry classpathEntry : classPathEntries) {
            classpathEntriesSequence = "<" + classpathEntry.toString() + ">";
        }

        _log.debug("Storing User-Library [" + userLibrary + "] as [" + classpathEntriesSequence + "]");

        userLibMgr.setUserLibrary(userLibrary, classPathEntries, isSysLib);
    }

    /**
     *
     */
    static public void removeUserLibrary(String userLibrary) {
        UserLibraryManager userLibMgr = JavaModelManager.getUserLibraryManager();

        if (null != userLibrary) {
            userLibMgr.removeUserLibrary(userLibrary);
        }
    }

    /**
    *
    */
    static public IClasspathEntry[] getClasspathEntriesForUserLibrary(String userLibrary) {
        IClasspathEntry[] result = null;

        UserLibraryManager userLibMgr = JavaModelManager.getUserLibraryManager();
        UserLibrary rimLibs = userLibMgr.getUserLibrary(userLibrary);

        if (null == rimLibs)
            return new IClasspathEntry[] {};

        result = rimLibs.getEntries();

        if (0 < result.length)
            return result;

        return new IClasspathEntry[] {};
    }

    static public void addUserLibraryToProject(String userLibrary, IJavaProject iJavaProject,
            IProgressMonitor monitor) {
        UserLibrary library = JavaModelManager.getUserLibraryManager().getUserLibrary(userLibrary);

        if (null != library && null != iJavaProject) {
            UserLibraryClasspathContainer container = new UserLibraryClasspathContainer(userLibrary);

            IPath path = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID).append(userLibrary);

            try {
                JavaCore.setClasspathContainer(path, new IJavaProject[] { iJavaProject },
                        new IClasspathContainer[] { container },
                        null == monitor ? new NullProgressMonitor()
                                : monitor instanceof SubProgressMonitor ? monitor
                                        : new SubProgressMonitor(monitor, 1));
            } catch (Throwable e) {
                _log.error(e.getMessage(), e);
            } finally {
                monitor.done();
            }
        }
    }

    static public void addUserLibraryToProjects(String userLibrary, IJavaProject[] iJavaProjects,
            IProgressMonitor monitor) {
        UserLibrary library = JavaModelManager.getUserLibraryManager().getUserLibrary(userLibrary);

        if (null != library && null != iJavaProjects && 0 < iJavaProjects.length) {
            UserLibraryClasspathContainer[] containers = new UserLibraryClasspathContainer[iJavaProjects.length];

            IPath path;

            path = new Path(JavaCore.USER_LIBRARY_CONTAINER_ID).append(userLibrary);

            for (int i = 0; i < iJavaProjects.length; i++)
                containers[i] = new UserLibraryClasspathContainer(userLibrary);

            try {
                JavaCore.setClasspathContainer(path, iJavaProjects, containers, null == monitor
                        ? new NullProgressMonitor()
                        : monitor instanceof SubProgressMonitor ? monitor : new SubProgressMonitor(monitor, 1));
            } catch (Throwable e) {
                _log.error(e.getMessage(), e);
            } finally {
                monitor.done();
            }
        }
    }
}