View Javadoc

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