1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.bridges.struts.config;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Comparator;
22
23 import org.apache.commons.digester.Digester;
24
25 public class PortletURLTypes extends AbstractConfigComponent
26 {
27 private static final Comparator portletURLTypeComparator =
28 new Comparator()
29 {
30 public int compare(Object o1, Object o2)
31 {
32 PortletURLType a1 = (PortletURLType)o1;
33 PortletURLType a2 = (PortletURLType)o2;
34 int lendiff = a1.getPath().length() - a2.getPath().length();
35 if ( lendiff == 0 )
36 {
37 return a1.getPath().compareTo(a2.getPath());
38 }
39 else if ( lendiff > 0 )
40 {
41 return -1;
42 }
43 else
44 {
45 return 1;
46 }
47 }
48 };
49
50 public static class URLType
51 {
52 public static final URLType ACTION = new URLType(0,"action");
53 public static final URLType RENDER = new URLType(1,"render");
54 public static final URLType RESOURCE = new URLType(2,"resource");
55
56 private int id;
57 private String name;
58
59 private URLType(int id, String name)
60 {
61 this.id = id;
62 this.name = name;
63 }
64
65 public String getName()
66 {
67 return name;
68 }
69
70 public boolean equals(URLType type)
71 {
72 return type != null ? type.id == id : false;
73 }
74 }
75
76 public static class PortletURLType
77 {
78 private String path;
79 private URLType type;
80
81 public PortletURLType(){}
82 public String getPath()
83 {
84 return path;
85 }
86
87 public void setPath(String path)
88 {
89 this.path = path;
90 }
91
92 public void setType(URLType type)
93 {
94 this.type = type;
95 }
96
97 public URLType getType()
98 {
99 return type;
100 }
101
102 public String toString()
103 {
104 return "PortletURLType: path="+path+", type="+type;
105 }
106 }
107
108 private URLType defaultPortletURLType = URLType.RENDER;
109 private PortletURLType[] portletURLTypes = new PortletURLType[0];
110 private ArrayList portletURLTypeList;
111
112 public PortletURLTypes(){}
113
114 public void addActionType(PortletURLType portletURLType)
115 {
116 checkLoaded();
117 portletURLType.setType(URLType.ACTION);
118 portletURLTypeList.add(portletURLType);
119 }
120
121 public void addRenderType(PortletURLType portletURLType)
122 {
123 checkLoaded();
124 portletURLType.setType(URLType.RENDER);
125 portletURLTypeList.add(portletURLType);
126 }
127
128 public void addResourceType(PortletURLType portletURLType)
129 {
130 checkLoaded();
131 portletURLType.setType(URLType.RESOURCE);
132 portletURLTypeList.add(portletURLType);
133 }
134
135 public void setDefault(String value)
136 {
137 checkLoaded();
138 this.defaultPortletURLType = "action".equals(value.toLowerCase()) ? URLType.ACTION : URLType.RENDER;
139 }
140
141 public void configure(Digester digester)
142 {
143 portletURLTypeList = new ArrayList();
144 digester.addRule("config/portlet-url-type", new SetParentRule(this));
145 digester.addSetProperties("config/portlet-url-type");
146 digester.addObjectCreate("config/portlet-url-type/action", PortletURLType.class);
147 digester.addSetProperties("config/portlet-url-type/action");
148 digester.addSetNext("config/portlet-url-type/action", "addActionType");
149 digester.addObjectCreate("config/portlet-url-type/render", PortletURLType.class);
150 digester.addSetProperties("config/portlet-url-type/render");
151 digester.addSetNext("config/portlet-url-type/render", "addRenderType");
152 digester.addObjectCreate("config/portlet-url-type/resource", PortletURLType.class);
153 digester.addSetProperties("config/portlet-url-type/resource");
154 digester.addSetNext("config/portlet-url-type/resource", "addResourceType");
155 digester.addCallMethod("config/portlet-url-type", "afterLoad");
156 }
157
158 public void afterLoad()
159 {
160 super.afterLoad();
161
162 if ( portletURLTypeList != null && portletURLTypeList.size() > 0 )
163 {
164 portletURLTypes = new PortletURLType[portletURLTypeList.size()];
165 for ( int i = 0; i < portletURLTypes.length; i++ )
166 {
167 portletURLTypes[i] = (PortletURLType)portletURLTypeList.get(i);
168 }
169 if ( portletURLTypes.length > 1 )
170 {
171 Arrays.sort(portletURLTypes, portletURLTypeComparator);
172 }
173 }
174
175 portletURLTypeList = null;
176 }
177
178 public URLType getType(String path)
179 {
180 URLType type = defaultPortletURLType;
181 for (int i = 0; i < portletURLTypes.length; i++ )
182 {
183 if (path.startsWith(portletURLTypes[i].path))
184 {
185 type = portletURLTypes[i].getType();
186 break;
187 }
188 }
189 return type;
190 }
191 }