1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (c) 2001-2004 World Wide Web Consortium, (Massachusetts Institute of 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Technology, Institut National de Recherche en Informatique et en 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Automatique, Keio University). All Rights Reserved. This program is 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the W3C's Software Intellectual Property License. This 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * program is distributed in the hope that it will be useful, but WITHOUT ANY 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * FOR A PARTICULAR PURPOSE. See W3C License 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.w3.org/Consortium/Legal/ for more details. 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.w3c.domts; 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method; 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.xml.parsers.DocumentBuilderFactory; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is a strategy that provides the mapping from an abstract setting 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (such as DocumentBuilderSetting.validating) to a specific DOM implementation 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Curt Arnold @date 2 Feb 2002 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class DocumentBuilderSettingStrategy { 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected DocumentBuilderSettingStrategy() { 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String JAXP_SCHEMA_LANGUAGE = 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final String W3C_XML_SCHEMA = 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://www.w3.org/2001/XMLSchema"; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasConflict(DocumentBuilderSettingStrategy other) { 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (other == this); 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void applySetting( 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderFactory factory, 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean value) throws DOMTestIncompatibleException; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean hasSetting(DOMTestDocumentBuilderFactory factory); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy coalescing = 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws DOMTestIncompatibleException { 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setCoalescing(value); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isCoalescing(); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project expandEntityReferences = 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws DOMTestIncompatibleException { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setExpandEntityReferences(value); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isExpandEntityReferences(); 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ignoringElementContentWhitespace = 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws DOMTestIncompatibleException { 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setIgnoringElementContentWhitespace(value); 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isIgnoringElementContentWhitespace(); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy ignoringComments = 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws DOMTestIncompatibleException { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value) { 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException( 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Exception("ignoreComments=true not supported"), 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.ignoringComments); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy namespaceAware = 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) throws 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setNamespaceAware(value); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isNamespaceAware(); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy validating = 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) throws 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setValidating(value); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return factory.isValidating(); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy signed = 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) throws 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!value) { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException( 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notSigned); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy hasNullString = 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) throws 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!value) { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new DOMTestIncompatibleException( 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project null, 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DocumentBuilderSetting.notHasNullString); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final DocumentBuilderSettingStrategy schemaValidating = 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new DocumentBuilderSettingStrategy() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void applySetting(DocumentBuilderFactory factory, boolean value) throws 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DOMTestIncompatibleException { 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value) { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setNamespaceAware(true); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setValidating(true); 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory.setAttribute(JAXP_SCHEMA_LANGUAGE, 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://www.w3.org/TR/REC-xml"); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (factory.isValidating()) { 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Method getAttrMethod = factory.getClass().getMethod("getAttribute", 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Class[] {String.class}); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String val = (String) getAttrMethod.invoke(factory, 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Object[] {JAXP_SCHEMA_LANGUAGE}); 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return W3C_XML_SCHEMA.equals(val); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project catch (Exception ex) { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // schema validating conflicts with namespaceAware 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // and validating 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasConflict(DocumentBuilderSettingStrategy other) { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (other == this || 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project other == DocumentBuilderSettingStrategy.namespaceAware || 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project other == DocumentBuilderSettingStrategy.validating) { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 200