1
2
3
4 package org.apache.struts2.sitegraph;
5
6 import java.io.File;
7 import java.io.IOException;
8 import java.util.Collections;
9 import java.util.LinkedHashMap;
10 import java.util.Map;
11 import java.util.Set;
12
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.apache.struts2.config.BeanSelectionProvider;
16 import org.apache.struts2.config.DefaultPropertiesProvider;
17 import org.apache.struts2.config.LegacyPropertiesConfigurationProvider;
18 import org.apache.struts2.config.StrutsXmlConfigurationProvider;
19 import org.apache.struts2.sitegraph.entities.FreeMarkerView;
20 import org.apache.struts2.sitegraph.entities.JspView;
21 import org.apache.struts2.sitegraph.entities.VelocityView;
22 import org.apache.struts2.sitegraph.entities.View;
23
24 import com.opensymphony.xwork2.config.ConfigurationManager;
25 import com.opensymphony.xwork2.config.ConfigurationProvider;
26 import com.opensymphony.xwork2.config.entities.ActionConfig;
27 import com.opensymphony.xwork2.config.entities.ResultConfig;
28
29 /***
30 * Initializes and retrieves XWork config elements
31 */
32 public class StrutsConfigRetriever {
33
34 private static final Log LOG = LogFactory.getLog(StrutsConfigRetriever.class);
35 private static String configDir;
36 private static String[] views;
37 private static boolean isXWorkStarted = false;
38 private static Map viewCache = new LinkedHashMap();
39 private static ConfigurationManager cm;
40
41 /***
42 * Returns a Map of all action names/configs
43 *
44 * @return Map of all action names/configs
45 */
46 public static Map getActionConfigs() {
47 if (!isXWorkStarted)
48 initXWork();
49 return cm.getConfiguration().getRuntimeConfiguration().getActionConfigs();
50 }
51
52 private static void initXWork() {
53 String configFilePath = configDir + "/struts.xml";
54 File configFile = new File(configFilePath);
55 try {
56 ConfigurationProvider configProvider = new StrutsXmlConfigurationProvider(configFile.getCanonicalPath(), true, null);
57 cm = new ConfigurationManager();
58 cm.addConfigurationProvider(new DefaultPropertiesProvider());
59 cm.addConfigurationProvider(new StrutsXmlConfigurationProvider("struts-default.xml", false, null));
60 cm.addConfigurationProvider(configProvider);
61 cm.addConfigurationProvider(new LegacyPropertiesConfigurationProvider());
62 cm.addConfigurationProvider(new BeanSelectionProvider());
63 isXWorkStarted = true;
64 } catch (IOException e) {
65 LOG.error("IOException", e);
66 }
67 }
68
69 public static Set getNamespaces() {
70 Set namespaces = Collections.EMPTY_SET;
71 Map allActionConfigs = getActionConfigs();
72 if (allActionConfigs != null) {
73 namespaces = allActionConfigs.keySet();
74 }
75 return namespaces;
76 }
77
78 /***
79 * Return a Set of the action names for this namespace.
80 *
81 * @param namespace
82 * @return Set of the action names for this namespace.
83 */
84 public static Set getActionNames(String namespace) {
85 Set actionNames = Collections.EMPTY_SET;
86 Map allActionConfigs = getActionConfigs();
87 if (allActionConfigs != null) {
88 Map actionMappings = (Map) allActionConfigs.get(namespace);
89 if (actionMappings != null) {
90 actionNames = actionMappings.keySet();
91 }
92 }
93 return actionNames;
94 }
95
96 /***
97 * Returns the ActionConfig for this action name at this namespace.
98 *
99 * @param namespace
100 * @param actionName
101 * @return The ActionConfig for this action name at this namespace.
102 */
103 public static ActionConfig getActionConfig(String namespace, String actionName) {
104 ActionConfig config = null;
105 Map allActionConfigs = getActionConfigs();
106 if (allActionConfigs != null) {
107 Map actionMappings = (Map) allActionConfigs.get(namespace);
108 if (actionMappings != null) {
109 config = (ActionConfig) actionMappings.get(actionName);
110 }
111 }
112 return config;
113 }
114
115 public static ResultConfig getResultConfig(String namespace, String actionName,
116 String resultName) {
117 ResultConfig result = null;
118 ActionConfig actionConfig = getActionConfig(namespace, actionName);
119 if (actionConfig != null) {
120 Map resultMap = actionConfig.getResults();
121 result = (ResultConfig) resultMap.get(resultName);
122 }
123 return result;
124 }
125
126 public static File getViewFile(String namespace, String actionName, String resultName) {
127 ResultConfig result = getResultConfig(namespace, actionName, resultName);
128 String location = (String) result.getParams().get("location");
129 for (int i = 0; i < views.length; i++) {
130 String viewRoot = views[i];
131 File viewFile = getViewFileInternal(viewRoot, location, namespace);
132 if (viewFile != null) {
133 return viewFile;
134 }
135 }
136
137 return null;
138 }
139
140 private static File getViewFileInternal(String root, String location, String namespace) {
141 StringBuffer filePath = new StringBuffer(root);
142 if (!location.startsWith("/")) {
143 filePath.append(namespace + "/");
144 }
145 filePath.append(location);
146 File viewFile = new File(filePath.toString());
147 if (viewFile.exists()) {
148 return viewFile;
149 } else {
150 return null;
151 }
152 }
153
154 public static View getView(String namespace, String actionName, String resultName, int type) {
155 String viewId = namespace + "/" + actionName + "/" + resultName;
156 View view = (View) viewCache.get(viewId);
157 if (view == null) {
158 File viewFile = StrutsConfigRetriever.getViewFile(namespace, actionName, resultName);
159 if (viewFile != null) {
160 switch (type) {
161 case View.TYPE_JSP:
162 view = new JspView(viewFile);
163 break;
164 case View.TYPE_FTL:
165 view = new FreeMarkerView(viewFile);
166 break;
167 case View.TYPE_VM:
168 view = new VelocityView(viewFile);
169 break;
170 default:
171 return null;
172 }
173
174 viewCache.put(viewId, view);
175 }
176 }
177 return view;
178 }
179
180 public static void setConfiguration(String configDir, String[] views) {
181 StrutsConfigRetriever.configDir = configDir;
182 StrutsConfigRetriever.views = views;
183 isXWorkStarted = false;
184 viewCache = new LinkedHashMap();
185 }
186 }