package org.reldb.rel.v0.types.userdefined; import org.reldb.rel.exceptions.ExceptionSemantic; import org.reldb.rel.v0.types.TypeAlpha; public class DerivedPossrep extends Possrep { public DerivedPossrep(TypeAlpha type, String name) { super(type, name); } public void addDerivation(String newIdentifier, String oldIdentifier, String supertypeName) { if (!oldIdentifier.startsWith("THE_")) throw new ExceptionSemantic("RS0236: Derived POSSREP component must reference a THE_ operator."); oldIdentifier = oldIdentifier.substring(4); TypeAlpha supertype = this.getType().getSupertype(); while (!supertype.getTypeName().equals(supertypeName)) { supertype = supertype.getSupertype(); if (supertype == null) throw new ExceptionSemantic("RS0237: Type '" + supertypeName + "' is not a supertype of '" + getType().getTypeName() + "'."); } for (int i=0; i<supertype.getPossrepCount(); i++) { Possrep possrep = supertype.getPossrep(i); PossrepComponent component = possrep.locateComponent(oldIdentifier); if (component != null) { new PossrepComponent(this, component.getComponentIndex(), newIdentifier, component.getType()); return; } } throw new ExceptionSemantic("RS0238: A component named '" + oldIdentifier + "' could not be found in type '" + supertypeName + "'."); } }