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

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

package net.sf.nakeduml.javageneration.basicjava;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import net.sf.nakeduml.feature.visit.VisitBefore;
import net.sf.nakeduml.javageneration.NakedStructuralFeatureMap;
import net.sf.nakeduml.javageneration.oclexpressions.ValueSpecificationUtil;
import net.sf.nakeduml.javageneration.util.OJUtil;
import net.sf.nakeduml.javametamodel.OJClass;
import net.sf.nakeduml.javametamodel.OJConstructor;
import net.sf.nakeduml.javametamodel.OJField;
import net.sf.nakeduml.javametamodel.OJIfStatement;
import net.sf.nakeduml.javametamodel.OJOperation;
import net.sf.nakeduml.javametamodel.OJParameter;
import net.sf.nakeduml.javametamodel.OJPathName;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedOperation;
import net.sf.nakeduml.javametamodel.annotation.OJEnum;
import net.sf.nakeduml.javametamodel.annotation.OJEnumLiteral;
import net.sf.nakeduml.javametamodel.generated.OJVisibilityKindGEN;
import net.sf.nakeduml.metamodel.core.INakedEnumeration;
import net.sf.nakeduml.metamodel.core.INakedEnumerationLiteral;
import net.sf.nakeduml.metamodel.core.INakedProperty;
import net.sf.nakeduml.metamodel.core.INakedSlot;
import net.sf.nakeduml.metamodel.core.INakedValueSpecification;
import net.sf.nakeduml.metamodel.core.internal.NakedEnumerationLiteralImpl;
import nl.klasse.octopus.codegen.umlToJava.maps.StructuralFeatureMap;
import nl.klasse.octopus.model.IAttribute;
import nl.klasse.octopus.model.IEnumLiteral;

public class EnumerationLiteralImplementor extends AttributeImplementor {
	@VisitBefore(matchSubclasses = true)
	public void generateExtraConstructor(INakedEnumeration c) {
		OJEnum myClass = (OJEnum) findJavaClass(c);
		OJOperation values = OJUtil.findOperation(myClass, "getValues");
		if (values != null) {
			OJPathName results = new OJPathName("java.util.List");
			results.addToElementTypes(OJUtil.classifierPathname(c));
			values.setReturnType(results);
			values.getBody().removeAllFromStatements();
			values.getBody().addToStatements("return java.util.Arrays.asList(values())");
		}
		OJAnnotatedOperation getName = new OJAnnotatedOperation();
		getName.setName("getName");
		getName.setReturnType(new OJPathName("String"));
		getName.getBody().addToStatements("return name()");
		myClass.addToOperations(getName);
		OJConstructor constr = new OJConstructor();
		constr.setVisibility(OJVisibilityKindGEN.PRIVATE);
		List allAttributes = c.getEffectiveAttributes();
		boolean hasDuplicates = hasDuplicates(allAttributes);
		if (!hasDuplicates) {
			for (INakedProperty attr : allAttributes) {
				StructuralFeatureMap map = OJUtil.buildStructuralFeatureMap(attr);
				if (!(attr.isDerived() || attr.isOclDef()) && map.isUmlPrimitive()) {
					addToConstructor(constr, myClass, attr, c);
				}
			}
			if (!constr.getParameters().isEmpty()) {
				myClass.addToConstructors(constr);
			}
		}
	}

	// @VisitBefore(matchSubclasses = true)
	// public void generateGettersAndSetters(INakedEnumeration c) {
	// OJAnnotatedClass owner = findJavaClass(c);
	// List allAttributes =
	// c.getEffectiveAttributes();
	// for (INakedProperty iNakedProperty : allAttributes) {
	// NakedStructuralFeatureMap map = new
	// NakedStructuralFeatureMap(iNakedProperty);
	// OJPathName javaTypePath = map.javaTypePath();
	// buildGetter(owner, map, javaTypePath);
	// }
	// }

	@VisitBefore(matchSubclasses = true)
	public void generateStaticMethods(INakedEnumeration c) {
		OJEnum myClass = (OJEnum) findJavaClass(c);
		// Does lookups on arbitrary string properties

		List allAttributes = c.getEffectiveAttributes();
		for (INakedProperty iNakedProperty : allAttributes) {
			if (iNakedProperty.getType().getName().equals("String") && iNakedProperty.getNakedMultiplicity().isOne()) {
				//TODO support for other types??
				OJAnnotatedOperation staticOp = new OJAnnotatedOperation();
				staticOp.setStatic(true);
				staticOp.setName(iNakedProperty.getName() + "to" + c.getName());
				OJPathName path = OJUtil.classifierPathname(c);
				staticOp.setReturnType(path);
				OJParameter ojParameter = new OJParameter();
				ojParameter.setName(iNakedProperty.getName());
				ojParameter.setType(OJUtil.classifierPathname(iNakedProperty.getNakedBaseType()));
				staticOp.addToParameters(ojParameter);

				List literals = c.getLiterals();
				for (IEnumLiteral iEnumLiteral : literals) {
					OJIfStatement ifSPS = new OJIfStatement();
					NakedEnumerationLiteralImpl nakedLiteral = (NakedEnumerationLiteralImpl) iEnumLiteral;
					List slots = nakedLiteral.getSlots();
					for (INakedSlot iNakedSlot : slots) {

						ifSPS.setCondition(iNakedProperty.getName() + ".equals(\"" + iNakedSlot.getFirstValue().stringValue() + "\")");

						ifSPS.addToThenPart("return " + iEnumLiteral.getName());
						break;
					}
					staticOp.getBody().addToStatements(ifSPS);
				}
				staticOp.getBody().addToStatements("return null");
				myClass.addToOperations(staticOp);
			}
		}
	}

	private boolean hasDuplicates(List allAttributes) {
		boolean result = false;
		List names = new ArrayList();
		Iterator it = allAttributes.iterator();
		while (it.hasNext()) {
			IAttribute attr = (IAttribute) it.next();
			if (names.contains(attr.getName())) {
				return true;
			} else {
				names.add(attr.getName());
			}
		}
		return result;
	}

	private void addToConstructor(OJConstructor constr, OJClass myClass, INakedProperty feat, INakedEnumeration c) {
		NakedStructuralFeatureMap mapper = OJUtil.buildStructuralFeatureMap(feat);
		OJPathName type = mapper.javaTypePath();
		myClass.addToImports(type);
		String parname = feat.getName();
		constr.addParam(parname, type);
		String setter = mapper.setter();
		// TODO Why is this being set to private???
		// OJUtil.findOperation(myClass,
		// mapper.getter()).setVisibility(OJVisibilityKindGEN.PRIVATE);
		constr.getBody().addToStatements("this." + setter + "(" + parname + ")");
		OJEnum oje = (OJEnum) myClass;
		for (IEnumLiteral l : c.getLiterals()) {
			OJEnumLiteral ojl = oje.findLiteral(l.getName().toUpperCase());
			OJField f = ojl.findAttributeValue(mapper.umlName());
			INakedValueSpecification value = ((INakedEnumerationLiteral) l).getFirstValueFor(feat.getName());
			f.setInitExp(ValueSpecificationUtil.expressValue(constr, value, c,feat.getType()));
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy