package abstrasy;
import abstrasy.externals.AExtClonable;
import abstrasy.interpreter.InterpreterException;
import abstrasy.interpreter.StdErrors;
/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
* http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/
public class Pattern implements AExtClonable{
//
// type primaire
//
private long primaryType = Node.TYPE_NONE;
//
// corps du pattern
//
private Node bodyPx = null;
//
// interface de contrainte générique
//
private Node iface=null;
public Pattern(){
}
public static Pattern createPattern(long primaryType,Node bodyPx, Node iface){
Pattern px=new Pattern();
px.setPrimaryType(primaryType);
px.setBodyPx(bodyPx);
px.setIface(iface);
return px;
}
public static Pattern createPattern(String externalId) throws InterpreterException {
Pattern px=new Pattern();
px.setPrimaryType(Node.TYPE_EXTERNAL);
px.setBodyPx( Node.createLazy().append(Node.createPCode(PCoder.PC_EXTERNAL)).append(new Node(externalId)) );
return px;
}
public boolean equals(Pattern pattern) throws Exception {
if(pattern==null) return false;
if(this==pattern) return true;
if(this.primaryType!=pattern.primaryType) return false;
if((this.iface!=null && pattern.iface==null) || (this.iface==null && pattern.iface!=null)) return false;
if(this.iface!=null && !Node.equalsNodes(iface, pattern.iface)) return false;
return Node.equalsNodes(bodyPx,pattern.bodyPx);
}
public void requirePrimaryType(Node node) throws InterpreterException {
if (node==null)
throw new InterpreterException(StdErrors.extend(StdErrors.Object_required, "void pattern"));
node.requireNodeType(primaryType);
}
public void requireInterface(Node node) throws InterpreterException {
if(iface!=null){
Interface cinter=(Interface)iface.getExternal();
cinter.require(node);
}
}
public void requireAll(Node node) throws InterpreterException {
requirePrimaryType(node);
requireInterface(node);
}
@Override
public Object clone_my_self(Bivalence bival) throws Exception {
Pattern res=new Pattern();
//
// les éléments sont copiés et non clonés
//
res.setPrimaryType(primaryType);
res.setBodyPx(bodyPx);
res.setIface(iface);
return res;
}
public void setPrimaryType(long primaryType) {
this.primaryType = primaryType;
}
public long getPrimaryType() {
return primaryType;
}
public void setBodyPx(Node bodyPx) {
this.bodyPx = bodyPx;
}
public Node getBodyPx() {
return bodyPx;
}
public void setIface(Node iface) {
this.iface = iface;
}
public Node getIface() {
return iface;
}
}