From bb69d8dd04fb7ee3da07d7b2c6f580af6fc5b978 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sat, 9 Feb 2019 18:55:34 +0100 Subject: [PATCH] upgrade variants to new format on start fix for variant export --- .../org/diylc/common/IVariantProcessor.java | 5 +- .../src/org/diylc/presenter/Presenter.java | 44 +++++ diylc/diylc-swing/lib/swing-framework.jar | Bin 156973 -> 157095 bytes .../src/org/diylc/swing/ActionFactory.java | 167 ++++++++++-------- 4 files changed, 143 insertions(+), 73 deletions(-) diff --git a/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java b/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java index b481b849..21aa4a4c 100644 --- a/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java +++ b/diylc/diylc-core/src/org/diylc/common/IVariantProcessor.java @@ -21,11 +21,10 @@ */ package org.diylc.common; -import java.io.FileNotFoundException; import java.io.IOException; -import java.util.List; +import java.util.List; -import org.diylc.core.Template; +import org.diylc.core.Template; public interface IVariantProcessor { diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index ccc145c5..036332c1 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -191,6 +191,7 @@ public class Presenter implements IPlugInPort { // lockedLayers = EnumSet.noneOf(ComponentLayer.class); // visibleLayers = EnumSet.allOf(ComponentLayer.class); + upgradeVariants(); } public void installPlugin(IPlugIn plugIn) { @@ -2633,4 +2634,47 @@ public class Presenter implements IPlugInPort { return pkg.getBlocks().size(); } + + private static boolean upgradedVariants = false; + + @SuppressWarnings("unchecked") + private synchronized void upgradeVariants() { + if (upgradedVariants) + return; + + upgradedVariants = true; + + LOG.info("Checking if variants need to be updated"); + Map> lookupMap = new TreeMap>(String.CASE_INSENSITIVE_ORDER); + Map> variantMap = + (Map>) ConfigurationManager.getInstance().readObject(TEMPLATES_KEY, null); + + if (variantMap == null) + return; + + Map typeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); + + Map> componentTypes = getComponentTypes(); + for (Map.Entry> entry : componentTypes.entrySet()) + for (ComponentType type : entry.getValue()) { + typeMap.put(type.getInstanceClass().getCanonicalName(), type); + typeMap.put(type.getCategory() + "." + type.getName(), type); + if (type.getCategory().contains("Electro-Mechanical")) + typeMap.put(type.getCategory().replace("Electro-Mechanical", "Electromechanical") + "." + type.getName(), type); + } + + Map> newVariantMap = new HashMap>(); + + lookupMap.putAll(variantMap); + + for (Map.Entry> entry : variantMap.entrySet()) { + if (typeMap.containsKey(entry.getKey())) { + newVariantMap.put(typeMap.get(entry.getKey()).getInstanceClass().getCanonicalName(), entry.getValue()); // great, nothing to upgrade + } else { + LOG.warn("Could not upgrade variants for: " + entry.getKey()); + } + } + + ConfigurationManager.getInstance().writeValue(TEMPLATES_KEY, newVariantMap); + } } diff --git a/diylc/diylc-swing/lib/swing-framework.jar b/diylc/diylc-swing/lib/swing-framework.jar index e3c7b6a5d0524e8cc81ba4c61f59a7861cd5fc70..6cf5eef18e83471f420afe7bbd9b2f07843d87c0 100644 GIT binary patch delta 6673 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 M)G4+GC=tg00X`z>mjD0& delta 6778 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 diff --git a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 4495b622..ad034d44 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -36,6 +36,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import javax.swing.AbstractAction; import javax.swing.JOptionPane; @@ -697,7 +698,7 @@ public class ActionFactory { private ISwingUI swingUI; private IPlugInPort plugInPort; - private Map typeMap = new HashMap(); + private Map typeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); public ExportVariantsAction(ISwingUI swingUI, IPlugInPort plugInPort) { super(); @@ -707,52 +708,69 @@ public class ActionFactory { Map> componentTypes = plugInPort.getComponentTypes(); for (Map.Entry> entry : componentTypes.entrySet()) - for (ComponentType type : entry.getValue()) + for (ComponentType type : entry.getValue()) { typeMap.put(type.getInstanceClass().getCanonicalName(), type); + } } @SuppressWarnings("unchecked") @Override public void actionPerformed(ActionEvent e) { LOG.info("ExportVariantsAction triggered"); - Map> variantMap = - (Map>) ConfigurationManager.getInstance().readObject(IPlugInPort.TEMPLATES_KEY, null); - if (variantMap == null || variantMap.isEmpty()) { - swingUI.showMessage("No variants found to export.", "Error", IView.ERROR_MESSAGE); + + Map> selectedVariants; + + try { + Map> variantMap = + (Map>) ConfigurationManager.getInstance().readObject(IPlugInPort.TEMPLATES_KEY, null); + if (variantMap == null || variantMap.isEmpty()) { + swingUI.showMessage("No variants found to export.", "Error", IView.ERROR_MESSAGE); + return; + } + + List types = new ArrayList(); + for (String className : variantMap.keySet()) { + ComponentType type = typeMap.get(className); + if (type != null) + types.add(type); + else + LOG.warn("Could not find type for: " + className); + } + + Collections.sort(types, new Comparator() { + + @Override + public int compare(ComponentType o1, ComponentType o2) { + return o1.toString().compareToIgnoreCase(o2.toString()); + }}); + + CheckBoxListDialog dialog = new CheckBoxListDialog(swingUI.getOwnerFrame(), "Export Variants", types.toArray()); + + dialog.setVisible(true); + + if (dialog.getSelectedButtonCaption() != "OK") + return; + + Object[] selected = dialog.getSelectedOptions(); + + if (selected.length == 0) { + swingUI.showMessage("No variants selected for export.", "Error", IView.ERROR_MESSAGE); + return; + } + + selectedVariants = new HashMap>(); + for (Object key : selected) { + ComponentType type = (ComponentType) key; + String clazz = type.getInstanceClass().getCanonicalName(); + List