/*******************************************************************************
* Copyright (c) 2010 protos software gmbh (http://www.protos.de).
* 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:
* Thomas Schuetz and Henrik Rentz-Reichert (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.core.validation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.room.ActorClass;
import org.eclipse.etrice.core.room.ActorContainerClass;
import org.eclipse.etrice.core.room.ActorInstancePath;
import org.eclipse.etrice.core.room.ActorRef;
import org.eclipse.etrice.core.room.Binding;
import org.eclipse.etrice.core.room.DataClass;
import org.eclipse.etrice.core.room.InitialTransition;
import org.eclipse.etrice.core.room.InterfaceItem;
import org.eclipse.etrice.core.room.LayerConnection;
import org.eclipse.etrice.core.room.NonInitialTransition;
import org.eclipse.etrice.core.room.ProtocolClass;
import org.eclipse.etrice.core.room.RoomClass;
import org.eclipse.etrice.core.room.RoomPackage;
import org.eclipse.etrice.core.room.StateGraph;
import org.eclipse.etrice.core.room.SubSystemClass;
import org.eclipse.etrice.core.room.TrPoint;
import org.eclipse.etrice.core.room.Transition;
import org.eclipse.etrice.core.validation.ValidationUtil.Result;
import org.eclipse.xtext.validation.Check;
public class RoomJavaValidator extends AbstractRoomJavaValidator {
@Check
public void checkTypeNameStartsWithCapital(RoomClass type) {
if (!Character.isUpperCase(type.getName().charAt(0))) {
warning("Name should start with a capital", RoomPackage.ROOM_CLASS__NAME);
}
}
@Check
public void checkActorRefIsNotCircular(ActorRef ar) {
if (ar.eContainer() instanceof ActorClass) {
ActorClass ac = (ActorClass) ar.eContainer();
if (ValidationUtil.isReferencing(ar.getType(), ac)) {
error("Actor reference is circular", RoomPackage.ACTOR_REF__TYPE);
}
}
}
@Check
public void checkBaseClassesNotCircular(DataClass dc) {
if (dc==null)
return;
DataClass base = dc.getBase();
if (base!=null && ValidationUtil.isBaseOf(dc, base))
error("Base classes are circular", RoomPackage.ACTOR_CLASS__BASE);
}
@Check
public void checkBaseClassesNotCircular(ProtocolClass pc) {
if (pc==null)
return;
ProtocolClass base = pc.getBase();
if (base!=null && ValidationUtil.isBaseOf(pc, base))
error("Base classes are circular", RoomPackage.ACTOR_CLASS__BASE);
}
@Check
public void checkBaseClassesNotCircular(ActorClass ac) {
if (ac==null)
return;
ActorClass base = ac.getBase();
if (base!=null && ValidationUtil.isBaseOf(ac, base))
error("Base classes are circular", RoomPackage.ACTOR_CLASS__BASE);
}
private SubSystemClass getSubSystemClass(EObject obj) {
EObject ctx = obj.eContainer();
while (!(ctx instanceof SubSystemClass) && ctx.eContainer()!=null)
ctx = ctx.eContainer();
if (ctx instanceof SubSystemClass)
return (SubSystemClass) ctx;
return null;
}
@Check
public void checkInstancePath(ActorInstancePath ai) {
ActorContainerClass acc = getSubSystemClass(ai);
for (String seg : ai.getSegments()) {
boolean found = false;
for (ActorRef ar : acc.getActorRefs()) {
if (ar.getName().equals(seg)) {
acc = ar.getType();
found = true;
break;
}
}
if (!found)
error("wrong actor instance path (segment number "+ai.getSegments().indexOf(seg)+")", RoomPackage.ACTOR_INSTANCE_PATH__SEGMENTS);
}
}
@Check
public void checkPortCompatibility(Binding bind) {
Result result = ValidationUtil.isValid(bind);
if (!result.isOk())
error(result.getMsg(), RoomPackage.BINDING);
}
@Check
public void checkServiceCompatibility(LayerConnection conn) {
Result result = ValidationUtil.isValid(conn);
if (!result.isOk())
error(result.getMsg(), RoomPackage.LAYER_CONNECTION);
}
@Check
public void checkTrPoint(TrPoint tp) {
Result result = ValidationUtil.isValid(tp);
if (!result.isOk())
error(result.getMsg(), RoomPackage.TR_POINT);
}
@Check
public void checkInterfaceItemUniqueName(InterfaceItem item) {
Result result = ValidationUtil.isUniqueName(item);
if (!result.isOk())
error(result.getMsg(), RoomPackage.INTERFACE_ITEM__NAME);
}
@Check
public void checkTransition(Transition trans) {
if (trans instanceof InitialTransition) {
Result result = ValidationUtil.isConnectable(null, trans.getTo(), trans, (StateGraph)trans.eContainer());
if (!result.isOk())
error(result.getMsg(), RoomPackage.TRANSITION);
}
else {
Result result = ValidationUtil.isConnectable(((NonInitialTransition)trans).getFrom(), trans.getTo(), trans, (StateGraph)trans.eContainer());
if (!result.isOk())
error(result.getMsg(), RoomPackage.TRANSITION);
}
}
}