/**
*
*/
package xapi.model.api;
import xapi.annotation.model.DeleterFor;
import xapi.annotation.model.GetterFor;
import xapi.annotation.model.SetterFor;
import xapi.model.impl.ModelNameUtil;
/**
* @author James X. Nelson (james@wetheinter.net, @james)
*
*/
public enum ModelMethodType {
GET("get"), /*GET_WITH_DEFAULT,*/ /*CHECK,*/
SET("set"), /*CHECK_AND_SET,*/ ADD("add"), ADD_ALL("addAll"),
REMOVE("remove"), CLEAR("clear"), ID("id");
private String prefix;
private ModelMethodType(final String prefix) {
this.prefix = prefix;
}
public static String deducePropertyName(final String name, String idField,
final GetterFor getter, final SetterFor setter, final DeleterFor deleter) {
switch (deduceMethodType(name, idField, getter, setter, deleter)) {
case GET:
return getter == null || getter.value().isEmpty() ? ModelNameUtil.stripGetter(name)
: getter.value();
case SET:
case ADD:
case ADD_ALL:
return setter == null || setter.value().isEmpty() ? ModelNameUtil.stripSetter(name)
: setter.value();
case REMOVE:
case CLEAR:
return deleter == null || deleter.value().isEmpty() ? ModelNameUtil.stripRemover(name)
: deleter.value();
}
throw new UnsupportedOperationException("Method "+name +" is not a valid model method name");
}
public static ModelMethodType deduceMethodType(final String name, String idField,
final GetterFor getter, final SetterFor setter, final DeleterFor deleter) {
if (getter != null) {
return GET;
}
if (setter != null) {
return SET;
}
if (deleter != null) {
return REMOVE;
}
if (name.equals(idField)) {
return ID;
}
// No annotations. We are stuck guessing based on method name. Ew.
final String prefix = name.replaceFirst("[A-Z].*", "");
switch(prefix) {
case "get":
case "is":
case "has":
return GET;
case "set":
return SET;
case "add":
case "put":
return name.startsWith(prefix+"All") ? ADD_ALL : ADD;
case "rem":
case "remove":
case "del":
case "delete":
return name.startsWith(prefix+"All") ? CLEAR : REMOVE;
case "clear":
return CLEAR;
}
throw new UnsupportedOperationException("Method "+name +" is not a valid model method name");
}
public boolean isDefaultName(final String methodName, final String propertyName) {
return methodName.equals(getDefaultName(propertyName));
}
public String getDefaultName(final String propertyName) {
return prefix + Character.toUpperCase(propertyName.charAt(0)) + propertyName.substring(1);
}
}