![JAR search and dependency download from the Maven repository](/logo.png)
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 extends INakedProperty> 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 extends INakedProperty> 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 extends INakedProperty> 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