/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* QueryExecuter.java
*
* Created on 29. Oktober 2003, 11:10
*/
package Sirius.server.search;
import Sirius.server.middleware.types.MetaObjectNode;
import Sirius.server.newuser.User;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
/**
* DOCUMENT ME!
*
* @author schlob
* @version $Revision$, $Date$
*/
public class QueryExecuter {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(QueryExecuter.class);
//~ Instance fields --------------------------------------------------------
// conatins references to all local servers available
private Map activeLocalServers;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of QueryExecuter.
*
* @param activeLocalServers DOCUMENT ME!
*/
public QueryExecuter(final Map activeLocalServers) {
this.activeLocalServers = activeLocalServers;
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param u DOCUMENT ME!
* @param classIds DOCUMENT ME!
* @param q DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public SearchResult executeQuery(final User u, final String[] classIds, final Query q) throws Exception {
final Sirius.server.middleware.interfaces.domainserver.SearchService s =
(Sirius.server.middleware.interfaces.domainserver.SearchService)activeLocalServers.get(
q.getQueryIdentifier().getDomain());
q.isExecuted();
if (s == null) {
LOG.error(
"query for ls " // NOI18N
+ q.getQueryIdentifier().getDomain()
+ " not possible as server is not online"); // NOI18N
return new SearchResult(new MetaObjectNode[0]);
}
// if(logger.isDebugEnabled())
// {
// for(int i =0;i<classIds.length;i++)
// {
// logger.debug("classIds inkl Domain");
// logger.debug(classIds[i]+",");
// }
// }
final int[] cIds = parseClassIds(classIds, q.getQueryIdentifier().getDomain());
// keine ausgew\u00E4hlte Klasse
if ((cIds != null) && (cIds.length == 1) && (cIds[0] == -1)) {
if (LOG.isDebugEnabled()) {
LOG.debug("No class on this local server selected. For this reason return"); // NOI18N
}
return new SearchResult(new MetaObjectNode[0]);
}
// if(logger.isDebugEnabled())
// {
// for(int i =0;i<cIds.length;i++)
// {
// logger.debug(cIds[i]+",");
// }
// }
// if(cIds.length>0)
// return ((SearchResult)s.search(u,cIds,q));
// else
// return new SearchResult(new Sirius.server.middleware.types.Node[0]);
return s.search(u, cIds, q);
}
/**
* such classIds bzgl. ls raus
*
* @param classIds DOCUMENT ME!
* @param domain DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private int[] parseClassIds(final String[] classIds, final String domain) {
if (classIds == null) {
return new int[0];
}
final ArrayList v = new ArrayList(classIds.length);
// add default class_id = -1 to ensure that the sql statement will be correct
v.add(new Integer(-1));
for (int i = 0; i < classIds.length; i++) {
final String[] res = classIds[i].split("@"); // NOI18N
// secon part contains domain
if (res[1].equals(domain)) {
v.add(new Integer(res[0]));
}
}
v.trimToSize();
if (LOG.isDebugEnabled()) {
LOG.debug("classids " + v + "for domain" + domain); // NOI18N
}
final int[] result = new int[v.size()];
final Iterator iter = v.iterator();
int i = 0;
while (iter.hasNext()) {
result[i++] = ((Integer)iter.next()).intValue();
}
return result;
}
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean serviceAvailable(final String domain) {
return activeLocalServers.get(domain) != null;
}
}