package com.googlecode.objectify.impl; import com.googlecode.objectify.annotation.AlsoLoad; import com.googlecode.objectify.annotation.IgnoreLoad; import java.lang.annotation.Annotation; import java.util.LinkedHashSet; import java.util.Set; /** * Some common behavior of properties */ abstract public class AbstractProperty implements Property { private String name; private String[] names; private Annotation[] annotations; /** */ public AbstractProperty(String name, Annotation[] annotations, Object thingForDebug) { this.name = name; this.annotations = annotations; // Figure out names from the @IgnoreLoad and @AlsoLoad annotations Set<String> nameSet = new LinkedHashSet<>(); // If we have @IgnoreLoad, don't add priamry name to the names collection (which is used for loading) if (this.getAnnotation(IgnoreLoad.class) == null) nameSet.add(name); // Now any additional names AlsoLoad alsoLoad = this.getAnnotation(AlsoLoad.class); if (alsoLoad != null) if (alsoLoad.value() == null || alsoLoad.value().length == 0) throw new IllegalStateException("If specified, @AlsoLoad must specify at least one value: " + thingForDebug); else for (String value: alsoLoad.value()) if (value == null || value.trim().length() == 0) throw new IllegalStateException("Illegal empty value in @AlsoLoad for " + thingForDebug); else nameSet.add(value); names = nameSet.toArray(new String[nameSet.size()]); } @Override public String getName() { return name; } @Override public String[] getLoadNames() { return names; } @Override public <A extends Annotation> A getAnnotation(Class<A> annoClass) { return TypeUtils.getAnnotation(annotations, annoClass); } @Override public Annotation[] getAnnotations() { return annotations; } }