All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opensymphony.xwork2.interceptor.ChainingInterceptor Maven / Gradle / Ivy

Go to download

XWork is an command-pattern framework that is used to power WebWork as well as other applications. XWork provides an Inversion of Control container, a powerful expression language, data type conversion, validation, and pluggable configuration.

There is a newer version: 2.1.3
Show newest version
/*
 * Copyright (c) 2002-2007 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.xwork2.interceptor;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Unchainable;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import com.opensymphony.xwork2.util.reflection.ReflectionProvider;


/**
 * 
 *
 * An interceptor that copies all the properties of every object in the value stack to the currently executing object,
 * except for any object that implements {@link Unchainable}. A collection of optional includes and
 * excludes may be provided to control how and which parameters are copied. Only includes or excludes may be
 * specified. Specifying both results in undefined behavior. See the javadocs for {@link ReflectionProvider#copy(Object, Object,
 * java.util.Map, java.util.Collection, java.util.Collection)} for more information.
 *
 * 

* Note: It is important to remember that this interceptor does nothing if there are no objects already on the stack. *
This means two things: *
One, you can safely apply it to all your actions without any worry of adverse affects. *
Two, it is up to you to ensure an object exists in the stack prior to invoking this action. The most typical way this is done * is through the use of the chain result type, which combines with this interceptor to make up the action * chaining feature. * * * *

Interceptor parameters: * * * *

    * *
  • excludes (optional) - the list of parameter names to exclude from copying (all others will be included).
  • * *
  • includes (optional) - the list of parameter names to include when copying (all others will be excluded).
  • * *
* * * *

Extending the interceptor: * *

* * * * There are no known extension points to this interceptor. * * * *

Example code: * *

 * 
 * 
 * <action name="someAction" class="com.examples.SomeAction">
 *     <interceptor-ref name="basicStack"/>
 *     <result name="success" type="chain">otherAction</result>
 * </action>
 *
 * <action name="otherAction" class="com.examples.OtherAction">
 *     <interceptor-ref name="chain"/>
 *     <interceptor-ref name="basicStack"/>
 *     <result name="success">good_result.ftl</result>
 * </action>
 * 
 * 
 * 
* * @see com.opensymphony.xwork2.ActionChainResult * @author mrdon * @author tm_jee ( tm_jee(at)yahoo.co.uk ) */ public class ChainingInterceptor extends AbstractInterceptor { private static final Logger LOG = LoggerFactory.getLogger(ChainingInterceptor.class); protected Collection excludes; protected Collection includes; protected ReflectionProvider reflectionProvider; @Inject public void setReflectionProvider(ReflectionProvider prov) { this.reflectionProvider = prov; } public String intercept(ActionInvocation invocation) throws Exception { ValueStack stack = invocation.getStack(); CompoundRoot root = stack.getRoot(); if (root.size() > 1) { List list = new ArrayList(root); list.remove(0); Collections.reverse(list); Map ctxMap = invocation.getInvocationContext().getContextMap(); Iterator iterator = list.iterator(); int index = 1; // starts with 1, 0 has been removed while (iterator.hasNext()) { index = index + 1; Object o = iterator.next(); if (o != null) { if (!(o instanceof Unchainable)) { reflectionProvider.copy(o, invocation.getAction(), ctxMap, excludes, includes); } } else { LOG.warn("compound root element at index "+index+" is null"); } } } return invocation.invoke(); } /** * Gets list of parameter names to exclude * * @return the exclude list */ public Collection getExcludes() { return excludes; } /** * Sets the list of parameter names to exclude from copying (all others will be included). * * @param excludes the excludes list */ public void setExcludes(Collection excludes) { this.excludes = excludes; } /** * Gets list of parameter names to include * * @return the include list */ public Collection getIncludes() { return includes; } /** * Sets the list of parameter names to include when copying (all others will be excluded). * * @param includes the includes list */ public void setIncludes(Collection includes) { this.includes = includes; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy