// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package jodd.madvoc.result;
import jodd.methref.Methref;
/**
* Result - cool, neat helper for results that are dealing with the path.
* It allows to specify any action in an easy way.
*/
public class Result {
protected Class<? extends ActionResult> actionResult;
protected String resultValue;
protected Methref methref;
protected Class target;
// ---------------------------------------------------------------- core
/**
* Specifies generic result type for rendering.
*/
public Result with(Class<? extends ActionResult> actionResult) {
this.actionResult = actionResult;
return this;
}
/**
* Defines raw result value to be rendered.
*/
public Result value(String resultValue) {
this.resultValue = resultValue;
return this;
}
/**
* Returns either result value or action method reference.
*/
public String value() {
if (methref != null) {
String methodName = methref.ref();
return target.getName() + "#" + methodName;
}
return resultValue;
}
/**
* Wraps action class and returns <code>MethRef</code> object
* (proxified target) so user can choose the method.
*/
protected <T> T wrapAction(Class<T> target) {
this.target = target;
this.methref = Methref.on(target);
this.resultValue = null;
return (T) methref.to();
}
// ---------------------------------------------------------------- forward
/**
* Basic forwarding to default result.
*/
public void forward() {
actionResult = ServletDispatcherResult.class;
resultValue = null;
methref = null;
}
/**
* Basic forwarding with provided result.
*/
public void forwardTo(String path) {
actionResult = ServletDispatcherResult.class;
resultValue = path;
methref = null;
}
/**
* Forward to action method of provided action.
*/
public <T> T forwardTo(Class<T> target) {
actionResult = ServletDispatcherResult.class;
return wrapAction(target);
}
/**
* Forward to action method of current action class.
*/
public <T> T forwardTo(T target) {
actionResult = ServletDispatcherResult.class;
return (T) wrapAction(target.getClass());
}
/**
* Appends forward by adding method result value.
*/
public void forwardTo(Result result, String append) {
resultValue = "/<" + result.value() + ">.." + append;
methref = null;
}
// ---------------------------------------------------------------- redirect
/**
* Basic redirection to path.
*/
public void redirectTo(String path) {
actionResult = ServletRedirectResult.class;
resultValue = path;
methref = null;
}
/**
* Redirect to specified path.
*/
public <T> T redirectTo(Class<T> target) {
actionResult = ServletRedirectResult.class;
return wrapAction(target);
}
/**
* Redirect to method of this class.
*/
public <T> T redirectTo(T target) {
actionResult = ServletRedirectResult.class;
return (T) wrapAction(target.getClass());
}
/**
* Appends redirection definition.
*/
public void redirectTo(Result result, String append) {
resultValue = "/<" + result.value() + ">" + append;
methref = null;
}
/**
* Permanent redirection to given path.
*/
public void urlTo(String path) {
actionResult = ServletUrlRedirectResult.class;
resultValue = path;
methref = null;
}
// ---------------------------------------------------------------- chain
/**
* Basic chain to path.
*/
public void chainTo(String path) {
actionResult = ChainResult.class;
resultValue = path;
methref = null;
}
/**
* Chains to specified path.
*/
public <T> T chainTo(Class<T> target) {
actionResult = ChainResult.class;
return wrapAction(target);
}
/**
* Chains to method of this class.
*/
public <T> T chainTo(T target) {
actionResult = ChainResult.class;
return (T) wrapAction(target.getClass());
}
// ---------------------------------------------------------------- move
/**
* Basic move to path.
*/
public void moveTo(String path) {
actionResult = MoveResult.class;
resultValue = path;
methref = null;
}
/**
* Moves to specified path.
*/
public <T> T moveTo(Class<T> target) {
actionResult = MoveResult.class;
return wrapAction(target);
}
/**
* Moves to method of this class.
*/
public <T> T moveTo(T target) {
actionResult = MoveResult.class;
return (T) wrapAction(target.getClass());
}
// ---------------------------------------------------------------- other results
/**
* Do nothing.
* @see jodd.madvoc.result.NoneResult
*/
public void nothing() {
actionResult = NoneResult.class;
resultValue = null;
}
/**
* Returns text.
* @see jodd.madvoc.result.TextResult
*/
public void text(String text) {
actionResult = TextResult.class;
resultValue = text;
}
/**
* Redirects to url.
* @see jodd.madvoc.result.ServletUrlRedirectResult
*/
public void url(String url) {
actionResult = ServletUrlRedirectResult.class;
resultValue = url;
}
// ---------------------------------------------------------------- direct
/**
* Returns action result type.
*/
public Class<? extends ActionResult> getActionResult() {
return actionResult;
}
/**
* Returns action result value.
*/
public Object getResultValue() {
return resultValue;
}
}