From 048ae20ef53bcdf2a4a5babc13577aaa55ec62d3 Mon Sep 17 00:00:00 2001 From: Eduardo Ramos Date: Tue, 24 Nov 2015 22:38:01 +0100 Subject: [PATCH] Add ability to configure element id type in ImportAPI --- .../datalab/DataTableTopComponent.java | 4 +- .../tables/AbstractElementsDataTable.java | 28 ++++++-- .../io/importer/api/ContainerLoader.java | 7 ++ .../io/importer/api/ContainerUnloader.java | 2 + .../gephi/io/importer/api/ElementIdType.java | 64 +++++++++++++++++++ .../io/importer/impl/ImportContainerImpl.java | 37 +++++++++++ .../gephi/io/importer/impl/Bundle.properties | 2 + .../io/processor/plugin/DefaultProcessor.java | 30 +++++++-- modules/UILibraryWrapper/pom.xml | 8 +-- 9 files changed, 165 insertions(+), 17 deletions(-) create mode 100644 modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementIdType.java diff --git a/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/DataTableTopComponent.java b/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/DataTableTopComponent.java index cc4ca0658..987b86dce 100644 --- a/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/DataTableTopComponent.java +++ b/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/DataTableTopComponent.java @@ -499,13 +499,13 @@ public class DataTableTopComponent extends TopComponent implements AWTEventListe return; } if (isShowingNodesTable()) { - if (nodeTable.setPattern(filterTextField.getText(), index)) { + if (nodeTable.setFilterPattern(filterTextField.getText(), index)) { filterTextField.setBackground(Color.WHITE); } else { filterTextField.setBackground(invalidFilterColor); } } else if (isShowingEdgesTable()) { - if (edgeTable.setPattern(filterTextField.getText(), index)) { + if (edgeTable.setFilterPattern(filterTextField.getText(), index)) { filterTextField.setBackground(Color.WHITE); } else { filterTextField.setBackground(invalidFilterColor); diff --git a/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/tables/AbstractElementsDataTable.java b/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/tables/AbstractElementsDataTable.java index 41185543d..54bbff238 100644 --- a/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/tables/AbstractElementsDataTable.java +++ b/modules/DesktopDataLaboratory/src/main/java/org/gephi/desktop/datalab/tables/AbstractElementsDataTable.java @@ -49,6 +49,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.regex.PatternSyntaxException; import javax.swing.RowFilter; import javax.swing.table.TableCellRenderer; @@ -81,7 +82,7 @@ import org.openide.util.Lookup; public abstract class AbstractElementsDataTable { protected final JXTable table; - protected RowFilter rowFilter; + protected String filterPattern; protected List selectedElements; protected final AttributeColumnsController attributeColumnsController; protected boolean refreshingTable = false; @@ -102,7 +103,6 @@ public abstract class AbstractElementsDataTable { table.setColumnControlVisible(false); table.setSortable(true); table.setAutoCreateRowSorter(true); - table.setRowFilter(rowFilter); sparkLinesRenderers = new ArrayList(); intervalSetRenderer = new IntervalSetRenderer(); intervalMapRenderer = new IntervalMapRenderer(); @@ -165,18 +165,32 @@ public abstract class AbstractElementsDataTable { return table; } - public boolean setPattern(String regularExpr, int column) { + public boolean setFilterPattern(String regularExpr, int column) { try { - if (!regularExpr.startsWith("(?i)")) { //CASE_INSENSITIVE - regularExpr = "(?i)" + regularExpr; + if(Objects.equals(filterPattern, regularExpr)){ + return true; + } + filterPattern = regularExpr; + + if(regularExpr == null || regularExpr.trim().isEmpty()){ + table.setRowFilter(null); + }else{ + if (!regularExpr.startsWith("(?i)")) { //CASE_INSENSITIVE + regularExpr = "(?i)" + regularExpr; + } + RowFilter rowFilter = RowFilter.regexFilter(regularExpr, column); + table.setRowFilter(rowFilter); } - rowFilter = RowFilter.regexFilter(regularExpr, column); - table.setRowFilter(rowFilter); } catch (PatternSyntaxException e) { return false; } + return true; } + + public String getPattern(){ + return filterPattern; + } public void refreshModel(T[] elements, Column[] cols, GraphModel graphModel, DataTablesModel dataTablesModel) { showingColumns = cols; diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerLoader.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerLoader.java index ec4930699..3ab14baa8 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerLoader.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerLoader.java @@ -231,6 +231,13 @@ public interface ContainerLoader { public void setTimeFormat(TimeFormat timeFormat); /** + /** + * Sets the type of the id for elements. + * + * @param type id type + */ + public void setElementIdType(ElementIdType type); + * Sets the current time representation, either TIMESTAMP or * INTERVAL. *

diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerUnloader.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerUnloader.java index 088791040..62a2b5446 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerUnloader.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ContainerUnloader.java @@ -88,6 +88,8 @@ public interface ContainerUnloader { public Class getEdgeTypeLabelClass(); + public ElementIdType getElementIdType(); + //PARAMETERS GETTERS public boolean allowSelfLoop(); diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementIdType.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementIdType.java new file mode 100644 index 000000000..c8f93b9c2 --- /dev/null +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementIdType.java @@ -0,0 +1,64 @@ +/* + Copyright 2008-2010 Gephi + Authors : Mathieu Bastian + Website : http://www.gephi.org + + This file is part of Gephi. + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2011 Gephi Consortium. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 3 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://gephi.org/about/legal/license-notice/ + or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License files at + /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 3, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 3] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 3 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 3 code and therefore, elected the GPL + Version 3 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + + Contributor(s): + + Portions Copyrighted 2011 Gephi Consortium. + */ +package org.gephi.io.importer.api; + +/** + * Element id type. + * + * @author Mathieu Bastian + */ +public enum ElementIdType { + + STRING(String.class), + INTEGER(Integer.class), + LONG(Long.class); + + private final Class cls; + + ElementIdType(Class cls) { + this.cls = cls; + } + + public Class getTypeClass() { + return cls; + } +} diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ImportContainerImpl.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ImportContainerImpl.java index 836cc76ce..16a4841aa 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ImportContainerImpl.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ImportContainerImpl.java @@ -68,6 +68,7 @@ import org.gephi.io.importer.api.EdgeDirectionDefault; import org.gephi.io.importer.api.EdgeDraft; import org.gephi.io.importer.api.EdgeWeightMergeStrategy; import org.gephi.io.importer.api.ElementDraft; +import org.gephi.io.importer.api.ElementIdType; import org.gephi.io.importer.api.Issue; import org.gephi.io.importer.api.Issue.Level; import org.gephi.io.importer.api.NodeDraft; @@ -99,6 +100,8 @@ public class ImportContainerImpl implements Container, ContainerLoader, Containe private EdgeDirectionDefault edgeDefault = EdgeDirectionDefault.MIXED; private final Object2ObjectMap nodeColumns; private final Object2ObjectMap edgeColumns; + //Config + private ElementIdType elementIdType = ElementIdType.STRING; //Management private boolean dynamicGraph = false; private boolean dynamicAttributes = false; @@ -525,6 +528,17 @@ public class ImportContainerImpl implements Container, ContainerLoader, Containe } @Override + + @Override + public void setElementIdType(ElementIdType type) { + this.elementIdType = type; + report.log(NbBundle.getMessage(ImportContainerImpl.class, "ImportContainerLog.ElementIdType", elementIdType.toString())); + } + + @Override + public ElementIdType getElementIdType() { + return elementIdType; + } public boolean verify() { //Edge weight zero or negative for (EdgeDraftImpl edge : new NullFilterIterable(edgeList)) { @@ -546,6 +560,29 @@ public class ImportContainerImpl implements Container, ContainerLoader, Containe setEdgeDefault(EdgeDirectionDefault.MIXED); } + //IdType + if (elementIdType.equals(ElementIdType.INTEGER) || elementIdType.equals(ElementIdType.LONG)) { + try { + for (NodeDraftImpl node : nodeList) { + if (elementIdType.equals(ElementIdType.INTEGER)) { + Integer.parseInt(node.getId()); + } else if (elementIdType.equals(ElementIdType.LONG)) { + Long.parseLong(node.getId()); + } + } + for (EdgeDraftImpl edge : edgeList) { + if (elementIdType.equals(ElementIdType.INTEGER)) { + Integer.parseInt(edge.getId()); + } else if (elementIdType.equals(ElementIdType.LONG)) { + Long.parseLong(edge.getId()); + } + } + } catch (NumberFormatException e) { + report.logIssue(new Issue(NbBundle.getMessage(ImportContainerImpl.class, "ImportContainerException_ElementIdType_Parse_Error", elementIdType), Level.WARNING)); + elementIdType = ElementIdType.STRING; + } + } + //Is dynamic graph for (NodeDraftImpl node : nodeList) { if (node != null) { diff --git a/modules/ImportAPI/src/main/resources/org/gephi/io/importer/impl/Bundle.properties b/modules/ImportAPI/src/main/resources/org/gephi/io/importer/impl/Bundle.properties index 4063b7b56..86be00481 100644 --- a/modules/ImportAPI/src/main/resources/org/gephi/io/importer/impl/Bundle.properties +++ b/modules/ImportAPI/src/main/resources/org/gephi/io/importer/impl/Bundle.properties @@ -8,6 +8,7 @@ ImportContainerLog.AddDynamicEdgeColumn = Edge column ''{0}'' (Dynamic {1}) ImportContainerLog.EdgeLabelType = Edge labels are of type ''{0}'' ImportContainerLog.TimeZone = Time zone is set at ''{0}'' ImportContainerLog.MultiGraphCount = Multi-graph with {0} different types +ImportContainerLog.ElementIdType = Element id type set at ''{0}'' ImportContainerException_nodeExist = Duplicated node id=''{0}'' ImportContainerException_UnknowNodeId = Unknown Node id=''{0}'' @@ -24,6 +25,7 @@ ImportContainerException_Unsupported_Edge_type = Edge types can only have a prim ImportContainerException_Unsupported_Edge_type_Conflict = Edge label type is of type {0} but should be {1}, the label is ignored ImportContainerException_Set_EdgeDefault = Default edge type set as ''{0}'' ImportContainerException_Weight_Zero_Ignored = Edge weight is 0, the edge id=''{0}'' is ignored +ImportContainerException_ElementIdType_Parse_Error = The id type is configured to ''{0}'' but some elements id can't be parsed, defaulting to 'STRING' ImportContainerException_Negative_Weight = Edge id=''{0}'' has a negative weight ImportContainerException_Column_Type_Mismatch = A column ''{0}'' already exists but with a different type=''{1}'' diff --git a/modules/ProcessorPlugin/src/main/java/org/gephi/io/processor/plugin/DefaultProcessor.java b/modules/ProcessorPlugin/src/main/java/org/gephi/io/processor/plugin/DefaultProcessor.java index 89420607b..4eebebf24 100644 --- a/modules/ProcessorPlugin/src/main/java/org/gephi/io/processor/plugin/DefaultProcessor.java +++ b/modules/ProcessorPlugin/src/main/java/org/gephi/io/processor/plugin/DefaultProcessor.java @@ -52,6 +52,7 @@ import org.gephi.graph.api.Node; import org.gephi.io.importer.api.ContainerUnloader; import org.gephi.io.importer.api.EdgeDirection; import org.gephi.io.importer.api.EdgeDraft; +import org.gephi.io.importer.api.ElementIdType; import org.gephi.io.importer.api.NodeDraft; import org.gephi.io.processor.spi.Processor; import org.gephi.project.api.ProjectController; @@ -111,6 +112,8 @@ public class DefaultProcessor extends AbstractProcessor implements Processor { if (container.getEdgeTypeLabelClass() != null) { // configuration.setEdgeLabelType(container.getEdgeTypeLabelClass()); } + configuration.setNodeIdType(container.getElementIdType().getTypeClass()); + configuration.setEdgeIdType(container.getElementIdType().getTypeClass()); graphController.getGraphModel(workspace).setConfiguration(configuration); } @@ -137,8 +140,10 @@ public class DefaultProcessor extends AbstractProcessor implements Processor { int addedNodes = 0, addedEdges = 0; //Create all nodes + ElementIdType elementIdType = container.getElementIdType(); for (NodeDraft draftNode : container.getNodes()) { - String id = draftNode.getId(); + String idString = draftNode.getId(); + Object id = toElementId(elementIdType, idString); Node node = graph.getNode(id); if (node == null) { node = factory.newNode(id); @@ -153,11 +158,12 @@ public class DefaultProcessor extends AbstractProcessor implements Processor { //Create all edges and push to data structure for (EdgeDraft draftEdge : container.getEdges()) { - String id = draftEdge.getId(); + String idString = draftEdge.getId(); + Object id = toElementId(elementIdType, idString); String sourceId = draftEdge.getSource().getId(); String targetId = draftEdge.getTarget().getId(); - Node source = graph.getNode(sourceId); - Node target = graph.getNode(targetId); + Node source = graph.getNode(toElementId(elementIdType, sourceId)); + Node target = graph.getNode(toElementId(elementIdType, targetId)); Object type = draftEdge.getType(); int edgeType = graphModel.addEdgeType(type); @@ -197,4 +203,20 @@ public class DefaultProcessor extends AbstractProcessor implements Processor { Progress.finish(progressTicket); } + + private Object toElementId(ElementIdType elementIdType, String idString) { + Object id; + switch (elementIdType) { + case INTEGER: + id = Integer.parseInt(idString); + break; + case LONG: + id = Long.parseLong(idString); + break; + default: + id = idString; + break; + } + return id; + } } diff --git a/modules/UILibraryWrapper/pom.xml b/modules/UILibraryWrapper/pom.xml index 8df0567a6..d2b3c3364 100644 --- a/modules/UILibraryWrapper/pom.xml +++ b/modules/UILibraryWrapper/pom.xml @@ -40,9 +40,9 @@ - org.swinglabs - swingx - 1.6.1 + org.swinglabs.swingx + swingx-all + 1.6.5-1 org.jdesktop @@ -62,7 +62,7 @@ com.miglayout miglayout - 3.7.1 + 3.7.4 net.java.dev -- GitLab