package org.infoglue.deliver.integration.dataproviders;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.exolab.castor.jdo.Database;
import org.infoglue.cms.applications.databeans.GenericOptionDefinition;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.dom.DOMBuilder;
import org.infoglue.deliver.applications.databeans.ComponentPropertyOption;
import org.infoglue.deliver.util.CacheController;
public class RemoteXMLPropertyOptionsDataProvider implements PropertyOptionsDataProvider
{
private final static Logger logger = Logger.getLogger(RemoteXMLPropertyOptionsDataProvider.class.getName());
public List<GenericOptionDefinition> getOptions(Map parameters, String languageCode, InfoGluePrincipal principal, Database db) throws Exception
{
String serviceUrl = (String)parameters.get("serviceUrl");
if(serviceUrl == null)
throw new Exception("Must supply a valid parameter [serviceUrl] to this provider.");
String charset = (String)parameters.get("charset");
if(charset == null)
charset = "utf-8";
logger.info("RemoteXMLPropertyOptionsDataProvider");
logger.info("serviceUrl:" + serviceUrl);
logger.info("charset:" + charset);
List<GenericOptionDefinition> options = (List<GenericOptionDefinition>)CacheController.getCachedObjectFromAdvancedCache("propertyOptionsCache", "properties_" + serviceUrl + "_" + charset + "_" + languageCode, 300);
if(options != null)
{
logger.info("Using cached options...");
return options;
}
try
{
logger.info("Getting options from remote service...");
options = new ArrayList<GenericOptionDefinition>();
org.infoglue.deliver.util.HttpHelper httpHelper = new org.infoglue.deliver.util.HttpHelper();
String xml = httpHelper.getUrlContent(serviceUrl, Collections.EMPTY_MAP, parameters, charset, 10000);
logger.info("xml from service:\n" + xml);
Document document = new DOMBuilder().getDocument(xml);
List properties = document.getRootElement().selectNodes("property");
logger.info("properties:" + properties.size());
Iterator propertiesIterator = properties.iterator();
while(propertiesIterator.hasNext())
{
Element propertyElement = (Element)propertiesIterator.next();
logger.info("propertyElement:" + propertyElement);
ComponentPropertyOption option = new ComponentPropertyOption();
if(propertyElement.attributeValue("name_" + languageCode) != null && !propertyElement.attributeValue("name_" + languageCode).equals(""))
option.setName(propertyElement.attributeValue("name_" + languageCode));
else
option.setName(propertyElement.attributeValue("name"));
option.setValue(propertyElement.attributeValue("value"));
options.add(option);
}
if(options != null)
CacheController.cacheObjectInAdvancedCache("propertyOptionsCache", "properties_" + serviceUrl + "_" + charset, options);
}
catch (Exception e)
{
e.printStackTrace();
options = (List<GenericOptionDefinition>)CacheController.getCachedObjectFromAdvancedCache("propertyOptionsCache", "properties_" + serviceUrl + "_" + charset);
}
return options;
}
}