KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > springframework > webflow > engine > builder > TextToViewSelector


1 /*
2  * Copyright 2002-2006 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.springframework.webflow.engine.builder;
17
18 import org.springframework.binding.convert.ConversionContext;
19 import org.springframework.binding.convert.support.ConversionServiceAwareConverter;
20 import org.springframework.binding.expression.Expression;
21 import org.springframework.util.StringUtils;
22 import org.springframework.webflow.engine.NullViewSelector;
23 import org.springframework.webflow.engine.ViewSelector;
24 import org.springframework.webflow.engine.support.ApplicationViewSelector;
25 import org.springframework.webflow.engine.support.ExternalRedirectSelector;
26 import org.springframework.webflow.engine.support.FlowDefinitionRedirectSelector;
27 import org.springframework.webflow.execution.support.ApplicationView;
28 import org.springframework.webflow.execution.support.ExternalRedirect;
29 import org.springframework.webflow.execution.support.FlowDefinitionRedirect;
30 import org.springframework.webflow.execution.support.FlowExecutionRedirect;
31
32 /**
33  * Converter that converts an encoded string representation of a view selector
34  * into a {@link ViewSelector} object that will make selections at runtime.
35  * <p>
36  * This converter supports the following encoded forms:
37  * <ul>
38  * <li>empty - will result in a {@link NullViewSelector}.</li>
39  * <li>"viewName" - will result in an {@link ApplicationViewSelector} that
40  * returns an {@link ApplicationView} ViewSelection with the provided view name expression.</li>
41  * <li>"redirect:&lt;viewName&gt;" - will result in an
42  * {@link ApplicationViewSelector} that returns an {@link FlowExecutionRedirect}
43  * to a flow execution URL.</li>
44  * <li>"externalRedirect:&lt;url&gt;" - will result in an
45  * {@link ExternalRedirectSelector} that returns an {@link ExternalRedirect} to a
46  * URL.</li>
47  * <li>"flowRedirect:&lt;flowId&gt;" - will result in a
48  * {@link FlowDefinitionRedirectSelector} that returns a {@link FlowDefinitionRedirect}
49  * to a flow.</li>
50  * <li>"bean:&lt;id&gt;" - will result in usage of a custom
51  * <code>ViewSelector</code> bean implementation.</li>
52  * </ul>
53  *
54  * @see org.springframework.webflow.execution.ViewSelection
55  * @see org.springframework.webflow.engine.ViewSelector
56  *
57  * @author Keith Donald
58  * @author Erwin Vervaet
59  */

60 public class TextToViewSelector extends ConversionServiceAwareConverter {
61
62     /**
63      * Prefix used when the encoded view name wants to specify that a redirect
64      * is required. ("redirect:")
65      */

66     public static final String JavaDoc REDIRECT_PREFIX = "redirect:";
67
68     /**
69      * Prefix used when the encoded view name wants to specify that a redirect
70      * to an external URL is required. ("externalRedirect:")
71      */

72     public static final String JavaDoc EXTERNAL_REDIRECT_PREFIX = "externalRedirect:";
73
74     /**
75      * Prefix used when the encoded view name wants to specify that a redirect
76      * to a flow definition is requred. ("flowRedirect:")
77      */

78     public static final String JavaDoc FLOW_DEFINITION_REDIRECT_PREFIX = "flowRedirect:";
79
80     /**
81      * Prefix used when the user wants to use a ViewSelector implementation
82      * managed by a bean factory. ("bean:")
83      */

84     private static final String JavaDoc BEAN_PREFIX = "bean:";
85
86     /**
87      * Locator to use for loading custom ViewSelector beans.
88      */

89     private FlowServiceLocator flowServiceLocator;
90
91     /**
92      * Create a new text to ViewSelector converter. Custom ViewSelector implemenations
93      * will be looked up using given service locator.
94      */

95     public TextToViewSelector(FlowServiceLocator flowServiceLocator) {
96         this.flowServiceLocator = flowServiceLocator;
97         setConversionService(flowServiceLocator.getConversionService());
98     }
99
100     public Class JavaDoc[] getSourceClasses() {
101         return new Class JavaDoc[] { String JavaDoc.class };
102     }
103
104     public Class JavaDoc[] getTargetClasses() {
105         return new Class JavaDoc[] { ViewSelector.class };
106     }
107
108     protected Object JavaDoc doConvert(Object JavaDoc source, Class JavaDoc targetClass, ConversionContext context) throws Exception JavaDoc {
109         String JavaDoc encodedView = (String JavaDoc)source;
110         if (!StringUtils.hasText(encodedView)) {
111             return NullViewSelector.INSTANCE;
112         }
113         else {
114             return convertEncodedViewSelector(encodedView);
115         }
116     }
117
118     /**
119      * Convert given encoded view into an appropriate view selector.
120      * @param encodedView the encoded view selector
121      * @return the view selector
122      */

123     protected ViewSelector convertEncodedViewSelector(String JavaDoc encodedView) {
124         if (encodedView.startsWith(REDIRECT_PREFIX)) {
125             String JavaDoc viewName = encodedView.substring(REDIRECT_PREFIX.length());
126             Expression viewNameExpr = (Expression)fromStringTo(Expression.class).execute(viewName);
127             // just show the application view using a redirect
128
return new ApplicationViewSelector(viewNameExpr, true);
129         }
130         else if (encodedView.startsWith(EXTERNAL_REDIRECT_PREFIX)) {
131             String JavaDoc externalUrl = encodedView.substring(EXTERNAL_REDIRECT_PREFIX.length());
132             Expression urlExpr = (Expression)fromStringTo(Expression.class).execute(externalUrl);
133             return new ExternalRedirectSelector(urlExpr);
134         }
135         else if (encodedView.startsWith(FLOW_DEFINITION_REDIRECT_PREFIX)) {
136             String JavaDoc flowRedirect = encodedView.substring(FLOW_DEFINITION_REDIRECT_PREFIX.length());
137             Expression redirectExpr = (Expression)fromStringTo(Expression.class).execute(flowRedirect);
138             return new FlowDefinitionRedirectSelector(redirectExpr);
139         }
140         else if (encodedView.startsWith(BEAN_PREFIX)) {
141             String JavaDoc id = encodedView.substring(BEAN_PREFIX.length());
142             return flowServiceLocator.getViewSelector(id);
143         }
144         else {
145             Expression viewNameExpr = (Expression)fromStringTo(Expression.class).execute(encodedView);
146             return new ApplicationViewSelector(viewNameExpr);
147         }
148     }
149 }
Popular Tags