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 }