package de.hsadmin.remote; import java.io.InputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; import de.hsadmin.core.model.AuthenticationException; import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ReadWriteAccess; import de.hsadmin.core.model.Transaction; public class ModulePropertiesRemote implements IRemote { @Override public List> search(String runAsUser, String ticket, Map whereParams) throws HSAdminException { String user = runAsUser; List> result = new ArrayList>(); Transaction transaction = new Transaction(user); try { if (transaction.login(user, ticket)) { InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("org/apache/xmlrpc/webserver/XmlRpcServlet.properties"); Properties properties = new Properties(); properties.load(resourceAsStream); for (Object moduleKey : properties.entrySet()) { Class remoteClass = Class.forName(properties.getProperty((String) moduleKey)); Object newInstance = remoteClass.newInstance(); if (newInstance instanceof AbstractRemote) { Map modMap = new HashMap(); modMap.put("module", moduleKey); AbstractRemote remote = (AbstractRemote) newInstance; Class entityClass = remote.getEntityClass(); ArrayList> propertiesList = new ArrayList>(); modMap.put("properties", propertiesList); // AnnFieldIO fieldIO = entityClass.getAnnotation(AnnFieldIO.class); for (Field f: entityClass.getDeclaredFields()) { HashMap propertyProperties = new HashMap(); propertiesList.add(propertyProperties); AnnFieldIO fieldIO = f.getAnnotation(AnnFieldIO.class); String fieldName = f.getName(); propertyProperties.put("property", fieldName); String regExp = fieldIO.validation(); propertyProperties.put("validation", regExp); ReadWriteAccess rw = fieldIO.rw(); propertyProperties.put("rw", rw.name()); String[] referredProps = fieldIO.referredProps(); propertyProperties.put("referredProps", referredProps); Class declaringClass = f.getDeclaringClass(); for(String s : referredProps){ String fullPropertyName = fieldName+"."+s; propertiesList.add(createReferredPropertyInfo(fullPropertyName, declaringClass, fullPropertyName)); } } result.add(modMap); } } return result; } else { throw new AuthenticationException("authentication failed"); } } catch (Exception e) { throw new HSAdminException(e); } finally { transaction.close(); } } private Map createReferredPropertyInfo(String fieldName, Class declaringClass, String propertyName) throws SecurityException, NoSuchFieldException { int indexOfDot = propertyName.indexOf('.'); if (indexOfDot>=0) { String prefix = propertyName.substring(0, indexOfDot); String remainingPart = propertyName.substring(indexOfDot + 1); return createReferredPropertyInfo(fieldName, declaringClass.getDeclaredField(prefix).getDeclaringClass(), remainingPart); } else { Map result = new HashMap(); result.put("property", fieldName); return result; } } @Override public Map add(String runAsUser, String ticket, Map setParams) throws HSAdminException { throw new HSAdminException("not implemented"); } @Override public List> update(String runAsUser, String ticket, Map setParams, Map whereParams) throws HSAdminException { throw new HSAdminException("not implemented"); } @Override public void delete(String runAsUser, String ticket, Map whereParams) throws HSAdminException { throw new HSAdminException("not implemented"); } }