blob: aea78bf32e1f761f515a70e972a4cbdb196a4515 [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2015-2019 Robert Bosch GmbH and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
********************************************************************************
*/
package org.eclipse.app4mc.amalthea.model.tests;
import static org.junit.Assert.assertTrue;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.WriterAppender;
import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public final class MetamodelStructureTest {
private Logger logger;
@Before
public void setUp() {
logger = LogManager.getLogger("org.eclipse.app4mc.amalthea.model.tests");
logger.addAppender(new ConsoleAppender(new PatternLayout("%d{ISO8601} %-5p [%c]: %m%n")));
logger.setLevel(Level.INFO);
}
@After
public void tearDown() {
final Enumeration<?> allAppenders = logger.getAllAppenders();
if (allAppenders != null) {
final Object nextElement = allAppenders.nextElement();
if (nextElement instanceof WriterAppender) {
((WriterAppender) nextElement).close();
}
}
}
@Test
public void checkMetaModel() {
boolean illegalReferencesFound = false;
final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
final AmaltheaPackage amPackage = AmaltheaPackage.eINSTANCE;
logger.info("++++ Metamodel check startet at " + dateFormat.format(new Date()));
// Get all classes
final List<EClass> classList = new ArrayList<>();
for (final EClassifier classifier : amPackage.getEClassifiers()) {
if (classifier instanceof EClass) {
classList.add((EClass) classifier);
}
}
// Find references to classes without unique name
for (final EClass eClass : classList) {
for (final EStructuralFeature feature : eClass.getEStructuralFeatures()) {
if (feature instanceof EReference) {
final EReference eRef = (EReference) feature;
if (eRef.getEType() instanceof EClass) {
final EClass refClass = (EClass) eRef.getEType();
if (eRef.isContainment()) {
// print("Containment reference", eClass, eRef, refClass, Level.INFO);
continue;
}
if (eRef.isContainer()) {
print("Container reference", eClass, eRef, refClass, Level.INFO);
continue;
}
if (eRef.isTransient()) {
if (eRef.isDerived()) {
print("Derived reference", eClass, eRef, refClass, Level.INFO);
} else {
print("Transient reference", eClass, eRef, refClass, Level.INFO);
}
continue;
}
if (amPackage.getIReferable().isSuperTypeOf(refClass)) {
// valid reference
// print("Valid reference", eClass, eRef, refClass, Level.INFO);
continue;
}
// invalid reference
illegalReferencesFound = true;
print("Illegal reference", eClass, eRef, refClass, Level.ERROR);
}
}
}
}
assertTrue(
"Illegal references exists in the AMALTHEA metamodel. For detailed info of illegal references -> check the console log ",
!illegalReferencesFound);
logger.info("++++ Metamodel check finished at " + dateFormat.format(new Date()));
} // main
private void print(final String prefix, final EClass origin, final EReference ref, final EClass target,
final Level level) {
final StringBuilder sb = new StringBuilder();
sb.append(prefix);
sb.append(": ");
sb.append(origin.getName());
sb.append(" -- ");
sb.append(ref.getName());
sb.append(" --> ");
sb.append(target.getName());
if (Level.INFO == level) {
logger.info(sb.toString());
} else if (Level.ERROR == level) {
logger.error(sb.toString());
}
}
}