package com.celements.model.classes.fields; import java.util.Objects; import javax.annotation.Nullable; import javax.validation.constraints.NotNull; import org.xwiki.model.reference.DocumentReference; import com.celements.model.util.ModelUtils; import com.celements.model.util.References; import com.google.common.base.Strings; import com.xpn.xwiki.objects.PropertyInterface; import com.xpn.xwiki.objects.classes.PropertyClass; import com.xpn.xwiki.web.Utils; /** * Subclasses are expected to be immutable */ public abstract class AbstractClassField<T> implements ClassField<T> { private final DocumentReference classRef; private final String name; private final String prettyName; private final String validationRegExp; private final String validationMessage; public abstract static class Builder<B extends Builder<B, T>, T> { private final DocumentReference classRef; private final String name; private String prettyName; private String validationRegExp; private String validationMessage; public Builder(@NotNull DocumentReference classRef, @NotNull String name) { Objects.requireNonNull(classRef); this.classRef = References.cloneRef(classRef, DocumentReference.class); this.name = Objects.requireNonNull(Strings.emptyToNull(name)); } public abstract B getThis(); public B prettyName(@Nullable String val) { prettyName = val; return getThis(); } public B validationRegExp(@Nullable String val) { validationRegExp = val; return getThis(); } public B validationMessage(@Nullable String val) { validationMessage = val; return getThis(); } public abstract AbstractClassField<T> build(); } protected AbstractClassField(@NotNull Builder<?, T> builder) { this.classRef = builder.classRef; this.name = builder.name; this.prettyName = builder.prettyName; this.validationRegExp = builder.validationRegExp; this.validationMessage = builder.validationMessage; } @Override public DocumentReference getClassRef() { return References.cloneRef(classRef, DocumentReference.class); } @Override public String getName() { return name; } public String getPrettyName() { return prettyName; } public String getValidationRegExp() { return validationRegExp; } public String getValidationMessage() { return validationMessage; } @Override public PropertyInterface getXField() { PropertyClass element = getPropertyClass(); element.setName(name); if (prettyName != null) { element.setPrettyName(prettyName); } if (validationRegExp != null) { element.setValidationRegExp(validationRegExp); } if (validationMessage != null) { element.setValidationMessage(validationMessage); } return element; } protected abstract PropertyClass getPropertyClass(); @Override public int hashCode() { return Objects.hash(classRef, name); } @Override public boolean equals(Object obj) { if (obj instanceof AbstractClassField) { AbstractClassField<?> other = (AbstractClassField<?>) obj; return Objects.equals(this.classRef, other.classRef) && Objects.equals(this.name, other.name); } return false; } @Override public String toString() { return toString(true); } @Override public String toString(boolean local) { return (local ? getModelUtils().serializeRefLocal(classRef) : getModelUtils().serializeRef(classRef)) + "." + name; } protected static ModelUtils getModelUtils() { return Utils.getComponent(ModelUtils.class); } }