/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.sca.sad.validation;
import gov.redhawk.validation.DceUuidConstraint;
import mil.jpeojtrs.sca.partitioning.NamingService;
import mil.jpeojtrs.sca.partitioning.PartitioningPackage;
import mil.jpeojtrs.sca.sad.ComponentResourceFactoryRef;
import mil.jpeojtrs.sca.sad.FindComponent;
import mil.jpeojtrs.sca.sad.SadComponentInstantiation;
import mil.jpeojtrs.sca.sad.SadComponentPlacement;
import mil.jpeojtrs.sca.sad.SadPackage;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.validator.EnhancedConstraintStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.validation.AbstractModelConstraint;
import org.eclipse.emf.validation.IValidationContext;
import org.eclipse.emf.validation.model.ConstraintStatus;
/**
* @since 2.1
*/
public class FindComponentConstraint extends AbstractModelConstraint {
public static final String SOURCE_ID = SadValidationConstants.SOURCE_ID;
public static final int STATUS_CODE = 1001;
private static final String NO_ELEMENTS = "FindComponent must have either a ComponentResourceFactoryRef or a NamingService element defined in Component: ";
private static final String BOTH_ELEMENTS = "FindComponent can only have either a ComponentResourceFactoryRef or a NamingService element defined in Component: ";
private static final String NULL_NAMING_SERVICE_NAME = "The Name attribute is not defined for the Naming Service element in Component: ";
private static final String BLANK_NAMING_SERVICE_NAME = "The Name attribute is blank for the Naming Service element in Component: ";
private static final String DUPLICATE_NAMING_SERVICE_NAME = "Duplicate Naming Service name being used by Components: ";
@Override
public IStatus validate(final IValidationContext ctx) {
final EObject target = ctx.getTarget();
if (target instanceof FindComponent) {
final FindComponent findComp = (FindComponent) target;
return FindComponentConstraint.validate(findComp, ctx);
}
return Status.OK_STATUS;
}
public static IStatus validate(final FindComponent findComp, final IValidationContext ctx) {
IStatus validStatus = FindComponentConstraint.valid(findComp, ctx);
if (validStatus != Status.OK_STATUS) {
return validStatus;
} else {
validStatus = FindComponentConstraint.unique(findComp, ctx);
}
if (validStatus != Status.OK_STATUS) {
return validStatus;
}
return Status.OK_STATUS;
}
private static IStatus valid(final FindComponent findComp, final IValidationContext ctx) {
final SadComponentInstantiation parentInst = (SadComponentInstantiation) findComp.eContainer();
if ((findComp.getComponentResourceFactoryRef() == null) && (findComp.getNamingService() == null)) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(FindComponentConstraint.NO_ELEMENTS + parentInst.getId()),
SadPackage.Literals.FIND_COMPONENT__NAMING_SERVICE);
}
if ((findComp.getComponentResourceFactoryRef() != null) && (findComp.getNamingService() != null)) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(FindComponentConstraint.BOTH_ELEMENTS + parentInst.getId()),
SadPackage.Literals.FIND_COMPONENT__NAMING_SERVICE);
}
if (findComp.getNamingService() != null) {
final NamingService ns = findComp.getNamingService();
final String nsName = ns.getName();
if (nsName == null) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(FindComponentConstraint.NULL_NAMING_SERVICE_NAME
+ parentInst.getId()), PartitioningPackage.Literals.NAMING_SERVICE__NAME);
}
if (nsName.trim().length() == 0) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(FindComponentConstraint.BLANK_NAMING_SERVICE_NAME
+ parentInst.getId()), PartitioningPackage.Literals.NAMING_SERVICE__NAME);
}
} else {
final ComponentResourceFactoryRef ref = findComp.getComponentResourceFactoryRef();
final String refid = ref.getRefid();
final IStatus status = DceUuidConstraint.validate(refid);
if (status.getSeverity() == IStatus.ERROR) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(status.getMessage() + " for Component: " + parentInst.getId()),
SadPackage.Literals.COMPONENT_RESOURCE_FACTORY_REF__REFID);
}
}
return Status.OK_STATUS;
}
private static IStatus unique(final FindComponent findComp, final IValidationContext ctx) {
final SoftwareAssembly sad = SoftwareAssembly.Util.getSoftwareAssembly(findComp.eResource());
final SadComponentInstantiation parentInst = (SadComponentInstantiation) findComp.eContainer();
final NamingService ns = findComp.getNamingService();
final String nsName = ns.getName();
for (final SadComponentPlacement sadCp : sad.getPartitioning().getComponentPlacement()) {
for (final SadComponentInstantiation sadInst : sadCp.getComponentInstantiation()) {
if (!(sadInst.getId().equals(parentInst.getId())) && (FindComponentConstraint.valid(sadInst.getFindComponent(), ctx) == Status.OK_STATUS)
&& (sadInst.getFindComponent().getNamingService().getName().equals(nsName))) {
return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(FindComponentConstraint.DUPLICATE_NAMING_SERVICE_NAME
+ parentInst.getId() + " and " + sadInst.getId()), PartitioningPackage.Literals.NAMING_SERVICE__NAME);
}
}
}
return Status.OK_STATUS;
}
}