/**
* Optimus, framework for Model Transformation
*
* Copyright (C) 2013 Worldline or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.atos.optimus.m2m.engine.masks.extension;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.atos.optimus.m2m.engine.core.masks.ITransformationMask;
import net.atos.optimus.m2m.engine.core.masks.TransformationMaskDataSource;
import net.atos.optimus.m2m.engine.core.masks.TransformationMaskReference;
import net.atos.optimus.m2m.engine.core.transformations.TransformationDataSource;
import net.atos.optimus.m2m.engine.core.transformations.TransformationDataSourceManager;
import net.atos.optimus.m2m.engine.core.transformations.TransformationReference;
import net.atos.optimus.m2m.engine.masks.Activator;
import net.atos.optimus.m2m.engine.masks.JavaTransformationMask;
import net.atos.optimus.m2m.engine.masks.MaskTransformationRequirementsTool;
import net.atos.optimus.m2m.engine.masks.logging.OptimusM2MMaskMessages;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
/**
* Implementation of Transformation Masks Extension Point management
*
* @author mvanbesien
* @since 1.1
*
*/
public class ExtensionPointTransformationMaskDataSource extends TransformationMaskDataSource {
/** The description of the transformation data source */
public static final String DESCRIPTION = "Optimus Transformation Mask Extension Point";
/** The name of the associated extension point */
public static final String EXTENSION_POINT_NAME = "TransformationMasks";
/**
* List of registered masks, read from extension point
*/
private final List<TransformationMaskReference> registeredMasks;
/**
* Constructor
*/
public ExtensionPointTransformationMaskDataSource() {
super(ExtensionPointTransformationMaskDataSource.DESCRIPTION);
OptimusM2MMaskMessages.ML01.log();
Map<String, TransformationMaskReference> foundMasks = new HashMap<String, TransformationMaskReference>();
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(Activator.PLUGIN_ID,
ExtensionPointTransformationMaskDataSource.EXTENSION_POINT_NAME);
for (IExtension extension : extensionPoint.getExtensions()) {
String contributorName = extension.getContributor().getName();
OptimusM2MMaskMessages.ML02.log(contributorName);
for (IConfigurationElement configurationElement : extension.getConfigurationElements()) {
if ("implementedMask".equals(configurationElement.getName())) {
// When Implementation of Mask is provided directly
try {
String name = configurationElement.getAttribute("name");
String description = configurationElement.getAttribute("description");
Object implementation = configurationElement.createExecutableExtension("implementation");
if (implementation instanceof ITransformationMask && name != null) {
if (foundMasks.containsKey(name)) {
OptimusM2MMaskMessages.ML14.log(name);
} else {
foundMasks.put(name, new TransformationMaskReference(name, description,
(ITransformationMask) implementation));
OptimusM2MMaskMessages.ML03.log(name, implementation.getClass().getName());
}
} else {
if (name == null) {
OptimusM2MMaskMessages.ML04.log();
} else {
OptimusM2MMaskMessages.ML05.log(implementation.getClass().getName());
}
}
} catch (CoreException e) {
OptimusM2MMaskMessages.ML06.log(e.getMessage(), contributorName);
Activator
.getDefault()
.getLog()
.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
"An error occurred when instanciating source from extension point", e));
}
} else if ("inclusiveMask".equals(configurationElement.getName())) {
// When transformation set is build from extension point,
// starting with nothing and including elements
String name = configurationElement.getAttribute("name");
String description = configurationElement.getAttribute("description");
JavaTransformationMask mask = JavaTransformationMask.allOff();
if (foundMasks.containsKey(name)) {
OptimusM2MMaskMessages.ML14.log(name);
} else {
OptimusM2MMaskMessages.ML07.log(name);
for (IConfigurationElement child : configurationElement.getChildren()) {
if ("includes".equals(child.getName())) {
String transformationId = child.getAttribute("transformationId");
if (transformationId != null) {
this.includeRequiredTransformation(name, mask, transformationId);
}
} else if ("includesSet".equals(child.getName())) {
String transformationSetId = child.getAttribute("transformationSetId");
if (transformationSetId != null) {
this.includeRequiredTransformationSet(name, mask, transformationSetId);
}
}
}
foundMasks.put(name, new TransformationMaskReference(name, description, mask));
}
} else if ("exclusiveMask".equals(configurationElement.getName())) {
// When transformation set is build from extension point,
// starting with all and excluding elements
String name = configurationElement.getAttribute("name");
String description = configurationElement.getAttribute("description");
JavaTransformationMask mask = JavaTransformationMask.allOn();
if (foundMasks.containsKey(name)) {
OptimusM2MMaskMessages.ML14.log(name);
} else {
OptimusM2MMaskMessages.ML10.log(name);
for (IConfigurationElement child : configurationElement.getChildren()) {
if ("excludes".equals(child.getName())) {
String transformationId = child.getAttribute("transformationId");
if (transformationId != null) {
this.excludeRequiredTransformation(name, mask, transformationId);
}
} else if ("excludesSet".equals(child.getName())) {
String transformationSetId = child.getAttribute("transformationSetId");
if (transformationSetId != null) {
this.excludeRequiredTransformationSet(name, mask, transformationSetId);
}
}
}
foundMasks.put(name, new TransformationMaskReference(name, description, mask));
}
}
}
}
OptimusM2MMaskMessages.ML13.log();
List<TransformationMaskReference> transformationMaskReferencesResult = new LinkedList<TransformationMaskReference>();
for (TransformationMaskReference transformationMaskReference : foundMasks.values()) {
transformationMaskReferencesResult.add(transformationMaskReference);
}
this.registeredMasks = Collections.unmodifiableList(transformationMaskReferencesResult);
}
/**
* Include the transformation set in an inclusive mask
*
* @param maskName
* the name of the inclusive mask.
* @param mask
* the inclusive mask.
* @param transformationSetId
* the transformation set to include.
*/
private void includeRequiredTransformationSet(String maskName, JavaTransformationMask mask,
String transformationSetId) {
OptimusM2MMaskMessages.ML09.log(maskName, transformationSetId);
for (TransformationDataSource transformationDataSource : TransformationDataSourceManager.INSTANCE
.getTransformationDataSources()) {
for (TransformationReference transformationReference : transformationDataSource.getAll()) {
String setId = transformationReference.getTransformationSet() == null ? "" : transformationReference
.getTransformationSet().getId();
if (transformationSetId.equals(setId) && transformationReference.getId() != null) {
this.includeRequiredTransformation(maskName, mask, transformationReference.getId());
}
}
}
}
/**
* Include the required transformations of a specified transformation and
* the transformation specified itself in an inclusive mask
*
* @param maskName
* the name of the inclusive mask.
* @param mask
* the inclusive mask.
* @param transformationId
* the transformation to include.
*/
private void includeRequiredTransformation(String maskName, JavaTransformationMask mask, String transformationId) {
Set<String> includedTransformations = MaskTransformationRequirementsTool.requirementsToActivate(mask,
TransformationDataSourceManager.INSTANCE.getById(transformationId));
includedTransformations.add(transformationId);
for (String includedTransformation : includedTransformations) {
mask.withTransformation(includedTransformation);
OptimusM2MMaskMessages.ML08.log(maskName, includedTransformation);
}
}
/**
* Exclude the transformation set in an exclusive mask
*
* @param maskName
* the name of the exclusive mask.
* @param mask
* the exclusive mask.
* @param transformationSetId
* the transformation set to exclude.
*/
private void excludeRequiredTransformationSet(String maskName, JavaTransformationMask mask,
String transformationSetId) {
OptimusM2MMaskMessages.ML12.log(maskName, transformationSetId);
for (TransformationDataSource transformationDataSource : TransformationDataSourceManager.INSTANCE
.getTransformationDataSources()) {
for (TransformationReference transformationReference : transformationDataSource.getAll()) {
String setId = transformationReference.getTransformationSet() == null ? "" : transformationReference
.getTransformationSet().getId();
if (transformationSetId.equals(setId) && transformationReference.getId() != null) {
this.excludeRequiredTransformation(maskName, mask, transformationReference.getId());
}
}
}
}
/**
* Exclude the transformations required by a specified transformation and
* the transformation specified itself in an exclusive mask
*
* @param maskName
* the name of the exclusive mask.
* @param mask
* the exclusive mask.
* @param transformationId
* the transformation to exclude.
*/
private void excludeRequiredTransformation(String maskName, JavaTransformationMask mask, String transformationId) {
Set<String> excludedTransformations = MaskTransformationRequirementsTool.requirementsToDesactivate(mask,
TransformationDataSourceManager.INSTANCE.getById(transformationId));
excludedTransformations.add(transformationId);
for (String excludedTransformation : excludedTransformations) {
mask.withoutTransformation(excludedTransformation);
OptimusM2MMaskMessages.ML11.log(maskName, excludedTransformation);
}
}
@Override
public Collection<TransformationMaskReference> getAllMasks() {
return registeredMasks;
}
}