/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.io.importer.plugin.file; import java.awt.Color; import java.io.Reader; import javax.xml.stream.Location; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLReporter; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.events.XMLEvent; import org.gephi.data.attributes.api.AttributeColumn; import org.gephi.data.attributes.api.AttributeOrigin; import org.gephi.data.attributes.api.AttributeType; import org.gephi.data.properties.PropertiesColumn; import org.gephi.dynamic.api.DynamicModel.TimeFormat; import org.gephi.io.importer.api.ContainerLoader; import org.gephi.io.importer.api.EdgeDefault; import org.gephi.io.importer.api.EdgeDraft; import org.gephi.io.importer.api.Issue; import org.gephi.io.importer.api.NodeDraft; import org.gephi.io.importer.api.Report; import org.gephi.io.importer.spi.FileImporter; import org.gephi.utils.longtask.spi.LongTask; import org.gephi.utils.progress.Progress; import org.gephi.utils.progress.ProgressTicket; import org.openide.util.NbBundle; /** * * @author Mathieu Bastian */ public class ImporterGEXF implements FileImporter, LongTask { //GEXF private static final String GEXF = "gexf"; private static final String GEXF_VERSION = "version"; private static final String GRAPH = "graph"; private static final String GRAPH_DEFAULT_EDGETYPE = "defaultedgetype"; private static final String GRAPH_TIMEFORMAT = "timeformat"; private static final String GRAPH_TIMEFORMAT2 = "timetype"; private static final String START = "start"; private static final String END = "end"; private static final String START_OPEN = "startopen"; private static final String END_OPEN = "endopen"; private static final String NODE = "node"; private static final String NODE_ID = "id"; private static final String NODE_LABEL = "label"; private static final String NODE_PID = "pid"; private static final String NODE_POSITION = "position"; private static final String NODE_COLOR = "color"; private static final String NODE_SIZE = "size"; private static final String NODE_SLICE = "slice"; private static final String EDGE = "edge"; private static final String EDGE_ID = "id"; private static final String EDGE_SOURCE = "source"; private static final String EDGE_TARGET = "target"; private static final String EDGE_LABEL = "label"; private static final String EDGE_TYPE = "type"; private static final String EDGE_WEIGHT = "weight"; private static final String EDGE_COLOR = "color"; private static final String EDGE_SLICE = "slice"; private static final String ATTRIBUTE = "attribute"; private static final String ATTRIBUTE_ID = "id"; private static final String ATTRIBUTE_TITLE = "title"; private static final String ATTRIBUTE_TYPE = "type"; private static final String ATTRIBUTE_DEFAULT = "default"; private static final String ATTRIBUTES = "attributes"; private static final String ATTRIBUTES_CLASS = "class"; private static final String ATTRIBUTES_TYPE = "type"; private static final String ATTRIBUTES_TYPE2 = "mode"; private static final String ATTVALUE = "attvalue"; private static final String ATTVALUE_FOR = "for"; private static final String ATTVALUE_FOR2 = "id"; private static final String ATTVALUE_VALUE = "value"; private static final String ATTVALUE_START = "start"; private static final String ATTVALUE_END = "end"; //Architecture private Reader reader; private ContainerLoader container; private boolean cancel; private Report report; private ProgressTicket progress; private XMLStreamReader xmlReader; public boolean execute(ContainerLoader container) { this.container = container; this.report = new Report(); Progress.start(progress); try { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); if (inputFactory.isPropertySupported("javax.xml.stream.isValidating")) { inputFactory.setProperty("javax.xml.stream.isValidating", Boolean.FALSE); } inputFactory.setXMLReporter(new XMLReporter() { @Override public void report(String message, String errorType, Object relatedInformation, Location location) throws XMLStreamException { System.out.println("Error:" + errorType + ", message : " + message); } }); xmlReader = inputFactory.createXMLStreamReader(reader); while (xmlReader.hasNext()) { Integer eventType = xmlReader.next(); if (eventType.equals(XMLEvent.START_ELEMENT)) { String name = xmlReader.getLocalName(); if (GEXF.equalsIgnoreCase(name)) { readGexf(xmlReader); } else if (GRAPH.equalsIgnoreCase(name)) { readGraph(xmlReader); } else if (NODE.equalsIgnoreCase(name)) { readNode(xmlReader, null); } else if (EDGE.equalsIgnoreCase(name)) { readEdge(xmlReader); } else if (ATTRIBUTES.equalsIgnoreCase(name)) { readAttributes(xmlReader); } } else if (eventType.equals(XMLStreamReader.END_ELEMENT)) { String name = xmlReader.getLocalName(); if (NODE.equalsIgnoreCase(name)) { } } } xmlReader.close(); } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } throw new RuntimeException(e); } Progress.finish(progress); return !cancel; } private void readGexf(XMLStreamReader reader) throws Exception { String version = ""; //Attributes for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (GEXF_VERSION.equalsIgnoreCase(attName)) { version = reader.getAttributeValue(i); } } if (!version.isEmpty() && version.equals("1.0")) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_version10"), Issue.Level.INFO)); } else { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_version11"), Issue.Level.INFO)); } } private void readGraph(XMLStreamReader reader) throws Exception { String defaultEdgeType = ""; String start = ""; String end = ""; String timeFormat = ""; //Attributes for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (GRAPH_DEFAULT_EDGETYPE.equalsIgnoreCase(attName)) { defaultEdgeType = reader.getAttributeValue(i); } else if (START.equalsIgnoreCase(attName)) { start = reader.getAttributeValue(i); } else if (END.equalsIgnoreCase(attName)) { end = reader.getAttributeValue(i); } else if (GRAPH_TIMEFORMAT.equalsIgnoreCase(attName) || GRAPH_TIMEFORMAT2.equalsIgnoreCase(attName)) { timeFormat = reader.getAttributeValue(i); } } //Edge Type if (!defaultEdgeType.isEmpty()) { if (defaultEdgeType.equalsIgnoreCase("undirected")) { container.setEdgeDefault(EdgeDefault.UNDIRECTED); } else if (defaultEdgeType.equalsIgnoreCase("directed")) { container.setEdgeDefault(EdgeDefault.DIRECTED); } else if (defaultEdgeType.equalsIgnoreCase("mutual")) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edgedouble"), Issue.Level.WARNING)); } else { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_defaultedgetype", defaultEdgeType), Issue.Level.SEVERE)); } } //TimeFormat if (!timeFormat.isEmpty()) { if ("double".equalsIgnoreCase(timeFormat) || "float".equalsIgnoreCase(timeFormat)) { container.setTimeFormat(TimeFormat.DOUBLE); } else if ("date".equalsIgnoreCase(timeFormat)) { container.setTimeFormat(TimeFormat.DATE); } } //Start & End if (!start.isEmpty()) { container.setTimeIntervalMin(start); } if (!end.isEmpty()) { container.setTimeIntervalMax(end); } } private void readNode(XMLStreamReader reader, NodeDraft parent) throws Exception { String id = ""; String label = ""; String startDate = ""; String endDate = ""; String pid = ""; boolean startOpen = false; boolean endOpen = false; //Attributes for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (NODE_ID.equalsIgnoreCase(attName)) { id = reader.getAttributeValue(i); } else if (NODE_LABEL.equalsIgnoreCase(attName)) { label = reader.getAttributeValue(i); } else if (START.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); } else if (START_OPEN.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); startOpen = true; } else if (END.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); } else if (END_OPEN.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); endOpen = true; } else if (NODE_PID.equalsIgnoreCase(attName)) { pid = reader.getAttributeValue(i); } } if (id.isEmpty()) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodeid"), Issue.Level.SEVERE)); return; } NodeDraft node = null; if (container.nodeExists(id)) { node = container.getNode(id); } else { node = container.factory().newNodeDraft(); } node.setId(id); node.setLabel(label); //Parent if (parent != null) { node.setParent(parent); } else if (!pid.isEmpty()) { NodeDraft parentNode = container.getNode(pid); if (parentNode == null) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_pid_notfound", pid, id), Issue.Level.SEVERE)); } else { node.setParent(parentNode); } } if (!container.nodeExists(id)) { container.addNode(node); } boolean end = false; boolean slices = false; while (reader.hasNext() && !end) { int type = reader.next(); switch (type) { case XMLStreamReader.START_ELEMENT: String name = xmlReader.getLocalName(); if (ATTVALUE.equalsIgnoreCase(xmlReader.getLocalName())) { readNodeAttValue(reader, node); } else if (NODE_POSITION.equalsIgnoreCase(name)) { readNodePosition(reader, node); } else if (NODE_COLOR.equalsIgnoreCase(name)) { readNodeColor(reader, node); } else if (NODE_SIZE.equalsIgnoreCase(name)) { readNodeSize(reader, node); } else if (NODE_SLICE.equalsIgnoreCase(name)) { readNodeSlice(reader, node); slices = true; } else if (NODE.equalsIgnoreCase(name)) { readNode(reader, node); } break; case XMLStreamReader.END_ELEMENT: if (NODE.equalsIgnoreCase(xmlReader.getLocalName())) { end = true; } break; } } //Dynamic if (!slices && (!startDate.isEmpty() || !endDate.isEmpty())) { try { node.addTimeInterval(startDate, endDate, startOpen, endOpen); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_node_timeinterval_parseerror", id), Issue.Level.SEVERE)); } } } private void readNodeAttValue(XMLStreamReader reader, NodeDraft node) { String fore = ""; String value = ""; String startDate = ""; String endDate = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (ATTVALUE_FOR.equalsIgnoreCase(attName) || ATTVALUE_FOR2.equalsIgnoreCase(attName)) { fore = reader.getAttributeValue(i); } else if (ATTVALUE_VALUE.equalsIgnoreCase(attName)) { value = reader.getAttributeValue(i); } else if (ATTVALUE_START.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); } else if (ATTVALUE_END.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); } } if (fore.isEmpty()) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datakey", node), Issue.Level.SEVERE)); return; } if (!value.isEmpty()) { //Data attribute value AttributeColumn column = container.getAttributeModel().getNodeTable().getColumn(fore); if (column != null) { if (!startDate.isEmpty() || !endDate.isEmpty()) { //Dynamic try { node.addAttributeValue(column, value, startDate, endDate); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodeattribute_timeinterval_parseerror", node), Issue.Level.SEVERE)); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datavalue", fore, node, column.getTitle()), Issue.Level.SEVERE)); } } else { if (column.getType().isDynamicType()) { node.addAttributeValue(column, value); } else { try { Object val = column.getType().parse(value); node.addAttributeValue(column, val); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datavalue", fore, node, column.getTitle()), Issue.Level.SEVERE)); } } } } } } private void readNodeColor(XMLStreamReader reader, NodeDraft node) throws Exception { String rStr = ""; String gStr = ""; String bStr = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if ("r".equalsIgnoreCase(attName)) { rStr = reader.getAttributeValue(i); } else if ("g".equalsIgnoreCase(attName)) { gStr = reader.getAttributeValue(i); } else if ("b".equalsIgnoreCase(attName)) { bStr = reader.getAttributeValue(i); } } int r = (rStr.isEmpty()) ? 0 : Integer.parseInt(rStr); int g = (gStr.isEmpty()) ? 0 : Integer.parseInt(gStr); int b = (bStr.isEmpty()) ? 0 : Integer.parseInt(bStr); node.setColor(new Color(r, g, b)); } private void readNodePosition(XMLStreamReader reader, NodeDraft node) throws Exception { String xStr = ""; String yStr = ""; String zStr = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if ("x".equalsIgnoreCase(attName)) { xStr = reader.getAttributeValue(i); } else if ("y".equalsIgnoreCase(attName)) { yStr = reader.getAttributeValue(i); } else if ("z".equalsIgnoreCase(attName)) { zStr = reader.getAttributeValue(i); } } if (!xStr.isEmpty()) { try { float x = Float.parseFloat(xStr); node.setX(x); } catch (NumberFormatException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodeposition", node, "X"), Issue.Level.WARNING)); } } if (!yStr.isEmpty()) { try { float y = Float.parseFloat(yStr); node.setY(y); } catch (NumberFormatException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodeposition", node, "Y"), Issue.Level.WARNING)); } } if (!zStr.isEmpty()) { try { float z = Float.parseFloat(zStr); node.setZ(z); } catch (NumberFormatException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodeposition", node, "Z"), Issue.Level.WARNING)); } } } private void readNodeSize(XMLStreamReader reader, NodeDraft node) throws Exception { String attName = reader.getAttributeName(0).getLocalPart(); if ("value".equalsIgnoreCase(attName)) { String sizeStr = reader.getAttributeValue(0); if (!sizeStr.isEmpty()) { try { float size = Float.parseFloat(sizeStr); node.setSize(size); } catch (NumberFormatException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_nodesize", node), Issue.Level.WARNING)); } } } } private void readNodeSlice(XMLStreamReader reader, NodeDraft node) throws Exception { String start = ""; String end = ""; boolean startOpen = false; boolean endOpen = false; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (START.equalsIgnoreCase(attName)) { start = reader.getAttributeValue(i); } else if (END.equalsIgnoreCase(attName)) { end = reader.getAttributeValue(i); } else if (START_OPEN.equalsIgnoreCase(attName)) { start = reader.getAttributeValue(i); startOpen = true; } else if (END_OPEN.equalsIgnoreCase(attName)) { end = reader.getAttributeValue(i); endOpen = true; } } if (!start.isEmpty() || !end.isEmpty()) { try { node.addTimeInterval(start, end, startOpen, endOpen); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_node_timeinterval_parseerror", node), Issue.Level.SEVERE)); } } } private void readEdge(XMLStreamReader reader) throws Exception { String id = ""; String label = ""; String source = ""; String target = ""; String weight = ""; String edgeType = ""; String startDate = ""; String endDate = ""; boolean startOpen = false; boolean endOpen = false; //Attributes for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (EDGE_SOURCE.equalsIgnoreCase(attName)) { source = reader.getAttributeValue(i); } else if (EDGE_TARGET.equalsIgnoreCase(attName)) { target = reader.getAttributeValue(i); } else if (EDGE_WEIGHT.equalsIgnoreCase(attName)) { weight = reader.getAttributeValue(i); } else if (EDGE_ID.equalsIgnoreCase(attName)) { id = reader.getAttributeValue(i); } else if (EDGE_TYPE.equalsIgnoreCase(attName)) { edgeType = reader.getAttributeValue(i); } else if (EDGE_LABEL.equalsIgnoreCase(attName)) { label = reader.getAttributeValue(i); } else if (START.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); } else if (END.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); } else if (START_OPEN.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); startOpen = true; } else if (END_OPEN.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); endOpen = true; } } EdgeDraft edge = container.factory().newEdgeDraft(); NodeDraft nodeSource = container.getNode(source); NodeDraft nodeTarget = container.getNode(target); edge.setSource(nodeSource); edge.setTarget(nodeTarget); //Type if (!edgeType.isEmpty()) { if (edgeType.equalsIgnoreCase("undirected")) { edge.setType(EdgeDraft.EdgeType.UNDIRECTED); } else if (edgeType.equalsIgnoreCase("directed")) { edge.setType(EdgeDraft.EdgeType.DIRECTED); } else if (edgeType.equalsIgnoreCase("mutual")) { edge.setType(EdgeDraft.EdgeType.MUTUAL); } else { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edgetype", edgeType, edge), Issue.Level.SEVERE)); } } //Id if (!id.isEmpty()) { edge.setId(id); } //Weight if (!weight.isEmpty()) { try { float weightNumber = Float.parseFloat(weight); edge.setWeight(weightNumber); } catch (NumberFormatException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edgeweight", edge), Issue.Level.WARNING)); } } //Label if (!label.isEmpty()) { edge.setLabel(label); } container.addEdge(edge); boolean end = false; boolean slices = false; while (reader.hasNext() && !end) { int type = reader.next(); switch (type) { case XMLStreamReader.START_ELEMENT: if (ATTVALUE.equalsIgnoreCase(xmlReader.getLocalName())) { readEdgeAttValue(reader, edge); } else if (EDGE_COLOR.equalsIgnoreCase(xmlReader.getLocalName())) { readEdgeColor(reader, edge); } else if (EDGE_SLICE.equalsIgnoreCase(xmlReader.getLocalName())) { readEdgeSlice(reader, edge); slices = true; } break; case XMLStreamReader.END_ELEMENT: if (EDGE.equalsIgnoreCase(xmlReader.getLocalName())) { end = true; } break; } } //Dynamic if (!slices && (!startDate.isEmpty() || !endDate.isEmpty())) { try { edge.addTimeInterval(startDate, endDate, startOpen, endOpen); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edge_timeinterval_parseerror", edge), Issue.Level.SEVERE)); } } } private void readEdgeAttValue(XMLStreamReader reader, EdgeDraft edge) { String fore = ""; String value = ""; String startDate = ""; String endDate = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (ATTVALUE_FOR.equalsIgnoreCase(attName) || ATTVALUE_FOR2.equalsIgnoreCase(attName)) { fore = reader.getAttributeValue(i); } else if (ATTVALUE_VALUE.equalsIgnoreCase(attName)) { value = reader.getAttributeValue(i); } else if (ATTVALUE_START.equalsIgnoreCase(attName)) { startDate = reader.getAttributeValue(i); } else if (ATTVALUE_END.equalsIgnoreCase(attName)) { endDate = reader.getAttributeValue(i); } } if (fore.isEmpty()) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datakey", edge), Issue.Level.SEVERE)); return; } if (!value.isEmpty()) { //Data attribute value AttributeColumn column = container.getAttributeModel().getEdgeTable().getColumn(fore); if (column != null) { if (!startDate.isEmpty() || !endDate.isEmpty()) { //Dynamic try { edge.addAttributeValue(column, value, startDate, endDate); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edgeattribute_timeinterval_parseerror", edge), Issue.Level.SEVERE)); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datavalue", fore, edge, column.getTitle()), Issue.Level.SEVERE)); } } else { if (column.getType().isDynamicType()) { edge.addAttributeValue(column, value); } else { try { Object val = column.getType().parse(value); edge.addAttributeValue(column, val); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_datavalue", fore, edge, column.getTitle()), Issue.Level.SEVERE)); } } } } } } private void readEdgeColor(XMLStreamReader reader, EdgeDraft edge) throws Exception { String rStr = ""; String gStr = ""; String bStr = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if ("r".equalsIgnoreCase(attName)) { rStr = reader.getAttributeValue(i); } else if ("g".equalsIgnoreCase(attName)) { gStr = reader.getAttributeValue(i); } else if ("b".equalsIgnoreCase(attName)) { bStr = reader.getAttributeValue(i); } } int r = (rStr.isEmpty()) ? 0 : Integer.parseInt(rStr); int g = (gStr.isEmpty()) ? 0 : Integer.parseInt(gStr); int b = (bStr.isEmpty()) ? 0 : Integer.parseInt(bStr); edge.setColor(new Color(r, g, b)); } private void readEdgeSlice(XMLStreamReader reader, EdgeDraft edge) throws Exception { String start = ""; String end = ""; boolean startOpen = false; boolean endOpen = false; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (START.equalsIgnoreCase(attName)) { start = reader.getAttributeValue(i); } else if (END.equalsIgnoreCase(attName)) { end = reader.getAttributeValue(i); } else if (START_OPEN.equalsIgnoreCase(attName)) { start = reader.getAttributeValue(i); startOpen = true; } else if (END_OPEN.equalsIgnoreCase(attName)) { end = reader.getAttributeValue(i); endOpen = true; } } if (!start.isEmpty() || !end.isEmpty()) { try { edge.addTimeInterval(start, end, startOpen, endOpen); } catch (IllegalArgumentException e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_edge_timeinterval_parseerror", edge), Issue.Level.SEVERE)); } } } private void readAttributes(XMLStreamReader reader) throws Exception { String classAtt = ""; String typeAtt = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (ATTRIBUTES_CLASS.equalsIgnoreCase(attName)) { classAtt = reader.getAttributeValue(i); } else if (ATTRIBUTES_TYPE.equalsIgnoreCase(attName) || ATTRIBUTES_TYPE2.equalsIgnoreCase(attName)) { typeAtt = reader.getAttributeValue(i); } } boolean end = false; while (reader.hasNext() && !end) { int type = reader.next(); switch (type) { case XMLStreamReader.START_ELEMENT: if (ATTRIBUTE.equalsIgnoreCase(xmlReader.getLocalName())) { readAttribute(reader, classAtt, typeAtt); } break; case XMLStreamReader.END_ELEMENT: if (ATTRIBUTES.equalsIgnoreCase(xmlReader.getLocalName())) { end = true; } break; } } } private void readAttribute(XMLStreamReader reader, String classAtt, String typeAtt) throws Exception { String id = ""; String type = ""; String title = ""; String defaultStr = ""; for (int i = 0; i < reader.getAttributeCount(); i++) { String attName = reader.getAttributeName(i).getLocalPart(); if (ATTRIBUTE_ID.equalsIgnoreCase(attName)) { id = reader.getAttributeValue(i); } else if (ATTRIBUTE_TYPE.equalsIgnoreCase(attName)) { type = reader.getAttributeValue(i); } else if (ATTRIBUTE_TITLE.equalsIgnoreCase(attName)) { title = reader.getAttributeValue(i); } } if (title.isEmpty()) { title = id; } if (!id.isEmpty() && !type.isEmpty()) { //Class type if (classAtt.isEmpty() || !(classAtt.equalsIgnoreCase("node") || classAtt.equalsIgnoreCase("edge"))) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributeclass", title), Issue.Level.SEVERE)); } //Default? boolean end = false; boolean defaultFlag = false; while (reader.hasNext() && !end) { int xmltype = reader.next(); switch (xmltype) { case XMLStreamReader.START_ELEMENT: if (ATTRIBUTE_DEFAULT.equalsIgnoreCase(xmlReader.getLocalName())) { defaultFlag = true; } break; case XMLStreamReader.CHARACTERS: if (defaultFlag && !xmlReader.isWhiteSpace()) { defaultStr = xmlReader.getText(); } break; case XMLStreamReader.END_ELEMENT: if (ATTRIBUTE.equalsIgnoreCase(xmlReader.getLocalName())) { end = true; } break; } } //Dynamic? boolean dynamic = typeAtt.equalsIgnoreCase("dynamic"); //Type AttributeType attributeType = AttributeType.STRING; if (type.equalsIgnoreCase("boolean") || type.equalsIgnoreCase("bool")) { attributeType = dynamic ? AttributeType.DYNAMIC_BOOLEAN : AttributeType.BOOLEAN; } else if (type.equalsIgnoreCase("integer") || type.equalsIgnoreCase("int")) { attributeType = dynamic ? AttributeType.DYNAMIC_INT : AttributeType.INT; } else if (type.equalsIgnoreCase("long")) { attributeType = dynamic ? AttributeType.DYNAMIC_LONG : AttributeType.LONG; } else if (type.equalsIgnoreCase("float")) { attributeType = dynamic ? AttributeType.DYNAMIC_FLOAT : AttributeType.FLOAT; } else if (type.equalsIgnoreCase("double")) { attributeType = dynamic ? AttributeType.DYNAMIC_DOUBLE : AttributeType.DOUBLE; } else if (type.equalsIgnoreCase("string")) { attributeType = dynamic ? AttributeType.DYNAMIC_STRING : AttributeType.STRING; } else if (type.equalsIgnoreCase("bigdecimal")) { attributeType = dynamic ? AttributeType.DYNAMIC_BIGDECIMAL : AttributeType.BIGDECIMAL; } else if (type.equalsIgnoreCase("biginteger")) { attributeType = dynamic ? AttributeType.DYNAMIC_BIGINTEGER : AttributeType.BIGINTEGER; } else if (type.equalsIgnoreCase("byte")) { attributeType = dynamic ? AttributeType.DYNAMIC_BYTE : AttributeType.BYTE; } else if (type.equalsIgnoreCase("char")) { attributeType = dynamic ? AttributeType.DYNAMIC_CHAR : AttributeType.CHAR; } else if (type.equalsIgnoreCase("short")) { attributeType = dynamic ? AttributeType.DYNAMIC_SHORT : AttributeType.SHORT; } else if (type.equalsIgnoreCase("listboolean")) { attributeType = AttributeType.LIST_BOOLEAN; } else if (type.equalsIgnoreCase("listint")) { attributeType = AttributeType.LIST_INTEGER; } else if (type.equalsIgnoreCase("listlong")) { attributeType = AttributeType.LIST_LONG; } else if (type.equalsIgnoreCase("listfloat")) { attributeType = AttributeType.LIST_FLOAT; } else if (type.equalsIgnoreCase("listdouble")) { attributeType = AttributeType.LIST_DOUBLE; } else if (type.equalsIgnoreCase("liststring")) { attributeType = AttributeType.LIST_STRING; } else if (type.equalsIgnoreCase("listbigdecimal")) { attributeType = AttributeType.LIST_BIGDECIMAL; } else if (type.equalsIgnoreCase("listbiginteger")) { attributeType = AttributeType.LIST_BIGINTEGER; } else if (type.equalsIgnoreCase("listbyte")) { attributeType = AttributeType.LIST_BYTE; } else if (type.equalsIgnoreCase("listchar")) { attributeType = AttributeType.LIST_CHARACTER; } else if (type.equalsIgnoreCase("listshort")) { attributeType = AttributeType.LIST_SHORT; } else { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributetype2", type), Issue.Level.SEVERE)); return; } //Default Object Object defaultValue = null; if (!defaultStr.isEmpty()) { try { defaultValue = attributeType.parse(defaultStr); report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_default", defaultStr, title)); } catch (Exception e) { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributedefault", title, attributeType.getTypeString()), Issue.Level.SEVERE)); } } //Add to model if ("node".equalsIgnoreCase(classAtt) || classAtt.isEmpty()) { if (container.getAttributeModel().getNodeTable().hasColumn(id) || container.getAttributeModel().getNodeTable().hasColumn(title)) { report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributecolumn_exist", id)); return; } container.getAttributeModel().getNodeTable().addColumn(id, title, attributeType, AttributeOrigin.DATA, defaultValue); report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_nodeattribute", title, attributeType.getTypeString())); } else if ("edge".equalsIgnoreCase(classAtt) || classAtt.isEmpty()) { if ((id.equalsIgnoreCase("weight") || title.equalsIgnoreCase("weight")) && dynamic && attributeType.equals(AttributeType.DYNAMIC_FLOAT)) { //Dynamic weight report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_dynamic_weight", id)); container.getAttributeModel().getEdgeTable().removeColumn(container.getAttributeModel().getEdgeTable().getColumn(PropertiesColumn.EDGE_WEIGHT.getIndex())); container.getAttributeModel().getEdgeTable().addColumn(id, PropertiesColumn.EDGE_WEIGHT.getTitle(), attributeType, AttributeOrigin.PROPERTY, defaultValue); return; } else if (container.getAttributeModel().getEdgeTable().hasColumn(id) || container.getAttributeModel().getEdgeTable().hasColumn(title)) { report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributecolumn_exist", id)); return; } container.getAttributeModel().getEdgeTable().addColumn(id, title, attributeType, AttributeOrigin.DATA, defaultValue); report.log(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_log_edgeattribute", title, attributeType.getTypeString())); } } else { report.logIssue(new Issue(NbBundle.getMessage(ImporterGEXF.class, "importerGEXF_error_attributeempty", title), Issue.Level.SEVERE)); } } public void setReader(Reader reader) { this.reader = reader; } public ContainerLoader getContainer() { return container; } public Report getReport() { return report; } public boolean cancel() { cancel = true; return true; } public void setProgressTicket(ProgressTicket progressTicket) { this.progress = progressTicket; } }