1 9 10 package org.eclipse.help.internal.xhtml; 11 12 import java.util.Iterator ; 13 import java.util.Map ; 14 15 import org.eclipse.core.runtime.IProduct; 16 import org.eclipse.core.runtime.Platform; 17 import org.eclipse.help.internal.FilterableUAElement; 18 import org.eclipse.help.internal.util.StringUtil; 19 import org.osgi.framework.Bundle; 20 import org.w3c.dom.Document ; 21 import org.w3c.dom.Element ; 22 import org.w3c.dom.Node ; 23 import org.w3c.dom.NodeList ; 24 25 29 public class UAContentFilterProcessor { 30 31 public Document applyFilters(Document dom) { 32 Element body = DOMUtil.getBodyElement(dom); 33 NodeList allChildElements = body.getChildNodes(); 34 for (int i = 0; i < allChildElements.getLength(); i++) { 35 Node node = (Node ) allChildElements.item(i); 36 if (!(node instanceof Element)) 37 continue; 38 applyFilters((Element) node); 39 40 } 41 return dom; 42 } 43 44 public void applyFilters(Element element) { 45 boolean filteredIn = false; 46 if (hasFilterAttribute(element)) { 47 filteredIn = processFilterAttribute(element); 48 if (!filteredIn) 49 return; 50 } else if (hasFiltersAsChildren(element)) { 51 Element[] filters = DOMUtil.getElementsByTagName(element, "filter"); filteredIn = processFilterChildren(element, filters); 53 if (!filteredIn) 54 return; 55 } 56 57 NodeList allChildElements = element.getChildNodes(); 58 for (int i = 0; i < allChildElements.getLength(); i++) { 59 Node node = (Node ) allChildElements.item(i); 60 if (!(node instanceof Element)) 61 continue; 62 Element childElement = (Element) node; 63 applyFilters(childElement); 64 } 65 } 66 67 74 public String getCurrentValue(String filterName) { 75 if (filterName.equals("ws")) { return Platform.getWS(); 77 } 78 else if (filterName.equals("os")) { return Platform.getOS(); 80 } 81 else if (filterName.equals("arch")) { return Platform.getOSArch(); 83 } 84 else if (filterName.equals("product")) { IProduct product = Platform.getProduct(); 86 if (product != null) { 87 return product.getId(); 88 } 89 } 90 return null; 91 } 92 93 private static boolean hasFilterAttribute(Element element) { 94 if (element.getAttribute(DOMUtil.ATT_FILTER).equals("")) return false; 96 return true; 97 } 98 99 private static boolean hasFiltersAsChildren(Element element) { 100 Element[] filters = DOMUtil.getElementsByTagName(element, "filter"); if (filters != null && filters.length > 0) 102 return true; 103 return false; 104 } 105 106 107 113 private boolean processFilterAttribute(Element element) { 114 String filterString = element.getAttribute(DOMUtil.ATT_FILTER); 115 boolean filtered_in = isFilteredIn(filterString); 116 117 if (!filtered_in) { 118 element.getParentNode().removeChild(element); 119 } 120 return filtered_in; 121 } 122 123 124 private boolean processFilterChildren(Element parent, Element[] filters) { 125 boolean filtered_in = false; 126 for (int i = 0; i < filters.length; i++) { 127 String filter = filters[i].getAttribute("name"); String value = filters[i].getAttribute("value"); boolean isPositive = (value.length() == 0 || value.charAt(0) != '!'); 130 if (!isPositive) { 131 value = value.substring(1); 133 } 134 filtered_in = isFilteredIn(filter, value, isPositive); 135 if (!filtered_in) { 136 parent.getParentNode().removeChild(parent); 137 break; 138 } 139 } 140 return filtered_in; 141 } 142 143 150 public boolean isFilteredIn(String filterAttribute) { 151 String [] parsedFilterString = null; 152 boolean isPositive = (filterAttribute.indexOf("!=") == -1); parsedFilterString = StringUtil.split(filterAttribute, "!?="); String filter = parsedFilterString[0]; 156 String value = parsedFilterString[1]; 157 return isFilteredIn(filter, value, isPositive); 158 } 159 160 169 public boolean isFilteredIn(String filter, String value, boolean isPositive) { 170 boolean filtered_in = false; 171 if (filter.equals("ws")) { filtered_in = filterByWS(value); 173 } else if (filter.equals("os")) { filtered_in = filterByOS(value); 175 } else if (filter.equals("arch")) { filtered_in = filterByARCH(value); 177 } else if (filter.equals("product")) { filtered_in = filterByProduct(value); 179 } else if (filter.equals("plugin")) { filtered_in = filterByPlugin(value); 181 } else 182 filtered_in = filterBySystemProperty(filter, value); 183 184 return isPositive ? filtered_in : !filtered_in; 185 } 186 187 194 public boolean isFilteredIn(FilterableUAElement element) { 195 if (element != null) { 196 Map filters = ((FilterableUAElement)element).getFilters(); 197 if (filters != null) { 198 Iterator iter = filters.entrySet().iterator(); 199 while (iter.hasNext()) { 200 Map.Entry entry = (Map.Entry )iter.next(); 201 String key = (String )entry.getKey(); 202 String value = (String )entry.getValue(); 203 boolean isPositive = (value.length() == 0 || value.charAt(0) != '!'); 204 if (!isPositive) { 205 value = value.substring(1); 206 } 207 if (!isFilteredIn(key, value, isPositive)) { 208 return false; 209 } 210 } 211 } 212 } 213 return true; 214 } 215 216 224 public boolean isMultiValue(String filterName) { 225 return !(filterName.equals("os") || filterName.equals("ws") || filterName.equals("arch") || filterName.equals("product")); } 230 231 234 private static boolean filterByWS(String ws) { 235 String currentWS = Platform.getWS(); 236 if (currentWS.equals(ws)) 237 return true; 238 return false; 239 } 240 241 244 private static boolean filterByOS(String os) { 245 String currentOS = Platform.getOS(); 246 if (currentOS.equals(os)) 247 return true; 248 return false; 249 } 250 251 254 private static boolean filterByARCH(String arch) { 255 String currentArch = Platform.getOSArch(); 256 if (currentArch.equals(arch)) 257 return true; 258 return false; 259 } 260 261 264 private static boolean filterByProduct(String productId) { 265 IProduct product = Platform.getProduct(); 266 if (product == null) 267 return false; 268 269 String currentProductId = product.getId(); 270 if (currentProductId.equals(productId)) 271 return true; 272 return false; 273 } 274 275 278 private static boolean filterByPlugin(String bundleId) { 279 Bundle bundle = Platform.getBundle(bundleId); 280 boolean bundleIsOK = checkBundleState(bundle); 281 if (bundleIsOK) 282 return true; 283 284 return false; 285 } 286 287 288 public static boolean checkBundleState(Bundle bundle) { 289 if (bundle == null || bundle.getState() == Bundle.UNINSTALLED 290 || bundle.getState() == Bundle.INSTALLED) 291 return false; 292 293 return true; 294 } 295 296 297 300 private static boolean filterBySystemProperty(String property, String value) { 301 String currentValue = System.getProperty(property); 302 if (currentValue != null && currentValue.equals(value)) 303 return true; 304 return false; 305 } 306 307 } 308 | Popular Tags |