/**
*/
package ftp.impl;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.cs3.prolog.connector.Connector;
import org.cs3.prolog.connector.process.PrologProcess;
import org.cs3.prolog.connector.process.PrologProcessException;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
import ftp.AndGate;
import ftp.Component;
import ftp.FTNode;
import ftp.Fault;
import ftp.FaultTree;
import ftp.FtpPackage;
import ftp.Observation;
import ftp.OrGate;
import ftp.Port;
import ftp.PortValue;
import ftp.RootEvent;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Observation</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* </p>
* <ul>
* <li>{@link ftp.impl.ObservationImpl#getComponent <em>Component</em>}</li>
* <li>{@link ftp.impl.ObservationImpl#getPortValues <em>Port Values</em>}</li>
* <li>{@link ftp.impl.ObservationImpl#getName <em>Name</em>}</li>
* <li>{@link ftp.impl.ObservationImpl#getFaultLimit <em>Fault Limit</em>}</li>
* <li>{@link ftp.impl.ObservationImpl#getFaulttree <em>Faulttree</em>}</li>
* </ul>
*
* @generated
*/
public class ObservationImpl extends MinimalEObjectImpl.Container implements Observation {
/**
* The cached value of the '{@link #getComponent() <em>Component</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getComponent()
* @generated
* @ordered
*/
protected Component component;
/**
* The cached value of the '{@link #getPortValues() <em>Port Values</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getPortValues()
* @generated
* @ordered
*/
protected EList<PortValue> portValues;
/**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getName()
* @generated
* @ordered
*/
protected static final String NAME_EDEFAULT = null;
/**
* The cached value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getName()
* @generated
* @ordered
*/
protected String name = NAME_EDEFAULT;
/**
* The default value of the '{@link #getFaultLimit() <em>Fault Limit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getFaultLimit()
* @generated
* @ordered
*/
protected static final int FAULT_LIMIT_EDEFAULT = 0;
/**
* The cached value of the '{@link #getFaultLimit() <em>Fault Limit</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getFaultLimit()
* @generated
* @ordered
*/
protected int faultLimit = FAULT_LIMIT_EDEFAULT;
/**
* The cached value of the '{@link #getFaulttree() <em>Faulttree</em>}' containment reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getFaulttree()
* @generated
* @ordered
*/
protected FaultTree faulttree;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ObservationImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return FtpPackage.Literals.OBSERVATION;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Component getComponent() {
if (component != null && component.eIsProxy()) {
InternalEObject oldComponent = (InternalEObject)component;
component = (Component)eResolveProxy(oldComponent);
if (component != oldComponent) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, FtpPackage.OBSERVATION__COMPONENT, oldComponent, component));
}
}
return component;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Component basicGetComponent() {
return component;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setComponent(Component newComponent) {
Component oldComponent = component;
component = newComponent;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FtpPackage.OBSERVATION__COMPONENT, oldComponent, component));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<PortValue> getPortValues() {
if (portValues == null) {
portValues = new EObjectContainmentEList<PortValue>(PortValue.class, this, FtpPackage.OBSERVATION__PORT_VALUES);
}
return portValues;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getName() {
return name;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setName(String newName) {
String oldName = name;
name = newName;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FtpPackage.OBSERVATION__NAME, oldName, name));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public int getFaultLimit() {
return faultLimit;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setFaultLimit(int newFaultLimit) {
int oldFaultLimit = faultLimit;
faultLimit = newFaultLimit;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FtpPackage.OBSERVATION__FAULT_LIMIT, oldFaultLimit, faultLimit));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public FaultTree getFaulttree() {
return faulttree;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetFaulttree(FaultTree newFaulttree, NotificationChain msgs) {
FaultTree oldFaulttree = faulttree;
faulttree = newFaulttree;
if (eNotificationRequired()) {
ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FtpPackage.OBSERVATION__FAULTTREE, oldFaulttree, newFaulttree);
if (msgs == null) msgs = notification; else msgs.add(notification);
}
return msgs;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setFaulttree(FaultTree newFaulttree) {
if (newFaulttree != faulttree) {
NotificationChain msgs = null;
if (faulttree != null)
msgs = ((InternalEObject)faulttree).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FtpPackage.OBSERVATION__FAULTTREE, null, msgs);
if (newFaulttree != null)
msgs = ((InternalEObject)newFaulttree).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FtpPackage.OBSERVATION__FAULTTREE, null, msgs);
msgs = basicSetFaulttree(newFaulttree, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FtpPackage.OBSERVATION__FAULTTREE, newFaulttree, newFaulttree));
}
private static final String compile_fault_trees_pl = "assertz((:-(min_fault_tree(A,B,I),','(copy_term(','(A,B),','(D,C)),','(setof(C,D,E),','(filter_for_time_and_fails(E,F),','(!,','(eliminate_supersets(F,G),','(!,','(factor_intersections(G,H),','(!,boolean_conversion(or,H,I)))))))))))),assertz((:-(min_fault_tree(A,B,C,I),','(findall(D,prune(A,B,C,D),E),','(sort(E,F),','(eliminate_supersets(F,G),','(!,','(factor_intersections(G,H),','(!,boolean_conversion(or,H,I)))))))))),assertz((:-(prune(A,B,E,D),','(call(A),','(convert_time_series(B,C),','(filter_conj(C,D),','(=(D,'.'(_,_)),fault_limit(E,D)))))))),assertz(fault_limit(fault_limit(0),_)),assertz((:-(fault_limit(fault_limit(A),B),','(>(A,0),','(length(B,C),<(C,+(A,1))))))),assertz(filter_for_time_and_fails([],[])),assertz((:-(filter_for_time_and_fails('.'(A,C),F),','(convert_time_series(A,B),','(filter_conj(B,D),','(filter_for_time_and_fails(C,E),combine(D,E,F))))))),assertz(combine([],A,A)),assertz((:-(combine(A,B,'.'(A,B)),\\=(A,[])))),assertz((:-(convert_time_series(A,B),','(is_a_list(A),','(!,convert_time_series(1,A,B)))))),assertz(convert_time_series(state(A,B),state(0,A,B))),assertz((:-(convert_time_series(','(A,C),','(B,D)),','(convert_time_series(A,B),convert_time_series(C,D))))),assertz((:-(convert_time_series(A,'.'(B,[]),C),convert_time_conj(A,B,C)))),assertz((:-(convert_time_series(A,'.'(B,E),','(C,F)),','(convert_time_conj(A,B,C),','(is(D,+(A,1)),convert_time_series(D,E,F)))))),assertz(convert_time_conj(A,state(B,C),state(A,B,C))),assertz((:-(convert_time_conj(A,','(state(B,C),D),','(state(A,B,C),E)),convert_time_conj(A,D,E)))),assertz((:-(filter_conj(','(A,B),E),','(filter_conj(A,C),','(filter_conj(B,D),append(C,D,E)))))),assertz((:-(filter_conj(state(_,_,A),[]),\\+(fail_state(A))))),assertz((:-(filter_conj(state(A,B,C),'.'(state(A,B,C),[])),fail_state(C)))),assertz(fail_state(failed)),assertz(fail_state(failed(_))),assertz(eliminate_supersets([],[])),assertz((:-(eliminate_supersets('.'(A,B),F),','(part(A,B,C,D),','(eliminate_supersets(C,E),append(D,E,F)))))),assertz((:-(part(A,[],[],'.'(A,[])),!))),assertz((:-(part(A,'.'(B,D),E,F),','(subset(A,B,C),part(C,A,'.'(B,D),E,F))))),assertz((:-(part(right,_,A,A,[]),!))),assertz((:-(part(A,B,'.'(_,C),D,E),','(;(=(A,left),=(A,both)),','(!,part(B,C,D,E)))))),assertz((:-(part(neither,B,'.'(A,C),'.'(A,D),E),part(B,C,D,E)))),assertz((:-(subset(A,B,G),','(intersection(A,B,C),','(!,','(size(A,D),','(size(B,E),','(size(C,F),q(D,E,F,G))))))))),assertz((:-(q(A,A,A,both),!))),assertz((:-(q(A,_,A,left),!))),assertz((:-(q(_,A,A,right),!))),assertz(q(_,_,_,neither)),assertz(factor_intersections([],[])),assertz((:-(factor_intersections(A,E),','(largest_common_subset(A,B,C,D),factor_intersections0(A,B,C,D,E))))),assertz(factor_intersections0(A,none,[],_,A)),assertz((:-(factor_intersections0(_,A,B,D,G),','(differences(A,B,C),','(append(A,'.'(C,[]),E),','(factor_intersections(D,F),append('.'(E,[]),F,G))))))),assertz((:-(largest_common_subset(A,C,D,E),','(lcs([],A,B),','(most_leaves_eliminated(B,C),split(A,C,D,E)))))),assertz(lcs(A,[],A)),assertz((:-(lcs(A,'.'(B,C),E),','(lcs0(A,B,C,D),lcs(D,C,E))))),assertz(lcs0(A,_,[],A)),assertz((:-(lcs0(E,A,'.'(B,G),H),','(intersection(A,B,C),','(size(C,D),','(add_unique(','(C,D),E,F),lcs0(F,A,G,H))))))),assertz(size([],0)),assertz((:-(size('.'(_,A),B),','(size(A,C),is(B,+(C,1)))))),assertz(add_unique(','([],0),A,A)),assertz(add_unique(','(A,B),[],'.'(','(A,B),[]))),assertz((:-(add_unique(','(A,E),'.'(','(A,D),B),'.'(','(A,C),B)),is(C,+(D,E))))),assertz((:-(add_unique(','(C,D),'.'(','(A,B),E),'.'(','(A,B),F)),','(\\+(=(C,A)),add_unique(','(C,D),E,F))))),assertz((:-(most_leaves_eliminated(A,B),mle(','(none,0),A,B)))),assertz(mle(','(A,_),[],A)),assertz((:-(mle(','(_,A),'.'(','(C,B),D),E),','(<(A,B),mle(','(C,B),D,E))))),assertz((:-(mle(','(C,A),'.'(','(_,B),D),E),','(\\+(<(A,B)),mle(','(C,A),D,E))))),assertz(differences(_,[],[])),assertz((:-(differences(A,'.'(B,D),'.'(C,E)),','(diff(A,B,C),differences(A,D,E))))),assertz(diff([],A,A)),assertz(diff(_,[],[])),assertz((:-(diff('.'(A,C),B,E),','(remove(A,B,D),diff(C,D,E))))),assertz(remove(_,[],[])),assertz(remove(A,'.'(A,B),B)),assertz((:-(remove(B,'.'(A,C),'.'(A,D)),','(\\+(=(B,A)),remove(B,C,D))))),assertz(split(A,none,[],A)),assertz(split([],_,[],[])),assertz((:-(split('.'(A,B),A,C,D),split(B,A,C,D)))),assertz((:-(split('.'(A,C),B,D,'.'(A,E)),','(\\+(=(A,B)),','(intersection(A,B,[]),split(C,B,D,E)))))),assertz((:-(split('.'(A,C),B,'.'(A,D),E),','(\\+(=(A,B)),','(intersection(A,B,'.'(_,_)),split(C,B,D,E)))))),assertz(intersection([],_,[])),assertz(intersection(_,[],[])),assertz((:-(intersection('.'(A,C),B,'.'(A,D)),','(member(A,B),intersection(C,B,D))))),assertz((:-(intersection('.'(A,C),B,D),','(\\+(member(A,B)),intersection(C,B,D))))),assertz((:-(member(A,'.'(A,_)),!))),assertz((:-(member(A,'.'(_,B)),member(A,B)))),assertz(boolean_conversion(_,[],[])),assertz((:-(boolean_conversion(_,A,A),=(A,fault(_))))),assertz((:-(boolean_conversion(_,A,B),','(=(A,state(_,_,_)),flatten_state(A,B))))),assertz((:-(boolean_conversion(A,'.'(C,[]),D),','(switch_op(A,B),boolean_conversion(B,C,D))))),assertz((:-(boolean_conversion(B,A,D),','(=(A,'.'(_,'.'(_,_))),','(switch_op(B,C),','(convert_subterms(C,A,E),=..(D,'.'(B,E)))))))),assertz((:-(flatten_state(state(F,A,B),fault(G)),','(flatten_list(A,C),','(atomize_term(B,D),','(atom_concat(C,D,E),add_time(E,F,G))))))),assertz(flatten_list([],'')),assertz((:-(flatten_list('.'(B,A),E),','(flatten_list(A,D),','(atom_concat(B,' ',C),atom_concat(C,D,E)))))),assertz((:-(atomize_term(A,A),','(atom(A),!)))),assertz((:-(atomize_term(A,B),','(number(A),','(!,atom_number(B,A)))))),assertz((:-(atomize_term(A,F),','(=..(A,'.'(B,C)),','(atom_concat(B,'(',D),','(atomize_args(C,E),atom_concat(D,E,F))))))),assertz(atomize_args([],')')),assertz((:-(atomize_args('.'(B,A),E),','(atomize_args(A,D),','(atomize_term(B,C),atom_concat(C,D,E)))))),assertz(add_time(A,0,A)),assertz((:-(add_time(B,A,E),','(>(A,0),','(atom_concat(B,' in state ',C),','(atom_number(D,A),atom_concat(C,D,E))))))),assertz(switch_op(or,and)),assertz(switch_op(and,or)),assertz(convert_subterms(_,[],[])),assertz((:-(convert_subterms(A,'.'(B,D),'.'(C,E)),','(boolean_conversion(A,B,C),convert_subterms(A,D,E))))),assertz((:-(component(E,A,F),','(functor(A,D,B),','(call(A),','(arg(B,A,C),rename_state(C,D,E,F))))))),assertz((:-(rename_state(state(B,A),C,the,state(D,A)),','(!,append(B,'.'(of,'.'(the,'.'(C,[]))),D))))),assertz((:-(rename_state(state(B,A),C,D,state(E,A)),','(!,append(B,'.'(of,'.'(C,'.'(D,[]))),E))))),assertz((:-(rename_state(','(A,E),B,C,','(D,F)),','(!,','(rename_state(A,B,C,D),rename_state(E,B,C,F)))))),assertz((:-(rename_state(A,_,_,A),','(is_a_list(A),!)))),assertz((:-(rename_state(B,A,the,state('.'(the,'.'(A,[])),B)),!))),assertz(rename_state(C,A,B,state('.'(A,'.'(B,[])),C))),assertz(is_a_list([])),assertz(is_a_list('.'(_,_))),assertz(connected([])),assertz(connected('.'(_,[]))),assertz((:-(connected('.'(A,B)),','(terminal_type(A,_,_),connected('.'(A,B),0))))),assertz((:-(connected('.'(A,'.'(B,C))),','(=(A,B),connected('.'(B,C)))))),assertz((:-(connected('.'(A,[]),B),','(terminal_type(A,_,C),{}(=(+(B,C),0)))))),assertz((:-(connected('.'(A,'.'(B,G)),E),','(terminal_type(A,C,F),','(terminal_type(B,D,_),','({}(','(=(C,D),=(H,+(E,F)))),connected('.'(B,G),H))))))),assertz(terminal_type(electrical(A,B),A,B)),assertz(terminal_type(hydraulic(A,B),A,B)),assertz(terminal_type(mechanical(A,B),A,B)),compile_predicates([add_time/3,add_unique/3,atomize_args/2,atomize_term/2,boolean_conversion/3,combine/3,component/3,connected/1,connected/2,convert_subterms/3,convert_time_conj/3,convert_time_series/2,convert_time_series/3,diff/3,differences/3,eliminate_supersets/2,factor_intersections/2,factor_intersections0/5,fail_state/1,fault_limit/2,filter_conj/2,filter_for_time_and_fails/2,flatten_list/2,flatten_state/2,intersection/3,is_a_list/1,largest_common_subset/4,lcs/3,lcs0/4,member/2,min_fault_tree/3,min_fault_tree/4,mle/3,most_leaves_eliminated/2,part/4,part/5,prune/4,q/4,remove/3,rename_state/4,size/2,split/4,subset/3,switch_op/2,terminal_type/3]),";
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public FaultTree buildFaultTree() {
if (component == null || portValues == null || (portValues != null && portValues.isEmpty())) {
return null;
}
StringBuffer query = new StringBuffer();
query.append("use_module(library(clpr)),");
query.append(compile_fault_trees_pl);
// NEED TO RELATIVIZE THIS REFERENCE ...
//*************************************************************
// query.append("consult('/Users/Mac/workspace-prolog/FTA/CertWare/fault_trees.pl'),");
//*************************************************************
/* IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
IPath root_path = myWorkspaceRoot.getLocation();
IProject myFTP = myWorkspaceRoot.getProject("ftp");
// open if necessary
if (myFTP.exists() && !myFTP.isOpen())
try {
myFTP.open(null);
} catch (CoreException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
IPath ftp_path = myFTP.getLocation();
IFile fault_trees = myFTP.getFile("fault_trees.pl");
IPath ft_path1 = fault_trees.getLocation();
IPath ft_path2 = fault_trees.getRawLocation();
URI ft_uri1 = fault_trees.getLocationURI();
URI ft_uri2 = fault_trees.getRawLocationURI(); */
//*************************************************************
// assert all of the predicate definitions
List<Predicate> preds = getComponent().translateToLogic();
for (Predicate p : preds) {
List<String> clauses = p.clauses;
for (String c : clauses) {
query.append("assertz(" + c + "),");
}
}
//translate PortValues to min_fault_tree query
query.append("min_fault_tree(");
query.append(getComponent().getSafeFunctor() + "(");
List<Port> ports = getComponent().retrievePorts();
EList<PortValue> pvs = getPortValues();
int number_of_args = 0;
for (Port p : ports) {
if (number_of_args > 0)
query.append(",");
boolean found = false;
for (PortValue pv : pvs) {
if (pv.getPort().equals(p)) {
pv.getValue().toBuffer(query);
found = true;
break;
}
}
if (!found) {
query.append("_");
}
number_of_args++;
}
query.append(",State),State,fault_limit(");
query.append(getFaultLimit());
query.append("),Tree).");
// execute query in a Prolog process
Map<String, Object> result = null;
PrologProcess prolog = null;
try {
// NEED TO PARAMATERIZE THE SWIPL EXECUTABLE ...
//*************************************************************
prolog = Connector.newPrologProcess("/applications/swi-prolog.app/contents/macos/swipl");
// prolog = Connector.newPrologProcess();
//*************************************************************
String queryStr = query.toString(); // for debugging ...
result = prolog.queryOnce(queryStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (PrologProcessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
prolog.stop();
} catch (PrologProcessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// build the root event
RootEvent root = new RootEventImpl();
StringBuffer sb = new StringBuffer();
if (result == null) {
sb.append("NO FAULT STATES ARE COMPATIBLE WITH ");
}
sb.append(getComponent().getType());
sb.append(':');
for (PortValue pv : pvs) {
sb.append(' ');
sb.append(pv.getPort().getType());
sb.append(" = ");
pv.getValue().toBuffer(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
FaultTree ft = new FaultTreeImpl();
ft.getFtnodes().add(root);
ft.setRoot(root);
if (result != null) {
String term = new String(result.get("Tree").toString());
if (term.equals("[]")) {
sb.append(" THERE ARE NO SOLUTIONS WITH FEWER THAN " + Integer.toString(getFaultLimit()+1) + " FAULTS");
}
else {
SubTree subtree = buildSubTree(term, 0, ft);
root.getInputs().add(subtree.faultTree);
}
}
root.setObservation(sb.toString());
return ft;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case FtpPackage.OBSERVATION__PORT_VALUES:
return ((InternalEList<?>)getPortValues()).basicRemove(otherEnd, msgs);
case FtpPackage.OBSERVATION__FAULTTREE:
return basicSetFaulttree(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
private SubTree buildSubTree(String root, int start, FaultTree ft) {
int next;
FTNode ftnode;
EList<FTNode> inputs;
if (root.indexOf("or",start) == start) {
OrGate or = new OrGateImpl();
inputs = or.getInputs();
ftnode = or;
next = start+3;
}
else if (root.indexOf("and",start) == start) {
AndGate and = new AndGateImpl();
inputs = and.getInputs();
ftnode = and;
next = start+4;
}
else if (root.indexOf("fault",start) == start) {
Fault fault = new FaultImpl();
int begin = start+7; // start after opening "fault('"
int end = root.indexOf('\'', begin);
fault.setDescription(root.substring(begin, end));
ft.getFtnodes().add(fault);
return new SubTree(fault,end+2); // after "')"
}
else
return null;
while (root.charAt(next) != ')') {
if (root.charAt(next) == ',')
next++;
SubTree st = buildSubTree(root, next, ft);
inputs.add(st.faultTree);
next = st.next;
}
ft.getFtnodes().add(ftnode);
return new SubTree(ftnode,next+1);
}
private class SubTree {
FTNode faultTree;
int next;
SubTree(FTNode ft, int i) {
faultTree = ft;
next = i;
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case FtpPackage.OBSERVATION__COMPONENT:
if (resolve) return getComponent();
return basicGetComponent();
case FtpPackage.OBSERVATION__PORT_VALUES:
return getPortValues();
case FtpPackage.OBSERVATION__NAME:
return getName();
case FtpPackage.OBSERVATION__FAULT_LIMIT:
return getFaultLimit();
case FtpPackage.OBSERVATION__FAULTTREE:
return getFaulttree();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case FtpPackage.OBSERVATION__COMPONENT:
setComponent((Component)newValue);
return;
case FtpPackage.OBSERVATION__PORT_VALUES:
getPortValues().clear();
getPortValues().addAll((Collection<? extends PortValue>)newValue);
return;
case FtpPackage.OBSERVATION__NAME:
setName((String)newValue);
return;
case FtpPackage.OBSERVATION__FAULT_LIMIT:
setFaultLimit((Integer)newValue);
return;
case FtpPackage.OBSERVATION__FAULTTREE:
setFaulttree((FaultTree)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case FtpPackage.OBSERVATION__COMPONENT:
setComponent((Component)null);
return;
case FtpPackage.OBSERVATION__PORT_VALUES:
getPortValues().clear();
return;
case FtpPackage.OBSERVATION__NAME:
setName(NAME_EDEFAULT);
return;
case FtpPackage.OBSERVATION__FAULT_LIMIT:
setFaultLimit(FAULT_LIMIT_EDEFAULT);
return;
case FtpPackage.OBSERVATION__FAULTTREE:
setFaulttree((FaultTree)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case FtpPackage.OBSERVATION__COMPONENT:
return component != null;
case FtpPackage.OBSERVATION__PORT_VALUES:
return portValues != null && !portValues.isEmpty();
case FtpPackage.OBSERVATION__NAME:
return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
case FtpPackage.OBSERVATION__FAULT_LIMIT:
return faultLimit != FAULT_LIMIT_EDEFAULT;
case FtpPackage.OBSERVATION__FAULTTREE:
return faulttree != null;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
switch (operationID) {
case FtpPackage.OBSERVATION___BUILD_FAULT_TREE:
return buildFaultTree();
}
return super.eInvoke(operationID, arguments);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (name: ");
result.append(name);
result.append(", faultLimit: ");
result.append(faultLimit);
result.append(')');
return result.toString();
}
} //ObservationImpl