Refactor the *.pkg file resourceset gathering to avoid fixing the same bug 12 times
authorEd Swartz <ed.swartz@nokia.com>
Thu, 10 Dec 2009 14:51:11 -0600
changeset 673 bc9a74f8e67b
parent 672 d1a48eefce6b
child 674 20c7966a3405
Refactor the *.pkg file resourceset gathering to avoid fixing the same bug 12 times
builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/builder/EpocEngineHelper.java
--- a/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/builder/EpocEngineHelper.java	Wed Dec 09 15:49:38 2009 -0600
+++ b/builder/com.nokia.carbide.cdt.builder/src/com/nokia/carbide/cdt/builder/EpocEngineHelper.java	Thu Dec 10 14:51:11 2009 -0600
@@ -35,6 +35,8 @@
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.InstanceScope;
 
 import java.io.*;
 import java.util.*;
@@ -892,7 +894,7 @@
 	 * @param targetPath full path to device-side .rsc directory
 	 */
 	private static void addResourceLanguageTargets(Map<String, String> resources, IMMPData data, IMMPResource resource, 
-			String baseGeneratedPath, String targetPath) {
+			IPath baseGeneratedPath, IPath targetPath) {
 		List<EMMPLanguage> languages = null;
 		// block resource can override languages (entirely)
 		if (resource != null) {
@@ -909,7 +911,8 @@
 		}
 		for (EMMPLanguage language : languages) {
 			String extension = ".R" + language.getCodeString(); //$NON-NLS-1$
-			resources.put(HostOS.convertPathToNative(baseGeneratedPath + extension), HostOS.convertPathToWindows(targetPath));
+			resources.put(baseGeneratedPath.toOSString() + extension.toLowerCase(), 
+					HostOS.convertPathToWindows(targetPath));
 		}
 	}
 	
@@ -944,84 +947,7 @@
 								new MMPDataRunnableAdapter() {
 
 								public Object run(IMMPData mmpData) {
-									// read the project-wide target path
-									String targetPath = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETPATH);
-									if (targetPath != null) {
-										// make sure it doesn't start with a "\" but ends with one
-										IPath targetP = new Path(targetPath).makeRelative().addTrailingSeparator();
-										targetPath = targetP.toOSString();
-									} else {
-										// for EKA1 just leave empty.  for EKA2 use sys\bin\
-										if (buildConfig.getSDK().getOSVersion().getMajor() > 8) {
-											targetPath = "sys/bin/"; //$NON-NLS-1$
-										} else {
-											targetPath = ""; //$NON-NLS-1$
-										}
-									}
-
-									String dataZDir = buildConfig.getSDK().getReleaseRoot().removeLastSegments(1).toPortableString() + "/data/z/"; //$NON-NLS-1$
-									// get the aifs
-									List<IMMPAIFInfo> aifs = mmpData.getAifs();
-									for (IMMPAIFInfo aif : aifs) {
-										IPath aifPath = aif.getTarget().makeAbsolute();
-										resources.put(HostOS.convertPathToNative(dataZDir + targetPath + aifPath.lastSegment().toLowerCase()), 
-												HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$
-									}
-
-									// get the bitmaps
-									List<IMMPBitmap> bmps = mmpData.getBitmaps();
-									for (IMMPBitmap bmp : bmps) {
-										IPath mbmPath = bmp.getTargetFilePath().makeRelative();
-										resources.put(HostOS.convertPathToNative(dataZDir + mbmPath.toOSString().toLowerCase()), 
-												HostOS.convertPathToWindows("C:\\" + mbmPath.removeLastSegments(1).addTrailingSeparator().toOSString())); //$NON-NLS-1$
-									}
-
-									// get the user resources
-									List<IPath> userResources = mmpData.getUserResources();
-									for (IPath userRes : userResources) {
-										addResourceLanguageTargets(resources, mmpData, null, 
-												HostOS.convertPathToNative(dataZDir + targetPath + userRes.removeFileExtension().lastSegment().toLowerCase()), 
-												HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$
-									}
-
-									// get the system resources
-									List<IPath> systemResources = mmpData.getSystemResources();
-									for (IPath systemRes : systemResources) {
-										addResourceLanguageTargets(resources, mmpData, null,
-												HostOS.convertPathToNative(dataZDir + targetPath + systemRes.removeFileExtension().lastSegment().toLowerCase()), 
-												HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$
-									}
-
-									// get the resource blocks
-									List<IMMPResource> resourceBlocks = mmpData.getResourceBlocks();
-									for (IMMPResource resourceBlock : resourceBlocks) {
-										IPath resPath = resourceBlock.getTargetPath();
-										if (resPath == null) {
-											// if not specified in the resource block then get the global
-											// target path
-											String targetP = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETPATH);
-											if (targetP != null) {
-												resPath = new Path(targetP);
-											}
-										}
-										if (resPath != null) {
-											resPath = resPath.makeRelative().addTrailingSeparator();
-											String filename = resourceBlock.getTargetFile();
-											if (filename == null) {
-												filename = resourceBlock.getSource().removeFileExtension().lastSegment().toLowerCase();
-											} else {
-												filename = HostOS.createPathFromString(filename).removeFileExtension().toPortableString().toLowerCase();
-											}
-											// adjust the path if necessary as it's different on the phone for the *_.reg file
-											IPath adjustedTargetPath = resPath;
-											if (adjustedTargetPath.toPortableString().equalsIgnoreCase("private/10003a3f/apps/")) { //$NON-NLS-1$
-												adjustedTargetPath = new Path("private/10003a3f/import/apps/"); //$NON-NLS-1$
-											}
-											addResourceLanguageTargets(resources, mmpData, resourceBlock,
-													HostOS.convertPathToNative(dataZDir + resPath.toOSString() + filename), 
-													HostOS.convertPathToWindows("C:\\" + HostOS.convertPathToWindows(adjustedTargetPath))); //$NON-NLS-1$
-										}
-									}
+									gatherMMPResourceMappings(buildConfig, resources, mmpData);
 									return null;
 								}
 						});
@@ -1048,103 +974,7 @@
 				new MMPDataRunnableAdapter() {
 
 				public Object run(IMMPData mmpData) {
-					// read the project-wide target path
-					String targetPath = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETPATH);
-					if (targetPath != null) {
-						// make sure it doesn't start with a "\" but ends with one
-						IPath targetP = new Path(targetPath).makeRelative().addTrailingSeparator();
-						targetPath = targetP.toOSString();
-					} else {
-						// for EKA1 just leave empty.  for EKA2 use sys\bin\
-						if (buildConfig.getSDK().getOSVersion().getMajor() > 8) {
-							targetPath = "sys\\bin\\"; //$NON-NLS-1$
-						} else {
-							targetPath = ""; //$NON-NLS-1$
-						}
-					}
-
-					String dataZDir = buildConfig.getSDK().getReleaseRoot().removeLastSegments(1).toPortableString() + "/data/z/"; //$NON-NLS-1$
-					
-					// get the aifs
-					List<IMMPAIFInfo> aifs = mmpData.getAifs();
-					for (IMMPAIFInfo aif : aifs) {
-						IPath aifPath = aif.getTarget().makeAbsolute();
-						resources.put(HostOS.convertPathToNative(dataZDir + targetPath + aifPath.lastSegment()), 
-								HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$
-					}
-
-					// for resources and bitmaps, the target path may be based on the target type if not explicitly
-					// set for the resource or bitmap.
-					String targetType = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETTYPE);
-					if (targetType != null) {
-						// could be PLUGIN or PLUGIN3
-						if (targetType.toUpperCase().startsWith("PLUGIN")) { //$NON-NLS-1$
-							targetPath = "resource/plugins/"; //$NON-NLS-1$
-						} else if (targetType.compareToIgnoreCase("PDL") == 0) { //$NON-NLS-1$
-							targetPath = "resource/printers/"; //$NON-NLS-1$
-						}
-					}
-
-					// get the bitmaps
-					List<IMMPBitmap> bmps = mmpData.getBitmaps();
-					for (IMMPBitmap bmp : bmps) {
-						IPath mbmPath = bmp.getTargetFilePath().makeRelative();
-						// if there's no target path then use the main target path
-						if (mbmPath.segmentCount() == 1) {
-							mbmPath = new Path(targetPath).append(mbmPath);
-						}
-						resources.put(HostOS.convertPathToNative(dataZDir + mbmPath.toOSString()), 
-								HostOS.convertPathToWindows("C:\\" + mbmPath.removeLastSegments(1).addTrailingSeparator().toOSString())); //$NON-NLS-1$
-					}
-
-					// get the user resources
-					List<IPath> userResources = mmpData.getUserResources();
-					for (IPath userRes : userResources) {
-						addResourceLanguageTargets(resources, mmpData, null, 
-								HostOS.convertPathToNative(dataZDir + targetPath + userRes.removeFileExtension().lastSegment()), 
-								HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-
-					// get the system resources
-					List<IPath> systemResources = mmpData.getSystemResources();
-					for (IPath systemRes : systemResources) {
-						addResourceLanguageTargets(resources, mmpData, null,
-								HostOS.convertPathToNative(dataZDir + targetPath + systemRes.removeFileExtension().lastSegment()), 
-								HostOS.convertPathToWindows("C:\\" + targetPath)); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-
-					// get the resource blocks
-					List<IMMPResource> resourceBlocks = mmpData.getResourceBlocks();
-					for (IMMPResource resourceBlock : resourceBlocks) {
-						IPath resPath = resourceBlock.getTargetPath();
-						if (resPath == null) {
-							// not specified in the resource block so use existing
-							resPath = new Path(targetPath);
-						}
-
-						String filename = resourceBlock.getTargetFile();
-						if (filename == null) {
-							filename = resourceBlock.getSource().removeFileExtension().lastSegment();
-						} else {
-							filename = HostOS.createPathFromString(filename).removeFileExtension().toOSString();
-						}
-						
-						if (resPath != null) {
-							resPath = resPath.makeRelative().addTrailingSeparator();
-							// adjust the path if necessary as it's different on the phone for the *_.reg file
-							IPath adjustedTargetPath = resPath;
-							if ((adjustedTargetPath.toPortableString()).equalsIgnoreCase("private/10003a3f/apps/")) { //$NON-NLS-1$
-								adjustedTargetPath = new Path("private/10003a3f/import/apps/"); //$NON-NLS-1$
-							}
-							addResourceLanguageTargets(resources, mmpData, resourceBlock,
-									HostOS.convertPathToNative(dataZDir + resPath.toOSString() + filename), 
-									HostOS.convertPathToWindows("C:\\" + adjustedTargetPath)); //$NON-NLS-1$
-						} else {
-							CarbideBuilderPlugin.log(Logging.newStatus(CarbideBuilderPlugin.getDefault(), 
-									IStatus.WARNING,
-									"No TARGETPATH specified for resource " + filename + ".  Skipping..."));
-						}
-					}
+					gatherMMPResourceMappings(buildConfig, resources, mmpData);
 					return null;
 				}
 		});
@@ -1152,6 +982,114 @@
 		return resources;
 	}
 	
+	private static void gatherMMPResourceMappings(
+			final ICarbideBuildConfiguration buildConfig,
+			final HashMap<String, String> resources, IMMPData mmpData) {
+		// read the project-wide target path
+		String targetPathStr = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETPATH);
+		
+		// the target path, should always be absolute and deviceless
+		IPath targetPath;
+		
+		if (targetPathStr != null) {
+			targetPath = new Path(targetPathStr).makeAbsolute();
+		} else {
+			// for EKA1 just leave empty.  for EKA2 use sys\bin\
+			if (buildConfig.getSDK().getOSVersion().getMajor() > 8) {
+				targetPath = new Path("/sys/bin/"); //$NON-NLS-1$
+			} else {
+				targetPath = Path.ROOT; //$NON-NLS-1$
+			}
+		}
+	
+		IPath dataZDir = buildConfig.getSDK().getReleaseRoot().removeLastSegments(1).append("/data/z/"); //$NON-NLS-1$
+		
+		// get the aifs
+		List<IMMPAIFInfo> aifs = mmpData.getAifs();
+		for (IMMPAIFInfo aif : aifs) {
+			IPath aifPath = aif.getTarget().makeAbsolute();
+			resources.put(dataZDir.append(targetPath).append(aifPath.lastSegment()).toOSString(), 
+					HostOS.convertPathToWindows(targetPath.setDevice("C:"))); //$NON-NLS-1$
+		}
+	
+		///////////
+		
+		// for resources and bitmaps, the target path may be based on the target type if not explicitly
+		// set for the resource or bitmap.
+		String targetType = mmpData.getSingleArgumentSettings().get(EMMPStatement.TARGETTYPE);
+		if (targetType != null) {
+			// could be PLUGIN or PLUGIN3
+			if (targetType.toUpperCase().startsWith("PLUGIN")) { //$NON-NLS-1$
+				targetPath = new Path("/resource/plugins"); //$NON-NLS-1$
+			} else if (targetType.compareToIgnoreCase("PDL") == 0) { //$NON-NLS-1$
+				targetPath = new Path("/resource/printers"); //$NON-NLS-1$
+			}
+		}
+	
+		// get the bitmaps
+		List<IMMPBitmap> bmps = mmpData.getBitmaps();
+		for (IMMPBitmap bmp : bmps) {
+			IPath mbmPath = bmp.getTargetFilePath().makeRelative();
+			// if there's no target path then use the main target path
+			if (mbmPath.segmentCount() == 1) {
+				mbmPath = targetPath.append(mbmPath);
+			}
+			IPath mbmDir = mbmPath.removeLastSegments(1).addTrailingSeparator().setDevice("C:"); //$NON-NLS-1$
+			resources.put(dataZDir.append(mbmPath).toOSString(), 
+					HostOS.convertPathToWindows(mbmDir.toOSString()));
+		}
+	
+		// get the user resources
+		List<IPath> userResources = mmpData.getUserResources();
+		for (IPath userRes : userResources) {
+			addResourceLanguageTargets(resources, mmpData, null, 
+					dataZDir.append(targetPath).append(userRes.removeFileExtension().lastSegment().toLowerCase()), 
+					targetPath.setDevice("C:")); //$NON-NLS-1$
+		}
+	
+		// get the system resources
+		List<IPath> systemResources = mmpData.getSystemResources();
+		for (IPath systemRes : systemResources) {
+			addResourceLanguageTargets(resources, mmpData, null,
+					dataZDir.append(targetPath).append(systemRes.removeFileExtension().lastSegment().toLowerCase()), 
+					targetPath.setDevice("C:")); //$NON-NLS-1$
+		}
+	
+		// get the resource blocks
+		List<IMMPResource> resourceBlocks = mmpData.getResourceBlocks();
+		for (IMMPResource resourceBlock : resourceBlocks) {
+			IPath resPath = resourceBlock.getTargetPath();
+			if (resPath == null) {
+				// not specified in the resource block so use existing
+				resPath = targetPath;
+			}
+	
+			String filename = resourceBlock.getTargetFile();
+			if (filename == null) {
+				filename = resourceBlock.getSource().removeFileExtension().lastSegment();
+			} else {
+				filename = HostOS.createPathFromString(filename).removeFileExtension().toOSString();
+			}
+			filename = filename.toLowerCase();
+			
+			if (resPath != null) {
+				resPath = resPath.makeAbsolute().addTrailingSeparator();
+				// adjust the path if necessary as it's different on the phone for the *_.reg file
+				IPath adjustedTargetPath = resPath;
+				if ((adjustedTargetPath.toPortableString()).equalsIgnoreCase("/private/10003a3f/apps/")) { //$NON-NLS-1$
+					adjustedTargetPath = new Path("/private/10003a3f/import/apps/"); //$NON-NLS-1$
+				}
+				addResourceLanguageTargets(resources, mmpData, resourceBlock,
+						dataZDir.append(resPath).append(filename), 
+						adjustedTargetPath.setDevice("C:")); //$NON-NLS-1$
+			} else {
+				CarbideBuilderPlugin.log(Logging.newStatus(CarbideBuilderPlugin.getDefault(), 
+						IStatus.WARNING,
+						"No TARGETPATH specified for resource " + filename + ".  Skipping..."));
+			}
+		}
+	}
+
 	/**
 	 * Get a map of the generated images from image makefiles for the project. 
 	 * @param buildConfig the build configuration
@@ -1592,13 +1530,13 @@
 	
 	public static boolean getIndexAllPreference() {
 		// Can't access this pref from the project ui plugin because it would cause a circular dependency
-		Plugin plugin = Platform.getPlugin("com.nokia.carbide.cpp.project.ui"); //$NON-NLS-1$
-		if (plugin == null) {
+		IEclipsePreferences prefs = new InstanceScope().getNode("com.nokia.carbide.cpp.project.ui");
+		if (prefs == null) {
 			CarbideBuilderPlugin.log(Logging.newStatus(CarbideBuilderPlugin.getDefault(), 
 					IStatus.WARNING, "Could not find project UI plugin!"));
 			return true;
 		}
-		return plugin.getPluginPreferences().getBoolean("indexAll"); //$NON-NLS-1$
+		return prefs.getBoolean("indexAll", false); //$NON-NLS-1$
 	}
 
 	/**
@@ -2159,26 +2097,6 @@
 	}
 	
 	/**
-	 * Get the target name with a variant suffix inserted.
-	 * @param mmpData
-	 * @param target
-	 * @return updated target name
-	 * 
-	 * @deprecated Deprecated in 2.1. Use {@link #getBinaryVariantTargetName(IMMPData mmpData, IPath target, IProject project)} instead.
-	 */
-	private static IPath getVariantTargetName(IMMPData mmpData, IPath target) {
-		if (target == null)
-			return null;
-		
-		String suffix = mmpData.getSingleArgumentSettings().get(EMMPStatement.VAR);
-		if (suffix != null) {
-			target = target.removeFileExtension().addFileExtension(suffix + "." + FileUtils.getSafeFileExtension(target)); //$NON-NLS-1$
-		}
-		
-		return target;
-	}
-	
-	/**
 	 * Get the target name with a variant suffix inserted. Since 2.1 this includes support for Symbian Binary Variation builds
 	 * that have the FEATUREVARIANT keyword in their MMP file.
 	 * @param mmpData