/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * MetaServiceImpl.java * * Created on 25. September 2003, 10:42 */ package Sirius.server.middleware.impls.proxy; import Sirius.server.Server; import Sirius.server.ServerType; import Sirius.server.localserver.method.MethodMap; import Sirius.server.localserver.tree.NodeReferenceList; import Sirius.server.middleware.interfaces.proxy.MetaService; import Sirius.server.middleware.types.HistoryObject; import Sirius.server.middleware.types.LightweightMetaObject; import Sirius.server.middleware.types.MetaClass; import Sirius.server.middleware.types.MetaNode; import Sirius.server.middleware.types.MetaObject; import Sirius.server.middleware.types.Node; import Sirius.server.naming.NameServer; import Sirius.server.newuser.User; import Sirius.server.newuser.permission.Policy; import Sirius.server.search.Query; import Sirius.server.search.QueryExecuter; import Sirius.util.NodeComparator; import java.rmi.Naming; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * DOCUMENT ME! * * @author awindholz * @version $Revision$, $Date$ */ public class MetaServiceImpl implements MetaService { //~ Instance fields -------------------------------------------------------- private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass()); private Map activeLocalServers; private NameServer nameServer; private Server[] localServers; // resolves Query tree private QueryExecuter qex; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of MetaServiceImpl. * * @param activeLocalServers DOCUMENT ME! * @param nameServer DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ public MetaServiceImpl(final Map activeLocalServers, final NameServer nameServer) throws RemoteException { this.activeLocalServers = activeLocalServers; this.nameServer = nameServer; // this.localServers = localServers; this.localServers = nameServer.getServers(ServerType.LOCALSERVER); qex = new QueryExecuter(activeLocalServers); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param classID DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaClass getClass(final User user, final int classID, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("getClass ::" + classID + " user::" + user + " domain::" + domain); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)).getClass( user, classID); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param tableName DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaClass getClassByTableName(final User user, final String tableName, final String domain) throws RemoteException { return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .getClassByTableName(user, tableName); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaClass[] getClasses(final User user, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("getClasses for User : " + user); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .getClasses(user); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public Node[] getClassTreeNodes(final User user) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getClassTreeNodes for user" + user); // NOI18N } } final List ctns = new ArrayList(); final java.util.Iterator iter = activeLocalServers.values().iterator(); Node[] classNodes = new Node[0]; int size = 0; try { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> iter: " + iter); // NOI18N } } while (iter.hasNext()) { try { final NodeReferenceList children = ((Sirius.server.middleware.interfaces.domainserver.MetaService)iter.next()).getClassTreeNodes( user); if ((children != null) && (children.getLocalNodes() != null)) { final Node[] tmp = children.getLocalNodes(); if (logger.isDebugEnabled()) { logger.debug("<CS> found valid localserver delivers topnodes ::" + tmp.length); // NOI18N } size += tmp.length; ctns.add(tmp); } } catch (Exception e) { logger.error("<CS> getTopNodes(user) of a domainserver:", e); // NOI18N } } classNodes = new Node[size]; for (int i = 0; i < ctns.size(); i++) { final Node[] tmp = (Node[])ctns.get(i); for (int j = 0; j < tmp.length; j++) { --size; classNodes[size] = tmp[j]; // wird von hinten nach vorne belegt } } } catch (Exception e) { if (logger != null) { logger.error("<CS> getTopNodes(user):", e); // NOI18N } throw new RemoteException("<CS> getTopNodes(user)", e); // NOI18N } java.util.Arrays.sort(classNodes, new NodeComparator()); return classNodes; } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param localServerName DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public Node[] getClassTreeNodes(final User user, final String localServerName) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getClassTreeNode for user" + user); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(localServerName)) .getClassTreeNodes(user).getLocalNodes(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public String[] getDomains() throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getDomains called "); // NOI18N } } final Server[] ls = nameServer.getServers(ServerType.LOCALSERVER); validateLocalServers(ls); final String[] lsnames = new String[ls.length]; for (int i = 0; i < ls.length; i++) { lsnames[i] = ls[i].getName(); } return lsnames; } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param nodeID DOCUMENT ME! * @param lsName DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public Node getMetaObjectNode(final User usr, final int nodeID, final String lsName) throws RemoteException { // usr wird nicht beachtet fuer spaetere anpassungen if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getMetaObjectNode for user" + usr + "node ::" + nodeID + " domain" + lsName); // NOI18N } } final java.lang.Object name = activeLocalServers.get(lsName); Node n = null; final int[] ids = new int[1]; ids[0] = nodeID; if (name != null) { n = ((Sirius.server.middleware.interfaces.domainserver.CatalogueService)name).getNodes(usr, ids)[0]; } else { final Node error = new MetaNode( ids[0], lsName, lsName + " not available!", // NOI18N lsName + " not available!", // NOI18N true, Policy.createWIKIPolicy(), -1, null, false, -1); error.validate(false); n = error; } return n; } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param query DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public Node[] getMetaObjectNode(final User usr, final String query) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getMetaObjectNode for user" + usr + "queryString ::" + query); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(usr.getDomain())) .getMetaObjectNode(usr, query); } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param query DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public Node[] getMetaObjectNode(final User usr, final Query query) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getMetaObjectNode for user" + usr + "query ::" + query); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(usr.getDomain())) // ?? BUG !?! das bedeutet ich kann nur Objekte meiner Domain anfragen .getMetaObjectNode(usr, query); } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param query DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaObject[] getMetaObject(final User usr, final String query) throws RemoteException { return getMetaObject(usr, query, usr.getDomain()); } @Override public MetaObject[] getMetaObject(final User usr, final String query, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getMetaObject for [user=" + usr + "|domain=" + domain + "|query=" + query + "]"); // NOI18N } } final Sirius.server.middleware.interfaces.domainserver.MetaService metaService = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain); if (metaService == null) { throw new RemoteException("no server registered for domain: " + domain); // NOI18N } return metaService.getMetaObject(usr, query); } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param query DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaObject[] getMetaObject(final User usr, final Query query) throws RemoteException { return getMetaObject(usr, query, usr.getDomain()); } @Override public MetaObject[] getMetaObject(final User usr, final Query query, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS> getMetaObject for [user=" + usr + "|domain=" + domain + "|query=" + query + "]"); // NOI18N } } final Sirius.server.middleware.interfaces.domainserver.MetaService metaService = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain); if (metaService == null) { throw new RemoteException("no server registered for domain: " + domain); // NOI18N } return metaService.getMetaObject(usr, query); } /** * DOCUMENT ME! * * @param usr DOCUMENT ME! * @param objectID DOCUMENT ME! * @param classID DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaObject getMetaObject(final User usr, final int objectID, final int classID, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( "<CS> getMetaObject for user" // NOI18N + usr + "objectID ::" // NOI18N + objectID + " classID" // NOI18N + classID + " domain::" // NOI18N + domain); } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .getMetaObject(usr, objectID, classID); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param metaObject DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaObject insertMetaObject(final User user, final MetaObject metaObject, final String domain) throws RemoteException { if (logger != null) { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( "<CS>insertMetaObject for user" // NOI18N + user + "metaObject ::" // NOI18N + metaObject + " domain::" // NOI18N + domain); } } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .insertMetaObject(user, metaObject); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param query DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public int insertMetaObject(final User user, final Query query, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>insertMetaObject for user" + user + "query ::" + query + " domain::" + domain); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .insertMetaObject(user, query); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param metaObject DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public int deleteMetaObject(final User user, final MetaObject metaObject, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( "<CS>delete MetaObject for user" // NOI18N + user + "metaObject ::" // NOI18N + metaObject + " domain::" // NOI18N + domain); } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .deleteMetaObject(user, metaObject); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param metaObject DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public int updateMetaObject(final User user, final MetaObject metaObject, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( "<CS>updateMetaObject for user" // NOI18N + user + "metaObject ::" // NOI18N + metaObject + " domain::" // NOI18N + domain); } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)) .updateMetaObject(user, metaObject); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param metaSQL DOCUMENT ME! * @param domain DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public int update(final User user, final String metaSQL, final String domain) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>update for user" + user + "metaSQL ::" + metaSQL + " domain::" + domain); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain)).update( user, metaSQL); } /** * creates an Instance of a MetaObject with all attribute values set to default. * * @param user DOCUMENT ME! * @param c DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MetaObject getInstance(final User user, final MetaClass c) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>getInstance for user" + user + "metaClass ::" + c); // NOI18N } } return ((Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(c.getDomain())) .getInstance(user, c); } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MethodMap getMethods(final User user) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>getMethods for user" + user); // NOI18N } } final MethodMap result = new MethodMap(); for (int i = 0; i < localServers.length; i++) { final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get( localServers[i].getName().trim()); result.putAll(s.getMethods(user)); } return result; } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param lsName DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public MethodMap getMethods(final User user, final String lsName) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>getMethods for user" + user + " domain::" + lsName); // NOI18N } } final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(lsName.trim()); return s.getMethods(user); } /** * ---!!! * * @param classId DOCUMENT ME! * @param user DOCUMENT ME! * @param representationFields DOCUMENT ME! * @param representationPattern DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public LightweightMetaObject[] getAllLightweightMetaObjectsForClass(final int classId, final User user, final String[] representationFields, final String representationPattern) throws RemoteException { final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(user.getDomain()); return s.getAllLightweightMetaObjectsForClass(classId, user, representationFields, representationPattern); } /** * DOCUMENT ME! * * @param classId DOCUMENT ME! * @param user DOCUMENT ME! * @param representationFields DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public LightweightMetaObject[] getAllLightweightMetaObjectsForClass(final int classId, final User user, final String[] representationFields) throws RemoteException { final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(user.getDomain()); return s.getAllLightweightMetaObjectsForClass(classId, user, representationFields); } /** * DOCUMENT ME! * * @param classId DOCUMENT ME! * @param user DOCUMENT ME! * @param query DOCUMENT ME! * @param representationFields DOCUMENT ME! * @param representationPattern DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public LightweightMetaObject[] getLightweightMetaObjectsByQuery(final int classId, final User user, final String query, final String[] representationFields, final String representationPattern) throws RemoteException { final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(user.getDomain()); return s.getLightweightMetaObjectsByQuery(classId, user, query, representationFields, representationPattern); } /** * DOCUMENT ME! * * @param classId DOCUMENT ME! * @param user DOCUMENT ME! * @param query DOCUMENT ME! * @param representationFields DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ @Override public LightweightMetaObject[] getLightweightMetaObjectsByQuery(final int classId, final User user, final String query, final String[] representationFields) throws RemoteException { final Sirius.server.middleware.interfaces.domainserver.MetaService s = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(user.getDomain()); return s.getLightweightMetaObjectsByQuery(classId, user, query, representationFields); } /** * private Fkt-en. * * @param ls DOCUMENT ME! */ private void validateLocalServers(final Server[] ls) { // aktualliseren der lokalserver wann immer ein Client anfragt if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("<CS>private function validateLocalServer called"); // NOI18N } } localServers = ls; try { for (int i = 0; i < ls.length; i++) { if (!activeLocalServers.containsKey(ls[i].getName())) { activeLocalServers.put(ls[i].getName(), Naming.lookup(ls[i].getRMIAddress())); } } } catch (Exception e) { logger.error(e); } } @Override public HistoryObject[] getHistory(final int classId, final int objectId, final String domain, final User user, final int elements) throws RemoteException { final Sirius.server.middleware.interfaces.domainserver.MetaService service = (Sirius.server.middleware.interfaces.domainserver.MetaService)activeLocalServers.get(domain); return service.getHistory(classId, objectId, user, elements); } }