libreccm-legacy/ccm-ldn-navigation/src/com/arsdigita/london/navigation/DataCollectionDefinition.java

217 lines
7.2 KiB
Java
Executable File

/*
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.arsdigita.london.navigation;
import com.arsdigita.categorization.Category;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.Party;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.Filter;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.metadata.ObjectType;
import com.arsdigita.util.Assert;
import com.arsdigita.util.LockableImpl;
import java.util.ArrayList;
import java.util.Iterator;
/**
* A class for building up a definition of parameters to
* later use for a DataCollection of ACSObjects.
*/
public class DataCollectionDefinition extends LockableImpl {
private String m_objectType = ACSObject.BASE_DATA_OBJECT_TYPE;
private String m_specificObjectType = null;
private boolean m_filterCategory = true;
private boolean m_descendCategories = false;
private boolean m_excludeIndexObjects = true;
private boolean m_checkPermissions = false;
private ArrayList m_ordering = new ArrayList();
private ArrayList m_excludedTypes = new ArrayList();
private ArrayList m_properties = new ArrayList();
public final void setObjectType(String objectType) {
Assert.unlocked(this);
validateObjectType(objectType);
m_objectType = objectType;
}
public final void setSpecificObjectType(String specificObjectType) {
Assert.unlocked(this);
if (specificObjectType != null) {
validateObjectType(specificObjectType);
}
m_specificObjectType = specificObjectType;
}
public final void excludeSpecificObjectType( String specificObjectType ) {
Assert.unlocked( this );
m_excludedTypes.add( specificObjectType );
}
private final void validateObjectType(String objectType) {
ObjectType type = SessionManager.getMetadataRoot().getObjectType(objectType);
Assert.exists(type, ObjectType.class);
validateObjectType(type);
}
protected void validateObjectType(ObjectType type) {
// Nada
}
public final void setFilterCategory(boolean filterCategory) {
Assert.unlocked(this);
m_filterCategory = filterCategory;
}
public final void setDescendCategories(boolean descendCategories) {
Assert.unlocked(this);
m_descendCategories = descendCategories;
}
public final void setExcludeIndexObjects(boolean excludeIndexObjects) {
Assert.unlocked(this);
m_excludeIndexObjects = excludeIndexObjects;
}
public final void setCheckPermissions(boolean checkPermissions) {
Assert.unlocked(this);
m_checkPermissions = checkPermissions;
}
public final void addOrder(String order) {
Assert.unlocked(this);
m_ordering.add(order);
}
public final void addProperty( DataCollectionProperty property ) {
Assert.unlocked( this );
m_properties.add( property );
}
public final DataCollection getDataCollection(NavigationModel model) {
Assert.locked(this);
DataCollection objects = SessionManager.getSession()
.retrieve(m_objectType);
applyFilters(objects, model);
Iterator properties = m_properties.iterator();
while( properties.hasNext() ) {
DataCollectionProperty property = (DataCollectionProperty)
properties.next();
property.addProperty( objects );
}
if (m_ordering.size() > 0) {
Iterator orders = m_ordering.iterator();
while (orders.hasNext()) {
objects.addOrder((String)orders.next());
}
} else {
objects.addOrder("id desc");
}
return objects;
}
/** Can be overridden to extract differently the category to inspect. */
protected Category getCategory(NavigationModel model) {
return model.getCategory();
}
protected void applyFilters(DataCollection objects,
NavigationModel model) {
if (m_specificObjectType != null) {
objects.addEqualsFilter(ACSObject.OBJECT_TYPE, m_specificObjectType);
}
Iterator excludedTypes = m_excludedTypes.iterator();
while (excludedTypes.hasNext()) {
String excludedType = excludedTypes.next().toString();
objects.addFilter(ACSObject.OBJECT_TYPE + " != '" +
excludedType + "'" );
}
Category cat = getCategory(model);
if (m_filterCategory && cat != null) {
if (m_descendCategories) {
Filter children = objects.addInSubqueryFilter(
getCategorizedObjectPath("id"),
"com.arsdigita.categorization.objectIDsInSubtree");
children.set( "categoryID", cat.getID() );
if (m_excludeIndexObjects) {
Filter moreChildren = objects.addNotInSubqueryFilter(
getCategorizedObjectPath("id"),
"com.arsdigita.categorization.liveIndexItemsInSubtree"
);
moreChildren.set( "categoryID", cat.getID() );
}
} else {
objects.addEqualsFilter(
getCategorizedObjectPath("categories.id"),
cat.getID());
if (m_excludeIndexObjects) {
Filter moreChildren = objects.addNotInSubqueryFilter(
getCategorizedObjectPath("id"),
"com.arsdigita.categorization.liveIndexItemsInCategory"
);
moreChildren.set( "categoryID", cat.getID() );
}
}
}
if (m_checkPermissions) {
// allow subclasses to override the permission check
checkPermissions(objects);
}
}
protected void checkPermissions(DataCollection objects) {
Party party = Kernel.getContext().getParty();
if (party == null) {
party = Kernel.getPublicUser();
}
PermissionService.filterObjects(
objects,
PrivilegeDescriptor.READ,
party.getOID());
}
protected String getCategorizedObjectPath(String fragment) {
return fragment;
}
}