Skip to content

Commit 0ce01b9

Browse files
OWL translation for enumerations. Testing needed.
1 parent b4a6cb9 commit 0ce01b9

15 files changed

+386
-299
lines changed

runTest.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env bash
2+
3+
java -jar ./target/scala-3.2.2/uml2semantics.jar \
4+
-c "./src/test/resources/Employer - Classes.tsv" \
5+
-a "./src/test/resources/Employer - Attributes.tsv" \
6+
-e "./src/test/resources/Employer - Enumerations.tsv" \
7+
-n "./src/test/resources/Employer - EnumerationNamedValues.tsv" \
8+
-o "./src/test/resources/employer.rdf" \
9+
-p "emp:http://uml2semantics.org/examples/employer#" \
10+
-i "http://uml2semantics.org/examples/employer/v.0.1"

src/main/scala/org/uml2semantics/Main.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ val argParser =
2929
opt[Option[File]]('a', "attributes")
3030
.valueName("<csv-attributes-file>")
3131
.action((a, c) => c.copy(attributesTsv = a))
32+
.validate(o =>
33+
if (o.exists(f => f.exists()) || o.isEmpty) success
34+
else failure(s"The file \"${o.get}\" does not exist.")
35+
)
3236
.text("A TSV file containing UML class attribute information"),
3337
opt[Option[File]]('e', "enumerations")
3438
.valueName("<csv-enumerations-file>")
@@ -41,6 +45,10 @@ val argParser =
4145
opt[Option[File]]('n', "enumeration values")
4246
.valueName("<csv-enumeration-values-file>")
4347
.action((a, c) => c.copy(enumerationsValuesTsv = a))
48+
.validate(o =>
49+
if (o.exists(f => f.exists()) || o.isEmpty) success
50+
else failure(s"The file \"${o.get}\" does not exist.")
51+
)
4452
.text("A TSV file containing UML enumeration values"),
4553
opt[Option[File]]('o', "ontology")
4654
.required()

src/main/scala/org/uml2semantics/model/UMLClassDiagram.scala

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ case class UMLClassAttributeName(name: String = "") extends UMLClassAttributeNam
4141

4242
override def nonEmpty: Boolean = name.nonEmpty
4343

44-
override def getName(classNamedElement: UMLClassNamedElement): String =
45-
logger.debug(s"classNamedElement=$classNamedElement ${Code.source}")
46-
classNamedElement match
44+
override def getName(namedElement: UMLClassNamedElement): String =
45+
logger.debug(s"classNamedElement=$namedElement ${Code.source}")
46+
namedElement match
4747
case UMLClassCurie(curieOption) => curieOption.get.prefixReference.reference + FRAGMENT_SEPARATOR + name
48-
case _ => classNamedElement.getName + FRAGMENT_SEPARATOR + name
48+
case _ => namedElement.getName + FRAGMENT_SEPARATOR + name
4949

5050
case class UMLClassAttributeCurie(curieOption: Option[Curie]) extends UMLClassAttributeNamedElement:
5151
private val logger = Logger[this.type]
5252

5353
override def nonEmpty: Boolean = curieOption.nonEmpty
5454

55-
override def getName(classNamedElement: UMLClassNamedElement): String =
56-
logger.debug(s"classNamedElement=$classNamedElement ${Code.source}")
57-
classNamedElement match
55+
override def getName(namedElement: UMLClassNamedElement): String =
56+
logger.debug(s"classNamedElement=$namedElement ${Code.source}")
57+
namedElement match
5858
case UMLClassCurie(curieOption) => curieOption.get.prefixReference.reference + FRAGMENT_SEPARATOR +
5959
curieOption.get.prefixReference.reference
60-
case _ => classNamedElement.getName + FRAGMENT_SEPARATOR + curieOption.get.prefixReference.reference
60+
case _ => namedElement.getName + FRAGMENT_SEPARATOR + curieOption.get.prefixReference.reference
6161

6262

6363
sealed trait UMLEnumerationNamedElement extends UMLNamedElement:
@@ -81,23 +81,23 @@ case class UMLEnumerationValueName(name: String = "") extends UMLEnumerationValu
8181

8282
override def nonEmpty: Boolean = name.nonEmpty
8383

84-
override def getName(enumerationNamedElement: UMLEnumerationNamedElement): String =
85-
logger.debug(s"enumerationNamedElement=$enumerationNamedElement ${Code.source}")
86-
enumerationNamedElement match
84+
override def getName(namedElement: UMLEnumerationNamedElement): String =
85+
logger.debug(s"enumerationNamedElement=$namedElement ${Code.source}")
86+
namedElement match
8787
case UMLEnumerationCurie(curieOption) => curieOption.get.prefixReference.reference + FRAGMENT_SEPARATOR + name
88-
case _ => enumerationNamedElement.getName + FRAGMENT_SEPARATOR + name
88+
case _ => namedElement.getName + FRAGMENT_SEPARATOR + name
8989

9090
case class UMLEnumerationValueCurie(curieOption: Option[Curie]) extends UMLEnumerationValueNamedElement:
9191
private val logger = Logger[this.type]
9292

9393
override def nonEmpty: Boolean = curieOption.nonEmpty
9494

95-
override def getName(enumerationNamedElement: UMLEnumerationNamedElement): String =
96-
logger.debug(s"enumerationNamedElement=$enumerationNamedElement ${Code.source}")
97-
enumerationNamedElement match
95+
override def getName(namedElement: UMLEnumerationNamedElement): String =
96+
logger.debug(s"enumerationNamedElement=$namedElement ${Code.source}")
97+
namedElement match
9898
case UMLEnumerationCurie(curieOption) => curieOption.get.prefixReference.reference + FRAGMENT_SEPARATOR +
9999
curieOption.get.prefixReference.reference
100-
case _ => enumerationNamedElement.getName + FRAGMENT_SEPARATOR + curieOption.get.prefixReference.reference
100+
case _ => namedElement.getName + FRAGMENT_SEPARATOR + curieOption.get.prefixReference.reference
101101

102102

103103
case class UMLClassAttributeIdentity(classNamedElement: UMLClassNamedElement,
@@ -149,7 +149,9 @@ object UMLClassAttributeIdentity:
149149

150150
classAttributeIdentity
151151

152-
private def populate(classNamedElement: UMLClassNamedElement, attributeNamedElement: UMLClassAttributeNamedElement, ontologyPrefix: PrefixNamespace,
152+
private def populate(classNamedElement: UMLClassNamedElement,
153+
attributeNamedElement: UMLClassAttributeNamedElement,
154+
ontologyPrefix: PrefixNamespace,
153155
attributeIdentity: UMLClassAttributeIdentity,
154156
label: String): Unit = {
155157
logger.debug(s"classNamedElement=$classNamedElement, attributeNamedElement=$attributeNamedElement, " +
@@ -211,7 +213,9 @@ object UMLEnumerationValueIdentity:
211213

212214
enumerationValueIdentity
213215

214-
private def populate(enumerationNamedElement: UMLEnumerationNamedElement, valueNamedElement: UMLEnumerationValueNamedElement, ontologyPrefix: PrefixNamespace,
216+
private def populate(enumerationNamedElement: UMLEnumerationNamedElement,
217+
valueNamedElement: UMLEnumerationValueNamedElement,
218+
ontologyPrefix: PrefixNamespace,
215219
valueIdentity: UMLEnumerationValueIdentity,
216220
label: String): Unit = {
217221
logger.debug(s"enumerationNamedElement=$enumerationNamedElement, valueNamedElement=$valueNamedElement, " +
@@ -240,13 +244,13 @@ object UMLClassParentNamedElements:
240244
.map(m => UMLClassIdentity.findClassNamedElement(m).get.classNamedElement)
241245
new UMLClassParentNamedElements(setOfParentUncertainClassNamedElements)
242246

243-
case class UMLClasses(mapOfUMLClasses: Map[UMLClassNamedElement, UMLClass])
247+
case class UMLClasses(umlClasses: Map[UMLClassNamedElement, UMLClass])
244248

245-
case class UMLClassAttributes(mapOfUMLClassAttributes: Map[UMLClassAttributeNamedElement, UMLClassAttribute])
249+
case class UMLClassAttributes(umlClassAttributes: Map[UMLClassAttributeNamedElement, UMLClassAttribute])
246250

247-
case class UMLEnumerations(mapOfUMLEnumerations: Map[UMLEnumerationNamedElement, UMLEnumeration])
251+
case class UMLEnumerations(umlEnumerations: Map[UMLEnumerationNamedElement, UMLEnumeration])
248252

249-
case class UMLEnumerationValues(mapOfUMLEnumerationValues: Map[UMLEnumerationValueNamedElement, UMLEnumerationValue])
253+
case class UMLEnumerationValues(umlEnumerationValues: Map[UMLEnumerationValueNamedElement, UMLEnumerationValue])
250254

251255
sealed trait UMLElementIRI:
252256
val iri: String
@@ -256,7 +260,8 @@ case class UMLClassIRI(override val iri: String) extends UMLElementIRI
256260
object UMLClassIRI:
257261
private val logger = Logger[this.type]
258262

259-
def apply(ontologyPrefix: PrefixNamespace, classNamedElement: UMLClassNamedElement): UMLClassIRI =
263+
def apply(ontologyPrefix: PrefixNamespace,
264+
classNamedElement: UMLClassNamedElement): UMLClassIRI =
260265
logger.debug(s"ontologyPrefix=$ontologyPrefix, classNamedElement=$classNamedElement ${Code.source}")
261266
classNamedElement match
262267
case classNamedElementType: UMLClassCurie =>
@@ -270,7 +275,8 @@ case class UMLClassAttributeIRI(override val iri: String) extends UMLElementIRI
270275
object UMLClassAttributeIRI:
271276
private val logger = Logger[this.type]
272277

273-
def apply(ontologyPrefix: PrefixNamespace, classNamedElement: UMLClassNamedElement,
278+
def apply(ontologyPrefix: PrefixNamespace,
279+
classNamedElement: UMLClassNamedElement,
274280
classAttributeNamedElement: UMLClassAttributeNamedElement): UMLClassAttributeIRI =
275281
logger.debug(s"ontologyPrefix.prefixIRI.iri = ${ontologyPrefix.prefixIRI.iri}, " +
276282
s"classAttributeNamedElement.getName = ${classAttributeNamedElement.getName} ${Code.source}")
@@ -301,7 +307,8 @@ case class UMLEnumerationValueIRI(override val iri: String) extends UMLElementIR
301307
object UMLEnumerationValueIRI:
302308
private val logger = Logger[this.type]
303309

304-
def apply(ontologyPrefix: PrefixNamespace, enumerationNamedElement: UMLEnumerationNamedElement,
310+
def apply(ontologyPrefix: PrefixNamespace,
311+
enumerationNamedElement: UMLEnumerationNamedElement,
305312
enumerationValueNamedElement: UMLEnumerationValueNamedElement): UMLEnumerationValueIRI =
306313
logger.debug(s"ontologyPrefix.prefixIRI.iri = ${ontologyPrefix.prefixIRI.iri}, " +
307314
s"enumerationValueNamedElement.getName = ${enumerationValueNamedElement.getName} ${Code.source}")
@@ -432,8 +439,10 @@ object UMLClassIdentity:
432439
classIdentity
433440

434441

435-
private def populate(classNamedElement: UMLClassNamedElement, ontologyPrefix: PrefixNamespace,
436-
classIdentity: UMLClassIdentity, label: String): Unit = {
442+
private def populate(classNamedElement: UMLClassNamedElement,
443+
ontologyPrefix: PrefixNamespace,
444+
classIdentity: UMLClassIdentity,
445+
label: String): Unit = {
437446
logger.debug(s"classNamedElement=$classNamedElement, ontologyPrefix=$ontologyPrefix, classIdentity=$classIdentity, " +
438447
s"label=$label, ${Code.source}")
439448
val classIRI: UMLClassIRI = UMLClassIRI(ontologyPrefix, classNamedElement)
@@ -502,8 +511,10 @@ object UMLEnumerationIdentity:
502511
enumerationIdentity
503512

504513

505-
private def populate(enumerationNamedElement: UMLEnumerationNamedElement, ontologyPrefix: PrefixNamespace,
506-
enumerationIdentity: UMLEnumerationIdentity, label: String): Unit = {
514+
private def populate(enumerationNamedElement: UMLEnumerationNamedElement,
515+
ontologyPrefix: PrefixNamespace,
516+
enumerationIdentity: UMLEnumerationIdentity,
517+
label: String): Unit = {
507518
logger.debug(s"enumerationNamedElement=$enumerationNamedElement, ontologyPrefix=$ontologyPrefix, enumerationIdentity=$enumerationIdentity, " +
508519
s"label=$label, ${Code.source}")
509520
val enumerationIRI: UMLEnumerationIRI = UMLEnumerationIRI(ontologyPrefix, enumerationNamedElement)
@@ -591,15 +602,45 @@ case class UMLClassAttribute(attributeIdentity: UMLClassAttributeIdentity,
591602
case class UMLEnumerationDefinition(definition: String = "")
592603

593604
case class UMLEnumeration(enumeratonIdentity: UMLEnumerationIdentity,
594-
enumerationDefinition: UMLEnumerationDefinition = UMLEnumerationDefinition())
605+
definition: UMLEnumerationDefinition = UMLEnumerationDefinition())
595606
extends UMLClassDiagramElement
596607

608+
609+
object UMLEnumeration:
610+
private val logger = Logger[this.type]
611+
612+
private val enumerationsWithEnumerationValues: mutable.HashMap[UMLEnumerationIdentity, mutable.Set[UMLEnumerationValueIdentity]] =
613+
mutable.HashMap[UMLEnumerationIdentity, mutable.Set[UMLEnumerationValueIdentity]]()
614+
615+
def cache(enumerationIdentity: UMLEnumerationIdentity, enumerationValueIdentity: UMLEnumerationValueIdentity): UMLEnumerationIRI =
616+
val enumerationValues: mutable.Set[UMLEnumerationValueIdentity] =
617+
enumerationsWithEnumerationValues.getOrElse(enumerationIdentity, mutable.HashSet[UMLEnumerationValueIdentity]())
618+
enumerationValues += enumerationValueIdentity
619+
enumerationIdentity.enumerationIRI
620+
621+
def find(enumerationIdentity: UMLEnumerationIdentity): Option[mutable.Set[UMLEnumerationValueIdentity]] =
622+
enumerationsWithEnumerationValues.get(enumerationIdentity)
623+
624+
597625
case class UMLEnumerationValueDefinition(definition: String = "")
598626

599627
case class UMLEnumerationValue(valueIdentity: UMLEnumerationValueIdentity,
600628
definition: UMLEnumerationValueDefinition = UMLEnumerationValueDefinition())
601629
extends UMLClassDiagramElement
602630

631+
object UMLEnumerationValue:
632+
private val enumerationValuesByIdentity: mutable.HashMap[UMLEnumerationValueIdentity, UMLEnumerationValue] =
633+
mutable.HashMap[UMLEnumerationValueIdentity, UMLEnumerationValue]()
634+
635+
def apply(valueIdentity: UMLEnumerationValueIdentity,
636+
definition: UMLEnumerationValueDefinition): UMLEnumerationValue =
637+
val umlEnumerationValue = new UMLEnumerationValue(valueIdentity, definition)
638+
enumerationValuesByIdentity += (valueIdentity -> umlEnumerationValue)
639+
umlEnumerationValue
640+
641+
def find(valueIdentity: UMLEnumerationValueIdentity): Option[UMLEnumerationValue] =
642+
enumerationValuesByIdentity.get(valueIdentity)
643+
603644
case class UMLClassDiagram(owlOntologyFile: File,
604645
ontologyIRI: OntologyIRI,
605646
ontologyPrefix: PrefixNamespace,

0 commit comments

Comments
 (0)