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

net.sf.nakeduml.javageneration.auditing.AuditImplementationStep Maven / Gradle / Ivy

package net.sf.nakeduml.javageneration.auditing;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import net.sf.nakeduml.feature.NakedUmlConfig;
import net.sf.nakeduml.feature.StepDependency;
import net.sf.nakeduml.feature.TransformationContext;
import net.sf.nakeduml.feature.visit.VisitBefore;
import net.sf.nakeduml.feature.visit.VisitorAdapter;
import net.sf.nakeduml.javageneration.AbstractJavaTransformationStep;
import net.sf.nakeduml.javametamodel.OJClass;
import net.sf.nakeduml.javametamodel.OJElement;
import net.sf.nakeduml.javametamodel.OJPackage;
import net.sf.nakeduml.javametamodel.OJPathName;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedClass;
import net.sf.nakeduml.javametamodel.annotation.OJAnnotatedInterface;
import net.sf.nakeduml.metamodel.workspace.INakedModelWorkspace;
import net.sf.nakeduml.textmetamodel.TextWorkspace;

@StepDependency(phase = AuditGenerationPhase.class, requires = {})
public class AuditImplementationStep extends AbstractJavaTransformationStep {
	@Override
	public void initialize(OJPackage pac, NakedUmlConfig config, TextWorkspace textWorkspace) {
		super.initialize(pac, config, textWorkspace);
	}

	public static final class OJVisitor extends VisitorAdapter {
		private final HashSet persistentClasses;

		private OJVisitor(HashSet classes) {
			this.persistentClasses = classes;
		}

		@Override
		public Collection getChildren(OJElement root) {
			if (root instanceof OJPackage) {
				Set results = new HashSet();
				OJPackage ojp = (OJPackage) root;
				results.addAll(ojp.getSubpackages());
				return results;
			}
			return Collections.emptySet();
		}

		@VisitBefore(matchSubclasses = true)
		public void visitPackage(OJPackage p) {
			for (OJClass c : p.getClasses()) {
				if ((c instanceof OJAnnotatedInterface && !((OJAnnotatedInterface) c).getPathName().getFirst().startsWith("util"))
						|| c instanceof OJAnnotatedClass && ((OJAnnotatedClass) c).hasAnnotation(new OJPathName("javax.persistence.Table"))) {
					persistentClasses.add(c);
				}
			}
		}
	}

	@Override
	public void generate(INakedModelWorkspace workspace, TransformationContext context) {
		TimestampAdder timestampAdder = new TimestampAdder();
		timestampAdder.initialize(workspace, javaModel, config, textWorkspace);
		timestampAdder.startVisiting(workspace);
		// Make copies of the root packages just below the model package
		OJPackage newRoot = new OJPackage();
		Set rootCopies = new HashSet();
		Set packages = this.javaModel.getSubpackages();
		for (OJPackage ojPackage : packages) {
			OJPackage deepCopy = ojPackage.getDeepCopy(null);
			rootCopies.add(deepCopy);
			deepCopy.setParent(newRoot);
		}
		// This next section must be here in the middle.
		// It adds in a makeAuditCopy method. This method must only be on the
		// original class
		AuditEntryMassageOriginalClasses anotherAuditEntryOriginalClassesGenerator = new AuditEntryMassageOriginalClasses();
		anotherAuditEntryOriginalClassesGenerator.initialize(workspace, this.javaModel, config, textWorkspace);
		anotherAuditEntryOriginalClassesGenerator.startVisiting(workspace);
		// Visit copy classes
		Set classes = getClassesRecursively(newRoot);
		AuditEntryMassage aeg = new AuditEntryMassage();
		aeg.initialize(workspace, newRoot, config, textWorkspace, classes);
		aeg.startVisiting(workspace);
		AuditFixAnnotations auditFixAnnotations = new AuditFixAnnotations();
		auditFixAnnotations.initialize(workspace, newRoot, config, textWorkspace, classes);
		auditFixAnnotations.startVisiting(workspace);
	}

	private Set getClassesRecursively(OJPackage copy) {
		final HashSet classes = new HashSet();
		new OJVisitor(classes).startVisiting(copy);
		return classes;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy