package de.hsadmin.remote; import java.lang.reflect.Field; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import de.hsadmin.cliClientConnector.TechnicalException; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ReadWriteAccess; import de.hsadmin.core.util.ReflectionUtil; public abstract class GenericAbstractRemote extends AbstractRemote { @Override protected abstract Class getEntityClass(); @Override protected abstract void regularizeKeys(Map whereParams); @Override protected void entity2map(AbstractEntity entity, Map resultMap) { Class entityClass = getEntityClass(); Field[] fields = entityClass.getDeclaredFields(); for (Field f : fields) { if (f.getName().equals("id") && f.getType().getCanonicalName().equals("long")) { resultMap.put("id", (ReflectionUtil.invokeGetter(entity, entityClass, f)).toString()); } else { AnnFieldIO fieldIO = f.getAnnotation(AnnFieldIO.class); if (fieldIO != null && fieldIO.rw() != ReadWriteAccess.WRITEONLY) { resultMap.put(f.getName(), ReflectionUtil.invokeGetter(entity, entityClass, f)); } } } } @Override protected void map2entity(Map paramsMap, AbstractEntity entity) throws HSAdminException { Class entityClass = getEntityClass(); Set keySet = paramsMap.keySet(); for (String key : keySet) { Object valueObj = paramsMap.get(key); try { Field f = entityClass.getDeclaredField(key); AnnFieldIO fieldIO = f.getAnnotation(AnnFieldIO.class); if (valueObj != null && valueObj instanceof String && !Pattern.matches(fieldIO.validation(), (String) valueObj)) { throw new HSAdminException("validation of field " + f.getName() + " failed, pattern: " + fieldIO.validation()); } if (fieldIO.rw() != ReadWriteAccess.READONLY) { ReflectionUtil.invokeSetter(entity, entityClass, f, valueObj); } else { throw new HSAdminException("field " + f.getName() + " is readonly"); } } catch (SecurityException e) { throw new TechnicalException(e); } catch (NoSuchFieldException e) { throw new HSAdminException("no such field: " + key, e); } } } }