/*
Copyright 2008-2010 Gephi
Authors : Sebastien Heymann <sebastien.heymann@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.io.BufferedReader;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.Reader;
import org.gephi.io.importer.api.ContainerLoader;
import org.gephi.io.importer.api.EdgeDraft;
import org.gephi.io.importer.api.ImportUtils;
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 Sebastien Heymann
*/
public class ImporterTLP implements FileImporter, LongTask {
//Architecture
private Reader reader;
private ContainerLoader container;
private Report report;
private ProgressTicket progressTicket;
private boolean cancel = false;
public boolean execute(ContainerLoader container) {
this.container = container;
this.report = report;
LineNumberReader lineReader = ImportUtils.getTextReader(reader);
try {
importData(lineReader);
} catch (Exception e) {
throw new RuntimeException(e);
}
return !cancel;
}
private void importData(LineNumberReader reader) throws Exception {
Progress.start(progressTicket);
walkFile(reader);
Progress.finish(progressTicket);
}
private void walkFile(BufferedReader reader) throws Exception {
int cptLine = 0;
int state = 0; // 0=topology, 1=properties
while (reader.ready() && !cancel) {
String line = reader.readLine();
if (!isComment(line)) {
String[] tokens = line.split("\\s|\\)");
if (tokens.length > 0) {
if (state == 0) {
// topology
if (tokens[0].equals("(nodes")) {
//Nodes
parseNodes(tokens);
} else if (tokens[0].equals("(edge")) {
//Edges
parseEdge(tokens, cptLine);
} else if (tokens[0].equals("(property")) {
//switch to properties grabbing
state = 1;
}
}
if (state == 1) {
// properties
// exit loop for the moment
return;
}
}
}
cptLine++;
}
}
private boolean isComment(String s) {
return s.startsWith(";");
}
private void parseNodes(String[] tokens) {
for (int i = 1; i < tokens.length; i++) {
NodeDraft node = container.factory().newNodeDraft();
String id = tokens[i];
node.setId(id);
container.addNode(node);
}
}
private void parseEdge(String[] tokens, int cptLine) {
if (tokens.length != 4) {
report.logIssue(new Issue(NbBundle.getMessage(ImporterGDF.class, "importerTPL_error_dataformat1", cptLine), Issue.Level.WARNING));
}
EdgeDraft edge = container.factory().newEdgeDraft();
String id = tokens[1];
NodeDraft source = container.getNode(tokens[2]);
NodeDraft target = container.getNode(tokens[3]);
edge.setId(id);
edge.setSource(source);
edge.setTarget(target);
container.addEdge(edge);
}
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.progressTicket = progressTicket;
}
}