1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (c) 2001-2004 World Wide Web Consortium, 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Massachusetts Institute of Technology, Institut National de 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Recherche en Informatique et en Automatique, Keio University). All 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Rights Reserved. This program is distributed under the W3C's Software 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Intellectual Property License. This program is distributed in the 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hope that it will be useful, but WITHOUT ANY WARRANTY; without even 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PURPOSE. 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See W3C License http://www.w3.org/Consortium/Legal/ for more details. 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.w3c.domts; 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.DOMImplementation; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.w3c.dom.Document; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class implements the generic parser and configuation 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * abstract class for the DOM L3 implementations 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Curt Arnold 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class LSDocumentBuilderFactory 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends DOMTestDocumentBuilderFactory { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Object parser; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Method parseURIMethod; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final DOMImplementation impl; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Abstract class for a strategy to map a DocumentBuilderSetting 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to an action on LSParser. 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static abstract class LSStrategy { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor. 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected LSStrategy() { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Applies setting to LSParser 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param setting setting 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param parser parser 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws DOMTestIncompatibleException if parser does not support setting 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void applySetting(DocumentBuilderSetting setting, 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object parser) throws 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets state of setting for parser 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param parser parser 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return state of setting 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean hasSetting(Object parser); 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Represents a fixed setting, for example, all Java implementations 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * supported signed values. 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class LSFixedStrategy 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends LSStrategy { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final boolean fixedValue; 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param settingName setting name 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param fixedValue fixed value 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LSFixedStrategy(boolean fixedValue) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fixedValue = fixedValue; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Apply setting. Throws exception if requested setting 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not match fixed value. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderSetting setting, Object parser) throws 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (setting.getValue() != fixedValue) { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(null, setting); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets fixed value for setting 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(Object parser) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fixedValue; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A strategy for a setting that can be applied by setting a DOMConfiguration 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameter. 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class LSParameterStrategy 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends LSStrategy { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String lsParameter; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final boolean inverse; 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param lsParameter corresponding DOMConfiguration parameter 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param inverse if true, DOMConfiguration value is the inverse 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the setting value 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LSParameterStrategy(String lsParameter, boolean inverse) { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.lsParameter = lsParameter; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.inverse = inverse; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected static void setParameter(DocumentBuilderSetting setting, 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object parser, 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String parameter, 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object value) throws 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method domConfigMethod = parser.getClass().getMethod("getDomConfig", 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[0]); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object domConfig = domConfigMethod.invoke(parser, new Object[0]); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method setParameterMethod = domConfig.getClass().getMethod( 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "setParameter", new Class[] {String.class, Object.class}); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setParameterMethod.invoke(domConfig, new Object[] {parameter, value}); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (InvocationTargetException ex) { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex.getTargetException(), setting); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex, setting); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected static Object getParameter(Object parser, 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String parameter) throws Exception { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method domConfigMethod = parser.getClass().getMethod("getDomConfig", 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[0]); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object domConfig = domConfigMethod.invoke(parser, new Object[0]); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method getParameterMethod = domConfig.getClass().getMethod("getParameter", 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[] {String.class}); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getParameterMethod.invoke(domConfig, new Object[] {parameter}); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Apply setting 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderSetting setting, Object parser) throws 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (inverse) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setParameter(setting, parser, lsParameter, 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Boolean(!setting.getValue())); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setParameter(setting, parser, lsParameter, new Boolean(setting.getValue())); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Get value of setting 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(Object parser) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (inverse) { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return! ( (Boolean) getParameter(parser, lsParameter)).booleanValue(); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ( (Boolean) getParameter(parser, lsParameter)).booleanValue(); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A strategy for the validation settings which require 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * two DOMConfigurure parameters being set, 'validate' and 'schema-type' 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class LSValidateStrategy 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extends LSParameterStrategy { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String schemaType; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructor 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param schemaType schema type 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LSValidateStrategy(String schemaType) { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super("validate", false); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.schemaType = schemaType; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Apply setting 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderSetting setting, Object parser) throws 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.applySetting(setting, parser); 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setParameter(null, parser, "schema-type", schemaType); 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Get setting value 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(Object parser) { 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (super.hasSetting(parser)) { 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String parserSchemaType = (String) getParameter(parser, "schema-type"); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (schemaType == null || schemaType.equals(parserSchemaType)) { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Strategies for mapping DocumentBuilderSettings to 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * actions on LSParser 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final Map strategies; 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static { 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies = new HashMap(); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("coalescing", new LSParameterStrategy("cdata-sections", true)); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("expandEntityReferences", new LSParameterStrategy("entities", true)); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("ignoringElementContentWhitespace", 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LSParameterStrategy("element-content-whitespace", true)); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("namespaceAware", new LSParameterStrategy("namespaces", false)); 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("validating", 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LSValidateStrategy("http://www.w3.org/TR/REC-xml")); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("schemaValidating", 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new LSValidateStrategy("http://www.w3.org/2001/XMLSchema")); 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("ignoringComments", new LSParameterStrategy("comments", true)); 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("signed", new LSFixedStrategy(true)); 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project strategies.put("hasNullString", new LSFixedStrategy(true)); 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a LS implementation of DOMTestDocumentBuilderFactory. 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param settings array of settings, may be null. 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws DOMTestIncompatibleException 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Thrown if implementation does not support the specified settings 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public LSDocumentBuilderFactory(DocumentBuilderSetting[] settings) throws 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(settings); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class domImplRegistryClass = Class.forName( 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "org.w3c.dom.bootstrap.DOMImplementationRegistry"); 27580279e21933dd29c8d353c1b66ede258660a0f3bElliott Hughes Method newInstanceMethod = domImplRegistryClass.getMethod("newInstance", (Class<?>) null); 27680279e21933dd29c8d353c1b66ede258660a0f3bElliott Hughes Object domRegistry = newInstanceMethod.invoke(null, (Class<?>) null); 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method getDOMImplementationMethod = domImplRegistryClass.getMethod( 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "getDOMImplementation", new Class[] {String.class}); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl = (DOMImplementation) getDOMImplementationMethod.invoke(domRegistry, 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Object[] {"LS"}); 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method createLSParserMethod = impl.getClass().getMethod("createLSParser", 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[] {short.class, String.class}); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parser = createLSParserMethod.invoke(impl, 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Object[] {new Short( (short) 1), null}); 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parseURIMethod = parser.getClass().getMethod("parseURI", 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[] {String.class}); 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (InvocationTargetException ex) { 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex.getTargetException(), null); 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(ex, null); 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (settings != null) { 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < settings.length; i++) { 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object strategy = strategies.get(settings[i].getProperty()); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (strategy == null) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException(null, settings[i]); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ( (LSStrategy) strategy).applySetting(settings[i], parser); 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create new instance of document builder factory 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reflecting specified settings 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newSettings new settings 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return New instance 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws DOMTestIncompatibleException 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if settings are not supported by implementation 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMTestDocumentBuilderFactory newInstance( 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] newSettings) throws DOMTestIncompatibleException { 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newSettings == null) { 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting[] mergedSettings = mergeSettings(newSettings); 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new LSDocumentBuilderFactory(mergedSettings); 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Loads specified URL 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url url to load 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return DOM document 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws DOMTestLoadException if unable to load document 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Document load(java.net.URL url) throws DOMTestLoadException { 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (Document) parseURIMethod.invoke(parser, 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Object[] {url.toString()}); 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (InvocationTargetException ex) { 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestLoadException(ex.getTargetException()); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestLoadException(ex); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets DOMImplementation 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return DOM implementation, may be null 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DOMImplementation getDOMImplementation() { 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl; 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Determines if the implementation supports the specified feature 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param feature Feature 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param version Version 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if implementation supports the feature 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasFeature(String feature, String version) { 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getDOMImplementation().hasFeature(feature, version); 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean hasProperty(String parameter) { 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ( (Boolean) LSParameterStrategy.getParameter(parser, parameter)). 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project booleanValue(); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the implementation combines text and cdata nodes. 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if coalescing 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isCoalescing() { 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return!hasProperty("cdata-sections"); 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the implementation expands entity references. 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if expanding entity references 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isExpandEntityReferences() { 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return!hasProperty("entities"); 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the implementation ignores 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element content whitespace. 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if ignoring element content whitespace 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isIgnoringElementContentWhitespace() { 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return!hasProperty("element-content-whitespace"); 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the implementation is namespace aware. 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if namespace aware 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNamespaceAware() { 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hasProperty("namespaces"); 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the implementation is validating. 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if validating 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isValidating() { 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hasProperty("validate"); 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 415