/* * 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 net.rim.ejde.internal.builders.ResourceBuilder; import net.rim.ejde.internal.core.IConstants; import net.rim.ide.Project; import net.rim.ide.Workspace; import net.rim.ide.core.IDEError; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; /** * @author cmalinescu, mcacenco * */ public final class LegacyModelUtil { static private final Logger log = Logger.getLogger( LegacyModelUtil.class ); static public final String BB_VIRTUAL_PROJECT_USERDATA = "VIRTUAL_PROJECT"; static public final String BLANK_STRING = " "; static public final String EMPTY_STRING = ""; static public final char DELIM_SECTION = '|'; static public final char DELIM_ITEM = ';'; /** * */ private LegacyModelUtil() { } /** * Ads a project to the workspace preventing duplicates * * @param wksp * @param proj * @throws IDEError */ public static void addProjectToWorkspaceNonDup( Workspace wksp, Project proj ) { int np = wksp.getNumProjects(); Project oldproj; File pfile = proj.getFile(); boolean isact; for( int i = 0; i < np; i++ ) { oldproj = wksp.getProject( i ); if( oldproj.getFile().equals( pfile ) ) { if( proj != oldproj ) { isact = wksp.isActiveProject( oldproj ); wksp.removeProject( oldproj ); try { wksp.addProject( proj ); } catch( IDEError e ) { log.error( e.getMessage(), e ); return; } if( isact ) wksp.setActiveProject( proj, "Release" ); return; } return; } } try { wksp.addProject( proj ); } catch( IDEError e ) { log.error( e.getMessage(), e ); } } static public void setSource( Project proj, IJavaProject eclipseJavaProject, String source ) { if( null == proj )// Don't process for a non existing legacy project return; if( StringUtils.isBlank( source ) )// Don't process for a non existing // source folder return; if( null == eclipseJavaProject )// Don't process for a non existing // Eclipse equivalent return; try { IClasspathEntry[] classpathEntries = eclipseJavaProject.getRawClasspath(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot workspaceRoot = workspace.getRoot(); IPath classpathEntryPath; String classpathEntryLastSegment; IFolder folder; for( IClasspathEntry classpathEntry : classpathEntries ) { if( IClasspathEntry.CPE_SOURCE == classpathEntry.getEntryKind() ) { classpathEntryPath = classpathEntry.getPath(); classpathEntryLastSegment = classpathEntryPath.lastSegment(); if( source.equalsIgnoreCase( classpathEntryLastSegment ) ) {// if // the // string // can't // be // matched // to // an // existing // classpath // entry // why // should // we // add // it // to // the // legacy // metadata?! if( ImportUtils.getImportPref( ResourceBuilder.LOCALE_INTERFACES_FOLDER_NAME ).equalsIgnoreCase( classpathEntryLastSegment ) ) { return; } if( !classpathEntryPath.toOSString().equals( IConstants.EMPTY_STRING ) ) { folder = workspaceRoot.getFolder( classpathEntryPath ); if( folder.isDerived() )// Don't process for // Eclipse // derived directories return; } } } } } catch( JavaModelException e ) { log.error( e.getMessage(), e ); } String udata = proj.getUserData(); if( StringUtils.isNotBlank( udata ) ) { int idx1 = udata.indexOf( DELIM_SECTION ); if( idx1 >= 0 ) { int idx2 = udata.indexOf( DELIM_SECTION, idx1 + 1 ); String udata_new = ( idx1 > 0 ? udata.substring( 0, idx1 ) : EMPTY_STRING ) + DELIM_SECTION + source + ( idx2 > idx1 ? udata.substring( idx2 ) : EMPTY_STRING ); if( !udata.equals( udata_new ) ) { proj.setUserData( udata_new ); } } } else { proj.setUserData( DELIM_SECTION + source ); } } static public void syncSources( Project proj, IJavaProject eclipseJavaProject ) { if( null == proj )// Don't process for a non existing legacy project return; if( null == eclipseJavaProject )// Don't process for a non existing // Eclipse equivalent return; String sources = ""; StringBuffer buf = new StringBuffer(); try { IClasspathEntry[] classpathEntries = eclipseJavaProject.getRawClasspath(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot workspaceRoot = workspace.getRoot(); IPath classpathEntryPath; String classpathEntryLastSegment; IFolder folder; for( IClasspathEntry classpathEntry : classpathEntries ) { if( IClasspathEntry.CPE_SOURCE == classpathEntry.getEntryKind() ) { classpathEntryPath = classpathEntry.getPath(); classpathEntryLastSegment = classpathEntryPath.lastSegment(); if( ImportUtils.getImportPref( ResourceBuilder.LOCALE_INTERFACES_FOLDER_NAME ).equalsIgnoreCase( classpathEntryLastSegment ) ) { continue; } if( classpathEntryPath.toOSString().equals( IConstants.EMPTY_STRING ) ) { continue; } folder = workspaceRoot.getFolder( classpathEntryPath ); if( folder.isDerived() ) {// Don't process for Eclipse // derived directories continue; } buf.append( DELIM_SECTION + classpathEntryLastSegment ); } } } catch( JavaModelException e ) { log.error( e.getMessage(), e ); } sources = buf.toString(); String udata = proj.getUserData(); if( StringUtils.isNotBlank( udata ) ) { int idx1 = udata.indexOf( DELIM_SECTION ); if( idx1 >= 0 ) { int idx2 = udata.indexOf( DELIM_SECTION, idx1 + 1 ); String udata_new = ( idx1 > 0 ? udata.substring( 0, idx1 ) : EMPTY_STRING ) + DELIM_SECTION + sources + ( idx2 > idx1 ? udata.substring( idx2 ) : EMPTY_STRING ); if( !udata.equals( udata_new ) ) { proj.setUserData( udata_new ); } } } else { proj.setUserData( sources ); } } }