Skip to content

Commit 0e73bdf

Browse files
committed
Dev/Feature: Instance-level .ttl honors types and blank nodes. Workflow checklist for generating .ttl. Can now determine datatypes.
2 parents 993a600 + 26f12e0 commit 0e73bdf

18 files changed

Lines changed: 671 additions & 270 deletions

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# Created by .ignore support plugin (hsz.mobi)
22
out/
33
.idea/
4-
res/
54
DrawingTurtles.iml

src/controller/Controller.java

Lines changed: 157 additions & 75 deletions
Large diffs are not rendered by default.

src/controller/CorrelateDialogController.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
import javafx.stage.Stage;
1212
import javafx.util.Pair;
1313
import model.conceptual.Vertex;
14-
import model.conversion.rdfxml.Correlation;
15-
import model.conversion.rdfxml.RDFXMLGenerator;
14+
import model.dataintegration.Correlation;
15+
import model.dataintegration.DataIntegrator;
1616

1717
import java.net.URL;
1818
import java.util.ArrayList;
1919
import java.util.ResourceBundle;
2020
import java.util.stream.Collectors;
2121

22-
public class CorrelateDialogController extends AbstractDataSharingController<RDFXMLGenerator> implements Initializable {
22+
public class CorrelateDialogController extends AbstractDataSharingController<DataIntegrator> implements Initializable {
2323
@FXML Button addManualCorrBtn, addHeaderBtn, commitBtn, cancelBtn;
2424
@FXML ListView<String> csvHeaderList;
2525
@FXML ListView<String> csvTtlCorrelationList;
@@ -37,7 +37,7 @@ public class CorrelateDialogController extends AbstractDataSharingController<RDF
3737
private ArrayList<Vertex> uncorrelatedTtlClasses;
3838
private ArrayList<String> uncorrelatedTtlClassNames;
3939

40-
private RDFXMLGenerator rdfxmlGenerator;
40+
private DataIntegrator dataIntegrator;
4141

4242
@Override public void initialize(URL location, ResourceBundle resources) {
4343
isSelectionFromBothLists.addListener((observable, oldV, newV) -> {
@@ -99,8 +99,8 @@ public class CorrelateDialogController extends AbstractDataSharingController<RDF
9999
}
100100

101101
@FXML void commitCorrelationBtn() {
102-
rdfxmlGenerator.setCorrelations(correlations);
103-
rdfxmlGenerator.setUncorrelated(new Pair<>(uncorrelatedCsvHeaders, uncorrelatedTtlClasses));
102+
dataIntegrator.setCorrelations(correlations);
103+
dataIntegrator.setUncorrelated(new Pair<>(uncorrelatedCsvHeaders, uncorrelatedTtlClasses));
104104
Stage stage = (Stage) commitBtn.getScene().getWindow();
105105
stage.close();
106106
}
@@ -111,19 +111,19 @@ public class CorrelateDialogController extends AbstractDataSharingController<RDF
111111
}
112112

113113
@Override
114-
public void setData(ArrayList<RDFXMLGenerator> data) {
115-
RDFXMLGenerator generator = data.get(0);
114+
public void setData(ArrayList<DataIntegrator> data) {
115+
DataIntegrator generator = data.get(0);
116116

117-
rdfxmlGenerator = generator;
118-
correlations = rdfxmlGenerator.getCorrelations();
117+
dataIntegrator = generator;
118+
correlations = dataIntegrator.getCorrelations();
119119
ArrayList<String> correlationStrings = correlations
120120
.stream()
121121
.map(Correlation::toString)
122122
.collect(Collectors.toCollection(ArrayList::new));
123123

124124
csvTtlCorrelationList.setItems(FXCollections.observableArrayList(correlationStrings));
125125

126-
uncorrelatedCsvHeaders = rdfxmlGenerator.getUncorrelated().getKey();
126+
uncorrelatedCsvHeaders = dataIntegrator.getUncorrelated().getKey();
127127
csvHeaderList.setItems(FXCollections.observableArrayList(uncorrelatedCsvHeaders));
128128
uncorrelatedTtlClasses = generator.getUncorrelated().getValue();
129129
uncorrelatedTtlClassNames = uncorrelatedTtlClasses
@@ -134,9 +134,9 @@ public void setData(ArrayList<RDFXMLGenerator> data) {
134134
}
135135

136136
@Override
137-
public ArrayList<RDFXMLGenerator> getData() {
138-
ArrayList<RDFXMLGenerator> data = new ArrayList<>();
139-
data.add(rdfxmlGenerator);
137+
public ArrayList<DataIntegrator> getData() {
138+
ArrayList<DataIntegrator> data = new ArrayList<>();
139+
data.add(dataIntegrator);
140140
return data;
141141
}
142142
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package controller;
2+
3+
import javafx.beans.property.BooleanProperty;
4+
import javafx.beans.property.SimpleBooleanProperty;
5+
import javafx.fxml.FXML;
6+
import javafx.fxml.Initializable;
7+
import javafx.scene.control.Button;
8+
import javafx.scene.control.Label;
9+
import javafx.scene.control.TextField;
10+
import javafx.scene.input.KeyCode;
11+
import javafx.scene.input.KeyEvent;
12+
import javafx.stage.Stage;
13+
14+
import java.net.URL;
15+
import java.util.ArrayList;
16+
import java.util.ResourceBundle;
17+
18+
public class NewClassDialogController extends AbstractDataSharingController<String> implements Initializable {
19+
private final BooleanProperty isClasslike = new SimpleBooleanProperty(false);
20+
private final BooleanProperty isLiterallike = new SimpleBooleanProperty(false);
21+
22+
private ArrayList<String> commitData = new ArrayList<>();
23+
24+
@FXML TextField classNameTfd;
25+
@FXML Label dataTypeLbl;
26+
@FXML Button cmtBtn, cancelBtn;
27+
28+
@Override
29+
public void initialize(URL location, ResourceBundle resources) {
30+
classNameTfd.textProperty().addListener(((observable, oldValue, newValue) -> {
31+
final String stringLitRegex = "\".+\"";
32+
final String otherLitRegex = "\".+\"\\^\\^.*";
33+
final String langLitRegex = "\".+\"@.*";
34+
final String instanceLitRegex = "(?<!\")[^:]*(?!\")";
35+
final String booleanLitRegex = "true|false";
36+
final String integerLitRegex = "[+\\-]?\\d+";
37+
final String decimalLitRegex = "[+\\-]?\\d*\\.\\d+";
38+
final String doubleLitRegex = "([+\\-]?\\d+\\.\\d+|[+\\-]?\\.\\d+|[+\\-]?\\d+)[Ee][+\\-]\\d+";
39+
40+
final String literalRegex = stringLitRegex + "|" + otherLitRegex + "|" + langLitRegex + "|" +
41+
instanceLitRegex + "|" + booleanLitRegex + "|" + integerLitRegex + "|" + decimalLitRegex + "|" +
42+
doubleLitRegex;
43+
final String classRegex = "([a-z]*:[^\" ]*)?";
44+
45+
if (newValue.matches(classRegex)){
46+
isClasslike.setValue(true);
47+
isLiterallike.setValue(false);
48+
} else if (newValue.matches(literalRegex)){
49+
isClasslike.setValue(false);
50+
isLiterallike.setValue(true);
51+
if (newValue.matches(stringLitRegex + "|" + langLitRegex)) dataTypeLbl.setText("xsd:string");
52+
else if (newValue.matches(booleanLitRegex)) dataTypeLbl.setText("xsd:boolean");
53+
else if (newValue.matches(integerLitRegex)) dataTypeLbl.setText("xsd:integer");
54+
else if (newValue.matches(decimalLitRegex)) dataTypeLbl.setText("xsd:decimal");
55+
else if (newValue.matches(doubleLitRegex)) dataTypeLbl.setText("xsd:double");
56+
else if (newValue.matches(otherLitRegex)) {
57+
final String[] otherParts = newValue.split("\\^\\^");
58+
dataTypeLbl.setText(otherParts.length > 1 ? otherParts[1] : "");
59+
} else dataTypeLbl.setText("");
60+
} else {
61+
isClasslike.setValue(false);
62+
isLiterallike.setValue(false);
63+
}
64+
}));
65+
66+
isLiterallike.addListener(((observable, oldValue, newValue) -> {
67+
if (!observable.getValue().booleanValue()) dataTypeLbl.setText("");
68+
}));
69+
70+
isClasslike.addListener(((observable, oldValue, newValue) -> {
71+
if (observable.getValue().booleanValue()) dataTypeLbl.setText("");
72+
}));
73+
}
74+
75+
@FXML void addNewClassAction() {
76+
commitData.add(classNameTfd.getText());
77+
commitData.add(dataTypeLbl.getText());
78+
Stage stage = (Stage) cmtBtn.getScene().getWindow();
79+
stage.close();
80+
}
81+
82+
@FXML void cancelAction() {
83+
Stage stage = (Stage) cancelBtn.getScene().getWindow();
84+
stage.close();
85+
}
86+
87+
@FXML void keyPressedAction(KeyEvent keyEvent) {
88+
if (keyEvent.getCode() == KeyCode.ENTER) addNewClassAction();
89+
}
90+
91+
@Override
92+
public void setData(ArrayList<String> data) {}
93+
94+
@Override
95+
public ArrayList<String> getData() {
96+
return commitData;
97+
}
98+
}

src/controller/OntologyClassDialogController.java

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,88 @@
11
package controller;
22

3+
import javafx.beans.property.BooleanProperty;
4+
import javafx.beans.property.SimpleBooleanProperty;
35
import javafx.fxml.FXML;
6+
import javafx.fxml.Initializable;
47
import javafx.scene.control.Button;
58
import javafx.scene.control.TextArea;
69
import javafx.scene.control.TextField;
710
import javafx.stage.Stage;
811

12+
import java.net.URL;
913
import java.util.ArrayList;
1014
import java.util.Arrays;
15+
import java.util.ResourceBundle;
1116

12-
public class OntologyClassDialogController extends AbstractDataSharingController<String> {
17+
public class OntologyClassDialogController extends AbstractDataSharingController<String> implements Initializable {
1318
@FXML Button cmtBtn, cancelBtn;
14-
@FXML TextField nameTfd, labelTfd;
19+
@FXML TextField typeTfd, nameTfd, labelTfd;
1520
@FXML TextArea commentTxa;
1621

22+
private final BooleanProperty isClasslike = new SimpleBooleanProperty(false);
23+
private final BooleanProperty isLiterallike = new SimpleBooleanProperty(false);
24+
1725
private ArrayList<String> commit_data = new ArrayList<>();
1826

27+
@Override
28+
public void initialize(URL location, ResourceBundle resources) {
29+
final String stringLitRegex = "\".+\"";
30+
final String otherLitRegex = "\".+\"\\^\\^.*";
31+
final String langLitRegex = "\".+\"@.*";
32+
final String instanceLitRegex = "(?<!\")[^:]*(?!\")";
33+
final String booleanLitRegex = "true|false";
34+
final String integerLitRegex = "[+\\-]?\\d+";
35+
final String decimalLitRegex = "[+\\-]?\\d*\\.\\d+";
36+
final String doubleLitRegex = "([+\\-]?\\d+\\.\\d+|[+\\-]?\\.\\d+|[+\\-]?\\d+)[Ee][+\\-]\\d+";
37+
38+
final String literalRegex = stringLitRegex + "|" + otherLitRegex + "|" + langLitRegex + "|" +
39+
instanceLitRegex + "|" + booleanLitRegex + "|" + integerLitRegex + "|" + decimalLitRegex + "|" +
40+
doubleLitRegex;
41+
final String classRegex = "([a-z]*:[^\" ]*)?";
42+
43+
nameTfd.textProperty().addListener(((observable, oldValue, newValue) -> {
44+
if (newValue.matches(classRegex)){
45+
isClasslike.setValue(true);
46+
isLiterallike.setValue(false);
47+
} else if (newValue.matches(literalRegex)){
48+
isClasslike.setValue(false);
49+
isLiterallike.setValue(true);
50+
if (newValue.matches(stringLitRegex + "|" + langLitRegex)) typeTfd.setText("xsd:string");
51+
else if (newValue.matches(booleanLitRegex)) typeTfd.setText("xsd:boolean");
52+
else if (newValue.matches(integerLitRegex)) typeTfd.setText("xsd:integer");
53+
else if (newValue.matches(decimalLitRegex)) typeTfd.setText("xsd:decimal");
54+
else if (newValue.matches(doubleLitRegex)) typeTfd.setText("xsd:double");
55+
else if (newValue.matches(otherLitRegex)) {
56+
final String[] otherParts = newValue.split("\\^\\^");
57+
typeTfd.setText(otherParts.length > 1 ? otherParts[1] : "");
58+
} else typeTfd.setText("");
59+
} else {
60+
isClasslike.setValue(false);
61+
isLiterallike.setValue(false);
62+
}
63+
}));
64+
65+
isClasslike.addListener(((observable, oldValue, newValue) -> {
66+
if (observable.getValue().booleanValue()){
67+
labelTfd.setDisable(false);
68+
commentTxa.setDisable(false);
69+
} else {
70+
labelTfd.setDisable(true);
71+
commentTxa.setDisable(true);
72+
labelTfd.setText("");
73+
commentTxa.setText("");
74+
}
75+
}));
76+
77+
isLiterallike.addListener(((observable, oldValue, newValue) -> {
78+
if (observable.getValue().booleanValue()) typeTfd.setDisable(false);
79+
else {
80+
typeTfd.setDisable(true);
81+
typeTfd.setText("");
82+
}
83+
}));
84+
}
85+
1986
@Override
2087
public void setData(ArrayList<String> data) {}
2188

@@ -25,7 +92,7 @@ public ArrayList<String> getData() {
2592
}
2693

2794
@FXML void addNewClassAction() {
28-
commit_data.addAll(Arrays.asList(nameTfd.getText(), labelTfd.getText(), commentTxa.getText()));
95+
commit_data.addAll(Arrays.asList(nameTfd.getText(), typeTfd.getText(), labelTfd.getText(), commentTxa.getText()));
2996
Stage stage = (Stage) cmtBtn.getScene().getWindow();
3097
stage.close();
3198
}

src/controller/PrefixMenuController.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,11 @@ public class PrefixMenuController extends AbstractDataSharingController<Map<Stri
107107
*/
108108
@FXML protected void savePrefixAction() {
109109
File saveFile = showSaveFileDialog(
110-
new FileChooser.ExtensionFilter("Text Files (*.txt)", "*.txt"),
111-
savPrefixBtn.getScene().getWindow()
110+
savPrefixBtn.getScene().getWindow(),
111+
new FileChooser.ExtensionFilter("Text Files (*.txt)", "*.txt")
112112
);
113113
if (saveFile != null && prefixes.size() != 0) {
114+
Controller.lastDirectory = saveFile.getParent();
114115
StringBuilder prefixesToSave = new StringBuilder();
115116
for (Map.Entry<String, String> prefix : prefixes.entrySet()) {
116117
String prefixStr = prefix.getKey() + " : " + prefix.getValue();
@@ -133,9 +134,12 @@ public class PrefixMenuController extends AbstractDataSharingController<Map<Stri
133134
* On clicking the 'Load Prefix' button, attempts to load prefixes from a user-specified .txt file.
134135
*/
135136
@FXML protected void loadPrefixAction(){
136-
File loadFile = showLoadFileDialog(lodPrefixBtn.getScene().getWindow());
137-
137+
File loadFile = showLoadFileDialog(
138+
lodPrefixBtn.getScene().getWindow(),
139+
new FileChooser.ExtensionFilter("Text file (*.txt)", "*.txt")
140+
);
138141
if (loadFile != null){
142+
Controller.lastDirectory = loadFile.getParent();
139143
try (FileReader reader = new FileReader(loadFile)){
140144
char[] rawPrefixes = new char[10000];
141145

@@ -202,16 +206,18 @@ private void showPrefixMalformedAlert(String badPrefix) {
202206

203207
/**
204208
* Creates a save file dialog, prompting the user to select a file to create and/or save data to.
205-
* @param extFilter the list of extension filters, for easy access to specific file types.
206209
* @param owner the window that owns the dialog.
210+
* @param extFilter the list of extension filters, for easy access to specific file types.
207211
* @return the file the user has chosen to save to, or null otherwise.
208212
*/
209-
private File showSaveFileDialog(FileChooser.ExtensionFilter extFilter, Window owner) {
213+
private File showSaveFileDialog(Window owner, FileChooser.ExtensionFilter extFilter) {
214+
File directory =
215+
new File(Controller.lastDirectory != null ? Controller.lastDirectory : System.getProperty("user.home"));
210216
FileChooser fileChooser = new FileChooser();
211217
fileChooser.setInitialFileName("prefixes.txt");
212218
fileChooser.setTitle("Save Prefixes");
213-
fileChooser.setSelectedExtensionFilter(extFilter);
214-
fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
219+
fileChooser.getExtensionFilters().addAll(extFilter);
220+
fileChooser.setInitialDirectory(directory);
215221

216222
return fileChooser.showSaveDialog(owner);
217223
}
@@ -221,10 +227,13 @@ private File showSaveFileDialog(FileChooser.ExtensionFilter extFilter, Window ow
221227
* @param owner the window that owns the dialog.
222228
* @return the file that will be loaded from.
223229
*/
224-
private File showLoadFileDialog(Window owner){
230+
private File showLoadFileDialog(Window owner, FileChooser.ExtensionFilter extFilter){
231+
File directory =
232+
new File(Controller.lastDirectory != null ? Controller.lastDirectory : System.getProperty("user.home"));
225233
FileChooser fileChooser = new FileChooser();
226234
fileChooser.setTitle("Load Prefixes");
227-
fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
235+
fileChooser.setInitialDirectory(directory);
236+
fileChooser.getExtensionFilters().add(extFilter);
228237

229238
return fileChooser.showOpenDialog(owner);
230239
}

src/model/conceptual/Edge.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ public class Edge {
2121
* @param subject the tail of the property arrow.
2222
* @param object the head of the property arrow.
2323
*/
24+
// TODO: 8/02/2019 if iri add <> keeps adding when save/loading. Need better fix.
2425
public Edge(StackPane container, Label name, Vertex subject, Vertex object){
2526
this.container = container;
2627
this.name = name.getText();
2728
this.subject = subject;
2829
this.object = object;
2930

30-
if (this.name.matches("http:.*|mailto:.*")){
31+
if (this.name.matches("<?https?:.*>?|<?mailto:.*>?")) {
3132
isIri = true;
32-
this.name = "<" + this.name + ">";
33+
this.name = this.name.matches("<https?:.*>|<mailto:.*>") ? this.name : "<" + this.name + ">";
3334
} else isIri = false;
3435
}
3536

0 commit comments

Comments
 (0)