andbin ha scritto:
morellik ha scritto:
Qualcuno mi ha suggerito di passare a Java -Djava.awt.headless=true ma non funziona.
Bisogna vedere dove l'hai applicato.
Comunque riguardo la questione del "headless" c'è della documentazione ufficiale: Using Headless Mode in the Java SE Platform
Dovresti anche precisare bene quale è il punto in cui viene scatenato il HeadlessException. Non conosco quella jgraphx citata, quindi bisogna chiarire cosa di essa ha causato il problema. Non è sicuramente la ImageIO, perché non causa HeadlessException. Non so invece cosa sia quel mxCellRenderer.
Questa e' la libreria che uso per generare i grafi:
https://jgraph.github.io/mxgraph/docs/manual_javavis.html
Ti posto l'intero metodo:
public Result getInteractionImage() throws IOException {
DynamicForm requestData = formFactory.form().bindFromRequest();
Integer lig_id = Integer.parseInt(requestData.get("lig_id"));
String typo = requestData.get("typo");
List<? extends InteractionHbond> interactions;
if(typo.equals("1")) {
interactions = ihbond.findByLigId(lig_id);
} else {
interactions = ivwd.findByLigId(lig_id);
}
//System.out.println(lig_id);
mxGraph graph = new mxGraph();
Object parent = graph.getDefaultParent();
Boolean first = Boolean.TRUE;
Object v1 = null;
Object v = null;
Integer y = 150;
graph.getModel().beginUpdate();
List<String> nBorList = new ArrayList<>();
for (InteractionHbond ib : interactions) {
for (Atom at : ib.getAtoms()) {
String[] neigRes = at.getNeigh_atom_str().split(" ");
if(first) {
String[] ligRes = at.getLig_atom_str().split(" ");
v1 = graph.insertVertex(parent, null, ligRes[0]+"_"+ligRes[1], 20, 20, 80,
30, "shape=ellipse;perimeter=ellipsePerimeter;strokeColor=blank;fillColor=violet");
first = Boolean.FALSE;
}
if(!nBorList.contains(neigRes[0]+"_"+neigRes[1])) {
nBorList.add(neigRes[0]+"_"+neigRes[1]);
v = graph.insertVertex(parent, null, neigRes[0]+"_"+neigRes[1], 240, y,
80, 30, "shape=ellipse;perimeter=ellipsePerimeter;strokeColor=black;fillColor=orange");
graph.insertEdge(parent, null, "", v1, v);
y +=50;
}
}
}
graph.getModel().endUpdate();
mxGraphComponent graphComponent = new mxGraphComponent(graph);
BufferedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, Color.white, true, null);
ImageIO.write(image, "PNG", new File("public/metalweb/images/" + lig_id + "_" + typo + ".png"));
String img = "<img src=\"/assets/metalweb/images/" + lig_id + "_" + typo + ".png\" >";
return ok(img);
}
Con l'opzione
-Djava.awt.headless=true ho la seguente exception:
play.api.UnexpectedException: Unexpected exception[HeadlessException: null]
.
.
Caused by: java.awt.HeadlessException: null
at java.awt.dnd.DragSource.<init>(DragSource.java:258)
at com.mxgraph.swing.handler.mxGraphHandler.installDragGestureHandler(Unknown Source)
at com.mxgraph.swing.handler.mxGraphHandler.<init>(Unknown Source)
at com.mxgraph.swing.mxGraphComponent.createGraphHandler(Unknown Source)
at com.mxgraph.swing.mxGraphComponent.createHandlers(Unknown Source)
at com.mxgraph.swing.mxGraphComponent.<init>(Unknown Source)
at controllers.ResultController.getInteractionImage(ResultController.java:199)
Noto però anche un altro potenziale problema: new File("public/metalweb/images/" + ......)
Questo è un percorso relativo alla directory "corrente". Quale è? Beh, in una web application è generalmente abbastanza "vaga" nel senso che dipende da quale è l'application server, da come è configurato, da come è stato lanciato. Quindi nelle webapp Java la directory "corrente" generalmente non è usabile e non ci si dovrebbe far troppo affidamento.
Quindi sarebbe meglio configurare un path assoluto o dedurlo in altro modo.
Sto usando Play Framework dove solitamente si lavora per path relativi. L'application server interno sa benissimo qual e' la root. Posso impostare anche una variabile nella sua configurazione, ma si tratta sempre di percorsi relativi.