diff options
Diffstat (limited to 'src/com/android/cts/apicoverage/CurrentXmlHandler.java')
-rw-r--r-- | src/com/android/cts/apicoverage/CurrentXmlHandler.java | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/com/android/cts/apicoverage/CurrentXmlHandler.java b/src/com/android/cts/apicoverage/CurrentXmlHandler.java new file mode 100644 index 0000000..de9f5d5 --- /dev/null +++ b/src/com/android/cts/apicoverage/CurrentXmlHandler.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.cts.apicoverage; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link DefaultHandler} that builds an empty {@link ApiCoverage} object from scanning current.xml. + */ +class CurrentXmlHandler extends DefaultHandler { + + private String mCurrentPackageName; + + private String mCurrentClassName; + + private boolean mIgnoreCurrentClass; + + private String mCurrentMethodName; + + private String mCurrentMethodReturnType; + + private boolean mCurrentMethodIsAbstract; + + private String mCurrentMethodVisibility; + + private boolean mCurrentMethodStaticMethod; + + private boolean mCurrentMethodFinalMethod; + + private boolean mDeprecated; + + + private List<String> mCurrentParameterTypes = new ArrayList<String>(); + + private ApiCoverage mApiCoverage = new ApiCoverage(); + + public ApiCoverage getApi() { + return mApiCoverage; + } + + @Override + public void startElement(String uri, String localName, String name, Attributes attributes) + throws SAXException { + super.startElement(uri, localName, name, attributes); + if ("package".equalsIgnoreCase(localName)) { + mCurrentPackageName = getValue(attributes, "name"); + + ApiPackage apiPackage = new ApiPackage(mCurrentPackageName); + mApiCoverage.addPackage(apiPackage); + + } else if ("class".equalsIgnoreCase(localName)) { + if (isEnum(attributes)) { + mIgnoreCurrentClass = true; + return; + } + mIgnoreCurrentClass = false; + mCurrentClassName = getValue(attributes, "name"); + mDeprecated = isDeprecated(attributes); + String superClass = attributes.getValue("extends"); + ApiClass apiClass = new ApiClass( + mCurrentClassName, mDeprecated, is(attributes, "abstract"), superClass); + ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName); + apiPackage.addClass(apiClass); + } else if ("interface".equalsIgnoreCase(localName)) { + // don't add interface + mIgnoreCurrentClass = true; + } else if ("constructor".equalsIgnoreCase(localName)) { + mDeprecated = isDeprecated(attributes); + mCurrentParameterTypes.clear(); + } else if ("method".equalsIgnoreCase(localName)) { + mDeprecated = isDeprecated(attributes); + mCurrentMethodName = getValue(attributes, "name"); + mCurrentMethodReturnType = getValue(attributes, "return"); + mCurrentMethodIsAbstract = is(attributes, "abstract"); + mCurrentMethodVisibility = getValue(attributes, "visibility"); + mCurrentMethodStaticMethod = is(attributes, "static"); + mCurrentMethodFinalMethod = is(attributes, "final"); + mCurrentParameterTypes.clear(); + } else if ("parameter".equalsIgnoreCase(localName)) { + mCurrentParameterTypes.add(getValue(attributes, "type")); + } + } + + @Override + public void endElement(String uri, String localName, String name) throws SAXException { + super.endElement(uri, localName, name); + if (mIgnoreCurrentClass) { + // do not add anything for interface + return; + } + if ("constructor".equalsIgnoreCase(localName)) { + if (mCurrentParameterTypes.isEmpty()) { + // Don't add empty default constructors... + return; + } + ApiConstructor apiConstructor = new ApiConstructor(mCurrentClassName, + mCurrentParameterTypes, mDeprecated); + ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName); + ApiClass apiClass = apiPackage.getClass(mCurrentClassName); + apiClass.addConstructor(apiConstructor); + } else if ("method".equalsIgnoreCase(localName)) { + ApiMethod apiMethod = new ApiMethod( + mCurrentMethodName, + mCurrentParameterTypes, + mCurrentMethodReturnType, + mDeprecated, + mCurrentMethodVisibility, + mCurrentMethodStaticMethod, + mCurrentMethodFinalMethod, + mCurrentMethodIsAbstract); + ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName); + ApiClass apiClass = apiPackage.getClass(mCurrentClassName); + apiClass.addMethod(apiMethod); + } + } + + static String getValue(Attributes attributes, String key) { + // Strip away generics <...> and make inner classes always use a "." rather than "$". + return attributes.getValue(key) + .replaceAll("<.+>", "") + .replace("$", "."); + } + + private boolean isDeprecated(Attributes attributes) { + return "deprecated".equals(attributes.getValue("deprecated")); + } + + private static boolean is(Attributes attributes, String valueName) { + return "true".equals(attributes.getValue(valueName)); + } + + private boolean isEnum(Attributes attributes) { + return "java.lang.Enum".equals(attributes.getValue("extends")); + } +}
\ No newline at end of file |