/**
* Ref.java
*
* @author Charles Groves
*/
package edu.sc.seis.sod.validator.model;
public class Ref implements FormProvider {
public Ref(Grammar owner) {
this(owner, "");
}
public Ref(Grammar owner, String name) {
this(owner, name, null);
}
public Ref(Grammar owner, String name, Form parent) {
this.owner = owner;
this.name = name;
this.parent = parent;
ann.setFormProvider(this);
}
public FormProvider copyWithNewParent(Form newParent) {
Ref copy = new Ref(owner, name, newParent);
copy.setMin(min);
copy.setMax(max);
if(ann != null) {
copy.setAnnotation(ann);
}
return copy;
}
public Form getForm() {
if(derefedForm == null) {
Definition def = getDef();
Form refedForm = def.getForm();
derefedForm = refedForm.deref(parent, def);
if(getMin() == 0) {
derefedForm.setMin(getMin());
}
if(getMax() > 1) {
derefedForm.setMax(getMax());
}
//TODO merge in annotations from ref into defs annotation
}
return derefedForm;
}
public String getName() {
return name;
}
public Definition getDef() {
Definition d = owner.getDef(name);
if (d == null) {
throw new NullPointerException("definition of '"+name+"' should not be null");
}
return d;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public int getMax() {
return max;
}
public void setAnnotation(Annotation ann) {
this.ann = ann;
ann.setFormProvider(this);
}
public void setMax(int max) {
this.max = max;
}
public int hashCode() {
int result = 382;
result += 37 * owner.hashCode();
result += 37 * name.hashCode();
return result + 37 * parent.hashCode();
}
private int max = 1, min = 1;
private Grammar owner;
private String name = "";
private Form parent;
private Form derefedForm;
private Annotation ann = new Annotation();
}