Skip to content

Commit

Permalink
Merge pull request #75 from stefanschoon/datatypes
Browse files Browse the repository at this point in the history
Added support for data types
  • Loading branch information
h-man2 authored Jun 13, 2024
2 parents 6534cc6 + 1b0cdca commit 62850ef
Show file tree
Hide file tree
Showing 151 changed files with 4,482 additions and 1,451 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
.idea/**/encodings.xml

# AWS User-specific
.idea/**/aws.xml
Expand Down
1 change: 1 addition & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
USE NEWS -- history of user-visible changes.
Please see the file `README' for a description of how to report bugs.

** Changes between version 7.1.0 and X.X.X
* USE now supports data types

** Changes between version 5.2.0 and 6.0.0
* New OCL complexity plugin
* New object to class plugin version
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ similar to the following.

```
loading properties from: C:\Dev\USE\use-6.0.0\etc\use.properties
USE version X.X.X, Copyright (C) 1999-2021 University of Bremen
USE version X.X.X, Copyright (C) 1999-2024 University of Bremen & University of Applied Sciences Hamburg
Plugin path: [C:\Dev\USE\use-6.0.0\lib\plugins]
Plugin filename(s) [AssociationExtend.jar,ModelValidatorPlugin-5.2.0-r1.jar,ObjectToClassPlugin-2.0.jar,OCLComplexityPlugin5.1.0.jar,use-filmstrip.jar]
compiling specification...
Expand Down
67 changes: 66 additions & 1 deletion manual/main.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ example must therefore be translated into a USE specification[^1] by
using an external text editor. The USE specification of the example
model is shown below.


model Cars

class Car
Expand Down Expand Up @@ -316,6 +315,72 @@ Example:

enum Flatware {Spoon, Fork, Knife}

#### Data types

Data types may be added at the top of the model body.

#### Syntax

<datatypedefinition> ::= [ abstract ] dataType <datatypename> [ < <datatypename> { , <datatypename> } ]
[ operations { <operationdeclaration> [ = <oclexpression> ]
{ <preconditiondefinition> | <postconditiondefinition> } } ]
[ constraints { <invariantdefinition> } ]
end
<datatypename> ::= <name>

Example:

The example shows four different data type definitions. The data types
'Rectange' and 'Circle' inherit from abstract data type 'Shape'. 'Shape'
defines the attribute 'position' which is of type 'Point' in its constructor.
'Point' defines the attributes 'x' and 'y' which are both of primitive type
'Real'. It also defines the operation 'translate()' which takes two parameters
of type 'Real'for shifting 'x' and 'y' with no result type. 'Shape' defines
the two opeartions 'perimeter()' and 'area()'. Since 'Shape' is abstract both
'Rectangle' and 'Circle' implement their specific logic for these operations.
Note that a constructor canonly have pre- and no postconditions, since it is a
stateless operation.

dataType Point
operations
Point(x : Real, y : Real)
translate(dx : Real, dy : Real)(dx) : Point =
Point(self.x + dx, self.y + dy)
end

abstract dataType Shape
operations
Shape(position : Point)
perimeter() : Real
area() : Real
end

dataType Rectangle < Shape
operations
Rectangle(position : Point, width : Real, height : Real)(position)
perimeter() : Real = 2.0 * width + 2.0 * height
area() : Real = width * height
end

dataType Circle < Shape
operations
Circle(position : Point, radius : Real)(position)
perimeter() : Real = 2.0 * 3.14 * radius
area() : Real = 3.14 * radius * radius
end

Following examample shows, how to query data types
from the above model 'Shapes' in the shell:

use> ?Point(1, 1)
-> Point{x=1, y=1} : Point
use> ?Point(1, 1).translate(3, 4)
-> Point{x=4, y=5} : Point
use> ?Rectangle(Point(2, 2), 2, 3).perimeter()
-> 10.0 : Real
use> ?Circle(Point(2, 6), 2, 3).area()
-> 12.56 : Real

#### Classes

A class has a name and optionally attribute and operation definitions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,67 +16,13 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

package org.tzi.use.analysis.coverage;

import java.util.Stack;

import org.tzi.use.uml.mm.MAssociation;
import org.tzi.use.uml.mm.MAttribute;
import org.tzi.use.uml.mm.MClass;
import org.tzi.use.uml.mm.MNavigableElement;
import org.tzi.use.uml.mm.MOperation;
import org.tzi.use.uml.ocl.expr.ExpAllInstances;
import org.tzi.use.uml.ocl.expr.ExpAny;
import org.tzi.use.uml.ocl.expr.ExpAsType;
import org.tzi.use.uml.ocl.expr.ExpAttrOp;
import org.tzi.use.uml.ocl.expr.ExpBagLiteral;
import org.tzi.use.uml.ocl.expr.ExpClosure;
import org.tzi.use.uml.ocl.expr.ExpCollect;
import org.tzi.use.uml.ocl.expr.ExpCollectNested;
import org.tzi.use.uml.ocl.expr.ExpCollectionLiteral;
import org.tzi.use.uml.ocl.expr.ExpConstBoolean;
import org.tzi.use.uml.ocl.expr.ExpConstEnum;
import org.tzi.use.uml.ocl.expr.ExpConstInteger;
import org.tzi.use.uml.ocl.expr.ExpConstReal;
import org.tzi.use.uml.ocl.expr.ExpConstString;
import org.tzi.use.uml.ocl.expr.ExpConstUnlimitedNatural;
import org.tzi.use.uml.ocl.expr.ExpEmptyCollection;
import org.tzi.use.uml.ocl.expr.ExpExists;
import org.tzi.use.uml.ocl.expr.ExpForAll;
import org.tzi.use.uml.ocl.expr.ExpIf;
import org.tzi.use.uml.ocl.expr.ExpIsKindOf;
import org.tzi.use.uml.ocl.expr.ExpIsTypeOf;
import org.tzi.use.uml.ocl.expr.ExpIsUnique;
import org.tzi.use.uml.ocl.expr.ExpIterate;
import org.tzi.use.uml.ocl.expr.ExpLet;
import org.tzi.use.uml.ocl.expr.ExpNavigation;
import org.tzi.use.uml.ocl.expr.ExpNavigationClassifierSource;
import org.tzi.use.uml.ocl.expr.ExpObjAsSet;
import org.tzi.use.uml.ocl.expr.ExpObjOp;
import org.tzi.use.uml.ocl.expr.ExpObjRef;
import org.tzi.use.uml.ocl.expr.ExpObjectByUseId;
import org.tzi.use.uml.ocl.expr.ExpOclInState;
import org.tzi.use.uml.ocl.expr.ExpOne;
import org.tzi.use.uml.ocl.expr.ExpOrderedSetLiteral;
import org.tzi.use.uml.ocl.expr.ExpQuery;
import org.tzi.use.uml.ocl.expr.ExpRange;
import org.tzi.use.uml.ocl.expr.ExpReject;
import org.tzi.use.uml.ocl.expr.ExpSelect;
import org.tzi.use.uml.ocl.expr.ExpSelectByKind;
import org.tzi.use.uml.ocl.expr.ExpSelectByType;
import org.tzi.use.uml.ocl.expr.ExpSequenceLiteral;
import org.tzi.use.uml.ocl.expr.ExpSetLiteral;
import org.tzi.use.uml.ocl.expr.ExpSortedBy;
import org.tzi.use.uml.ocl.expr.ExpStdOp;
import org.tzi.use.uml.ocl.expr.ExpTupleLiteral;
import org.tzi.use.uml.ocl.expr.ExpTupleSelectOp;
import org.tzi.use.uml.ocl.expr.ExpUndefined;
import org.tzi.use.uml.ocl.expr.ExpVariable;
import org.tzi.use.uml.ocl.expr.Expression;
import org.tzi.use.uml.ocl.expr.ExpressionVisitor;
import org.tzi.use.uml.ocl.expr.ExpressionWithValue;
import org.tzi.use.uml.ocl.expr.VarDecl;
import org.tzi.use.uml.ocl.expr.VarDeclList;
import org.tzi.use.uml.mm.*;
import org.tzi.use.uml.ocl.expr.*;

/**
* Abstract visitor implementation.
Expand All @@ -92,21 +38,25 @@ public AbstractCoverageVisitor(boolean expandOperations) {
this.expandOperations = expandOperations;
}

protected abstract void addDataTypeCoverage(MDataType cls);

protected abstract void addClassCoverage(MClass cls);

protected abstract void addAssociationEndCoverage(MNavigableElement dst);

protected abstract void addAssociationCoverage(MAssociation assoc);

protected abstract void addAttributeCoverage(MClass sourceClass,
protected abstract void addAttributeCoverage(MClassifier sourceClassifier,
MAttribute att);

protected abstract void addOperationCoverage(MClass sourceClass,
protected abstract void addOperationCoverage(MClassifier sourceClassifier,
MOperation att);

@Override
public void visitAllInstances(ExpAllInstances exp) {
if (exp.getSourceType() instanceof MClass) {
if (exp.getSourceType() instanceof MDataType) {
addDataTypeCoverage((MDataType) exp.getSourceType());
} else if (exp.getSourceType() instanceof MClass) {
addClassCoverage((MClass) exp.getSourceType());
} else if (exp.getSourceType() instanceof MAssociation) {
addAssociationCoverage((MAssociation) exp.getSourceType());
Expand Down Expand Up @@ -246,7 +196,24 @@ public void visitObjOp(ExpObjOp exp) {
ex.processWithVisitor(this);
}

addOperationCoverage((MClass) exp.getArguments()[0].type(),
addOperationCoverage((MClassifier) exp.getArguments()[0].type(),
exp.getOperation());

if (expandOperations && exp.getOperation().hasExpression()
&& !operationStack.contains(exp.getOperation())) {
operationStack.push(exp.getOperation());
exp.getOperation().expression().processWithVisitor(this);
operationStack.pop();
}
}

@Override
public void visitInstanceConstructor(ExpInstanceConstructor exp) {
for (Expression ex : exp.getArguments()) {
ex.processWithVisitor(this);
}

addOperationCoverage((MClassifier) exp.getArguments()[0].type(),
exp.getOperation());

if (expandOperations && exp.getOperation().hasExpression()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
package org.tzi.use.analysis.coverage;

import org.tzi.use.uml.mm.MAttribute;
import org.tzi.use.uml.mm.MClass;
import org.tzi.use.uml.mm.MClassifier;

/**
* A MAttribute can be defined in a base class.
Expand All @@ -33,11 +33,11 @@
*/
public class AttributeAccessInfo implements Comparable<AttributeAccessInfo> {
private MAttribute attribute;
private MClass sourceClass;
private MClassifier sourceClassifier;

public AttributeAccessInfo(MClass cls, MAttribute att) {
public AttributeAccessInfo(MClassifier cf, MAttribute att) {
this.attribute = att;
this.sourceClass = cls;
this.sourceClassifier = cf;
}

/**
Expand All @@ -50,8 +50,8 @@ public MAttribute getAttribute() {
/**
* @return the sourceClass
*/
public MClass getSourceClass() {
return sourceClass;
public MClassifier getSourceClass() {
return sourceClassifier;
}

@Override
Expand All @@ -69,7 +69,7 @@ public boolean equals(Object o) {

@Override
public int hashCode() {
return (sourceClass.name() + attribute.name()).hashCode();
return (sourceClassifier.name() + attribute.name()).hashCode();
}

/* (non-Javadoc)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,22 @@
import java.util.HashSet;
import java.util.Set;

import org.tzi.use.uml.mm.MAssociation;
import org.tzi.use.uml.mm.MAttribute;
import org.tzi.use.uml.mm.MClass;
import org.tzi.use.uml.mm.MOperation;
import org.tzi.use.uml.mm.*;

/**
* Basic coverage data, i. e., sets of model elements.
* @author Lars Hamann
*
*/
public class BasicCoverageData {
private Set<MClass> coveredClasses = new HashSet<MClass>();
private Set<MClassifier> coveredClasses = new HashSet<MClassifier>();
private Set<MAttribute> coveredAttributes = new HashSet<MAttribute>();
private Set<MOperation> coveredOperations = new HashSet<MOperation>();
private Set<MAssociation> coveredAssociations = new HashSet<MAssociation>();
/**
* @return the coveredClasses
*/
public Set<MClass> getCoveredClasses() {
public Set<MClassifier> getCoveredClasses() {
return coveredClasses;
}
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,7 @@

package org.tzi.use.analysis.coverage;

import org.tzi.use.uml.mm.MAssociation;
import org.tzi.use.uml.mm.MAttribute;
import org.tzi.use.uml.mm.MClass;
import org.tzi.use.uml.mm.MNavigableElement;
import org.tzi.use.uml.mm.MOperation;
import org.tzi.use.uml.mm.*;
import org.tzi.use.uml.ocl.expr.ExpObjectByUseId;
import org.tzi.use.uml.ocl.expr.ExpRange;
import org.tzi.use.uml.ocl.expr.Expression;
Expand Down Expand Up @@ -58,6 +54,11 @@ public BasicCoverageData calcualteCoverage(Expression expr) {
return coverage;
}

@Override
protected void addDataTypeCoverage(MDataType dtp) {
coverage.getCoveredClasses().add(dtp);
}

@Override
protected void addClassCoverage(MClass cls) {
coverage.getCoveredClasses().add(cls);
Expand All @@ -74,7 +75,7 @@ protected void addAssociationCoverage(MAssociation assoc) {
}

@Override
protected void addAttributeCoverage(MClass sourceClass, MAttribute att) {
protected void addAttributeCoverage(MClassifier sourceClassifier, MAttribute att) {
coverage.getCoveredAttributes().add(att);
}

Expand All @@ -85,7 +86,7 @@ public void visitObjectByUseId(ExpObjectByUseId expObjectByUseId) {
}

@Override
protected void addOperationCoverage(MClass sourceClass, MOperation op) {
protected void addOperationCoverage(MClassifier sourceClassifier, MOperation op) {
coverage.getCoveredOperations().add(op);
}

Expand Down
Loading

0 comments on commit 62850ef

Please sign in to comment.