Java tutorial
/* * 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(); } } } }