From 017f801f88db52a8739c0f6a21a3c0ca26161906 Mon Sep 17 00:00:00 2001 From: Mathieu Bastian Date: Tue, 14 May 2013 23:45:56 -0700 Subject: [PATCH] Add dynamic attribute support in ImportAPI --- .../gephi/io/importer/api/ColumnDraft.java | 2 + .../io/importer/api/ContainerLoader.java | 4 ++ .../gephi/io/importer/api/ElementDraft.java | 14 +++- .../io/importer/impl/ColumnDraftImpl.java | 9 ++- .../gephi/io/importer/impl/EdgeDraftImpl.java | 13 +--- .../io/importer/impl/ElementDraftImpl.java | 69 +++++++++++++++++++ .../io/importer/impl/ImportContainerImpl.java | 14 +++- .../gephi/io/importer/impl/NodeDraftImpl.java | 13 +--- .../importer/plugin/file/ImporterGraphML.java | 4 +- 9 files changed, 114 insertions(+), 28 deletions(-) diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ColumnDraft.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ColumnDraft.java index 3bac772ba..0b3f06580 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ColumnDraft.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ColumnDraft.java @@ -55,6 +55,8 @@ public interface ColumnDraft { public Object getDefaultValue(); + public boolean isDynamic(); + public void setTitle(String title); public void setDefaultValue(Object value); 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 7cb7a25d1..da8fe3240 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 @@ -174,6 +174,10 @@ public interface ContainerLoader { public ColumnDraft addEdgeColumn(String key, Class typeClass); + public ColumnDraft addNodeColumn(String key, Class typeClass, boolean dynamic); + + public ColumnDraft addEdgeColumn(String key, Class typeClass, boolean dynamic); + /** * Returns the factory for building nodes and edges instances. * diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementDraft.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementDraft.java index 37956bbb6..096e26d6a 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementDraft.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/api/ElementDraft.java @@ -65,7 +65,15 @@ public interface ElementDraft { public void setValue(String key, Object value); - public void setValueString(String key, String value); + public void setValue(String key, Object value, double timestamp); + + public void setValue(String key, Object value, String dateTime); + + public void parseAndSetValue(String key, String value); + + public void parseAndSetValue(String key, String value, double timestamp); + + public void parseAndSetValue(String key, String value, String dateTime); public void setLabel(String label); @@ -92,4 +100,8 @@ public interface ElementDraft { public void setLabelColor(int r, int g, int b); public void setLabelColor(String color); + + public void addTimestamp(double timestamp); + + public void addTimestamp(String dateTime); } diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ColumnDraftImpl.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ColumnDraftImpl.java index e8ae30e75..5de0254a4 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ColumnDraftImpl.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ColumnDraftImpl.java @@ -53,13 +53,15 @@ public class ColumnDraftImpl implements ColumnDraft { protected final int index; protected final String id; protected final Class typeClass; + protected final boolean dynamic; protected String title; protected Object defaultValue; - public ColumnDraftImpl(String id, int index, Class typeClass) { + public ColumnDraftImpl(String id, int index, boolean dynamic, Class typeClass) { this.id = id; this.index = index; this.typeClass = typeClass; + this.dynamic = dynamic; } @Override @@ -100,4 +102,9 @@ public class ColumnDraftImpl implements ColumnDraft { public void setDefaultValueString(String value) { this.defaultValue = AttributeUtils.parse(value, typeClass); } + + @Override + public boolean isDynamic() { + return true; + } } diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/EdgeDraftImpl.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/EdgeDraftImpl.java index bd30ad97c..879c80ef0 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/EdgeDraftImpl.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/EdgeDraftImpl.java @@ -41,7 +41,6 @@ */ package org.gephi.io.importer.impl; -import org.gephi.attribute.api.AttributeUtils; import org.gephi.io.importer.api.ColumnDraft; import org.gephi.io.importer.api.EdgeDirection; import org.gephi.io.importer.api.EdgeDraft; @@ -257,15 +256,7 @@ public class EdgeDraftImpl extends ElementDraftImpl implements EdgeDraft { } @Override - public void setValue(String key, Object value) { - ColumnDraft column = container.addEdgeColumn(key, value.getClass()); - setAttributeValue(((ColumnDraftImpl) column).getIndex(), value); - } - - @Override - public void setValueString(String key, String value) { - ColumnDraft column = container.addEdgeColumn(key, value.getClass()); - Object val = AttributeUtils.parse(value, column.getTypeClass()); - setAttributeValue(((ColumnDraftImpl) column).getIndex(), val); + ColumnDraft getColumn(String key, Class type) { + return container.addEdgeColumn(key, type); } } diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ElementDraftImpl.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ElementDraftImpl.java index cb4594e00..f816b8509 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ElementDraftImpl.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/ElementDraftImpl.java @@ -42,7 +42,10 @@ */ package org.gephi.io.importer.impl; +import it.unimi.dsi.fastutil.doubles.Double2ObjectMap; import java.awt.Color; +import org.gephi.attribute.api.AttributeUtils; +import org.gephi.io.importer.api.ColumnDraft; import org.gephi.io.importer.api.ElementDraft; /** @@ -63,13 +66,20 @@ public abstract class ElementDraftImpl implements ElementDraft { protected boolean labelVisible = true; //Attributes protected Object[] attributes; + //Timestamps + protected double[] timeStamps; + //Dynamic values + protected Double2ObjectMap[] dynamicAttributes; public ElementDraftImpl(ImportContainerImpl container, String id) { this.container = container; this.id = id; this.attributes = new Object[0]; + this.timeStamps = new double[0]; } + abstract ColumnDraft getColumn(String key, Class type); + @Override public String getId() { return id; @@ -171,6 +181,54 @@ public abstract class ElementDraftImpl implements ElementDraft { setLabelColor(Color.getColor(color)); } + @Override + public void setValue(String key, Object value) { + ColumnDraft column = getColumn(key, value.getClass()); + setAttributeValue(((ColumnDraftImpl) column).getIndex(), value); + } + + @Override + public void setValue(String key, Object value, String dateTime) { + setValue(key, value, AttributeUtils.parseDateTime(dateTime)); + } + + @Override + public void setValue(String key, Object value, double timestamp) { + ColumnDraft column = getColumn(key, value.getClass()); + setAttributeValue(((ColumnDraftImpl) column).getIndex(), value, timestamp); + } + + @Override + public void parseAndSetValue(String key, String value) { + ColumnDraft column = getColumn(key, value.getClass()); + Object val = AttributeUtils.parse(value, column.getTypeClass()); + setAttributeValue(((ColumnDraftImpl) column).getIndex(), val); + } + + @Override + public void parseAndSetValue(String key, String value, String dateTime) { + parseAndSetValue(key, value, AttributeUtils.parseDateTime(dateTime)); + } + + @Override + public void parseAndSetValue(String key, String value, double timestamp) { + ColumnDraft column = getColumn(key, value.getClass()); + Object val = AttributeUtils.parse(value, column.getTypeClass()); + setAttributeValue(((ColumnDraftImpl) column).getIndex(), val, timestamp); + } + + @Override + public void addTimestamp(String dateTime) { + addTimestamp(AttributeUtils.parseDateTime(dateTime)); + } + + @Override + public void addTimestamp(double timestamp) { + int index = timeStamps.length; + ensureTimestampArraySize(index); + timeStamps[index] = timestamp; + } + //UTILITY protected void setAttributeValue(int index, Object value) { if (index >= attributes.length) { @@ -181,10 +239,21 @@ public abstract class ElementDraftImpl implements ElementDraft { attributes[index] = value; } + protected void setAttributeValue(int index, Object value, double timestamp) { + } + protected Object getAttributeValue(int index) { if (index < attributes.length) { return attributes[index]; } return null; } + + protected void ensureTimestampArraySize(int index) { + if (index >= timeStamps.length) { + double[] newArray = new double[index + 1]; + System.arraycopy(timeStamps, 0, newArray, 0, timeStamps.length); + timeStamps = newArray; + } + } } 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 960d615d1..e851d1a94 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 @@ -423,10 +423,15 @@ public class ImportContainerImpl implements Container, ContainerLoader, Containe @Override public ColumnDraft addNodeColumn(String key, Class typeClass) { + return addNodeColumn(key, typeClass, false); + } + + @Override + public ColumnDraft addNodeColumn(String key, Class typeClass, boolean dynamic) { ColumnDraft column = nodeColumns.get(key); if (column == null) { int index = nodeColumns.size(); - column = new ColumnDraftImpl(key, index, typeClass); + column = new ColumnDraftImpl(key, index, dynamic, typeClass); nodeColumns.put(key, column); } else { if (!column.getTypeClass().equals(typeClass)) { @@ -438,10 +443,15 @@ public class ImportContainerImpl implements Container, ContainerLoader, Containe @Override public ColumnDraft addEdgeColumn(String key, Class typeClass) { + return addEdgeColumn(key, typeClass, false); + } + + @Override + public ColumnDraft addEdgeColumn(String key, Class typeClass, boolean dynamic) { ColumnDraft column = edgeColumns.get(key); if (column == null) { int index = edgeColumns.size(); - column = new ColumnDraftImpl(key, index, typeClass); + column = new ColumnDraftImpl(key, index, dynamic, typeClass); edgeColumns.put(key, column); } else { if (!column.getTypeClass().equals(typeClass)) { diff --git a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/NodeDraftImpl.java b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/NodeDraftImpl.java index b9d14f0f1..dbe07f623 100644 --- a/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/NodeDraftImpl.java +++ b/modules/ImportAPI/src/main/java/org/gephi/io/importer/impl/NodeDraftImpl.java @@ -41,7 +41,6 @@ */ package org.gephi.io.importer.impl; -import org.gephi.attribute.api.AttributeUtils; import org.gephi.io.importer.api.ColumnDraft; import org.gephi.io.importer.api.NodeDraft; @@ -258,15 +257,7 @@ public class NodeDraftImpl extends ElementDraftImpl implements NodeDraft { } @Override - public void setValue(String key, Object value) { - ColumnDraft column = container.addNodeColumn(key, value.getClass()); - setAttributeValue(((ColumnDraftImpl) column).getIndex(), value); - } - - @Override - public void setValueString(String key, String value) { - ColumnDraft column = container.addNodeColumn(key, value.getClass()); - Object val = AttributeUtils.parse(value, column.getTypeClass()); - setAttributeValue(((ColumnDraftImpl) column).getIndex(), val); + ColumnDraft getColumn(String key, Class type) { + return container.addNodeColumn(key, type); } } diff --git a/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterGraphML.java b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterGraphML.java index 45d9b249b..64937111d 100644 --- a/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterGraphML.java +++ b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterGraphML.java @@ -348,7 +348,7 @@ public class ImporterGraphML implements FileImporter, LongTask { ColumnDraft column = container.getNodeColumn(fore); if (column != null) { try { - node.setValueString(column.getId(), value); + node.parseAndSetValue(column.getId(), value); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGraphML.class, "importerGraphML_error_datavalue", fore, node, column.getTitle()), Issue.Level.SEVERE)); } @@ -500,7 +500,7 @@ public class ImporterGraphML implements FileImporter, LongTask { ColumnDraft column = container.getEdgeColumn(fore); if (column != null) { try { - edge.setValueString(column.getId(), value); + edge.parseAndSetValue(column.getId(), value); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGraphML.class, "importerGraphML_error_datavalue", fore, edge, column.getTitle()), Issue.Level.SEVERE)); } -- GitLab