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

228 lines
7.5 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.db.Sequences;
import com.arsdigita.domain.DomainServiceInterfaceExposer;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.Filter;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.UncheckedWrapperException;
import org.apache.log4j.Logger;
import java.sql.SQLException;
import java.math.BigDecimal;
public class Template extends DomainObject {
private static final Logger s_log = Logger.getLogger(Template.class);
public static final String ID = "id";
public static final String TITLE = "title";
public static final String DESCRIPTION = "description";
public static final String URL = "url";
public static final String TEMPLATE_CATEGORIES = "templateCategories";
public static final String TEMPLATES = "templates";
public static final String DISPATCHER_CONTEXT = "dispatcherContext";
public static final String DEFAULT_DISPATCHER_CONTEXT = "public";
public static final String DEFAULT_USE_CONTEXT = "default";
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.london.navigation.Template";
// used by findBestForCategory
private static final String TEMPLATES_FOR_CATEGORY =
"com.arsdigita.london.navigation.getTemplatesForCategory";
protected Template() {
this(BASE_DATA_OBJECT_TYPE);
}
protected Template(String type) {
super(type);
}
public Template(DataObject obj) {
super(obj);
}
public void initialize() {
super.initialize();
if (get(ID) == null) {
try {
set(ID, Sequences.getNextValue());
} catch (SQLException ex) {
throw new UncheckedWrapperException("cannot assign id", ex);
}
}
}
public static Template create(String title,
String description,
String url) {
Template temp = new Template();
temp.setTitle(title);
temp.setDescription(description);
temp.setURL(url);
return temp;
}
public static Template retrieveByURL(String url)
throws DataObjectNotFoundException {
Session session = SessionManager.getSession();
DataCollection temp = session.retrieve(BASE_DATA_OBJECT_TYPE);
temp.addEqualsFilter(URL, url);
if (temp.next()) {
DataObject obj = temp.getDataObject();
temp.close();
return (Template)DomainObjectFactory.newInstance(obj);
}
throw new DataObjectNotFoundException("cannot find template for url " + url);
}
public static Template retrieve(BigDecimal id)
throws DataObjectNotFoundException {
Session session = SessionManager.getSession();
DataCollection temp = session.retrieve(BASE_DATA_OBJECT_TYPE);
temp.addEqualsFilter(ID, id);
if (temp.next()) {
DataObject obj = temp.getDataObject();
temp.close();
return (Template)DomainObjectFactory.newInstance(obj);
}
throw new DataObjectNotFoundException("cannot find template for id " + id);
}
public static TemplateCollection retrieveAll() {
Session session = SessionManager.getSession();
DataCollection temp = session.retrieve(BASE_DATA_OBJECT_TYPE);
temp.addOrder("title");
return new TemplateCollection(temp);
}
/**
* Retrieve templates across all contexts for a given Category.
*/
public static DataCollection retrieveForCategory(Category category) {
DataCollection templates = SessionManager.getSession().retrieve
( Template.BASE_DATA_OBJECT_TYPE );
templates.addEqualsFilter( "templateMappings.category.id", category.getID() );
return templates;
}
public static Template matchExact(Category category, String dispatcherContext, String useContext) {
DataCollection templates = SessionManager.getSession().retrieve
( Template.BASE_DATA_OBJECT_TYPE );
templates.addEqualsFilter( "templateMappings.category.id", category.getID() );
templates.addEqualsFilter( "templateMappings.dispatcherContext", dispatcherContext );
templates.addEqualsFilter( "templateMappings.useContext", useContext );
if (templates.next()) {
DataObject obj = templates.getDataObject();
templates.close();
return (Template)DomainObjectFactory.newInstance(obj);
}
return null;
}
public static Template matchBest(Category cat, String dispatcherContext, String useContext) {
String path = (String)DomainServiceInterfaceExposer.get(cat, "defaultAncestors");
DataCollection templates = SessionManager.getSession().retrieve
( Template.BASE_DATA_OBJECT_TYPE );
templates.addPath( "templateMappings.category.defaultAncestors" );
// Filter on ancestors, getting longest match first
Filter f = templates.addFilter( ":path like templateMappings.category.defaultAncestors || '%'" );
f.set( "path", path );
templates.addOrder( "templateMappings.category.defaultAncestors desc" );
templates.addEqualsFilter("templateMappings.dispatcherContext", dispatcherContext);
templates.addEqualsFilter("templateMappings.useContext", useContext);
templates.setRange( new Integer( 1 ), new Integer( 2 ) );
if (templates.next()) {
if (s_log.isDebugEnabled()) {
s_log.debug("Got template matching " + templates.get("templateMappings.category.defaultAncestors"));
}
Template template = (Template)DomainObjectFactory.newInstance(templates.getDataObject());
templates.close();
return template;
}
return null;
}
public BigDecimal getID() {
return (BigDecimal)get(ID);
}
public String getTitle() {
return (String)get(TITLE);
}
public void setTitle(String title) {
set(TITLE, title);
}
public String getDescription() {
return (String)get(DESCRIPTION);
}
public void setDescription(String description) {
set(DESCRIPTION, description);
}
public String getURL() {
return (String)get(URL);
}
public void setURL(String url) {
set(URL, url);
}
}