All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.umlg.javageneration.visitor.clazz.ClassValidateMultiplicitiesBuilder Maven / Gradle / Ivy

package org.umlg.javageneration.visitor.clazz;

import org.eclipse.uml2.uml.AssociationClass;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Property;
import org.umlg.framework.VisitSubclasses;
import org.umlg.framework.Visitor;
import org.umlg.generation.Workspace;
import org.umlg.java.metamodel.OJField;
import org.umlg.java.metamodel.OJIfStatement;
import org.umlg.java.metamodel.OJPathName;
import org.umlg.java.metamodel.annotation.OJAnnotatedClass;
import org.umlg.java.metamodel.annotation.OJAnnotatedOperation;
import org.umlg.javageneration.util.PropertyWrapper;
import org.umlg.javageneration.util.UmlgGenerationUtil;
import org.umlg.javageneration.util.UmlgClassOperations;
import org.umlg.javageneration.visitor.BaseVisitor;

public class ClassValidateMultiplicitiesBuilder extends BaseVisitor implements Visitor {

    public ClassValidateMultiplicitiesBuilder(Workspace workspace) {
        super(workspace);
    }

    @Override
    @VisitSubclasses({Class.class, AssociationClass.class})
    public void visitBefore(Class clazz) {
        OJAnnotatedClass annotatedClass = findOJClass(clazz);
        OJAnnotatedOperation validateMultiplicities = new OJAnnotatedOperation("validateMultiplicities", new OJPathName("java.util.List").addToGenerics(UmlgGenerationUtil.UmlgConstraintViolation));
        UmlgGenerationUtil.addOverrideAnnotation(validateMultiplicities);
        annotatedClass.addToOperations(validateMultiplicities);
        OJField result = new OJField("result", new OJPathName("java.util.List").addToGenerics(UmlgGenerationUtil.UmlgConstraintViolation));
        result.setInitExp("new ArrayList<" + UmlgGenerationUtil.UmlgConstraintViolation.getLast() + ">()");
        annotatedClass.addToImports(new OJPathName("java.util.ArrayList"));
        validateMultiplicities.getBody().addToLocals(result);
        for (Property p : UmlgClassOperations.getAllProperties(clazz)) {
            PropertyWrapper pWrap = new PropertyWrapper(p);
            //Qualified properties raw multiplicity is assumed to be *
            if (!pWrap.isDerived() && !pWrap.isQualified() && (pWrap.getLower() > 0 || (pWrap.isMany() && pWrap.getUpper() != -1))) {
                if (pWrap.getLower() > 0) {
                    OJIfStatement ifNotNull;
                    if (pWrap.isMany()) {
                        ifNotNull = new OJIfStatement(pWrap.getter() + "().size() < " + pWrap.getLower());
                    } else {
                        ifNotNull = new OJIfStatement(pWrap.getter() + "() == null");
                    }
                    ifNotNull.addToThenPart("result.add(new " + UmlgGenerationUtil.UmlgConstraintViolation.getLast() + "(\"multiplicity\", \"" + pWrap.getQualifiedName() + "\", \"lower multiplicity is " + pWrap.getLower() + "\"))");
                    validateMultiplicities.getBody().addToStatements(ifNotNull);
                }
                if (pWrap.getUpper() != -1) {
                    if (pWrap.isMany()) {
                        OJIfStatement ifNotNull = new OJIfStatement(pWrap.getter() + "().size() > " + pWrap.getUpper());
                        ifNotNull.addToThenPart("result.add(new " + UmlgGenerationUtil.UmlgConstraintViolation.getLast() + "(\"multiplicity\", \"" + pWrap.getQualifiedName() + "\", \"upper multiplicity is " + pWrap.getUpper() + "\"))");
                        validateMultiplicities.getBody().addToStatements(ifNotNull);
                    }
                }
            }
        }
        validateMultiplicities.getBody().addToStatements("return result");
    }

    @Override
    public void visitAfter(Class element) {

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy