/*
* ome.services.query.ClassQuerySource
*
* Copyright 2006 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.query;
// Java imports
import java.lang.reflect.Constructor;
// Third-party libraries
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// Application-internal dependencies
import ome.model.IObject;
import ome.parameters.Parameters;
/**
* creates a query based on the id string by interpreting it as a Class. The
* class can either be a {@link ome.services.query.Query} implementation or an
* {@link ome.model.IObject} implementation.
*
* <p>
* If it is an {@link ome.model.IObject} implementation, the
* {@link ome.parameters.QueryParameter} instances passed in through
* {@link Parameters} are interpreted as being field names whose
* {@link ome.parameters.QueryParameter#value values} should equals the value in
* the database.
* </p>
*
* <p>
* If it is an {@link ome.services.query.Query} implementation, then it is
* instantiated by passing the {@link ome.parameters.Parameters} into the
* constructor.
* </p>
*
*
* @author Josh Moore, <a href="mailto:josh.moore@gmx.de">josh.moore@gmx.de</a>
* @version 1.0 <small> (<b>Internal version:</b> $Rev$ $Date$) </small>
* @since OMERO 3.0
* @see ome.services.query.IObjectClassQuery
*/
public class ClassQuerySource extends QuerySource {
private static Logger log = LoggerFactory.getLogger(ClassQuerySource.class);
@Override
public Query lookup(String queryID, Parameters parameters) {
Query q = null;
Class klass = null;
try {
klass = Class.forName(queryID);
} catch (ClassNotFoundException e) {
// Not an issue.
}
// return null immediately
if (klass == null) {
return null;
}
// it's a query
else if (Query.class.isAssignableFrom(klass)) {
try {
Constructor c = klass.getConstructor(Parameters.class);
q = (Query) c.newInstance(parameters);
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug("Query could not be instanced.", e.getCause());
}
throw new RuntimeException("Error while trying to instantiate:"
+ queryID, e);
}
return q;
}
// it's an IObject
else if (IObject.class.isAssignableFrom(klass)) {
Parameters p = new Parameters(parameters);
p.addClass(klass);
return new IObjectClassQuery(p);
}
else {
return null;
}
}
}