/*******************************************************************************
* Copyright (c) 2013, 2015 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
* Adolfo Sanchez-Barbudo Herrera (University of York) - Lookup Environment/Visitor
*******************************************************************************/
package org.eclipse.ocl.examples.autogen.java;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.autogen.utilities.GenPackageHelper;
import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
/**
* AutoCodeGenerator supports generation of the content of a JavaClassFile to
* execute a Auto transformation.
*/
public abstract class AutoVisitorsCodeGenerator extends AutoCodeGenerator
{
public AutoVisitorsCodeGenerator(@NonNull EnvironmentFactoryInternal environmentFactory,
org.eclipse.ocl.pivot.@NonNull Package asPackage,
org.eclipse.ocl.pivot.@Nullable Package asSuperPackage,
@NonNull GenPackage genPackage,
@Nullable GenPackage superGenPackage,
@Nullable GenPackage baseGenPackage) {
super(environmentFactory, asPackage, asSuperPackage, genPackage, superGenPackage, baseGenPackage);
}
@SuppressWarnings("null")
public @NonNull Class<?> getVisitableClass() {
try {
return genModel.getClass().getClassLoader().loadClass(getVisitablePackageName() + '.' + getVisitableClassName());
} catch (ClassNotFoundException e) {
return Object.class;
}
}
protected org.eclipse.ocl.pivot.@NonNull Class getVisitablePivotClass() {
// return ClassUtil.nonNullState(metamodelManager.getASClass(visitableClass));
for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {
if (getBasePrefix().equals(genPackage.getPrefix()) &&
getBaseVisitorPackageName().startsWith(genPackage.getQualifiedPackageName())) {
for (GenClass genClass : genPackage.getGenClasses()) {
if (getVisitableClassName().equals(genClass.getName())) {
EClass visitableEClass = genClass.getEcoreClass();
org.eclipse.ocl.pivot.Class visitableClass = metamodelManager.getASOfEcore(org.eclipse.ocl.pivot.Class.class, visitableEClass);
if (visitableClass != null) {
return visitableClass;
}
}
}
}
}
throw new IllegalStateException("Visitable Class not found from the provided GenModel");
}
private GenPackageHelper genPackageHelper;
private GenPackageHelper superGenPackageHelper;
private GenPackageHelper baseGenPackageHelper;
private GenPackageHelper getGenPackageHelper() {
if (genPackageHelper == null) {
genPackageHelper = new GenPackageHelper(genPackage);
}
return genPackageHelper;
}
private GenPackageHelper getSuperGenPackageHelper() {
if (superGenPackageHelper == null) {
superGenPackageHelper = new GenPackageHelper(superGenPackage);
}
return superGenPackageHelper;
}
private GenPackageHelper getBaseGenPackageHelper() {
if (baseGenPackageHelper == null) {
baseGenPackageHelper = new GenPackageHelper(baseGenPackage);
}
return baseGenPackageHelper;
}
public @NonNull Class<?> getVisitorResultClass() {
return Object.class;
}
/**
* @return <code>true</code> if the generation is for a base language, otherwise is for a derived one
*/
public boolean isBaseVisitorsGeneration() {
return getSuperProjectPrefix() == null;
}
protected @NonNull String getVisitorPackageName() {
return getGenPackageHelper().getVisitorPackageName();
}
protected @NonNull String getSuperVisitorPackageName() {
return getSuperGenPackageHelper().getVisitorPackageName();
}
protected @NonNull String getBaseVisitorPackageName() {
return getBaseGenPackageHelper().getVisitorPackageName();
}
protected @NonNull String getVisitorClassName() {
return getGenPackageHelper().getVisitorClassName();
}
protected @NonNull String getSuperVisitorClassName() {
return getSuperGenPackageHelper().getVisitorClassName();
}
protected @NonNull String getBaseVisitorClassName() {
return getBaseGenPackageHelper().getVisitorClassName();
}
protected @NonNull String getVisitablePackageName() {
// Visitable will always be taken from the base genPackage
return getBaseGenPackageHelper().getVisitablePackageName();
}
protected @NonNull String getVisitableClassName() {
// Visitable will always be taken from the base genPackage
return getBaseGenPackageHelper().getVisitableClassName();
}
}