package com.marginallyclever.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; import com.marginallyclever.makelangelo.Log; /** * @author Peter Colapietro * @since v7.1.4 */ final class MarginallyCleverPreferencesHelper { /** * */ private static final String PURGE_FLAG = "-p"; /** * */ private static final String SAVE_FILE_FLAG = "-f"; /** * @param args command line arguments. */ @SuppressWarnings("deprecation") public static void main(String[] args) throws BackingStoreException { final Preferences machinesPreferenceNode = PreferencesHelper.getPreferenceNode(PreferencesHelper.MakelangeloPreferenceKey.MACHINES); Log.message("node name: "+ machinesPreferenceNode.name()); final boolean wereThereCommandLineArguments = args.length > 0; if (wereThereCommandLineArguments) { final boolean wasSaveFileFlagFound = wasSearchKeyFoundInArray(SAVE_FILE_FLAG, args); if (wasSaveFileFlagFound) { final File preferencesFile = MarginallyCleverPreferencesFileFactory.getXmlPreferencesFile(); try (final OutputStream fileOutputStream = new FileOutputStream(preferencesFile)) { PreferencesHelper.getPreferenceNode(PreferencesHelper.MakelangeloPreferenceKey.LEGACY_MAKELANGELO_ROOT).exportSubtree(fileOutputStream); } catch (IOException e) { Log.error(e.getMessage()); } } final boolean wasPurgeFlagFound = wasSearchKeyFoundInArray(PURGE_FLAG, args); if (wasPurgeFlagFound) { final String[] childrenPreferenceNodeNames = machinesPreferenceNode.childrenNames(); purgeMachineNamesThatAreLessThanZero(machinesPreferenceNode, childrenPreferenceNodeNames); } } } /** * @param searchKey * @param stringArray * @return */ private static boolean wasSearchKeyFoundInArray(String searchKey, String[] stringArray) { final int searchResult = Arrays.binarySearch(stringArray, searchKey); return searchResult >= 0; } /** * @param machinesPreferenceNode * @param childrenPreferenceNodeNames * @throws BackingStoreException */ private static void purgeMachineNamesThatAreLessThanZero(Preferences machinesPreferenceNode, String[] childrenPreferenceNodeNames) throws BackingStoreException { final Set<String> lessThanZeroNames = getMachineNamesThatAreLessThanZero(childrenPreferenceNodeNames); for (String name : lessThanZeroNames) { machinesPreferenceNode.node(name).removeNode(); } } /** * @param childrenPreferenceNodeNames * @return */ private static Set<String> getMachineNamesThatAreLessThanZero(String[] childrenPreferenceNodeNames) { final Set<String> lessThanZeroNames = new HashSet<>(); for (String childNodeName : childrenPreferenceNodeNames) { Log.message("child node name: "+ childNodeName); Long parsedMachineName = null; try { parsedMachineName = Long.parseLong(childNodeName); } catch (NumberFormatException e) { Log.error(e.getMessage()); } boolean isMachineNameAnInteger = false; if (parsedMachineName != null) { isMachineNameAnInteger = true; } if (isMachineNameAnInteger) { //Machine configurations numbered -1 and below should not exist. final boolean isMachineNameLessThanZero = parsedMachineName < 0; if (isMachineNameLessThanZero) { lessThanZeroNames.add(parsedMachineName.toString()); } } } return lessThanZeroNames; } private MarginallyCleverPreferencesHelper() throws IllegalStateException { throw new IllegalStateException(); } }