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

net.sf.nakeduml.javageneration.basicjava.OperationAnnotator Maven / Gradle / Ivy

package net.sf.nakeduml.javageneration.basicjava;

import java.util.Iterator;

import net.sf.nakeduml.feature.visit.VisitBefore;
import net.sf.nakeduml.javageneration.NakedOperationMap;
import net.sf.nakeduml.javageneration.StereotypeAnnotator;
import net.sf.nakeduml.javametamodel.OJParameter;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedClass;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedInterface;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedOperation;
import net.sf.nakeduml.metamodel.commonbehaviors.INakedBehavior;
import net.sf.nakeduml.metamodel.core.INakedClassifier;
import net.sf.nakeduml.metamodel.core.INakedElement;
import net.sf.nakeduml.metamodel.core.INakedEntity;
import net.sf.nakeduml.metamodel.core.INakedEnumeration;
import net.sf.nakeduml.metamodel.core.INakedInterfaceRealization;
import net.sf.nakeduml.metamodel.core.INakedOperation;
import net.sf.nakeduml.metamodel.core.INakedStructuredDataType;
import net.sf.nakeduml.metamodel.core.IParameterOwner;
import nl.klasse.octopus.model.IOperation;
import nl.klasse.octopus.model.IParameter;

public class OperationAnnotator extends StereotypeAnnotator {
	@VisitBefore(matchSubclasses = true)
	public void visitBehavior(INakedBehavior o) {
		if (hasOJClass(o.getContext()) && !o.isClassifierBehavior() && o.getOwnerElement() instanceof INakedClassifier) {
			// DO not do effects and
			// state actions classifier behavior will be invoked elsewhere
			if (o.getSpecification() == null || !o.getSpecification().getOwner().equals(o.getContext())) {
				// if there is no specification or the specificatoin is in a
				// superclass/interface,
				// we need to create a matching OJOperation
				createOperation(o, findJavaClass(o.getContext()));
			}
		}
	}

	@VisitBefore(matchSubclasses = true)
	public void visitClass(INakedClassifier c) {
		if (c instanceof INakedEntity || c instanceof INakedStructuredDataType || c instanceof INakedEnumeration) {
			for (INakedInterfaceRealization ir : c.getInterfaceRealizations()) {
				for (IOperation o : ir.getContract().getOperations()) {
					createOperation((INakedOperation) o, findJavaClass(c));
				}
			}
		}
	}

	@VisitBefore(matchSubclasses = true)
	public void visitOperation(INakedOperation o) {
		if (o.isOclDef())
			return;
		INakedClassifier umlOwner = o.getOwner();
		OJAnnotatedClass myOwner = findJavaClass(umlOwner);
		OJAnnotatedOperation oper = createOperation(o, myOwner);
		if (o.hasClassScope()) {
			oper.setStatic(true);
		}
		oper.setAbstract(o.isAbstract());
	}

	private OJAnnotatedOperation createOperation(IParameterOwner o, OJAnnotatedClass owner) {
		NakedOperationMap operationMap = new NakedOperationMap(o);
		OJAnnotatedOperation oper = (OJAnnotatedOperation) owner.findOperation(operationMap.javaOperName(),
				operationMap.javaParamTypePaths());
		if (oper == null) {
			oper = new OJAnnotatedOperation();
			if (o.getReturnParameter() != null) {
				oper.setReturnType(operationMap.javaReturnTypePath());
				owner.addToImports(operationMap.javaReturnTypePath());
			}
			oper.setName(operationMap.javaOperName());
			Iterator it = o.getParameters().iterator();
			while (it.hasNext()) {
				IParameter elem = it.next();
				OJParameter param = new OJParameter();
				param.setName(elem.getName());
				param.setType(operationMap.javaParamTypePath(elem));
				oper.addToParameters(param);
				applyStereotypesAsAnnotations(((INakedElement) elem), param);
				owner.addToImports(operationMap.javaParamTypePath(elem));
			}
			if (!(owner instanceof OJAnnotatedInterface)) {
				if (o.getReturnParameter() != null) {
					String resultName = "result";
					String resultDefaultValue = operationMap.javaReturnDefaultValue();
					owner.addToImports(operationMap.javaReturnDefaultTypePath());
					oper.getBody().addToStatements(oper.getReturnType().getLast() + " " + resultName + " = " + resultDefaultValue);
					oper.getBody().addToStatements("return " + resultName);
				}
			}
			oper.setVisibility(operationMap.javaVisibility());
			owner.addToOperations(oper);
			applyStereotypesAsAnnotations((o), oper);
		}

		return oper;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy