/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.datamanagement.browser.spi; import java.util.Comparator; import java.util.Map; import de.rcenvironment.core.component.datamanagement.history.HistoryMetaDataKeys; import de.rcenvironment.core.datamanagement.commons.MetaData; /** * Provides common methods for manipulating {@link DMBrowserNode}s. * * @author Robert Mischke * @author Jan Flink Made compare methods null safe * */ public abstract class DMBrowserNodeUtils { /** * A {@link Comparator} that sorts by ascending history timestamp. */ public static final Comparator<DMBrowserNode> COMPARATOR_BY_HISTORY_TIMESTAMP = new Comparator<DMBrowserNode>() { @Override public int compare(DMBrowserNode o1, DMBrowserNode o2) { boolean o1NullCheck = o1 == null || o1.getMetaData() == null; boolean o2NullCheck = o2 == null || o2.getMetaData() == null; if (o1NullCheck && o2NullCheck) { return 0; } if (o1NullCheck) { return Integer.MAX_VALUE; } if (o2NullCheck) { return Integer.MIN_VALUE; } String val1 = o1.getMetaData().getValue(METADATA_HISTORY_TIMESTAMP); String val2 = o2.getMetaData().getValue(METADATA_HISTORY_TIMESTAMP); long time1 = nullSafeLongValue(val1); long time2 = nullSafeLongValue(val2); return Long.compare(time1, time2); } private long nullSafeLongValue(String val1) { if (val1 == null) { return 0L; } return Long.parseLong(val1); } }; /** * A {@link Comparator} that sorts by descending history timestamp. */ public static final Comparator<DMBrowserNode> COMPARATOR_BY_HISTORY_TIMESTAMP_DESC = new Comparator<DMBrowserNode>() { @Override public int compare(DMBrowserNode o1, DMBrowserNode o2) { boolean o1NullCheck = o1 == null || o1.getMetaData() == null; boolean o2NullCheck = o2 == null || o2.getMetaData() == null; if (o1NullCheck && o2NullCheck) { return 0; } if (o1NullCheck) { return Integer.MAX_VALUE; } if (o2NullCheck) { return Integer.MIN_VALUE; } String val1 = o1.getMetaData().getValue(METADATA_HISTORY_TIMESTAMP); String val2 = o2.getMetaData().getValue(METADATA_HISTORY_TIMESTAMP); long time1 = nullSafeLongValue(val1); long time2 = nullSafeLongValue(val2); return Long.compare(time1, time2) * DESC; } private long nullSafeLongValue(String val1) { if (val1 == null) { return 0L; } return Long.parseLong(val1); } }; /** * A {@link Comparator} that sorts by associated filename. */ public static final Comparator<DMBrowserNode> COMPARATOR_BY_FILENAME = new Comparator<DMBrowserNode>() { @Override public int compare(DMBrowserNode o1, DMBrowserNode o2) { boolean o1NullCheck = o1 == null || o1.getAssociatedFilename() == null; boolean o2NullCheck = o2 == null || o2.getAssociatedFilename() == null; if (o1NullCheck && o2NullCheck) { return 0; } if (o1NullCheck) { return Integer.MIN_VALUE; } if (o2NullCheck) { return Integer.MAX_VALUE; } String val1 = o1.getAssociatedFilename().toLowerCase(); String val2 = o2.getAssociatedFilename().toLowerCase(); return val1.compareTo(val2); } }; /** * A {@link Comparator} that sorts by ascending node title. */ public static final Comparator<DMBrowserNode> COMPARATOR_BY_NODE_TITLE = new Comparator<DMBrowserNode>() { @Override public int compare(DMBrowserNode o1, DMBrowserNode o2) { boolean o1NullCheck = o1 == null || o1.getTitle() == null; boolean o2NullCheck = o2 == null || o2.getTitle() == null; if (o1NullCheck && o2NullCheck) { return 0; } if (o1NullCheck) { return Integer.MIN_VALUE; } if (o2NullCheck) { return Integer.MAX_VALUE; } String val1 = o1.getTitle().toLowerCase(); String val2 = o2.getTitle().toLowerCase(); return val1.compareTo(val2); } }; /** * A {@link Comparator} that sorts by descending node title. */ public static final Comparator<DMBrowserNode> COMPARATOR_BY_NODE_TITLE_DESC = new Comparator<DMBrowserNode>() { @Override public int compare(DMBrowserNode o1, DMBrowserNode o2) { boolean o1NullCheck = o1 == null || o1.getTitle() == null; boolean o2NullCheck = o2 == null || o2.getTitle() == null; if (o1NullCheck && o2NullCheck) { return 0; } if (o1NullCheck) { return Integer.MIN_VALUE; } if (o2NullCheck) { return Integer.MAX_VALUE; } String val1 = o1.getTitle().toLowerCase(); String val2 = o2.getTitle().toLowerCase(); return val1.compareTo(val2) * DESC; } }; private static final int DESC = -1; private static final MetaData METADATA_HISTORY_TIMESTAMP = new MetaData( HistoryMetaDataKeys.HISTORY_TIMESTAMP, true, true); private DMBrowserNodeUtils() {} /** * Creates a folder node containing file reference nodes for the files referenced by the * provided map. The file nodes are sorted by their associated filename. * * @param fileMap a map containing entries with the associated filename as the key and the data * reference id as value * @param folder the parent node to add the created nodes to */ public static void createDMFileResourceNodesFromMap(Map<String, String> fileMap, DMBrowserNode folder) { for (Map.Entry<String, String> entry : fileMap.entrySet()) { DMBrowserNode fileNode = DMBrowserNode.addNewLeafNode(entry.getKey(), DMBrowserNodeType.DMFileResource, folder); fileNode.setAssociatedFilename(entry.getKey()); fileNode.setDataReferenceId(entry.getValue()); } folder.sortChildren(DMBrowserNodeUtils.COMPARATOR_BY_FILENAME); } }