blob: 495a1255431ad2ddb69650a84b6a562e856ac3cf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.forrest.locationmap.lm;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.components.treeprocessor.InvokeContext;
import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.sitemap.PatternException;
import org.apache.cocoon.environment.SourceResolver;
/**
* Locationmap select statement.
*/
public final class ActNode extends AbstractNode {
// the containing LocatorNode
private final LocatorNode m_ln;
// the action that does the work
private Action m_action;
// the type of action for this node
private String m_type;
// the src of action for this node
private String m_src;
private VariableResolver m_varResolver;
// the locations to test against
private AbstractNode[] m_nodes;
private SourceResolver resolver;
public ActNode(LocatorNode ln, ServiceManager manager) {
super(manager);
m_ln = ln;
}
public void build(Configuration configuration) throws ConfigurationException {
super.build(configuration);
// get the selector
m_type = configuration.getAttribute("type",m_ln.getDefaultAction());
String src=configuration.getAttribute("src","");
try
{
m_varResolver = VariableResolverFactory.getResolver(
src, super.m_manager);
}
catch (PatternException e) {
throw new ConfigurationException("unable to resolve action 'src' attribute");
}
// try {
// m_src = VariableResolverFactory.getResolver(
// configuration.getAttribute("src"), super.m_manager);
// } catch (PatternException e) {
// final String message = "Illegal pattern syntax at for location attribute 'src'" +
// " at " + configuration.getLocation();
// throw new ConfigurationException(message,e);
// }
try {
final ServiceSelector selectors = (ServiceSelector) super.m_manager.lookup(Action.ROLE + "Selector");
m_action = (Action) selectors.select(m_type);
} catch (ServiceException e) {
final String message = "Unable to get Selector of type " + m_type;
throw new ConfigurationException(message,e);
}
// build the child nodes
final Configuration[] children = configuration.getChildren();
final List nodes = new ArrayList(children.length);
for (int i = 0; i < children.length; i++) {
AbstractNode node = null;
String name = children[i].getName();
if (name.equals("location")) {
node = new LocationNode(m_ln, super.m_manager);
}
else if (name.equals("match")) {
node = new MatchNode(m_ln, super.m_manager);
}
else if (name.equals("select")) {
node = new SelectNode(m_ln, super.m_manager);
}
else if (name.equals("act")) {
node = new ActNode(m_ln, super.m_manager);
}
else if (!name.equals("parameter")) {
final String message = "Unknown select node child:" + name;
throw new ConfigurationException(message);
}
if (node != null) {
node.enableLogging(getLogger());
node.build(children[i]);
nodes.add(node);
}
}
m_nodes = (AbstractNode[]) nodes.toArray(new AbstractNode[nodes.size()]);
}
public void service(ServiceManager manager) throws ServiceException {
//FIXME: Determine whether this is really necessary anymore.
this.resolver = (SourceResolver) manager.lookup(SourceResolver.ROLE);
}
/* (non-Javadoc)
* @see org.apache.forrest.locationmap.lm.AbstractNode#locate(java.util.Map, org.apache.cocoon.components.treeprocessor.InvokeContext)
*/
public String locate(Map objectModel, InvokeContext context) throws Exception {
this.resolver = (SourceResolver)m_manager.lookup(SourceResolver.ROLE);
Parameters parameters = resolveParameters(context,objectModel);
Redirector redirector = context.getRedirector();
m_src = m_varResolver.resolve(context,objectModel);
Map substitutions = m_action.act(redirector, resolver, objectModel, m_src, parameters);
if (substitutions != null) {
if (getLogger().isDebugEnabled()) {
// getLogger().debug("matched: " + m_pattern);
}
context.pushMap(null,substitutions);
for (int i = 0; i < m_nodes.length; i++) {
String location = m_nodes[i].locate(objectModel,context);
if (location != null) {
return location;
}
}
context.popMap();
}
return null;
}
// public String locate(Map om, InvokeContext context) throws Exception {
//
// Parameters parameters = resolveParameters(context,om);
// for (int i = 0; i < m_nodes.length; i++) {
// String location = m_nodes[i].locate(om,context);
// if (m_action.act().select(location,om,parameters)) {
// if (getLogger().isDebugEnabled()) {
// getLogger().debug("selected: " + location);
// }
// return location;
// }
// }
// return null;
// }
}