core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/sbsv2/SBSv2QueryUtils.java
branchC3_BUILDER_WORK
changeset 1568 508bfdb3a934
parent 1538 ac789a0152a8
child 1621 393b985a50f3
--- a/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/sbsv2/SBSv2QueryUtils.java	Mon Jun 28 10:14:24 2010 -0500
+++ b/core/com.nokia.carbide.cpp.sdk.core/src/com/nokia/carbide/cpp/internal/api/sdk/sbsv2/SBSv2QueryUtils.java	Thu Jul 01 16:36:11 2010 -0500
@@ -21,12 +21,14 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.Serializable;
 import java.io.StringReader;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -51,69 +53,82 @@
 
 public class SBSv2QueryUtils {
 
+	public static final String QUERY_ALIASES_COMMAND = "--query=aliases";
 	public static final String QUERY_PRODUCTS_COMMAND = "--query=products";
 	public static final String QUERY_CONFIG_COMMAND = "--query=config";
-	public static final String QUERY_COMMAND = "--query=aliases";
-	
-	public static HashMap<String, String> getAliasesForSDK(ISymbianSDK sdk) throws SBSv2MinimumVersionException{
-		
-		checkForMinimumRaptorVersion();
-		
-		List<String> argListAliasQuery = new ArrayList<String>();
-		argListAliasQuery.add(QUERY_COMMAND);
-		
-		Properties envVars = EnvironmentReader.getEnvVars();
-		if (sdk != null){
-			envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
-		} else {
-			envVars.setProperty("EPOCROOT", "FOOBAR");
+
+	public static final String ALIAS_CACHE_KEY = "alias_cache";
+	public static final String CONFIG_CACHE_KEY = "config_cache";
+	public static final String PRODUCT_CACHE_KEY = "product_cache";
+
+	public static final String BAD_EPOCROOT = "BADEPOCROOT";
+
+	@SuppressWarnings("unchecked")
+	public static HashMap<String, String> getAliasesForSDK(ISymbianSDK sdk) throws SBSv2MinimumVersionException {
+		HashMap<String, String> aliases;
+		Map<String, HashMap<String, String>> aliasesMap = SDKCorePlugin.getCache().getCachedData(ALIAS_CACHE_KEY, Map.class, 0);
+		SBSv2SDKKey key = new SBSv2SDKKey(sdk);
+
+		if (aliasesMap == null) {
+			aliasesMap = new HashMap<String, HashMap<String, String>>();
 		}
-		
-		String queryResult = getSBSQueryOutput(argListAliasQuery, createEnvStringList(envVars));
-		
-		return parseQueryAliasResult(queryResult);
-	}
-	
-	public static List<String> getProductVariantsForSDK(ISymbianSDK sdk) throws SBSv2MinimumVersionException{
-		
-		checkForMinimumRaptorVersion();
-		
-		List<String> argListProductQuery = new ArrayList<String>();
-		
-		Properties envVars = EnvironmentReader.getEnvVars();
-		if (sdk != null){
-			envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
-		} else {
-			envVars.setProperty("EPOCROOT", "FOOBAR");
-		}
-		
-		argListProductQuery.add(QUERY_PRODUCTS_COMMAND);
-		String queryResult = getSBSQueryOutput(argListProductQuery, createEnvStringList(envVars));
-		return parseQueryProductsResults(queryResult);
-	}
-	
-	public static String getConfigQueryXML(ISymbianSDK sdk, List<String> aliasOrMeaningArray) throws SBSv2MinimumVersionException{
-		
-		checkForMinimumRaptorVersion();
-		
-		List<String> argListConfigQuery = new ArrayList<String>();
-		
-		for (String alias : aliasOrMeaningArray){
-			argListConfigQuery.add(QUERY_CONFIG_COMMAND + "[" + alias + "]");
-		}
-		
-		Properties envVars = null;
-		if (sdk != null){
-			File epocRoot = new File(sdk.getEPOCROOT());
-			if (epocRoot.exists()){
-				envVars = EnvironmentReader.getEnvVars();
-				envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
+		else {
+			aliases = aliasesMap.get(key.toString());
+			if (aliases != null && !aliases.containsKey(BAD_EPOCROOT)) {
+				return aliases;
 			}
 		}
-		return getSBSQueryOutput(argListConfigQuery, createEnvStringList(envVars));
+
+		aliases = getAliasesQuery(sdk);
+		aliasesMap.put(key.toString(), aliases);
+		SDKCorePlugin.getCache().putCachedData(ALIAS_CACHE_KEY, (Serializable)aliasesMap, 0);
+		return aliases;
 	}
-	
-	
+
+	@SuppressWarnings("unchecked")
+	public static List<String> getProductVariantsForSDK(ISymbianSDK sdk) throws SBSv2MinimumVersionException {
+		List<String> products;
+		Map<String, List<String>> productsMap = SDKCorePlugin.getCache().getCachedData(PRODUCT_CACHE_KEY, Map.class, 0);
+		SBSv2SDKKey key = new SBSv2SDKKey(sdk);
+		
+		if (productsMap == null) {
+			productsMap = new HashMap<String, List<String>>();
+		}
+		else {
+			products = productsMap.get(key.toString());
+			if (products != null && !products.contains(BAD_EPOCROOT)) {
+				return products;
+			}
+		}
+
+		products = getProductsQuery(sdk);
+		productsMap.put(key.toString(), products);
+		SDKCorePlugin.getCache().putCachedData(PRODUCT_CACHE_KEY, (Serializable)productsMap, 0);
+		return products;
+	}
+
+	@SuppressWarnings("unchecked")
+	public static String getConfigQueryXMLforSDK(ISymbianSDK sdk, List<String> aliasOrMeaningArray) throws SBSv2MinimumVersionException {
+		String configs;
+		Map<String, String> configsMap = SDKCorePlugin.getCache().getCachedData(CONFIG_CACHE_KEY, Map.class, 0);
+		SBSv2SDKKey key = new SBSv2SDKKey(sdk);
+
+		if (configsMap == null) {
+			configsMap = new HashMap<String, String>();
+		}
+		else {
+			configs = configsMap.get(key.toString());
+			if (configs != null) {
+				return configs;
+			}
+		}
+
+		configs = getConfigurations(sdk, aliasOrMeaningArray);
+		configsMap.put(key.toString(), configs);
+		SDKCorePlugin.getCache().putCachedData(CONFIG_CACHE_KEY, (Serializable)configsMap, 0);
+		return configs;
+	}
+
 	public static HashMap<String, String> queryConfigTargetInfo(ISymbianSDK sdk, List<String> aliasOrMeaningArray) throws SBSv2MinimumVersionException{
 		
 		checkForMinimumRaptorVersion();
@@ -136,7 +151,7 @@
 		
 		return parseQueryConfigResults(queryResult);
 	}
-	
+
 	private static String[] createEnvStringList(Properties envProps) {
 		
 		if (envProps == null){
@@ -154,7 +169,75 @@
 		}
 		return env;
 	}
-	
+
+	private static HashMap<String, String> getAliasesQuery(ISymbianSDK sdk) throws SBSv2MinimumVersionException {
+		
+		checkForMinimumRaptorVersion();
+		if (!isEpocRootValid(sdk)) {
+			HashMap<String, String> result = new HashMap<String, String>();
+			result.put(BAD_EPOCROOT, "");
+			return result;
+		}
+		
+		List<String> argListAliasQuery = new ArrayList<String>();
+		argListAliasQuery.add(QUERY_ALIASES_COMMAND);
+		
+		Properties envVars = EnvironmentReader.getEnvVars();
+		if (sdk != null){
+			envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
+		} else {
+			envVars.setProperty("EPOCROOT", "FOOBAR");
+		}
+		
+		String queryResult = getSBSQueryOutput(argListAliasQuery, createEnvStringList(envVars));
+		
+		return parseQueryAliasResult(queryResult);
+	}
+
+	private static List<String> getProductsQuery(ISymbianSDK sdk) throws SBSv2MinimumVersionException {
+		
+		checkForMinimumRaptorVersion();
+		if (!isEpocRootValid(sdk)) {
+			List<String> result = new ArrayList<String>();
+			result.add(BAD_EPOCROOT);
+			return result;
+		}
+
+		List<String> argListProductQuery = new ArrayList<String>();
+		argListProductQuery.add(QUERY_PRODUCTS_COMMAND);
+		
+		Properties envVars = EnvironmentReader.getEnvVars();
+		if (sdk != null){
+			envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
+		} else {
+			envVars.setProperty("EPOCROOT", "FOOBAR");
+		}
+		
+		String queryResult = getSBSQueryOutput(argListProductQuery, createEnvStringList(envVars));
+		return parseQueryProductsResults(queryResult);
+	}
+
+	private static String getConfigurations(ISymbianSDK sdk, List<String> aliasOrMeaningArray) throws SBSv2MinimumVersionException {
+		
+		checkForMinimumRaptorVersion();
+		
+		List<String> argListConfigQuery = new ArrayList<String>();
+		for (String alias : aliasOrMeaningArray){
+			argListConfigQuery.add(QUERY_CONFIG_COMMAND + "[" + alias + "]");
+		}
+		
+		Properties envVars = null;
+		if (sdk != null){
+			File epocRoot = new File(sdk.getEPOCROOT());
+			if (epocRoot.exists()){
+				envVars = EnvironmentReader.getEnvVars();
+				envVars.setProperty("EPOCROOT", sdk.getEPOCROOT());
+			}
+		}
+
+		return getSBSQueryOutput(argListConfigQuery, createEnvStringList(envVars));
+	}
+
 	private static String getSBSQueryOutput(List<String> queryCommandList, String[] env) {
 		String overallOutput = "";
 		
@@ -210,7 +293,18 @@
 
 		return overallOutput;
 	}
-	
+
+	private static Boolean isEpocRootValid(ISymbianSDK sdk) {
+		IPath epocRoot = new Path(sdk.getEPOCROOT());
+		epocRoot = epocRoot.append("epoc32");
+		File epocRootFile = epocRoot.toFile();
+		if (epocRootFile.exists()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
 	private static HashMap<String, String> parseQueryAliasResult(String queryResult) {
 		/* Alias to dotted name config */
 		HashMap<String, String> sbsAliasMap = new HashMap<String, String>();
@@ -278,7 +372,7 @@
 		
 		return sbsAliasMap;
 	}
-	
+
 	private static List<String> parseQueryProductsResults(String queryResult) {
 		List<String> productList = new ArrayList<String>();
 		
@@ -323,11 +417,14 @@
 		HashMap<String, String> resultMap = new HashMap<String, String>();
 		
 		// iterate all SDKs and build the map up
-		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()){
-			if (sdk.isEnabled() && (new File(sdk.getEPOCROOT()).exists())){
+		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()) {
+			if (sdk.isEnabled() && isEpocRootValid(sdk)) {
 				HashMap<String, String> aliasMap = getAliasesForSDK(sdk);
-				for (String alias : aliasMap.keySet()){
-					if (resultMap.get(alias) == null){
+				for (String alias : aliasMap.keySet()) {
+					if (alias.equals(BAD_EPOCROOT)) {
+						continue;
+					}
+					if (resultMap.get(alias) == null) {
 						resultMap.put(alias, aliasMap.get(alias));
 					}
 				}
@@ -336,16 +433,19 @@
 		
 		return resultMap;
 	}
-	
+
 	public static List<String> getCompleteProductVariantList() throws SBSv2MinimumVersionException {
 		List<String> resultList = new ArrayList<String>();
 		
 		// iterate all SDKs and build the map up
-		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()){
-			if (sdk.isEnabled() && (new File(sdk.getEPOCROOT()).exists())){
+		for (ISymbianSDK sdk : SDKCorePlugin.getSDKManager().getSDKList()) {
+			if (sdk.isEnabled() && isEpocRootValid(sdk)) {
 				List<String> productList = getProductVariantsForSDK(sdk);
-				for (String variant : productList){
-					if (!resultList.contains(variant)){
+				for (String variant : productList) {
+					if (variant.equals(BAD_EPOCROOT)) {
+						continue;
+					}
+					if (!resultList.contains(variant)) {
 						resultList.add(variant);
 					}
 				}
@@ -354,5 +454,23 @@
 		
 		return resultList;
 	}
-	
+
+	public static void removeAllCachedQueries() {
+		removeCachedAliases();
+		removeCachedProducts();
+		removeCachedConfigurations();
+	}
+
+	public static void removeCachedAliases() {
+		SDKCorePlugin.getCache().removeCache(ALIAS_CACHE_KEY);
+	}
+
+	public static void removeCachedProducts() {
+		SDKCorePlugin.getCache().removeCache(PRODUCT_CACHE_KEY);		
+	}
+
+	public static void removeCachedConfigurations() {
+		SDKCorePlugin.getCache().removeCache(CONFIG_CACHE_KEY);
+	}
+
 }