33import javafx .fxml .FXMLLoader ;
44import javafx .scene .Parent ;
55import javafx .scene .Scene ;
6- import javafx .scene .shape .StrokeType ;
76import javafx .stage .Modality ;
87import javafx .stage .Stage ;
98import model .conceptual .Edge ;
109import model .conceptual .Vertex ;
1110import model .conceptual .Vertex .OutsideElementException ;
1211import model .conversion .gat .FromGatConverter ;
1312import model .conversion .gat .ToGatConverter ;
14- import model .conversion .ttl . Converter ;
13+ import model .conversion .rdfxml . RDFXMLGenerator ;
1514import model .graph .Arrow ;
15+ import model .conversion .ttl .Converter ;
1616import javafx .embed .swing .SwingFXUtils ;
1717import javafx .fxml .FXML ;
1818import javafx .geometry .BoundingBox ;
3333import javafx .scene .shape .Rectangle ;
3434import javafx .scene .text .Text ;
3535import javafx .stage .FileChooser ;
36+ import org .apache .commons .csv .CSVFormat ;
37+ import org .apache .commons .csv .CSVParser ;
38+ import org .apache .commons .csv .CSVRecord ;
3639
3740import javax .imageio .ImageIO ;
3841import java .awt .*;
3942import java .awt .image .RenderedImage ;
4043import java .io .*;
4144import java .lang .reflect .InvocationTargetException ;
4245import java .lang .reflect .Method ;
43- import java .util .ArrayList ;
44- import java .util .Arrays ;
45- import java .util .Optional ;
46+ import java .util .*;
47+ import java .util .List ;
4648import java .util .logging .Level ;
4749import java .util .logging .Logger ;
4850
@@ -55,18 +57,22 @@ public final class Controller {
5557 @ FXML protected BorderPane root ;
5658 @ FXML protected Pane drawPane ;
5759 @ FXML protected ScrollPane scrollPane ;
58- @ FXML protected Button prefixBtn , saveGraphBtn , loadGraphBtn , exportTllBtn , exportPngBtn , instrBtn , optionsBtn ;
60+ @ FXML protected Button prefixBtn , saveGraphBtn , loadGraphBtn , exportTllBtn , exportPngBtn , eatCsvBtn , rdfXmlBtn ,
61+ instrBtn , optionsBtn ;
5962 @ FXML protected Label statusLbl ;
6063 private ArrayList <Boolean > config = new ArrayList <>(Arrays .asList (false , false , false ));
6164
62- private ArrayList <String > prefixes = new ArrayList <>();
65+ private Map <String , String > prefixes = new HashMap <>();
6366 private final ArrayList <Edge > properties = new ArrayList <>();
6467 private final ArrayList <Vertex > classes = new ArrayList <>();
6568
6669 private Arrow arrow ;
6770 private Vertex subject ;
6871 private boolean srcClick = true ;
6972
73+ private List <CSVRecord > csv ;
74+ private Map <String , Integer > headers ;
75+
7076 /**
7177 * Method invoked on any key press in the main application.
7278 * @param keyEvent the key that invoked the method.
@@ -124,8 +130,12 @@ private <C extends AbstractDataSharingController<T>, T> ArrayList<T> showWindow(
124130 * Shows the Prefixes menu, updating the prefixes if they have been modified in the menu.
125131 */
126132 @ FXML void showPrefixMenuAction () {
127- ArrayList <String > updatedPrefixes = showWindow ("/view/prefixmenu.fxml" , "Prefixes Menu" , prefixes );
128- if (updatedPrefixes != null ) prefixes = updatedPrefixes ;
133+ ArrayList <Map <String , String >> data = new ArrayList <>();
134+ data .add (prefixes );
135+
136+ ArrayList <Map <String , String >> updatedData = showWindow ("/view/prefixmenu.fxml" , "Prefixes Menu" , data );
137+
138+ if (updatedData != null ) prefixes = updatedData .get (0 );
129139 }
130140
131141 /**
@@ -135,12 +145,12 @@ private <C extends AbstractDataSharingController<T>, T> ArrayList<T> showWindow(
135145 @ FXML public void saveGraphAction () {
136146 File saveFile = showSaveFileDialog ("graph.gat" , "Save Graph As" , null );
137147 if (saveFile != null ){
138- String filetext = ToGatConverter . traverseCanvas (
148+ ToGatConverter converter = new ToGatConverter (
139149 drawPane .getWidth (),
140150 drawPane .getHeight (),
141- classes ,
142- properties
151+ classes , properties
143152 );
153+ String filetext = converter .traverseCanvas ();
144154 try {
145155 FileWriter writer = new FileWriter (saveFile );
146156 writer .write (filetext );
@@ -158,15 +168,15 @@ private <C extends AbstractDataSharingController<T>, T> ArrayList<T> showWindow(
158168 * into elements of a graph. It then binds the visual elements into meaningful java-friendly elements.
159169 */
160170 @ FXML public void loadGraphAction () {
161- File loadFile = showLoadFileDialog ();
171+ File loadFile = showLoadFileDialog ("Load Graph File" );
162172 if (loadFile != null ){
163173 drawPane .getChildren ().clear ();
164174 prefixes .clear ();
165175 classes .clear ();
166176 properties .clear ();
167177
168178 try (FileReader reader = new FileReader (loadFile )){
169- char [] rawGraph = new char [10000 ];
179+ char [] rawGraph = new char [10000 ]; //needs to be arbitrary
170180 if (reader .read (rawGraph ) == 0 ) {
171181 statusLbl .setText ("Read failed: nothing in graph file." );
172182 LOGGER .warning ("Nothing in graph file." );
@@ -445,21 +455,15 @@ private void addElementSubaction(MouseEvent mouseEvent) {
445455 double textWidth = elementName .getBoundsInLocal ().getWidth ();
446456
447457 if (isClass ){
448- Ellipse elementType = new Ellipse ();
449- elementType .setCenterX (x );
450- elementType .setCenterY (y );
451- elementType .setRadiusX (textWidth / 2 > 62.5 ? textWidth / 2 + 10 : 62.5 );
452- elementType .setRadiusY (37.5 );
458+ Ellipse elementType = new Ellipse (x , y , textWidth / 2 > 62.5 ? textWidth / 2 + 10 : 62.5 , 37.5 );
453459 elementType .setFill (Color .web ("f4f4f4" ));
454460 elementType .setStroke (Color .BLACK );
455461 compiledElement .getChildren ().addAll (elementType , elementName );
456462
457463 } else {
458- Rectangle elementType = new Rectangle ();
464+ Rectangle elementType = new Rectangle (textWidth > 125 ? textWidth + 15 : 125 , 75 );
459465 String name = elementName .getText ();
460466
461- elementType .setHeight (75 );
462- elementType .setWidth (textWidth > 125 ? textWidth + 15 : 125 );
463467 elementType .setFill (Color .web ("f4f4f4" ));
464468 elementType .setStroke (Color .BLACK );
465469 if (name .matches (instanceLiteralRegex ) && !name .matches (globalLiteralRegex ))
@@ -553,9 +557,9 @@ private File showSaveFileDialog(String fileName, String windowTitle, FileChooser
553557 * Creates a load file dialog, which prompts the user to load from a specific file.
554558 * @return the file that will be loaded from.
555559 */
556- private File showLoadFileDialog (){
560+ private File showLoadFileDialog (String title ){
557561 FileChooser fileChooser = new FileChooser ();
558- fileChooser .setTitle ("Load Graph File" );
562+ fileChooser .setTitle (title );
559563 fileChooser .setInitialDirectory (new File (System .getProperty ("user.home" )));
560564
561565 return fileChooser .showOpenDialog (root .getScene ().getWindow ());
@@ -588,4 +592,63 @@ private void showOptionsDialog() {
588592 ArrayList <Boolean > updatedConfig = showWindow ("/view/optionsmenu.fxml" , "Options for the Current Project" , config );
589593 if (updatedConfig != null ) config = updatedConfig ;
590594 }
595+
596+ @ FXML protected void ingestCsvAction (){
597+ File loadFile = showLoadFileDialog ("Load .csv for RDF/XML generation" );
598+ if (loadFile != null ){
599+ csv = null ;
600+ headers = null ;
601+ try (Reader reader = new BufferedReader (new FileReader (loadFile ))){
602+ CSVParser parser = CSVFormat .DEFAULT .withFirstRecordAsHeader ().parse (reader );
603+ headers = parser .getHeaderMap ();
604+ csv = parser .getRecords ();
605+ statusLbl .setText (".csv ingested. Yum." );
606+ LOGGER .info ("Ingested " + loadFile .getName () + ".\n Found csv headers: " + headers );
607+ rdfXmlBtn .setDisable (false );
608+ parser .close ();
609+ } catch (IOException e ) {
610+ e .printStackTrace ();
611+ }
612+ }
613+ }
614+
615+ @ FXML protected void rdfXmlGenAction () {
616+ String rdfxml ;
617+ RDFXMLGenerator rdfxmlGenerator = new RDFXMLGenerator (headers , csv , classes , prefixes );
618+ rdfxmlGenerator .attemptCorrelationOfHeaders ();
619+
620+ LOGGER .info ("BEFORE Correlation:\n Correlated: " + rdfxmlGenerator .getCorrelations ().toString () +
621+ "\n Uncorrelated: " + rdfxmlGenerator .uncorrelatedToString ());
622+
623+ if (rdfxmlGenerator .getUncorrelated () != null && rdfxmlGenerator .getUncorrelated ().getKey ().size () != 0 )
624+ showManualCorrelationDialog (rdfxmlGenerator );
625+ if (rdfxmlGenerator .getUncorrelated () != null && rdfxmlGenerator .getUncorrelated ().getKey ().size () != 0 ){
626+ LOGGER .info ("Cancelled Manual Correlations. " );
627+ return ;
628+ }
629+
630+ LOGGER .info ("AFTER Correlation:" +
631+ "\n Correlated: " + rdfxmlGenerator .getCorrelations ().toString () +
632+ "\n Uncorrelated (assumed constant): " + rdfxmlGenerator .uncorrelatedClassesToString ());
633+
634+ rdfxml = rdfxmlGenerator .generate ();
635+ File saveFile = showSaveFileDialog ("rdf.rdf" , "Save RDF/XML Document" , null );
636+ if (saveFile != null ){
637+ try {
638+ FileWriter writer = new FileWriter (saveFile );
639+ writer .write (rdfxml );
640+ writer .flush ();
641+ writer .close ();
642+ statusLbl .setText ("RDF/XML saved." );
643+ } catch (IOException e ) {
644+ e .printStackTrace ();
645+ }
646+ }
647+ }
648+
649+ private void showManualCorrelationDialog (RDFXMLGenerator generator ){
650+ ArrayList <RDFXMLGenerator > data = new ArrayList <>();
651+ data .add (generator );
652+ showWindow ("/view/correlateDialog.fxml" , "Set Manual Correlations" , data );
653+ }
591654}
0 commit comments