libreccm-legacy/ccm-navigation/src/com/arsdigita/navigation/ui/GreetingItemExtraXML.java

125 lines
4.3 KiB
Java
Executable File

/*
* Copyright (C) 2005 Runtime Collective Ltd. All Rights Reserved.
*/
package com.arsdigita.navigation.ui;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.CMSConfig;
import com.arsdigita.cms.ExtraXMLGenerator;
import com.arsdigita.globalization.GlobalizationHelper;
import com.arsdigita.navigation.Navigation;
import com.arsdigita.xml.Element;
/**
* GreetingItemExtraXML generates the extra XML which is not included in the standard
* cms:item element.
*
* @author <a href="mailto:fabrice@runtime-collective.com">Fabrice Retkowsky</a>
* @version $Id: GreetingItem.java 285 2005-02-22 00:29:02Z sskracic $
*/
public class GreetingItemExtraXML extends AbstractComponent {
private static final Logger s_log = Logger.getLogger(GreetingItemExtraXML.class);
public static final String extraTag = "greetingItemExtraXML";
Map xmlGenerators = new HashMap();
public void register(Page p) {
super.register(p);
for (Iterator i=CMSConfig.getExtraXMLGeneratorsIterator(); i.hasNext(); ) {
Map.Entry e = (Map.Entry) i.next();
String type = (String) e.getKey();
List genClasses = (List) e.getValue();
List genInstances = new LinkedList();
for (Iterator genClassesIterator=genClasses.iterator(); genClassesIterator.hasNext(); ) {
try {
ExtraXMLGenerator gen =(ExtraXMLGenerator) ((Class)genClassesIterator.next()).newInstance();
if (s_log.isDebugEnabled()) {
s_log.debug("Adding parameters for generator : "+gen);
}
gen.addGlobalStateParams(p);
genInstances.add(gen);
} catch (Exception exc) {
s_log.warn("getting ExtraXMLGenerator failed:", exc);
}
}
xmlGenerators.put(type, genInstances);
}
}
public Element generateXML(HttpServletRequest request,
HttpServletResponse response) {
ContentItem item = getItem();
if (item == null) {
return null;
}
List generators = (List) xmlGenerators.get(item.getClass().getName());
if (s_log.isDebugEnabled()) {
s_log.debug("Item : "+item.getName()+", type : "+item.BASE_DATA_OBJECT_TYPE+", no generators : "+(generators == null ? "null" : ""+generators.size()));
}
if (generators == null || generators.isEmpty()) {
return null;
}
Element content = Navigation.newElement(extraTag);
PageState state = PageState.getPageState(request);
for (Iterator i=generators.iterator(); i.hasNext(); ) {
ExtraXMLGenerator generator = (ExtraXMLGenerator) i.next();
if (s_log.isDebugEnabled()) {
s_log.debug("Calling generator : "+generator);
}
generator.generateXML(item, content, state);
}
return content;
}
public ContentItem getItem() {
ContentItem item = (ContentItem) getObject();
if (null == item || !item.isLive()) {
return null;
}
if (!ContentItem.VERSION.equals(item.getVersion())) {
item = item.getLiveVersion();
}
ContentBundle bundle = (ContentBundle) item;
/*Fix by Quasimodo*/
/* getPrimaryInstance doesn't negotiate the language of the content item */
/* ContentItem baseItem = bundle.getPrimaryInstance(); */
ContentItem baseItem = bundle.
getInstance(GlobalizationHelper.getNegotiatedLocale(), true);
// If there is no matching language version for this content item
if(baseItem == null) {
// get the primary instance instead (fallback)
baseItem = bundle.getPrimaryInstance();
}
return baseItem;
}
}