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

org.umlg.javageneration.visitor.property.QualifiedNameClassNameMapBuilder Maven / Gradle / Ivy

The newest version!
package org.umlg.javageneration.visitor.property;

import org.eclipse.uml2.uml.Property;
import org.umlg.java.metamodel.OJConstructor;
import org.umlg.java.metamodel.OJField;
import org.umlg.java.metamodel.OJPackage;
import org.umlg.java.metamodel.OJPathName;
import org.umlg.java.metamodel.OJVisibilityKind;
import org.umlg.java.metamodel.annotation.OJAnnotatedClass;
import org.umlg.java.metamodel.annotation.OJAnnotatedOperation;
import org.umlg.framework.Visitor;
import org.umlg.generation.Workspace;
import org.umlg.javageneration.util.PropertyWrapper;
import org.umlg.javageneration.util.UmlgGenerationUtil;
import org.umlg.javageneration.visitor.BaseVisitor;

/**
 * Every property gets a entry in a global map that contains the property type's
 * java class
 * 
 */
public class QualifiedNameClassNameMapBuilder extends BaseVisitor implements Visitor {

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

	@Override
	public void visitBefore(Property p) {
		OJAnnotatedClass globalMap = this.workspace.findOJClass(UmlgGenerationUtil.QualifiedNameClassMap.toJavaString());
		if (globalMap == null) {
			globalMap = new OJAnnotatedClass(UmlgGenerationUtil.QualifiedNameClassMap.getLast());
			OJPackage ojPackage = new OJPackage(UmlgGenerationUtil.UmlgRootPackage.toJavaString());
			globalMap.setMyPackage(ojPackage);
			addINSTANCE(globalMap);
			addMap(globalMap);
			createPropertyClassAdderMethod(globalMap);
			addToSource(globalMap);
			OJConstructor constructor = addPrivateConstructor(globalMap);
			constructor.getBody().addToStatements("addAllEntries()");
			addGetForQualifiedName(globalMap);
		}
		addEntries(globalMap, p);
	}

	private void addGetForQualifiedName(OJAnnotatedClass globalMap) {
		OJAnnotatedOperation get = new OJAnnotatedOperation("get", new OJPathName("Class"));
		get.addParam("qualifiedName", "String");
		get.getBody().addToStatements("return this." + UmlgGenerationUtil.QualifiedNameClassMapName + ".get(qualifiedName)");
		globalMap.addToOperations(get);
	}

	private void addEntries(OJAnnotatedClass globalMap, Property p) {
		PropertyWrapper pWrap = new PropertyWrapper(p);
		OJAnnotatedOperation addAllEntries = globalMap.findOperation("addAllEntries");
		addAllEntries.getBody().addToStatements("this." + UmlgGenerationUtil.QualifiedNameClassMapName + ".put(\"" + p.getQualifiedName() +
				"\", " + pWrap.javaBaseTypePath().getLast() + ".class)");
		globalMap.addToImports(pWrap.javaBaseTypePath());
	}

	private void addINSTANCE(OJAnnotatedClass globalMap) {
		OJField instance = new OJField("INSTANCE", globalMap.getPathName());
		instance.setVisibility(OJVisibilityKind.PUBLIC);
		instance.setStatic(true);
		instance.setInitExp("new " + globalMap.getPathName().getLast() + "()");
		globalMap.addToFields(instance);
	}

	private void addMap(OJAnnotatedClass globalMap) {
		OJField map = new OJField(UmlgGenerationUtil.QualifiedNameClassMapName, new OJPathName("java.util.Map").addToGenerics("String").addToGenerics(
				"Class"));
		map.setVisibility(OJVisibilityKind.PRIVATE);
		map.setInitExp("new HashMap>()");
		globalMap.addToImports(new OJPathName("java.util.HashMap"));
		globalMap.addToImports(new OJPathName("java.util.Map"));
		globalMap.addToFields(map);
	}

	private OJAnnotatedOperation createPropertyClassAdderMethod(OJAnnotatedClass globalMap) {
		OJAnnotatedOperation addAllEntries = new OJAnnotatedOperation("addAllEntries");
		addAllEntries.setVisibility(OJVisibilityKind.PRIVATE);
		globalMap.addToOperations(addAllEntries);
		return addAllEntries;
	}

	private OJConstructor addPrivateConstructor(OJAnnotatedClass globalMap) {
		OJConstructor constructor = new OJConstructor();
		constructor.setVisibility(OJVisibilityKind.PRIVATE);
		globalMap.addToConstructors(constructor);
		return constructor;
	}

	@Override
	public void visitAfter(Property p) {
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy