Loading src/com/elphel/vdt/core/options/Option.java +21 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ *******************************************************************************/ package com.elphel.vdt.core.options; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; /** Loading Loading @@ -97,6 +99,24 @@ public abstract class Option { value = store.getString(key); setValue(value); } else { // Trying to get with different index //See TODO: 07/01/2016 in OptionUtils // public static List<String> getStoreContext( final String contextID // if (contextID.equals("cocotb")) { if (!key.startsWith(OptionsUtils.KEY_CONTENT)){ // Otherwise will be infinite loop List<String> context = OptionsUtils.getStoreContext(contextID,store); String patt=contextID+"_[^_]*"+key.substring( key.indexOf("_",contextID.length()+1)); for (String skey:context){ if (skey.matches(patt)){ value = store.getString(skey); setValue(value); System.out.println("Option.doLoad(): in context "+contextID+" - found replacement for "+key+": "+skey); return value; } } } value = doLoadDefault(); } return value; Loading src/com/elphel/vdt/core/options/OptionsCore.java +36 −14 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ public class OptionsCore { } public static void doLoadContextOptions(Context context, IPreferenceStore store) { // System.out.println("doLoadContextOptions("+context.getName()+")"); List<Parameter> list = context.getParams(); if (list.isEmpty()) return; Loading @@ -198,6 +199,7 @@ public class OptionsCore { option = new ParamBasedListOption(param); else option = new ParamBasedOption(param); option.setPreferenceStore(store); option.doLoad(); } Loading @@ -217,16 +219,26 @@ public class OptionsCore { } public static void doStoreContextOptions(Context context, IProject project) { if ("cocotb".equals(context.getName())){ System.out.println("doStoreContextOptions('cocotb'), project="+project); } IPreferenceStore store = getPreferenceStore(context, project); doStoreContextOptions(context, store); } public static void doStoreContextOptions(Context context) { if ("cocotb".equals(context.getName())){ System.out.println("doStoreContextOptions('cocotb')"); } IPreferenceStore store = VerilogPlugin.getDefault().getPreferenceStore(); doStoreContextOptions(context, store); } public static void doStoreContextOptions(Context context, IPreferenceStore store) { if ("cocotb".equals(context.getName())){ System.out.println("static doStoreContextOptions('cocotb')"); } List<Parameter> list = context.getParams(); if (list.isEmpty()) return; Loading @@ -240,7 +252,7 @@ public class OptionsCore { option.setPreferenceStore(store); option.doStore(); } OptionsUtils.setStoreVersion(context.getVersion(), context.getName(), store); OptionsUtils.setStoreVersion(context.getContextVersion(), context.getName(), store); finalizeDoStore(store); } Loading @@ -250,6 +262,7 @@ public class OptionsCore { if (store.needsSaving()) ((ScopedPreferenceStore)store).save(); } catch (IOException e) { System.out.println("finalizeDoStore() - out of sync (edited manually settings file?"); // Nothing do do, we don't need to bother the user } } Loading Loading @@ -284,20 +297,29 @@ public class OptionsCore { } private static void checkVersionCompatibility(Context context, IPreferenceStore store) { if (OptionsUtils.isVersionCompatible(context.getVersion(), context.getName(), store)) // Context Version is a version of the file, like <vdt-project version = "0.8"> if (OptionsUtils.isVersionCompatible(context.getContextVersion(), context.getName(), store)) return; Shell shell = VerilogPlugin.getActiveWorkbenchShell(); String message = "Version of TSL description has been changed.\nDo you wish to delete stored values?"; String message = "Version of TSL description for context '"+ context.getName()+"' has been changed.\n"+ "What do you wish to do with the stored values?\n"+ "'Delete' resets all context values to defaults\n"+ "'Update' tries to convert settings to newer format\n"+ "'Cancel' does nothing, keeping existing files (until saved)."; MessageDialog messageBox = new MessageDialog( shell, "Warning", null , message , MessageDialog.WARNING , new String[]{"Yes", "No"} , new String[]{"Delete", "Update", "Cancel"} , 1); messageBox.open(); if (messageBox.getReturnCode() == 0) { int returnCode = messageBox.getReturnCode(); if (returnCode == 0) { OptionsUtils.clearStore(context.getName(), store); finalizeDoStore(store); } else if (returnCode == 1) { OptionsUtils.updateStore(context.getName(), store); finalizeDoStore(store); } } Loading src/com/elphel/vdt/core/options/OptionsUtils.java +72 −8 Original line number Diff line number Diff line Loading @@ -28,8 +28,12 @@ package com.elphel.vdt.core.options; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.preference.IPreferenceStore; Loading @@ -51,6 +55,7 @@ class OptionsUtils { public static final String KEY_VERSION = "com.elphel.store.version."; private static final String SEPARATOR = "<-@##@->"; private static final String CONTEXT_SEPARATOR = "_@_"; public static String convertListToString(List<String> list) { String value = ""; Loading Loading @@ -94,9 +99,21 @@ class OptionsUtils { } public static String toKey(Parameter param) { Context context = param.getContext(); int index = context.getParams().indexOf(param); return "" + param.getContext().getName() + "_" + index + "_" + param.getID(); // Context context = param.getContext(); // int index = context.getParams().indexOf(param); // return "" + param.getContext().getName() + "_" + index + "_" + param.getID(); return "" + param.getContext().getName() + CONTEXT_SEPARATOR + param.getID(); /* TODO: 07/02/2016: Disabled using parameter index in the key - that was causing VDT to forget all settings * when number of tool parameters was modified. * ContextOptionsDialog */ //TODO: 07/01/2016: Understand why index is needed? It changes when xml files are edited (added/deleted parameters // But each parameter ID + context should already be unique // So meanwhile I'll add searching for same context/parameter with other indices if the exact match is not found } Loading Loading @@ -172,6 +189,49 @@ class OptionsUtils { store.setToDefault(getVersionKey(contextID)); } public static void updateStore(final String contextID, IPreferenceStore store) { List<String> contextList = getStoreContext(contextID, store); Map<String,String> newKeyValues= new HashMap<String,String>(); Pattern patt_new=Pattern.compile("[a-zA-Z0-9_]*"+CONTEXT_SEPARATOR); Pattern patt_indx=Pattern.compile("([a-zA-Z0-9_]*)_[0-9]+_(.*)"); for (String key : contextList) { if (patt_new.matcher(key).lookingAt()){ newKeyValues.put(key, store.getString(key)); // Found new <context>_@_<parameter> } else { Matcher matcher = patt_indx.matcher(key); if (matcher.lookingAt()) { String newKey = matcher.group(1)+CONTEXT_SEPARATOR+matcher.group(2); if (!newKeyValues.containsKey(newKey)){ // Only if it is not yet set - not to overwrite the new value newKeyValues.put(newKey, store.getString(key)); // Found new <context>_@_<parameter> } } } store.setToDefault(key); } // Save converted/filtered values, if they are not empty (will not be able to overwrite non-empty default) for (String key :newKeyValues.keySet()){ store.putValue(key,newKeyValues.get(key)); } // now regenerate context string //Rebuild the list, getting rid of indexed entries contextList = new ArrayList<String>(); for (String key :newKeyValues.keySet()){ contextList.add(key); } final String contentKey = getContentKey(contextID); ValueBasedListOption option = new ValueBasedListOption(contentKey, contextID, contextList); option.setPreferenceStore(store); option.doStore(contextList); // store.setToDefault(getContentKey(contextID)); store.setToDefault(getVersionKey(contextID)); } public static void setStoreVersion( final String version , final String contextID , IPreferenceStore store) Loading @@ -190,6 +250,9 @@ class OptionsUtils { { boolean compatible; final String versionKey = getVersionKey(contextID); if (versionKey.endsWith("ocotb")){ System.out.println("isVersionCompatible(cocotb)"); } if (version == null) { compatible = ! store.contains(versionKey); } else if (store.contains(versionKey)) { Loading @@ -200,7 +263,8 @@ class OptionsUtils { return compatible; } private static List<String> getStoreContext( final String contextID public static List<String> getStoreContext( final String contextID // private static List<String> getStoreContext( final String contextID , IPreferenceStore store ) { List<String> context = new ArrayList<String>(); ValueBasedListOption option = new ValueBasedListOption(getContentKey(contextID), contextID, context); Loading src/com/elphel/vdt/core/options/ValueBasedListOption.java +2 −2 Original line number Diff line number Diff line Loading @@ -94,7 +94,7 @@ public class ValueBasedListOption extends Option { /** * Load the default option value from persistent storage * * @return the sequnce of the list items separated by SEPARATOR. * @return the sequence of the list items separated by SEPARATOR. */ public String doLoadDefault() { List<String> list = doLoadDefaultList(); Loading @@ -110,7 +110,7 @@ public class ValueBasedListOption extends Option { /** * Save value to persistent storage * * @param value the sequnce of the list items separated by SEPARATOR. * @param value the sequence of the list items separated by SEPARATOR. */ public boolean doStore(String value) { List<String> list = OptionsUtils.convertStringToList(value); Loading src/com/elphel/vdt/core/tools/config/xml/ParamNodeReader.java +11 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.elphel.vdt.core.tools.contexts.Context; public class ParamNodeReader extends AbstractConditionNodeReader { private List<Parameter> paramList = new ArrayList<Parameter>(); private List<String> paramIdList = new ArrayList<String>(); public ParamNodeReader(XMLConfig config, Context context) { super(config, context); Loading @@ -46,7 +47,14 @@ public class ParamNodeReader extends AbstractConditionNodeReader { public void readNode(Node node, Condition condition) throws ConfigException { if(XMLConfig.isElemNode(node, XMLConfig.PARAMETER_TAG)) { try { paramList.add(readParam(node, condition)); Parameter param = readParam(node, condition); String id=param.getID(); if (paramIdList.contains(id)){ System.out.println("Warning: duplicate parameter ('" + id + "') in context '" + context + "' defined in "+param.getSourceXML()); // throw new ConfigException("Duplicate parameter ('" + id + "') in context '" + context + "' defined in "+param.getSourceXML()); } paramIdList.add(id); paramList.add(param); } catch(ConfigException e) { config.logError(e); } Loading Loading
src/com/elphel/vdt/core/options/Option.java +21 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ *******************************************************************************/ package com.elphel.vdt.core.options; import java.util.List; import org.eclipse.jface.preference.IPreferenceStore; /** Loading Loading @@ -97,6 +99,24 @@ public abstract class Option { value = store.getString(key); setValue(value); } else { // Trying to get with different index //See TODO: 07/01/2016 in OptionUtils // public static List<String> getStoreContext( final String contextID // if (contextID.equals("cocotb")) { if (!key.startsWith(OptionsUtils.KEY_CONTENT)){ // Otherwise will be infinite loop List<String> context = OptionsUtils.getStoreContext(contextID,store); String patt=contextID+"_[^_]*"+key.substring( key.indexOf("_",contextID.length()+1)); for (String skey:context){ if (skey.matches(patt)){ value = store.getString(skey); setValue(value); System.out.println("Option.doLoad(): in context "+contextID+" - found replacement for "+key+": "+skey); return value; } } } value = doLoadDefault(); } return value; Loading
src/com/elphel/vdt/core/options/OptionsCore.java +36 −14 Original line number Diff line number Diff line Loading @@ -186,6 +186,7 @@ public class OptionsCore { } public static void doLoadContextOptions(Context context, IPreferenceStore store) { // System.out.println("doLoadContextOptions("+context.getName()+")"); List<Parameter> list = context.getParams(); if (list.isEmpty()) return; Loading @@ -198,6 +199,7 @@ public class OptionsCore { option = new ParamBasedListOption(param); else option = new ParamBasedOption(param); option.setPreferenceStore(store); option.doLoad(); } Loading @@ -217,16 +219,26 @@ public class OptionsCore { } public static void doStoreContextOptions(Context context, IProject project) { if ("cocotb".equals(context.getName())){ System.out.println("doStoreContextOptions('cocotb'), project="+project); } IPreferenceStore store = getPreferenceStore(context, project); doStoreContextOptions(context, store); } public static void doStoreContextOptions(Context context) { if ("cocotb".equals(context.getName())){ System.out.println("doStoreContextOptions('cocotb')"); } IPreferenceStore store = VerilogPlugin.getDefault().getPreferenceStore(); doStoreContextOptions(context, store); } public static void doStoreContextOptions(Context context, IPreferenceStore store) { if ("cocotb".equals(context.getName())){ System.out.println("static doStoreContextOptions('cocotb')"); } List<Parameter> list = context.getParams(); if (list.isEmpty()) return; Loading @@ -240,7 +252,7 @@ public class OptionsCore { option.setPreferenceStore(store); option.doStore(); } OptionsUtils.setStoreVersion(context.getVersion(), context.getName(), store); OptionsUtils.setStoreVersion(context.getContextVersion(), context.getName(), store); finalizeDoStore(store); } Loading @@ -250,6 +262,7 @@ public class OptionsCore { if (store.needsSaving()) ((ScopedPreferenceStore)store).save(); } catch (IOException e) { System.out.println("finalizeDoStore() - out of sync (edited manually settings file?"); // Nothing do do, we don't need to bother the user } } Loading Loading @@ -284,20 +297,29 @@ public class OptionsCore { } private static void checkVersionCompatibility(Context context, IPreferenceStore store) { if (OptionsUtils.isVersionCompatible(context.getVersion(), context.getName(), store)) // Context Version is a version of the file, like <vdt-project version = "0.8"> if (OptionsUtils.isVersionCompatible(context.getContextVersion(), context.getName(), store)) return; Shell shell = VerilogPlugin.getActiveWorkbenchShell(); String message = "Version of TSL description has been changed.\nDo you wish to delete stored values?"; String message = "Version of TSL description for context '"+ context.getName()+"' has been changed.\n"+ "What do you wish to do with the stored values?\n"+ "'Delete' resets all context values to defaults\n"+ "'Update' tries to convert settings to newer format\n"+ "'Cancel' does nothing, keeping existing files (until saved)."; MessageDialog messageBox = new MessageDialog( shell, "Warning", null , message , MessageDialog.WARNING , new String[]{"Yes", "No"} , new String[]{"Delete", "Update", "Cancel"} , 1); messageBox.open(); if (messageBox.getReturnCode() == 0) { int returnCode = messageBox.getReturnCode(); if (returnCode == 0) { OptionsUtils.clearStore(context.getName(), store); finalizeDoStore(store); } else if (returnCode == 1) { OptionsUtils.updateStore(context.getName(), store); finalizeDoStore(store); } } Loading
src/com/elphel/vdt/core/options/OptionsUtils.java +72 −8 Original line number Diff line number Diff line Loading @@ -28,8 +28,12 @@ package com.elphel.vdt.core.options; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.preference.IPreferenceStore; Loading @@ -51,6 +55,7 @@ class OptionsUtils { public static final String KEY_VERSION = "com.elphel.store.version."; private static final String SEPARATOR = "<-@##@->"; private static final String CONTEXT_SEPARATOR = "_@_"; public static String convertListToString(List<String> list) { String value = ""; Loading Loading @@ -94,9 +99,21 @@ class OptionsUtils { } public static String toKey(Parameter param) { Context context = param.getContext(); int index = context.getParams().indexOf(param); return "" + param.getContext().getName() + "_" + index + "_" + param.getID(); // Context context = param.getContext(); // int index = context.getParams().indexOf(param); // return "" + param.getContext().getName() + "_" + index + "_" + param.getID(); return "" + param.getContext().getName() + CONTEXT_SEPARATOR + param.getID(); /* TODO: 07/02/2016: Disabled using parameter index in the key - that was causing VDT to forget all settings * when number of tool parameters was modified. * ContextOptionsDialog */ //TODO: 07/01/2016: Understand why index is needed? It changes when xml files are edited (added/deleted parameters // But each parameter ID + context should already be unique // So meanwhile I'll add searching for same context/parameter with other indices if the exact match is not found } Loading Loading @@ -172,6 +189,49 @@ class OptionsUtils { store.setToDefault(getVersionKey(contextID)); } public static void updateStore(final String contextID, IPreferenceStore store) { List<String> contextList = getStoreContext(contextID, store); Map<String,String> newKeyValues= new HashMap<String,String>(); Pattern patt_new=Pattern.compile("[a-zA-Z0-9_]*"+CONTEXT_SEPARATOR); Pattern patt_indx=Pattern.compile("([a-zA-Z0-9_]*)_[0-9]+_(.*)"); for (String key : contextList) { if (patt_new.matcher(key).lookingAt()){ newKeyValues.put(key, store.getString(key)); // Found new <context>_@_<parameter> } else { Matcher matcher = patt_indx.matcher(key); if (matcher.lookingAt()) { String newKey = matcher.group(1)+CONTEXT_SEPARATOR+matcher.group(2); if (!newKeyValues.containsKey(newKey)){ // Only if it is not yet set - not to overwrite the new value newKeyValues.put(newKey, store.getString(key)); // Found new <context>_@_<parameter> } } } store.setToDefault(key); } // Save converted/filtered values, if they are not empty (will not be able to overwrite non-empty default) for (String key :newKeyValues.keySet()){ store.putValue(key,newKeyValues.get(key)); } // now regenerate context string //Rebuild the list, getting rid of indexed entries contextList = new ArrayList<String>(); for (String key :newKeyValues.keySet()){ contextList.add(key); } final String contentKey = getContentKey(contextID); ValueBasedListOption option = new ValueBasedListOption(contentKey, contextID, contextList); option.setPreferenceStore(store); option.doStore(contextList); // store.setToDefault(getContentKey(contextID)); store.setToDefault(getVersionKey(contextID)); } public static void setStoreVersion( final String version , final String contextID , IPreferenceStore store) Loading @@ -190,6 +250,9 @@ class OptionsUtils { { boolean compatible; final String versionKey = getVersionKey(contextID); if (versionKey.endsWith("ocotb")){ System.out.println("isVersionCompatible(cocotb)"); } if (version == null) { compatible = ! store.contains(versionKey); } else if (store.contains(versionKey)) { Loading @@ -200,7 +263,8 @@ class OptionsUtils { return compatible; } private static List<String> getStoreContext( final String contextID public static List<String> getStoreContext( final String contextID // private static List<String> getStoreContext( final String contextID , IPreferenceStore store ) { List<String> context = new ArrayList<String>(); ValueBasedListOption option = new ValueBasedListOption(getContentKey(contextID), contextID, context); Loading
src/com/elphel/vdt/core/options/ValueBasedListOption.java +2 −2 Original line number Diff line number Diff line Loading @@ -94,7 +94,7 @@ public class ValueBasedListOption extends Option { /** * Load the default option value from persistent storage * * @return the sequnce of the list items separated by SEPARATOR. * @return the sequence of the list items separated by SEPARATOR. */ public String doLoadDefault() { List<String> list = doLoadDefaultList(); Loading @@ -110,7 +110,7 @@ public class ValueBasedListOption extends Option { /** * Save value to persistent storage * * @param value the sequnce of the list items separated by SEPARATOR. * @param value the sequence of the list items separated by SEPARATOR. */ public boolean doStore(String value) { List<String> list = OptionsUtils.convertStringToList(value); Loading
src/com/elphel/vdt/core/tools/config/xml/ParamNodeReader.java +11 −3 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.elphel.vdt.core.tools.contexts.Context; public class ParamNodeReader extends AbstractConditionNodeReader { private List<Parameter> paramList = new ArrayList<Parameter>(); private List<String> paramIdList = new ArrayList<String>(); public ParamNodeReader(XMLConfig config, Context context) { super(config, context); Loading @@ -46,7 +47,14 @@ public class ParamNodeReader extends AbstractConditionNodeReader { public void readNode(Node node, Condition condition) throws ConfigException { if(XMLConfig.isElemNode(node, XMLConfig.PARAMETER_TAG)) { try { paramList.add(readParam(node, condition)); Parameter param = readParam(node, condition); String id=param.getID(); if (paramIdList.contains(id)){ System.out.println("Warning: duplicate parameter ('" + id + "') in context '" + context + "' defined in "+param.getSourceXML()); // throw new ConfigException("Duplicate parameter ('" + id + "') in context '" + context + "' defined in "+param.getSourceXML()); } paramIdList.add(id); paramList.add(param); } catch(ConfigException e) { config.logError(e); } Loading