diff --git a/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java b/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java new file mode 100644 index 0000000..5aed461 --- /dev/null +++ b/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java @@ -0,0 +1,108 @@ +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"); + } + +} diff --git a/hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties b/hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties index 7cdc32f..6cc440a 100644 --- a/hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties +++ b/hsarback/src/org/apache/xmlrpc/webserver/XmlRpcServlet.properties @@ -10,3 +10,4 @@ mysqluser=de.hsadmin.remote.MysqlUserRemote postgresqluser=de.hsadmin.remote.PgsqlUserRemote mysqldb=de.hsadmin.remote.MysqlDbRemote postgresqldb=de.hsadmin.remote.PgsqlDbRemote +moduleprop=de.hsadmin.remote.ModulePropertiesRemote