/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* CatalogueServiceImpl.java
*
* Created on 25. September 2003, 10:13
*/
package Sirius.server.middleware.impls.proxy;
import Sirius.server.localserver.tree.NodeReferenceList;
import Sirius.server.middleware.types.Link;
import Sirius.server.middleware.types.MetaNode;
import Sirius.server.middleware.types.Node;
import Sirius.server.newuser.*;
import Sirius.server.newuser.permission.Policy;
import Sirius.util.*;
import java.rmi.*;
/**
* DOCUMENT ME!
*
* @author awindholz
* @version $Revision$, $Date$
*/
public class CatalogueServiceImpl {
//~ Instance fields --------------------------------------------------------
private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());
private java.util.Hashtable activeLocalServers;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of CatalogueServiceImpl.
*
* @param activeLocalServers DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public CatalogueServiceImpl(final java.util.Hashtable activeLocalServers) throws RemoteException {
this.activeLocalServers = activeLocalServers;
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param node DOCUMENT ME!
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public Node[] getChildren(final Node node, final User user) throws RemoteException {
try {
final NodeReferenceList c =
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
node.getDomain())).getChildren(node, user);
final Link[] links = c.getRemoteLinks();
if (links.length == 0) {
return c.getLocalNodes();
}
if ((logger != null) && logger.isInfoEnabled()) {
logger.info("<CS> Number of remote links at getchildren :" + links.length); // NOI18N
}
// group Links by lsName
final Group[] groupedLinks = this.group(links);
// contains all nodes from links
final java.util.Vector nodesFromLinks = new java.util.Vector(links.length);
// temporary used in the loop to keep nodes of one ls
Node[] n = null;
// get the corresponding Nodes from every different localServer
for (int i = 0; i < groupedLinks.length; i++) {
final String lsName = groupedLinks[i].getGroup();
if ((logger != null) && logger.isInfoEnabled()) {
logger.info(lsName + " gets request for node"); // NOI18N
}
final Sirius.server.middleware.interfaces.domainserver.CatalogueService ls =
(Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(lsName);
// nodes from links
if (ls != null) {
n = ls.getNodes(user, groupedLinks[i].getIDs());
} else // create dummy node to show that system
// is not available
{
if (logger != null) {
if (logger.isDebugEnabled()) {
logger.debug("System :" + ls + " not available"); // NOI18N
}
}
final MetaNode error = new MetaNode(
0,
lsName,
lsName
+ " not available!", // NOI18N
lsName
+ " not available!", // NOI18N
true,
Policy.createParanoidPolicy(),
-1,
null,
false,
-1);
error.validate(false);
n = new Node[1];
n[0] = error;
}
// copy nodes into vector
for (int l = 0; l < n.length; l++) {
nodesFromLinks.add(n[l]);
}
}
// directly availabe nodes
final Node[] lsNodes = c.getLocalNodes();
// contains all nodes
final Node[] result = new Node[nodesFromLinks.size() + lsNodes.length];
// put the nodes from the fathers ls into result
for (int i = 0; i < lsNodes.length; i++) {
result[i] = lsNodes[i];
}
int offset = lsNodes.length;
// former links into result
for (int i = 0; i < nodesFromLinks.size(); i++) {
result[offset] = (Node)nodesFromLinks.get(i);
offset++;
}
return result;
} catch (Exception e) {
if (logger != null) {
logger.error(e);
}
throw new RemoteException(e.getMessage(), e);
}
}
/**
* DOCUMENT ME!
*
* @param user DOCUMENT ME!
* @param localServerName DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public Node[] getRoots(final User user, final String localServerName) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("getRoots called " + localServerName); // NOI18N
}
return ((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
localServerName)).getRoots(user).getLocalNodes();
}
/**
* DOCUMENT ME!
*
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public Node[] getRoots(final User user) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("<CS> getRoots user" + user); // NOI18N
}
final java.util.Vector tops = new java.util.Vector(10, 10);
final java.util.Iterator iter = activeLocalServers.values().iterator();
Node[] topNodes = new Node[0];
int size = 0;
try {
if (logger.isDebugEnabled()) {
logger.debug("<CS> iterator for active local servers in getRoots: " + iter); // NOI18N
}
while (iter.hasNext()) {
final NodeReferenceList children = (NodeReferenceList)
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)iter.next()).getRoots(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;
tops.addElement(tmp);
}
}
topNodes = new Node[size];
for (int i = 0; i < tops.size(); i++) {
final Node[] tmp = (Node[])tops.get(i);
for (int j = 0; j < tmp.length; j++) {
--size;
topNodes[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(topNodes, new NodeComparator());
return topNodes;
}
/**
* //////////////////////// Private Fkt-en ////////////////////////////////////
*
* @param toBeGrouped DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Group[] group(final Groupable[] toBeGrouped) {
if (logger.isDebugEnabled()) {
logger.debug("private function group called "); // NOI18N
}
final java.util.Hashtable grouped = new java.util.Hashtable(100);
try {
for (int i = 0; i < toBeGrouped.length; i++) {
final String group = toBeGrouped[i].getGroup().trim();
if (grouped.containsKey(group)) {
final java.util.Vector v = (java.util.Vector)grouped.get(group);
v.addElement(toBeGrouped[i]);
} else {
final java.util.Vector v = new java.util.Vector(20, 20);
v.addElement(toBeGrouped[i]);
grouped.put(group, v);
}
}
} catch (Exception e) {
if (logger != null) {
logger.error(e);
}
}
// iterator to obtain the vectors
final java.util.Iterator iter = grouped.values().iterator();
final Group[] groups = new Group[grouped.size()];
// counter for groups
int j = 0;
// get the corresponding "Groupables" from every different localServer
while (iter.hasNext() && (j < groups.length)) // same conditions just to be shure ;-)
{
final java.util.Vector v = (java.util.Vector)iter.next();
groups[j] = new Group(((Groupable)v.get(0)).getGroup(), (Groupable[])v.toArray(new Groupable[v.size()]));
j++;
}
return groups;
}
/**
* DOCUMENT ME!
*
* @param node DOCUMENT ME!
* @param parent DOCUMENT ME!
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public Node addNode(final Node node, final Link parent, final User user) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("addNode called node:" + node + "parentLink ::" + parent + " user::" + user); // NOI18N
}
return
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
node.getDomain())).addNode(node, parent, user);
}
/**
* DOCUMENT ME!
*
* @param node DOCUMENT ME!
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public boolean deleteNode(final Node node, final User user) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("delete Node called node:" + node + " user::" + user); // NOI18N
}
return
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
node.getDomain())).deleteNode(node, user);
}
/**
* DOCUMENT ME!
*
* @param from DOCUMENT ME!
* @param to DOCUMENT ME!
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public boolean addLink(final Node from, final Node to, final User user) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("addLink called nodeFrom:" + from + "nodeTo ::" + to + " user::" + user); // NOI18N
}
return
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
from.getDomain())).addLink(from, to, user);
}
/**
* DOCUMENT ME!
*
* @param from DOCUMENT ME!
* @param to DOCUMENT ME!
* @param user DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws RemoteException DOCUMENT ME!
*/
public boolean deleteLink(final Node from, final Node to, final User user) throws RemoteException {
if (logger.isDebugEnabled()) {
logger.debug("deleteLink called nodeFrom:" + from + "nodeTo ::" + to + " user::" + user); // NOI18N
}
return
((Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(
from.getDomain())).deleteLink(from, to, user);
}
// public boolean copySubTree(Node root, User user) throws RemoteException
// {
// logger.debug("copysubtree called root::"+root+" user::"+user);
// return ( (Sirius.server.middleware.interfaces.domainserver.CatalogueService)activeLocalServers.get(root.getDomain()) ).copySubTree(root,user);
// }
//
}