/*******************************************************************************
* Copyright (c) 2006-2012
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Berlin, Germany
* - initial API and implementation
******************************************************************************/
package org.reuseware.coconut.compositionprogram.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.reuseware.coconut.compositionprogram.*;
import org.reuseware.coconut.compositionprogram.CompositionLink;
import org.reuseware.coconut.compositionprogram.CompositionProgram;
import org.reuseware.coconut.compositionprogram.CompositionprogramPackage;
import org.reuseware.coconut.compositionprogram.DerivedCompositionProgram;
import org.reuseware.coconut.compositionprogram.FragmentInstance;
import org.reuseware.coconut.compositionprogram.PhysicalCompositionProgram;
import org.reuseware.coconut.compositionprogram.PortInstance;
import org.reuseware.coconut.compositionprogram.Setting;
import org.reuseware.coconut.fragment.AddressablePoint;
import org.reuseware.coconut.fragment.HeterogeneousPort;
/**
* <!-- begin-user-doc -->
* The <b>Validator</b> for the model.
* <!-- end-user-doc -->
* @see org.reuseware.coconut.compositionprogram.CompositionprogramPackage
* @generated
*/
public class CompositionprogramValidator extends EObjectValidator
{
/**
* The cached model package
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final CompositionprogramValidator INSTANCE = new CompositionprogramValidator();
/**
* A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see org.eclipse.emf.common.util.Diagnostic#getSource()
* @see org.eclipse.emf.common.util.Diagnostic#getCode()
* @generated
*/
public static final String DIAGNOSTIC_SOURCE = "org.reuseware.coconut.compositionprogram";
/**
* A constant with a fixed name that can be used as the base value for additional hand written constants.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
/**
* A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
/**
* Creates an instance of the switch.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public CompositionprogramValidator()
{
super();
}
/**
* Returns the package of this validator switch.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EPackage getEPackage()
{
return CompositionprogramPackage.eINSTANCE;
}
/**
* Calls <code>validateXXX</code> for the corresponding classifier of the model.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, Map<Object, Object> context)
{
switch (classifierID)
{
case CompositionprogramPackage.COMPOSITION_LINK:
return validateCompositionLink((CompositionLink)value, diagnostics, context);
case CompositionprogramPackage.COMPOSITION_PROGRAM:
return validateCompositionProgram((CompositionProgram)value, diagnostics, context);
case CompositionprogramPackage.DERIVED_COMPOSITION_PROGRAM:
return validateDerivedCompositionProgram((DerivedCompositionProgram)value, diagnostics, context);
case CompositionprogramPackage.FRAGMENT_INSTANCE:
return validateFragmentInstance((FragmentInstance)value, diagnostics, context);
case CompositionprogramPackage.PHYSICAL_COMPOSITION_PROGRAM:
return validatePhysicalCompositionProgram((PhysicalCompositionProgram)value, diagnostics, context);
case CompositionprogramPackage.PORT_INSTANCE:
return validatePortInstance((PortInstance)value, diagnostics, context);
case CompositionprogramPackage.SETTING:
return validateSetting((Setting)value, diagnostics, context);
default:
return true;
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean validateCompositionLink(CompositionLink compositionLink, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(compositionLink, diagnostics, context)) return false;
boolean result = validate_EveryMultiplicityConforms(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryDataValueConforms(compositionLink, diagnostics, context);
// if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(compositionLink, diagnostics, context);
// if (result || diagnostics != null) result &= validate_EveryProxyResolves(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validate_UniqueID(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryKeyUnique(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionLink_Valid(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionLink_Typed(compositionLink, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionLink_PortsExist(compositionLink, diagnostics, context);
return result;
}
/**
* Validates the Valid constraint of '<em>Composition Link</em>'. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
public boolean validateCompositionLink_Valid(
CompositionLink compositionLink, DiagnosticChain diagnostics,
Map<Object, Object> context) {
compositionLink.match();
if (isCompositionLinkDerivedAndEmpty(compositionLink)) {
return true;
}
if (!compositionLink.isValid()) {
List<EObject> cause = new ArrayList<EObject>();
cause.add(compositionLink);
cause.addAll(compositionLink.getDerivedFrom());
addWarning(diagnostics, constructInvalidLinkMsg(compositionLink), cause);
}
return true;
}
/**
* Validates the Typed constraint of '<em>Composition Link</em>'. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
public boolean validateCompositionLink_Typed(
CompositionLink compositionLink, DiagnosticChain diagnostics,
Map<Object, Object> context) {
if (isCompositionLinkDerivedAndEmpty(compositionLink)) {
return true;
}
if (compositionLink.compositionAssociation() == null) {
String message = "Link not allowed in fracol";
if (compositionLink.getSource() != null && compositionLink.getTarget() != null &&
compositionLink.getSource().getFragmentInstance() != null && compositionLink.getTarget().getFragmentInstance() != null) {
message = message + ": "
+ compositionLink.getSource().getFragmentInstance().getName()
+ "(" + compositionLink.getSource().getFragmentRoleName() + "." + compositionLink.getSource().getPortName() + ")";
message = message + " --> " + compositionLink.getTarget().getFragmentInstance().getName()
+ "(" + compositionLink.getTarget().getFragmentRoleName() + "." + compositionLink.getTarget().getPortName() + ")";
}
List<EObject> cause = new ArrayList<EObject>();
cause.add(compositionLink);
cause.addAll(compositionLink.getDerivedFrom());
addWarning(diagnostics, message, cause);
}
return true;
}
/**
* Validates the PortsExist constraint of '<em>Composition Link</em>'. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
public boolean validateCompositionLink_PortsExist(
CompositionLink compositionLink, DiagnosticChain diagnostics,
Map<Object, Object> context) {
//if (isCompositionLinkDerivedAndEmpty(compositionLink)) {
// return true;
//}
boolean result = true;
if(compositionLink.getSource().port() == null) {
List<EObject> cause = new ArrayList<EObject>();
cause.add(compositionLink.getSource());
cause.addAll(compositionLink.getDerivedFrom());
addWarning(diagnostics,
"Port '" +
compositionLink.getSource().getPortName() +
"' can not be identified on fragment '" +
compositionLink.getSource().getFragmentInstance().getName() + "'.",
cause);
result = false;
}
if(compositionLink.getTarget().port() == null) {
List<EObject> cause = new ArrayList<EObject>();
cause.add(compositionLink.getTarget());
cause.addAll(compositionLink.getDerivedFrom());
addWarning(diagnostics,
"Port '" +
compositionLink.getTarget().getPortName() +
"' can not be identified on fragment '" +
compositionLink.getTarget().getFragmentInstance().getName() + "'.",
cause);
result = false;
}
return result;
}
private boolean isCompositionLinkDerivedAndEmpty(
CompositionLink compositionLink) {
boolean empty = false;
if (compositionLink.getCompositionProgram() instanceof DerivedCompositionProgram) {
if (compositionLink.getSource().port() == null
|| compositionLink.getTarget().port() == null) {
empty = true;
} else {
for (HeterogeneousPort port : compositionLink.getSource()
.allPorts()) {
if (port.getAddressablePoints().isEmpty()) {
empty = true;
}
}
for (HeterogeneousPort port : compositionLink.getTarget()
.allPorts()) {
if (port.getAddressablePoints().isEmpty()) {
empty = true;
}
}
}
}
return empty;
}
private String constructInvalidLinkMsg(CompositionLink compositionLink) {
String msg = "Invalid composition";
if (compositionLink.getSource() != null && compositionLink.getTarget() != null &&
compositionLink.getSource().getFragmentInstance() != null && compositionLink.getTarget().getFragmentInstance() != null) {
msg = msg + ": "
+ compositionLink.getSource().getFragmentInstance().getName()
+ "(" + compositionLink.getSource().getFragmentRoleName() + "." + compositionLink.getSource().getPortName() + ")[";
for(HeterogeneousPort p : compositionLink.getSource().allPorts()) {
for(Iterator<AddressablePoint> i = p.getAddressablePoints().iterator(); i.hasNext(); ) {
AddressablePoint ap = i.next();
msg = msg + ap.eClass().getName() + ":" + ap.getVarTypedEObject().eClass().getName();
if (i.hasNext()) msg = msg + ",";
}
break;
}
msg = msg + "] --> " + compositionLink.getTarget().getFragmentInstance().getName()
+ "(" + compositionLink.getTarget().getFragmentRoleName() + "." + compositionLink.getTarget().getPortName() + ")[";
for(HeterogeneousPort p : compositionLink.getTarget().allPorts()) {
for(Iterator<AddressablePoint> i = p.getAddressablePoints().iterator(); i.hasNext(); ) {
AddressablePoint ap = i.next();
msg = msg + ap.eClass().getName() + ":" + ap.getVarTypedEObject().eClass().getName();
if (i.hasNext()) msg = msg + ",";
}
break;
}
msg = msg + "]";
}
return msg;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateCompositionProgram(CompositionProgram compositionProgram, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(compositionProgram, diagnostics, context)) return false;
boolean result = validate_EveryMultiplicityConforms(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryDataValueConforms(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryProxyResolves(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_UniqueID(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryKeyUnique(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(compositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionProgram_TargetDefined(compositionProgram, diagnostics, context);
return result;
}
/**
* Validates the TargetDefined constraint of '<em>Composition Program</em>'.
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
public boolean validateCompositionProgram_TargetDefined(
CompositionProgram compositionProgram, DiagnosticChain diagnostics,
Map<Object, Object> context) {
for(FragmentInstance fragmentInstance : compositionProgram.getFragmentInstances()) {
if (fragmentInstance.isTarget()) {
return true;
}
}
addWarning(diagnostics,
"The composition program must define at least one target",
Collections.singletonList(compositionProgram));
return false;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateDerivedCompositionProgram(DerivedCompositionProgram derivedCompositionProgram, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(derivedCompositionProgram, diagnostics, context)) return false;
boolean result = validate_EveryMultiplicityConforms(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryDataValueConforms(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryProxyResolves(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_UniqueID(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryKeyUnique(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(derivedCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionProgram_TargetDefined(derivedCompositionProgram, diagnostics, context);
return result;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean validateFragmentInstance(FragmentInstance fragmentInstance, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(fragmentInstance, diagnostics, context)) return false;
boolean result = validate_EveryMultiplicityConforms(fragmentInstance, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryDataValueConforms(fragmentInstance, diagnostics, context);
// if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(fragmentInstance, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(fragmentInstance, diagnostics, context);
// if (result || diagnostics != null) result &= validate_EveryProxyResolves(fragmentInstance, diagnostics, context);
if (result || diagnostics != null) result &= validate_UniqueID(fragmentInstance, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryKeyUnique(fragmentInstance, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(fragmentInstance, diagnostics, context);
return result;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePhysicalCompositionProgram(PhysicalCompositionProgram physicalCompositionProgram, DiagnosticChain diagnostics, Map<Object, Object> context)
{
if (!validate_NoCircularContainment(physicalCompositionProgram, diagnostics, context)) return false;
boolean result = validate_EveryMultiplicityConforms(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryDataValueConforms(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryProxyResolves(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_UniqueID(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryKeyUnique(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(physicalCompositionProgram, diagnostics, context);
if (result || diagnostics != null) result &= validateCompositionProgram_TargetDefined(physicalCompositionProgram, diagnostics, context);
return result;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validatePortInstance(PortInstance portInstance, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(portInstance, diagnostics, context);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean validateSetting(Setting setting, DiagnosticChain diagnostics, Map<Object, Object> context)
{
return validate_EveryDefaultConstraint(setting, diagnostics, context);
}
@Override
protected boolean validate_MultiplicityConforms(EObject eObject,
EStructuralFeature eStructuralFeature, DiagnosticChain diagnostics,
Map<Object, Object> context) {
BasicDiagnostic tempDiagnostics = new BasicDiagnostic();
boolean result = super.validate_MultiplicityConforms(eObject,
eStructuralFeature, tempDiagnostics, context);
if (!result) {
if (eStructuralFeature
.equals(CompositionprogramPackage.Literals.FRAGMENT_INSTANCE__FRAGMENT)) {
FragmentInstance fragmentInstance = (FragmentInstance) eObject;
List<EObject> cause = new ArrayList<EObject>();
cause.add(fragmentInstance);
cause.addAll(fragmentInstance.getDerivedFrom());
addWarning(diagnostics,
"Fragment " + fragmentInstance.getUFI() + " not found",
cause);
} else if (eStructuralFeature
.equals(CompositionprogramPackage.Literals.COMPOSITION_PROGRAM__UCPI)) {
// ignore warnings about empty UCPIs, since these are only follow-up problems
} else {
diagnostics.add(tempDiagnostics);
}
}
return result;
}
/**
* Returns the resource locator that will be used to fetch messages for this validator's diagnostics.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
@Override
public ResourceLocator getResourceLocator() {
// Specialize this to return a resource locator for messages specific to
// this validator.
return super.getResourceLocator();
}
protected void addWarning(DiagnosticChain diagnostics, String message, List<? extends EObject> data) {
if (diagnostics != null) {
diagnostics.add(new BasicDiagnostic(
Diagnostic.WARNING,
DIAGNOSTIC_SOURCE,
0,
message,
data.toArray()));
}
}
} //CompositionprogramValidator