package com.celements.model.util; import static com.google.common.base.Preconditions.*; import org.xwiki.component.annotation.Component; import org.xwiki.component.annotation.Requirement; import org.xwiki.model.EntityType; import org.xwiki.model.reference.EntityReference; import org.xwiki.model.reference.EntityReferenceResolver; import org.xwiki.model.reference.EntityReferenceSerializer; import org.xwiki.model.reference.WikiReference; import com.celements.model.context.ModelContext; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; @Component public class DefaultModelUtils implements ModelUtils { @Requirement private ModelContext context; @Requirement("explicit") private EntityReferenceResolver<String> resolver; @Requirement private EntityReferenceSerializer<String> serializer; @Requirement("local") private EntityReferenceSerializer<String> serializerLocal; @Override public boolean isAbsoluteRef(EntityReference ref) { return References.isAbsoluteRef(ref); } @Override public EntityReference cloneRef(EntityReference ref) { return References.cloneRef(ref); } @Override public <T extends EntityReference> T cloneRef(EntityReference ref, Class<T> token) { return References.cloneRef(ref, token); } @Override public <T extends EntityReference> Optional<T> extractRef(EntityReference fromRef, Class<T> token) { return References.extractRef(fromRef, token); } @Override public <T extends EntityReference> T adjustRef(T ref, Class<T> token, EntityReference toRef) { return References.adjustRef(ref, token, MoreObjects.firstNonNull(toRef, context.getWikiRef())); } @Override public Class<? extends EntityReference> identifyClassFromName(String name) { return References.identifyClassFromName(name); } @Override public EntityReference resolveRef(String name) { return resolveRef(name, (EntityReference) null); } @Override public EntityReference resolveRef(String name, EntityReference baseRef) { return resolveRef(name, identifyClassFromName(name), baseRef); } @Override public <T extends EntityReference> T resolveRef(String name, Class<T> token) { return resolveRef(name, token, null); } @Override public <T extends EntityReference> T resolveRef(String name, Class<T> token, EntityReference baseRef) { if (checkNotNull(name).isEmpty()) { throw new IllegalArgumentException("name may not be empty"); } EntityType type = References.getEntityTypeForClass(token); baseRef = MoreObjects.firstNonNull(baseRef, context.getWikiRef()); EntityReference resolvedRef; if (type.ordinal() == 0) { // resolver cannot handle root reference resolvedRef = new WikiReference(name); } else { resolvedRef = resolver.resolve(name, type, baseRef); } return cloneRef(resolvedRef, token); // effective immutability } @Override public String serializeRef(EntityReference ref) { checkNotNull(ref); return serializer.serialize(ref); } @Override public String serializeRefLocal(EntityReference ref) { checkNotNull(ref); return serializerLocal.serialize(ref); } }