From 24466425014251fa19ae2f05f8d26a83bc8d6315 Mon Sep 17 00:00:00 2001 From: Andy Crapo Date: Tue, 21 Feb 2017 10:37:50 -0500 Subject: [PATCH 1/3] fixes to implied property bugs --- .../jena/JenaBasedSadlModelProcessor.java | 33 +++++++++++++++++-- .../jena/JenaBasedSadlModelValidator.java | 33 ++++++++++++++++--- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java index 3a394815f..2c57d9d39 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java @@ -6203,6 +6203,7 @@ protected boolean isBooleanOperator(String op) { // return false; // } protected Object translateAndApplyImpliedProperty(Expression expr, Property impliedPropertyWrapper) throws InvalidNameException, InvalidTypeException, TranslationException { + int start = serialize.length(); if (includeImpliedPropertiesInDirectWrite && impliedPropertyWrapper != null) { serialize.append("impliedProperty('"); serialize.append(impliedPropertyWrapper.toString()); @@ -6212,11 +6213,22 @@ protected Object translateAndApplyImpliedProperty(Expression expr, Property impl if (includeImpliedPropertiesInDirectWrite && impliedPropertyWrapper != null) { serialize.append(")"); } - return obj; + if (!(obj instanceof String)) { + return obj; + } + return getExpressionTranslationString(start); + } + + protected void resetProcessorState(SadlModelElement element) throws InvalidTypeException { + if (getModelValidator() != null) { + getModelValidator().resetValidatorState(element); + } } + public List getEquations() { return equations; } + public void setEquations(List equations) { this.equations = equations; } @@ -6265,7 +6277,12 @@ public List getImpliedProperties(com.hp.hpl.jena.rdf.model.Resource retlst = scips; } else { - retlst.addAll(scips); + for (int i = 0; i < scips.size(); i++) { + ConceptName cn = scips.get(i); + if (!scips.contains(cn)) { + retlst.add(scips.get(i)); + } + } } } } @@ -6278,7 +6295,10 @@ public List getImpliedProperties(com.hp.hpl.jena.rdf.model.Resource while (sitr.hasNext()) { RDFNode obj = sitr.nextStatement().getObject(); if (obj.isURIResource()) { - retlst.add(new ConceptName(obj.asResource().getURI())); + ConceptName cn = new ConceptName(obj.asResource().getURI()); + if (!retlst.contains(cn)) { + retlst.add(cn); + } } } return retlst; @@ -6348,6 +6368,13 @@ protected String conceptIdentifierToString(ConceptIdentifier ci) { } return ci.toString(); } + /********************************* End translate methods *****************************************/ + protected String getExpressionTranslationString(int start) { + if (start > serialize.length()) { + start = serialize.length(); + } + return serialize.substring(start); + } } diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java index c9a4b8a63..e9ef14ecc 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java @@ -48,6 +48,7 @@ import com.ge.research.sadl.sADL.PropOfSubject; import com.ge.research.sadl.sADL.SadlDataType; import com.ge.research.sadl.sADL.SadlIntersectionType; +import com.ge.research.sadl.sADL.SadlModelElement; import com.ge.research.sadl.sADL.SadlParameterDeclaration; import com.ge.research.sadl.sADL.SadlPrimitiveDataType; import com.ge.research.sadl.sADL.SadlPropertyCondition; @@ -314,7 +315,7 @@ private Object implicitPropertiesToString(List iprops) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < iprops.size(); i++) { if (i > 0) sb.append(", "); - sb.append(getImplicitProperties().get(0).toFQString()); + sb.append(getImplicitProperties().get(i).toFQString()); } return sb.toString(); } @@ -1528,9 +1529,19 @@ protected List getTypeCheckTypeClasses(TypeCheckInfo tci) { return results; } - protected TypeCheckInfo getTypeFromRestriction(Expression subject, Expression predicate) throws CircularDefinitionException, InvalidTypeException { + protected TypeCheckInfo getTypeFromRestriction(Expression subject, Expression predicate) throws CircularDefinitionException, InvalidTypeException, DontTypeCheckException, InvalidNameException, TranslationException, URISyntaxException, IOException, ConfigurationException, CircularDependencyException { if (subject instanceof Name && predicate instanceof Name) { String subjuri = declarationExtensions.getConceptUri(((Name)subject).getName()); + OntConceptType subjtype = declarationExtensions.getOntConceptType(((Name)subject).getName()); + if (subjtype.equals(OntConceptType.VARIABLE)) { + TypeCheckInfo varTci = getType(((Name)subject).getName()); + if (varTci != null && varTci.getTypeCheckType() != null) { + ConceptIdentifier varci = varTci.getTypeCheckType(); + if (varci instanceof ConceptName) { + subjuri = ((ConceptName)varci).getUri(); + } + } + } String propuri = declarationExtensions.getConceptUri(((Name)predicate).getName()); OntConceptType proptype = declarationExtensions.getOntConceptType(((Name)predicate).getName()); return getTypeFromRestriction(subjuri, propuri, proptype, predicate); @@ -2266,6 +2277,8 @@ else if (val.isLiteral()) { private boolean compareTypesUsingImpliedProperties(List operations, EObject leftExpression, EObject rightExpression, TypeCheckInfo leftTypeCheckInfo, TypeCheckInfo rightTypeCheckInfo) throws InvalidNameException, DontTypeCheckException, InvalidTypeException { + + String opstr = (operations != null && operations.size() > 0) ? operations.get(0) : null; if (leftTypeCheckInfo.getImplicitProperties() != null) { Iterator litr = leftTypeCheckInfo.getImplicitProperties().iterator(); while (litr.hasNext()) { @@ -2282,7 +2295,7 @@ else if (prop.canAs(DatatypeProperty.class)) { } TypeCheckInfo newltci = getTypeInfoFromRange(cn, prop, leftExpression); if (compareTypes(operations, leftExpression, rightExpression, newltci, rightTypeCheckInfo)) { - issueAcceptor.addInfo("Implied property '" + getModelProcessor().conceptIdentifierToString(cn) + "' used (left side) to pass type check", leftExpression); + issueAcceptor.addInfo("Implied property '" + getModelProcessor().conceptIdentifierToString(cn) + "' used (left side" + (opstr != null ? (" of '" + opstr + "'") : "") + ") to pass type check", leftExpression); addImpliedPropertiesUsed(leftExpression, prop); return true; } @@ -2304,7 +2317,7 @@ else if (prop.canAs(DatatypeProperty.class)) { } TypeCheckInfo newrtci = getTypeInfoFromRange(cn, prop, rightExpression); if (compareTypes(operations, leftExpression, rightExpression, leftTypeCheckInfo, newrtci)) { - issueAcceptor.addInfo("Implied property '" + getModelProcessor().conceptIdentifierToString(cn) + "' used (right side) to pass type check", rightExpression); + issueAcceptor.addInfo("Implied property '" + getModelProcessor().conceptIdentifierToString(cn) + "' used (right side" + (opstr != null ? (" of '" + opstr + "'") : "") + ") to pass type check", rightExpression); addImpliedPropertiesUsed(rightExpression, prop); return true; } @@ -2845,4 +2858,16 @@ protected void setModelProcessor(JenaBasedSadlModelProcessor modelProcessor) { this.modelProcessor = modelProcessor; } + public void resetValidatorState(SadlModelElement element) { + if (impliedPropertiesUsed != null) { + impliedPropertiesUsed.clear(); + } + if (binaryLeftTypeCheckInfo != null) { + binaryLeftTypeCheckInfo.clear(); + } + if (binaryRightTypeCheckInfo != null) { + binaryRightTypeCheckInfo.clear(); + } + } + } From f242eb8313852185be3e57dcc6f87b3413e9f067 Mon Sep 17 00:00:00 2001 From: Andy Crapo Date: Tue, 21 Feb 2017 11:37:03 -0500 Subject: [PATCH 2/3] added filtering of implied properties to operator --- .../jena/JenaBasedSadlModelProcessor.java | 72 +++++++++++++++++++ .../jena/JenaBasedSadlModelValidator.java | 72 +++---------------- 2 files changed, 82 insertions(+), 62 deletions(-) diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java index 2c57d9d39..e5dfdf90b 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelProcessor.java @@ -27,6 +27,7 @@ import java.net.URISyntaxException; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -248,6 +249,9 @@ public final static Property xsdProperty( String local ) protected enum AnnType {ALIAS, NOTE} + private List comparisonOperators = Arrays.asList(">=",">","<=","<","==","!=","is","=","not","unique","in","contains","does",/*"not",*/"contain"); + private List numericOperators = Arrays.asList("*","+","/","-","%","^"); + private List canBeNumericOperators = Arrays.asList(">=",">","<=","<","==","!=","is","="); public enum OPERATORS_RETURNING_BOOLEAN {contains, unique, is, gt, ge, lt, le, and, or, not, was, hasBeen} public enum BOOLEAN_LITERAL_TEST {BOOLEAN_TRUE, BOOLEAN_FALSE, NOT_BOOLEAN, NOT_BOOLEAN_NEGATED} @@ -6368,6 +6372,7 @@ protected String conceptIdentifierToString(ConceptIdentifier ci) { } return ci.toString(); } + /********************************* End translate methods *****************************************/ protected String getExpressionTranslationString(int start) { if (start > serialize.length()) { @@ -6375,6 +6380,73 @@ protected String getExpressionTranslationString(int start) { } return serialize.substring(start); } + + public boolean isComparisonOperator(String operation) { + if (comparisonOperators.contains(operation)) { + return true; + } + return false; + } + + public boolean isBooleanComparison(List operations) { + if(comparisonOperators.containsAll(operations)){ + return true; + } + return false; + } + + public boolean canBeNumericOperator(String op) { + if (canBeNumericOperators.contains(op)) return true; + return false; + } + + public boolean isNumericOperator(String op) { + if (numericOperators.contains(op)) return true; + return false; + } + + public boolean isNumericOperator(List operations) { + Iterator itr = operations.iterator(); + while (itr.hasNext()) { + if (isNumericOperator(itr.next())) return true; + } + return false; + } + public boolean canBeNumericOperator(List operations) { + Iterator itr = operations.iterator(); + while (itr.hasNext()) { + if (canBeNumericOperator(itr.next())) return true; + } + return false; + } + + public boolean isNumericType(ConceptName conceptName) { + try { + String uri = conceptName.getUri(); + return isNumericType(uri); + } catch (InvalidNameException e) { + e.printStackTrace(); + } + return false; + } + + public boolean isNumericType(String uri) { + if (uri.equals(XSD.decimal.getURI()) || + uri.equals(XSD.integer.getURI()) || + uri.equals(XSD.xdouble.getURI()) || + uri.equals(XSD.xfloat.getURI()) || + uri.equals(XSD.xint.getURI()) || + uri.equals(XSD.xlong.getURI())) { + return true; + } + return false; + } + public boolean isBooleanType(String uri) { + if (uri.equals(XSD.xboolean.getURI())) { + return true; + } + return false; + } } diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java index e9ef14ecc..5e9873bce 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java @@ -94,9 +94,6 @@ public class JenaBasedSadlModelValidator implements ISadlModelValidator { protected ValidationAcceptor issueAcceptor = null; protected OntModel theJenaModel = null; protected DeclarationExtensions declarationExtensions = null; - private List comparisonOperators = Arrays.asList(">=",">","<=","<","==","!=","is","=","not","unique","in","contains","does",/*"not",*/"contain"); - private List numericOperators = Arrays.asList("*","+","/","-","%","^"); - private List canBeNumericOperators = Arrays.asList(">=",">","<=","<","==","!=","is","="); private EObject defaultContext; protected Map expressionsValidated = new HashMap(); @@ -605,7 +602,7 @@ protected void createErrorMessage(StringBuilder errorMessageBuilder, TypeCheckIn } } - if (comparisonOperators.contains(operation)) { + if (getModelProcessor().isComparisonOperator(operation)) { op = "be compared (" + operation + ")"; } else { @@ -901,7 +898,7 @@ else if(expression instanceof BinaryOperation){ } TypeCheckInfo binopreturn = combineTypes(operations, ((BinaryOperation) expression).getLeft(), ((BinaryOperation) expression).getRight(), leftTypeCheckInfo, rightTypeCheckInfo); - if (isNumericOperator(((BinaryOperation) expression).getOp())) { + if (getModelProcessor().isNumericOperator(((BinaryOperation) expression).getOp())) { if (leftTypeCheckInfo != null && !isNumeric(leftTypeCheckInfo) && !isNumericWithImpliedProperty(leftTypeCheckInfo, ((BinaryOperation)expression).getLeft())) { issueAcceptor.addError("Numeric operator requires numeric arguments", ((BinaryOperation)expression).getLeft()); } @@ -1042,12 +1039,12 @@ else if (prop.canAs(DatatypeProperty.class)) { return false; } - private boolean isNumeric(TypeCheckInfo tci) { + private boolean isNumeric(TypeCheckInfo tci) throws InvalidTypeException { ConceptIdentifier ci; if (tci.getTypeCheckType() != null) { ci = tci.getTypeCheckType(); if (ci instanceof ConceptName) { - return isNumericType((ConceptName) ci); + return getModelProcessor().isNumericType((ConceptName) ci); } } else if (tci.getExplicitValueType() != null) { @@ -1057,7 +1054,7 @@ else if (tci.getExplicitValueType() != null) { issueAcceptor.addWarning("Explicit value type is RESTRICITON, which isn't yet handled. Please report with use case.", tci.context); } else if (tci.getExpressionType() instanceof ConceptName){ - return isNumericType((ConceptName) tci.getExpressionType()); + return getModelProcessor().isNumericType((ConceptName) tci.getExpressionType()); } } return false; @@ -2087,12 +2084,12 @@ private TypeCheckInfo combineTypes(List operations, Expression leftExpre if(!compareTypes(operations, leftExpression, rightExpression, leftTypeCheckInfo, rightTypeCheckInfo)){ return null; } - if (isBooleanComparison(operations)) { + if (getModelProcessor().isBooleanComparison(operations)) { ConceptName booleanLiteralConceptName = new ConceptName(XSD.xboolean.getURI()); booleanLiteralConceptName.setType(ConceptType.DATATYPEPROPERTY); return new TypeCheckInfo(booleanLiteralConceptName, booleanLiteralConceptName, this, leftExpression.eContainer()); } - else if (isNumericOperator(operations)) { + else if (getModelProcessor().isNumericOperator(operations)) { ConceptName lcn = getTypeCheckInfoType(leftTypeCheckInfo); ConceptName rcn = getTypeCheckInfoType(rightTypeCheckInfo); if (lcn == null || lcn.getNamespace() == null) { @@ -2166,13 +2163,6 @@ private ConceptName getTypeCheckInfoType(TypeCheckInfo tci) throws InvalidNameEx throw new InvalidNameException("Failed to get TypeCheckInfoType"); } - protected boolean isBooleanComparison(List operations) { - if(comparisonOperators.containsAll(operations)){ - return true; - } - return false; - } - /** * Compare two TypeCheckInfo structures * @param operations @@ -2346,14 +2336,14 @@ private boolean compatibleTypes(List operations, EObject leftExpression, ConceptName leftConceptName = (ConceptName) leftConceptIdentifier; ConceptName rightConceptName = (ConceptName) rightConceptIdentifier; - if (isNumericOperator(operations) && (!isNumeric(leftTypeCheckInfo) || !isNumeric(rightTypeCheckInfo))) { + if (getModelProcessor().isNumericOperator(operations) && (!isNumeric(leftTypeCheckInfo) || !isNumeric(rightTypeCheckInfo))) { return false; } if (leftConceptName.equals(rightConceptName)) { return true; } - else if ((isNumericOperator(operations) || canBeNumericOperator(operations)) && - (isNumericType(leftConceptName) && isNumericType(rightConceptName))) { + else if ((getModelProcessor().isNumericOperator(operations) || getModelProcessor().canBeNumericOperator(operations)) && + (getModelProcessor().isNumericType(leftConceptName) && getModelProcessor().isNumericType(rightConceptName))) { return true; } else if (leftConceptName.getType() == null || rightConceptName.getType() == null) { @@ -2517,48 +2507,6 @@ private boolean checkForContainer(EObject expr, Class t ) return checkForContainer(expr.eContainer(), t); } - private boolean canBeNumericOperator(List operations) { - Iterator itr = operations.iterator(); - while (itr.hasNext()) { - if (canBeNumericOperator(itr.next())) return true; - } - return false; - } - - private boolean canBeNumericOperator(String op) { - if (canBeNumericOperators.contains(op)) return true; - return false; - } - - private boolean isNumericOperator(String op) { - if (numericOperators.contains(op)) return true; - return false; - } - - private boolean isNumericOperator(List operations) { - Iterator itr = operations.iterator(); - while (itr.hasNext()) { - if (isNumericOperator(itr.next())) return true; - } - return false; - } - - private boolean isNumericType(ConceptName conceptName) { - try { - if (conceptName.getUri().equals(XSD.decimal.getURI()) || - conceptName.getUri().equals(XSD.integer.getURI()) || - conceptName.getUri().equals(XSD.xdouble.getURI()) || - conceptName.getUri().equals(XSD.xfloat.getURI()) || - conceptName.getUri().equals(XSD.xint.getURI()) || - conceptName.getUri().equals(XSD.xlong.getURI())) { - return true; - } - } catch (InvalidNameException e) { - e.printStackTrace(); - } - return false; - } - protected boolean isQualifyingListOperation(List operations, TypeCheckInfo leftTypeCheckInfo, TypeCheckInfo rightTypeCheckInfo) { if (operations.contains("contain") || operations.contains("contains") && leftTypeCheckInfo != null && leftTypeCheckInfo.getRangeValueType().equals(RangeValueType.LIST)) { From ff7534bed4f484d7f1105c89664bbfe06162d2ef Mon Sep 17 00:00:00 2001 From: Andy Crapo Date: Tue, 21 Feb 2017 16:36:35 -0500 Subject: [PATCH 3/3] some fixes to OWL importing --- .../jena/JenaBasedSadlModelValidator.java | 1 + .../ge/research/sadl/owl2sadl/OwlToSadl.java | 135 ++++++++++++++++-- 2 files changed, 121 insertions(+), 15 deletions(-) diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java index 5e9873bce..f58ba9585 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/jena/JenaBasedSadlModelValidator.java @@ -1115,6 +1115,7 @@ else if(constant.equals("None")){ } private boolean isVariable(TypeCheckInfo tci) { + if (tci == null) return false; ConceptIdentifier ci = tci.getTypeCheckType(); if (ci instanceof ConceptName && ((ConceptName)ci).getType() != null && ((ConceptName)ci).getType().equals(ConceptType.VARIABLE)) { return true; diff --git a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/owl2sadl/OwlToSadl.java b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/owl2sadl/OwlToSadl.java index b3a98e570..4ee957604 100644 --- a/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/owl2sadl/OwlToSadl.java +++ b/sadl3/com.ge.research.sadl.parent/com.ge.research.sadl.jena/src/com/ge/research/sadl/owl2sadl/OwlToSadl.java @@ -44,6 +44,7 @@ import com.ge.research.sadl.jena.JenaBasedSadlModelProcessor; import com.ge.research.sadl.jena.inference.SadlJenaModelGetterPutter; import com.ge.research.sadl.preferences.SadlPreferences; +import com.ge.research.sadl.processing.SadlConstants; import com.ge.research.sadl.reasoner.ConfigurationException; import com.ge.research.sadl.utils.ResourceManager; import com.hp.hpl.jena.datatypes.RDFDatatype; @@ -132,6 +133,7 @@ public class OwlToSadl { public class ModelConcepts { private List ontologies = new ArrayList(); private List classes = new ArrayList(); + private List anonClasses = new ArrayList(); private List objProperties = new ArrayList(); private List dtProperties = new ArrayList(); private List rdfProperties = new ArrayList(); @@ -347,6 +349,14 @@ public void addErrorMessage(String errorMessage) { errorMessages.add(errorMessage); } } + + private List getAnonClasses() { + return anonClasses; + } + + private void addAnonClass(OntClass anonClass) { + this.anonClasses.add(anonClass); + } } /** @@ -561,7 +571,7 @@ private void process() throws Exception { alias = qNamePrefixes.get(baseUri + "#"); } } - if (alias != null) { + if (alias != null && alias.length() > 0) { sadlModel.append(" alias "); sadlModel.append(alias); } @@ -641,6 +651,9 @@ private void process() throws Exception { String impUri; try { impUri = imp.asOntology().getURI(); //getNameSpace(); + if (isImplicitUri(impUri)) { + continue; + } } catch (Exception e) { impUri = imp.toString(); @@ -869,6 +882,22 @@ private void process() throws Exception { } } + private boolean isImplicitUri(String impUri) { + if (impUri.equals(SadlConstants.SADL_BASE_MODEL_URI)) { + return true; + } + else if (impUri.equals(SadlConstants.SADL_BUILTIN_FUNCTIONS_URI)) { + return true; + } + else if (impUri.equals(SadlConstants.SADL_IMPLICIT_MODEL_URI)) { + return true; + } + else if (impUri.equals(SadlConstants.SADL_LIST_MODEL_URI)) { + return true; + } + return false; + } + private void addEndOfStatement(StringBuilder sb, int numLineFeeds) { if (sb.length() > 1 && Character.isDigit(sb.charAt(sb.length() - 1))) { sb.append(" ."); @@ -1232,8 +1261,8 @@ private List rdfListToList(Node lst, List trLst) { } return trLst; } - - private String individualToSadl(ModelConcepts concepts, Individual inst) { + + private String individualNameAndAnnotations(ModelConcepts concepts, Individual inst) { StringBuilder sb = new StringBuilder(); if (!inst.getNameSpace().equals(baseUri+'#')) { if (qNamePrefixes.containsKey(inst.getNameSpace())) { @@ -1254,6 +1283,12 @@ private String individualToSadl(ModelConcepts concepts, Individual inst) { sb.append(uriToSadlString(concepts, inst)); } addNotesAndAliases(sb, inst); + return sb.toString(); + } + + private String individualToSadl(ModelConcepts concepts, Individual inst) { + StringBuilder sb = new StringBuilder(); + sb.append(individualNameAndAnnotations(concepts, inst)); if (isNewLineAtEndOfBuffer(sb)) { sb.append(" "); } @@ -1282,7 +1317,7 @@ private String individualToSadl(ModelConcepts concepts, Individual inst) { StmtIterator insitr = inst.listProperties(); while (insitr.hasNext()) { Statement s = insitr.next(); - if (s.getPredicate().equals(RDF.type)) { + if (s.getPredicate().equals(RDF.type) || s.getPredicate().equals(RDFS.label) || s.getPredicate().equals(RDFS.comment)) { continue; } sb.append("\n has "); @@ -1390,6 +1425,15 @@ else if (!spcls.equals(OWL.Thing)) { else { sb.append(" is a class"); } + OntClass eqcls = cls.getEquivalentClass(); + if (eqcls != null) { + if (concepts.getAnonClasses().contains(eqcls)) { + concepts.getAnonClasses().remove(eqcls); + String str = uriToSadlString(concepts, eqcls); + sb.append(" must be "); + sb.append(str); + } + } // add properties with this class in the domain ExtendedIterator eitr2 = cls.listDeclaredProperties(true); while (eitr2.hasNext()) { @@ -1443,8 +1487,8 @@ else if (!spcls.equals(OWL.Thing)) { private void addNotesAndAliases(StringBuilder sb, Resource rsrc) { StmtIterator sitr = rsrc.listProperties(RDFS.label); if (sitr.hasNext()) { - addNewLineIfNotAtEndOfBuffer(sb); - sb.append(" (alias "); +// addNewLineIfNotAtEndOfBuffer(sb); + sb.append(" (alias "); int cntr = 0; while (sitr.hasNext()) { RDFNode alias = sitr.nextStatement().getObject(); @@ -1643,11 +1687,13 @@ private String rdfNodeToSadlString(ModelConcepts concepts, RDFNode object, boole } else if (object.isLiteral()) { String dturi = object.asLiteral().getDatatypeURI(); - forceQuotes = forceQuotes ? true : isRDFDatatypeString(dturi, object); + forceQuotes = forceQuotes ? true : (dturi != null ? isRDFDatatypeString(dturi, object) : true); if (object.asLiteral().getDatatypeURI() == null) { String lf = object.asLiteral().getLexicalForm(); - if (forceQuotes || lf.contains(" ")) { - return "\"" + object.asLiteral().getLexicalForm() + "\""; + if (forceQuotes || lf.contains(" ") || lf.contains("\"")) { + String s = object.asLiteral().getLexicalForm(); + s = s.replace("\"", "\\\""); + return "\"" + s + "\""; } return object.asLiteral().getLexicalForm(); } @@ -1672,10 +1718,17 @@ private String uriToSadlString(ModelConcepts concepts, Resource rsrc) { if (rsrc.getNameSpace().equals(XSD.getURI())) { return rsrc.getLocalName(); } - if (qNamePrefixes.containsKey(rsrc.getNameSpace())) { - return qNamePrefixes.get(rsrc.getNameSpace()) + ":" + checkLocalnameForKeyword(rsrc.getLocalName()); + String ns = rsrc.getNameSpace(); + String trimmedNs = ns.endsWith("#") ? ns.substring(0, ns.length() - 1) : null; + if (qNamePrefixes.containsKey(ns)) { + return qNamePrefixes.get(ns) + ":" + checkLocalnameForKeyword(rsrc.getLocalName()); } else { + if (trimmedNs != null) { + if (qNamePrefixes.containsKey(trimmedNs)) { + return qNamePrefixes.get(trimmedNs) + ":" + checkLocalnameForKeyword(rsrc.getLocalName()); + } + } return rsrc.getURI(); } } @@ -1687,6 +1740,47 @@ private String uriToSadlString(ModelConcepts concepts, Resource rsrc) { else if (rsrc.canAs(Restriction.class)) { return restrictionToString(concepts, null, rsrc.as(Restriction.class)); } + else if (rsrc instanceof OntClass) { +// OntClass eqcls = ((OntClass)rsrc).getEquivalentClass(); +// if (eqcls != null) { +// return uriToSadlString(concepts, eqcls); +// } + EnumeratedClass enumcls = ((OntClass)rsrc).asEnumeratedClass(); + if (enumcls != null) { + ExtendedIterator eitr = enumcls.listInstances(); + while (eitr.hasNext()) { + OntResource en = eitr.next(); + en.toString(); + } + ExtendedIterator eitr2 = enumcls.listIsDefinedBy(); + while (eitr2.hasNext()) { + RDFNode en = eitr2.next(); + en.toString(); + } + RDFList oneoflst = enumcls.getOneOf(); + List nodeLst = oneoflst.asJavaList(); + if (nodeLst != null && nodeLst.size() > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("one of {"); + int cntr = 0; + for (int i = 0; i < nodeLst.size(); i++) { + RDFNode n = nodeLst.get(i); + if (cntr > 0) sb.append(", "); + sb.append("\n "); + if (n.canAs(Individual.class)&& concepts.getInstances().contains(n)) { + sb.append(individualNameAndAnnotations(concepts, n.as(Individual.class))); + concepts.getInstances().remove(n); + } + else { + sb.append(rdfNodeToSadlString(concepts, n, false)); + } + cntr++; + } + sb.append("}"); + return sb.toString(); + } + } + } } return rsrc.toString(); } @@ -1702,8 +1796,14 @@ private String checkLocalnameForKeyword(String localName) { private boolean addResourceToList(ModelConcepts concepts, OntResource ontRsrc) { Resource type = ontRsrc.getRDFType(); if (type.equals(OWL.Class)) { - concepts.addClass(ontRsrc.as(OntClass.class)); - return true; + if (ontRsrc.isAnon() && ontRsrc.canAs(OntClass.class)) { + concepts.addAnonClass(ontRsrc.as(OntClass.class)); + return true; + } + else { + concepts.addClass(ontRsrc.as(OntClass.class)); + return true; + } } else if (type.equals(OWL.ObjectProperty)) { concepts.addObjProperty(ontRsrc.asObjectProperty()); @@ -1734,8 +1834,13 @@ else if (type.equals(OWL.AnnotationProperty)) { return true; } else if (type.equals(OWL.Ontology)) { - concepts.addOntology(ontRsrc.asOntology()); - return true; + if (!isImplicitUri(ontRsrc.getURI())) { + concepts.addOntology(ontRsrc.asOntology()); + return true; + } + else { + return false; + } } else if (type.equals(RDFS.Datatype)) { if (ontRsrc.isAnon()) {