Hi!
I do have big problems understanding the following exception:
org.jetel.exception.GraphConfigurationException: An edge without source node cannot be added into the graph.
at org.jetel.graph.TransformationGraph.addEdge(TransformationGraph.java:803)
at at.sozvers.bva.loewe.BlzCloverTransform.main(BlzCloverTransform.java:56)
This is my code:
package at.test;
import org.jetel.component.DelimitedDataReader;
import org.jetel.component.SimpleCopy;
import org.jetel.component.XLSWriter;
import org.jetel.data.Defaults;
import org.jetel.exception.GraphConfigurationException;
import org.jetel.graph.Edge;
import org.jetel.graph.InputPort;
import org.jetel.graph.Node;
import org.jetel.graph.Phase;
import org.jetel.graph.TransformationGraph;
import org.jetel.graph.runtime.GraphExecutor;
import org.jetel.graph.runtime.GraphRuntimeContext;
import org.jetel.graph.runtime.IGraphRuntimeContext;
import org.jetel.metadata.DataFieldMetadata;
import org.jetel.metadata.DataRecordMetadata;
import org.jetel.plugin.Plugins;
public class BlzCloverTransform {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Defaults.init(""); //TODO anpassen
Plugins.init("c:/cloverETL/plugins"); //TODO dir anpassen
// Struktur des Eigabefiles:
DataRecordMetadata eingabeStruktur = new DataRecordMetadata("CSVein",DataRecordMetadata.DELIMITED_RECORD);
// "null" deshalb, weil defaul- Delimiter benutzt werden (unten)
eingabeStruktur.addField(new DataFieldMetadata("blz",DataFieldMetadata.NUMERIC_FIELD,null));
eingabeStruktur.addField(new DataFieldMetadata("bankname",DataFieldMetadata.STRING_FIELD,null));
eingabeStruktur.setFieldDelimiter(";");
eingabeStruktur.setRecordDelimiters("\n");
TransformationGraph graph= new TransformationGraph();
Phase phase= new Phase(0);
Edge inEdge = new Edge("InEdge",eingabeStruktur);
Edge outEdge=new Edge("OutEdge",eingabeStruktur);
Node nodeEingabe = new DelimitedDataReader("csvLesen","c:/blz.csv"); //TODO TEST
Node nodeCopy = new SimpleCopy("SIMPLE_COPY");
Node nodeAusgabe = new XLSWriter("excelSchreiben","c:/out.xls",false);
try {
// Phase zum Graphen hinzufügen:
graph.addPhase(phase);
// Kanten hinzufügen
phase.addEdge(inEdge);
phase.addEdge(outEdge);
// Knoten hinzufügen
phase.addNode(nodeEingabe);
phase.addNode(nodeCopy);
phase.addNode(nodeAusgabe);
// Data - Flows erstellen...
nodeEingabe.addOutputPort(0,inEdge);
nodeCopy.addInputPort(0,inEdge);
nodeCopy.addOutputPort(0,outEdge);
nodeAusgabe.addOutputPort(0,outEdge);
GraphRuntimeContext ctx= new GraphRuntimeContext();
ctx.setVerboseMode(true);
GraphExecutor executor= new GraphExecutor();
GraphExecutor.initGraph(graph);
executor.runGraph(graph,ctx);
System.out.println("----------------------------------------------");
graph.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ende");
}
}
Can anyone tell me what I’m doing wrong?
I was not able to find any complete java example on th web working with GrapHExecutur, etc.
Thanks in advance.
Stefan
Hi, you need to assign edges to nodes:
nodeEingabe.addOutputPort(0, inEdge);
nodeCopy.addInputPort(0, inEdge);
nodeCopy.addOutputPort(0, outEdge);
nodeAusgabe.addInputPort(0, outEdge);
and switch over order of adding elements to graph: first nodes, then edges.
Example for creating graph in java code is javaExamples\testGraphSort.java
Hi!
Thanks for that quick answer.
But I already had the assignment in my code, just below the line
// Data - Flows erstellen...
I now changed this to the code you wrote, but I still get the same
“Edge cannot be added into the phase without source component.” - error message.
Thanks a lot!
Try in such order:
TransformationGraph graph= new TransformationGraph();
Phase phase= new Phase(0);
Edge inEdge = new Edge("InEdge",eingabeStruktur);
Edge outEdge=new Edge("OutEdge",eingabeStruktur);
Node nodeEingabe = new DelimitedDataReader("csvLesen","c:/blz.csv"); //TODO TEST
Node nodeCopy = new SimpleCopy("SIMPLE_COPY");
Node nodeAusgabe = new XLSWriter("excelSchreiben","c:/out.xls",false);
nodeEingabe.addOutputPort(0, inEdge);
nodeCopy.addInputPort(0, inEdge);
nodeCopy.addOutputPort(0, outEdge);
nodeAusgabe.addInputPort(0, outEdge);
try {
// Phase zum Graphen hinzufügen:
graph.addPhase(phase);
// Knoten hinzufügen
phase.addNode(nodeEingabe);
phase.addNode(nodeCopy);
phase.addNode(nodeAusgabe);
// Kanten hinzufügen
phase.addEdge(inEdge);
phase.addEdge(outEdge);
GraphRuntimeContext ctx= new GraphRuntimeContext();
ctx.setVerboseMode(true);
GraphExecutor executor= new GraphExecutor();
GraphExecutor.initGraph(graph);
executor.runGraph(graph,ctx);
Thanks very much, but in time I got the code working, but now when I change the DelimitedDataWriter to XLSWriter , it only outputs a 0-byte .XLS - File, the DelimetedDataWriter works.
Any ideas? Thank you again!
Here my code:
package at.sozvers.bva.loewe;
import java.util.concurrent.Future;
import org.jetel.component.DelimitedDataReader;
import org.jetel.component.DelimitedDataWriter;
import org.jetel.component.SimpleCopy;
import org.jetel.component.XLSWriter;
import org.jetel.data.Defaults;
import org.jetel.exception.ComponentNotReadyException;
import org.jetel.graph.Edge;
import org.jetel.graph.Node;
import org.jetel.graph.Phase;
import org.jetel.graph.Result;
import org.jetel.graph.TransformationGraph;
import org.jetel.graph.runtime.GraphExecutor;
import org.jetel.graph.runtime.GraphRuntimeContext;
import org.jetel.metadata.DataFieldMetadata;
import org.jetel.metadata.DataRecordMetadata;
import org.jetel.plugin.Plugins;
public class BlzCloverTransform {
private static final Phase _PHASE_1=new Phase(1);
private static final Phase _PHASE_2=new Phase(2);
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Defaults.init(""); //TODO anpassen
Plugins.init("c:/cloverETL/plugins"); //TODO dir anpassen
// Struktur des Eigabefiles:
DataRecordMetadata eingabeStruktur = new DataRecordMetadata("CSVein",DataRecordMetadata.DELIMITED_RECORD);
// "null" deshalb, weil defaul- Delimiter benutzt werden (unten)
eingabeStruktur.addField(new DataFieldMetadata("blz",DataFieldMetadata.STRING_FIELD,null));
eingabeStruktur.addField(new DataFieldMetadata("bankname",DataFieldMetadata.STRING_FIELD,null));
eingabeStruktur.setFieldDelimiter(";");
eingabeStruktur.setRecordDelimiters("\n");
TransformationGraph graph= new TransformationGraph();
Edge inEdge = new Edge("InEdge",eingabeStruktur);
Edge outEdge= new Edge("OutEdge",eingabeStruktur);
Node nodeRead = new DelimitedDataReader("DataParser","c:/blz.csv"); //TODO TEST
Node nodeCopy = new SimpleCopy("EinfachKopieren");
Node nodeWrite = new XLSWriter("DataWriter","c:/out.xls",false);
nodeRead.addOutputPort(0,inEdge);
nodeCopy.addInputPort(0,inEdge);
nodeCopy.addOutputPort(0, outEdge);
nodeWrite.addInputPort(0,outEdge);
try {
// Phase zum Graphen hinzufügen:
graph.addPhase(_PHASE_1);
_PHASE_1.addNode(nodeRead);
_PHASE_1.addNode(nodeCopy);
graph.addPhase(_PHASE_2);
_PHASE_2.addNode(nodeWrite);
graph.addEdge(inEdge);
graph.addEdge(outEdge);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
GraphRuntimeContext runtimeContext = new GraphRuntimeContext();
runtimeContext.setUseJMX(false);
runtimeContext.setVerboseMode(true);
GraphExecutor executor = new GraphExecutor();
try {
GraphExecutor.initGraph(graph);
} catch (ComponentNotReadyException e) {
System.out.println("Failed graph initialization!\n" + e.getMessage());
return;
}
Future<Result> result;
try{
result = executor.runGraph(graph, runtimeContext);
while (result.isDone()) {;}
if (!result.get().equals(Result.FINISHED_OK)){
System.out.println(result.get().message());
System.out.println("Failed graph execution!");
return;
}
}catch (Exception e) {
System.out.println("Failed graph execution!\n" + e.getMessage());
return;
}
System.out.println("ende");
}
}
The file is empty, because XLSWriter flushes all data to file during graph freeing. After graph execution you have to close graph resources by free method:
graph.free();
thank you very much, you helped me much.
Unfortunately the documentation of CloverETL is incomplete, especially the docu about using Clover within Java.
For example I can’t find anything about GraphExecutor- class within the wiki.
Stefan