/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* 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.
*/
package org.apache.jetspeed.modules;
// jetspeed stuff
import org.apache.jetspeed.modules.parameters.ParameterPresentationStyle;
import org.apache.jetspeed.modules.parameters.ParameterPresentationStyleFactory;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.resources.JetspeedResources;
// Java Core Classes
import java.util.Vector;
import java.util.Map;
import java.util.Hashtable;
import java.util.Iterator;
// Turbine Utility Classes
import org.apache.turbine.modules.GenericLoader;
import org.apache.turbine.services.TurbineServices;
import org.apache.turbine.services.assemblerbroker.AssemblerBrokerService;
import org.apache.turbine.util.RunData;
/**
* The purpose of this class is to allow one to load and execute
* Parameter modules.
*
* @author <a href="mailto:mark_orciuch@ngsltd.com">Mark Orciuch</a>
* @version $Id: ParameterLoader.java,v 1.5 2004/02/23 03:01:32 jford Exp $
*/
public class ParameterLoader extends GenericLoader
{
/**
* The single instance of this class.
*/
private static ParameterLoader instance = new ParameterLoader(JetspeedResources.getInt("parameter.cache.size", 50));
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(ParameterLoader.class.getName());
/**
* These ctor's are private to force clients to use getInstance()
* to access this class.
*/
private ParameterLoader() {
super();
}
/**
* These ctor's are private to force clients to use getInstance()
* to access this class.
*
* @param i
*/
private ParameterLoader(int i) {
super(i);
}
/**
* Adds an instance of an object into the hashtable.
*
* @param name Name of object.
* @param param
*/
private void addInstance(String name, ParameterPresentationStyle param) {
if (cache()) {
this.put(name, (ParameterPresentationStyle)param );
}
}
/**
* Attempts to load and render a parameter using custom style. For example, one might define
* a custom parameter presentation style TextArea which displays current value of the parameter
* using HTML text area presentation. Assuming that TextArea is rendered using two optional
* parameters: rows and cols, the map passed to this method could contain the following values:
* <li>symbols.style.rows = 5
* <li>symbols.style.cols = 80
* and the call might look like this:
*<p>
* String symbols = eval(data, "TextArea", "symbols", "MSFT,SUNW,EMC,ORCL", parms);
*
* @param data Turbine information.
* @param provider Custom parameter class name (without the package)
* @param name Name for rendered HTML tag
* @param value Current value
* @param parms Optional rendition parameters
* @return
* @exception Exception a generic exception.
*/
public String eval(RunData data, String provider, String name, String value, Map parms) throws Exception {
// Execute parameter
ParameterPresentationStyle prm = getInstance(provider);
// Filter out style params
Map styleparms = extractStyleParameters(parms, name);
prm.setParms(styleparms);
return prm.getContent(data, name, value, styleparms);
}
/**
* This method is not used.
*
* @param data Turbine information.
* @param name Name of object that will execute the screen.
* @exception Exception a generic exception.
*/
public void exec(RunData data, String name) throws Exception {
//this.eval(data, name);
}
/**
* Pulls out an instance of the object by name. Name is just the
* single name of the object.
*
* @param provider Name of object instance.
* @return A Screen with the specified name, or null.
* @exception Exception a generic exception.
*/
public ParameterPresentationStyle getInstance(String provider) throws Exception {
ParameterPresentationStyle prm = null;
// Check if the parameter is already in the cache
if (cache() && this.containsKey(provider)) {
prm = (ParameterPresentationStyle) this.get(provider);
if ( logger.isDebugEnabled() ) {
logger.debug("ParameterLoader: Serving parameter: " + provider + ", prm=" + prm + " from cache");
}
} else {
// We get the broker service
AssemblerBrokerService ab =
(AssemblerBrokerService)TurbineServices.getInstance()
.getService (AssemblerBrokerService.SERVICE_NAME);
try {
// Attempt to load the presentation style
prm = (ParameterPresentationStyle)ab.getAssembler("parameter", provider);
if (prm == null) {
if ( logger.isDebugEnabled() ) {
logger.debug("ParameterLoader: Registering the factory");
}
ab.registerFactory("parameter", new ParameterPresentationStyleFactory());
prm = (ParameterPresentationStyle)ab.getAssembler("parameter", provider);
}
if ( logger.isDebugEnabled() ) {
logger.debug("ParameterLoader: Loaded parameter: "+provider+", prm="+prm);
}
} catch (ClassCastException cce) {
prm = null;
logger.error( "Error loading presentation style", cce );
}
if (prm == null) {
// If we did not find a screen we should try and give
// the user a reason for that...
// FIX ME: The AssemblerFactories should each add it's own string here...
Vector packages = JetspeedResources.getVector("module.packages");
throw new ClassNotFoundException( "\n\n\tRequested Parameter not found: " +
provider + "\n" +
"\tTurbine looked in the following modules.packages path: \n\t" +
packages.toString() + "\n");
} else if(cache()) {
addInstance(provider, prm);
}
}
return prm;
}
/**
* The method through which this class is accessed.
*
* @return The single instance of this class.
*/
public static ParameterLoader getInstance() {
return instance;
}
/**
* Extracts any parameters to parameter style.
*
* @param parms portlet parameters
* @param parm parameter name
* @return hashtable of optional parameters for the style
*/
public static Map extractStyleParameters(Map parms, String parmName) {
Hashtable result = new Hashtable();
if (parms != null) {
String key = parmName.concat(".style.");
Iterator it = parms.keySet().iterator();
while (it.hasNext()) {
String parmkey = (String)it.next();
if (parmkey.startsWith(key)) {
try {
String stylekey = parmkey.substring(parmkey.lastIndexOf(".")+1);
if ( logger.isDebugEnabled() )
{
logger.debug("ParameterLoader: parm name [" + parmName + "] - storing option [" + stylekey +
"] with value [" + parms.get(parmkey) + "]");
}
result.put(stylekey, parms.get(parmkey));
} catch (Exception e) {
logger.error("Error extracting params", e);
}
}
}
}
return result;
}
}