/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.semantics.builder.model; import edu.uci.ics.jung.algorithms.layout.KKLayout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.SparseMultigraph; import edu.uci.ics.jung.graph.util.EdgeType; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; import edu.uci.ics.jung.visualization.control.ModalGraphMouse; import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; import org.apache.commons.collections15.Transformer; import org.semanticweb.owlapi.model.IRI; import javax.swing.*; import java.awt.*; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class GraphModelImpl extends ModelImpl implements GraphModel { private Graph<Concept, Relation> cgraph = new SparseMultigraph<Concept, Relation>(); private Set<String> conceptNames = new HashSet<String>(); GraphModelImpl() { } public boolean saveAsGraphML(String target) { return false; //To change body of implemented methods use File | Settings | File Templates. } public void display() { KKLayout<Concept, Relation> layout = new KKLayout<Concept, Relation>( cgraph ); layout.setExchangeVertices(true); layout.setAdjustForGravity(false); layout.setDisconnectedDistanceMultiplier(2.0); layout.setLengthFactor(5.0); layout.setSize( new Dimension(1800,1000) ); VisualizationViewer<Concept, Relation> vv = new VisualizationViewer<Concept, Relation>( layout ); vv.setPreferredSize(new Dimension(1850,1050)); //Sets the viewing area size final Stroke sccStroke = new BasicStroke(5.0f); final Stroke edgeStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 10.0f, null, 0.0f); Transformer<Relation, Stroke> edgeStrokeTransformer = new Transformer<Relation, Stroke>() { public Stroke transform(Relation rel) { return rel.getProperty().contains("subConceptOf") ? sccStroke : edgeStroke; } }; Transformer<Concept,Paint> vertexPaint = new Transformer<Concept,Paint>() { public Paint transform(Concept c) { return c.getIri().contains("XMLSchema") ? Color.GREEN : Color.BLUE; } }; vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint); vv.getRenderContext().setEdgeStrokeTransformer(edgeStrokeTransformer); vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller()); vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller()); DefaultModalGraphMouse gm = new DefaultModalGraphMouse(); gm.setMode(ModalGraphMouse.Mode.TRANSFORMING); vv.setGraphMouse(gm); // EditingModalGraphMouse gm = // new EditingModalGraphMouse(vv.getRenderContext(), // cgraph.get, cgraph.edgeFactory); vv.addKeyListener(gm.getModeKeyListener()); JFrame frame = new JFrame("Simple Graph View"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(vv); frame.pack(); frame.setVisible(true); } public void addRelationEdge( Relation rel ) { if ( rel == null ){ System.err.println( "WARNING : adding null relation/edge to graph"); } Object sub = getTrait( rel.getSubject() ); Object obj = null; if ( rel instanceof PropertyRelation ) { obj = getTrait( ((PropertyRelation) rel).getTarget().getIri()); } else { obj = getTrait( rel.getObject() ); } if ( obj == null ) { // literal aka datatype, most probably Concept k = new Concept( IRI.create( rel.getObject() ), ((PropertyRelation) rel).getTarget().getName(), true ); cgraph.addVertex( k ); obj = k; } if ( sub != null && obj != null ) { cgraph.addEdge( rel, (Concept) sub, (Concept) obj, EdgeType.DIRECTED ); } else { System.err.println(" WARNING : Broken edge for " + rel.getProperty() + " : sub = " + sub + " | obj = " + obj ); } } public void addTrait(String name, Object trait) { conceptNames.add( name ); cgraph.addVertex( (Concept) trait ); } public Object getTrait(String name) { Collection<Concept> vertix = cgraph.getVertices(); for ( Concept con : vertix ) { if ( con.getName().equals( name ) || con.getIri().equals( name ) ) { return con; } } return null; } public Set<String> getTraitNames() { return conceptNames; } protected String traitsToString() { return cgraph.toString(); } }