package rtt.annotation.editor.controller; import rtt.annotation.editor.model.annotation.Annotatable; import rtt.annotation.editor.model.annotation.Annotation; public abstract class AbstractAnnotationController<A extends Annotation> implements IAnnotationController<A> { private Class<A> annotationType; public AbstractAnnotationController(Class<A> annotationType) { this.annotationType = annotationType; } @Override public final boolean hasAnnotationType(Class<? extends Annotation> annotationType) { return this.annotationType.equals(annotationType); } @Override public final boolean canExecute(Mode mode, Annotatable<?> element) { if (element == null) { throw new IllegalArgumentException("Element was null."); } switch (mode) { case SET: return canSetAnnotation(element); case UNSET: return canUnsetAnnotation(element); default: throw new IllegalArgumentException("Unknown mode '" + mode + "'"); } } protected boolean canSetAnnotation(Annotatable<?> element) { return !element.hasAnnotation(); } protected boolean canUnsetAnnotation(Annotatable<?> element) { return element.hasAnnotation(); } @Override public final boolean execute(Mode mode, Annotatable<A> element) { if (element == null) { throw new IllegalArgumentException("Element was null."); } switch (mode) { case SET: element.setAnnotation(Annotation.create(annotationType)); return true; case UNSET: element.setAnnotation(null); return true; default: throw new IllegalArgumentException("Unknown mode '" + mode + "'"); } } }