org.efaps.db.ListQuery Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of efaps-kernel Show documentation
Show all versions of efaps-kernel Show documentation
eFaps is a framework used to map objects with or without attached files to
a relational database and optional file systems (only for attaches files). Configurable access control can be provided down to object and attribute level depending on implementation and use case. Depending on requirements, events (like triggers) allow to implement business logic and to separate business logic from user interface.
The framework includes integrations (e.g. webdav, full text search) and a web application as 'simple' configurable user interface. Some best practises, example web application modules (e.g. team work module) support administrators and implementers using this framework.
/*
* Copyright 2003 - 2011 The eFaps Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Revision: $Rev: 6210 $
* Last Changed: $Date: 2011-02-18 16:02:56 -0500 (Fri, 18 Feb 2011) $
* Last Changed By: $Author: [email protected] $
*/
package org.efaps.db;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.efaps.admin.AbstractAdminObject;
import org.efaps.admin.datamodel.Attribute;
import org.efaps.admin.datamodel.AttributeSet;
import org.efaps.admin.datamodel.Type;
import org.efaps.db.query.OneRoundQuery;
import org.efaps.util.EFapsException;
/**
* TODO: description
* @author The eFaps Team
* @version $Id: ListQuery.java 6210 2011-02-18 21:02:56Z [email protected] $
* @deprecated will be removed for 2.0
*/
@Deprecated
public class ListQuery
extends AbstractQuery
{
/**
* Stores all instances for which this query is executed.
*/
private final List instances;
/**
* Stores all select statements for this query.
*/
private final Set selects = new HashSet();
private final Set multiSelects = new HashSet();
private final Map subSelects = new HashMap();
private OneRoundQuery query = null;
private AttributeSet attributeSet;
/**
* @param _instances list of instances for which this query is executed
*/
public ListQuery(final List _instances)
{
this.instances = _instances;
}
public ListQuery()
{
this.instances = new ArrayList();
}
// ///////////////////////////////////////////////////////////////////////////
// instance methods
@Deprecated
@Override
public void execute() throws EFapsException
{
try {
if (this.instances.size() > 0) {
this.query = new OneRoundQuery(this.instances, this.selects, this);
this.query.execute();
for (final Map.Entry sub : this.subSelects.entrySet()) {
while (this.query.next()) {
if (this.multiSelects.contains(sub.getKey())) {
sub.getValue().instances.addAll(this.instances);
} else {
final Attribute attr = this.query.getAttribute(sub.getKey());
if ((attr != null) && (attr.getLink() != null)) {
final Object value = this.query.getValue(sub.getKey());
if (value != null) {
// we must differ between ids that are
// returned and
// AdminObject (e.g. Person in case of
// CreatorLink)
if (value instanceof Number) {
final Long id = ((Number) value).longValue();
if ((id != null) && (id != 0)) {
sub.getValue().addInstance(attr.getLink(), id);
}
} else if (value instanceof AbstractAdminObject) {
sub.getValue().addInstance(attr.getLink(),
((AbstractAdminObject) value).getId());
}
}
}
}
}
this.query.beforeFirst();
sub.getValue().execute();
}
}
} catch (final Exception e) {
throw (new EFapsException(this.getClass(), "execute", e));
}
}
/**
* @param set
*/
public void setExpand(final AttributeSet _set)
{
this.attributeSet = _set;
}
public Set getMultiSelects()
{
return this.multiSelects;
}
private boolean gotoKey(final Object _key)
{
return this.query == null ? false : this.query.gotoKey(_key);
}
/**
* Adds one select statement to this query.
*
* @param _select select statement to add
* @see #selects
*/
@Override
public void addSelect(final String _select)
{
final int idx = _select.indexOf(".");
if (idx > 0) {
// differ select expression from sub expression
final String select = _select.substring(0, idx);
final String subSel = _select.substring(idx + 1);
this.selects.add(select);
// make the subquery depending on the select statement
ListQuery subQuery = this.subSelects.get(select);
if (subQuery == null) {
subQuery = new ListQuery();
this.subSelects.put(select, subQuery);
}
subQuery.addSelect(subSel);
} else {
this.selects.add(_select);
}
}
private void addInstance(final Type _type, final long _id)
{
this.instances.add(Instance.get(_type, _id));
}
/**
* @return true if a new row is selected and exists, otherwise
* false
*/
@Override
public boolean next()
{
return (this.query != null) ? this.query.next() : false;
}
/**
* The instance method returns for the given key the attribute value.
*
* @param _key key for which the attribute value must returned
* @return atribute value for given key
*/
@Override
public Object get(final String _select) throws EFapsException
{
try {
final int idx = _select.indexOf(".");
Object ret = null;
if (idx > 0) {
// differ select expression from sub expression
final String select = _select.substring(0, idx);
final String subSel = _select.substring(idx + 1);
// evalute sub select expression for given id
final ListQuery subQuery = this.subSelects.get(select);
Object key = this.query.getValue(select);
if (key instanceof AbstractAdminObject) {
key = ((AbstractAdminObject) key).getId();
}
if (subQuery.gotoKey(key)) {
ret = subQuery.get(subSel);
}
} else if (this.multiSelects.contains(_select)) {
final ListQuery subQuery = this.subSelects.get(_select);
final Object key = this.query.getValue(_select);
if (subQuery.gotoKey(key)) {
ret = subQuery.query.getMultiLineValue();
}
} else {
ret = this.query.getValue(_select);
}
return ret;
} catch (final Exception e) {
throw (new EFapsException(this.getClass(), "get", e));
}
}
@Override
public Type getType()
{
return this.query.getType();
}
public Instance getInstance()
{
return this.query.getInstance();
}
public List getInstances(final String _select)
{
final List ret = new ArrayList();
if (this.multiSelects.contains(_select)) {
final ListQuery subQuery = this.subSelects.get(_select);
ret.addAll(subQuery.query.getInstances());
} else {
ret.addAll(this.instances);
}
return ret;
}
public Map getSubSelects()
{
return this.subSelects;
}
/**
* The instance method returns for the given key the atribute.
*
* @param _key key for which the attribute value must returned
* @return attribute for given key
* @throws EFapsException
*/
@Override
public Attribute getAttribute(final String _select) throws EFapsException
{
final int idx = _select.indexOf(".");
Attribute ret = null;
if (idx > 0) {
// differ select expression from sub expression
final String select = _select.substring(0, idx);
final String subSel = _select.substring(idx + 1);
if (select.contains("\\")) {
ret = this.query.getAttribute(select);
} else {
// evalute sub select expression for given id
final ListQuery subQuery = this.subSelects.get(select);
if (subQuery.gotoKey(this.query.getValue(select))) {
ret = subQuery.getAttribute(subSel);
}
}
} else {
ret = this.query.getAttribute(_select);
}
return ret;
}
/**
* Returns a string representation of this .
*
* @return string representation of this
*/
@Override
public String toString()
{
return new ToStringBuilder(this).appendSuper(super.toString()).append("selects", this.selects.toString())
.append("subSelects", this.subSelects.toString()).toString();
}
/**
* @return the expand
*/
public AttributeSet getAttributeSet()
{
return this.attributeSet;
}
}