| /* |
| * Copyright (C) 2012 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.ant; |
| |
| import com.android.SdkConstants; |
| import com.android.sdklib.internal.project.ProjectProperties; |
| import com.android.xml.AndroidManifest; |
| import com.android.xml.AndroidXPathFactory; |
| |
| import org.apache.tools.ant.BuildException; |
| import org.apache.tools.ant.Project; |
| import org.apache.tools.ant.Task; |
| import org.xml.sax.InputSource; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| |
| import javax.xml.xpath.XPath; |
| import javax.xml.xpath.XPathExpressionException; |
| |
| /** |
| * Task to query the type of the current project. |
| * |
| * Out params: |
| * |
| * <code>projectTypeOut</code>: String value containing the type of the project. Possible values |
| * are 'app', 'library', 'test', 'test-app' |
| * |
| */ |
| public class GetTypeTask extends Task { |
| |
| private String mProjectTypeOut; |
| |
| public void setProjectTypeOut(String projectTypeOut) { |
| mProjectTypeOut = projectTypeOut; |
| } |
| |
| @Override |
| public void execute() throws BuildException { |
| if (mProjectTypeOut == null) { |
| throw new BuildException("Missing attribute projectTypeOut"); |
| } |
| |
| Project antProject = getProject(); |
| |
| String libraryProp = antProject.getProperty(ProjectProperties.PROPERTY_LIBRARY); |
| if (libraryProp != null) { |
| if (Boolean.valueOf(libraryProp).booleanValue()) { |
| System.out.println("Project Type: Android Library"); |
| |
| antProject.setProperty(mProjectTypeOut, "library"); |
| return; |
| } |
| } |
| |
| if (antProject.getProperty(ProjectProperties.PROPERTY_TESTED_PROJECT) != null) { |
| System.out.println("Project Type: Test Application"); |
| |
| antProject.setProperty(mProjectTypeOut, "test"); |
| return; |
| } |
| |
| // we also need to check if the Manifest doesn't have some instrumentation which |
| // means the app is a self-contained test project. |
| try { |
| File manifest = new File(antProject.getBaseDir(), SdkConstants.FN_ANDROID_MANIFEST_XML); |
| XPath xPath = AndroidXPathFactory.newXPath(); |
| |
| // check the present of /manifest/instrumentation/ |
| String value = xPath.evaluate( |
| "/" + AndroidManifest.NODE_MANIFEST + |
| "/" + AndroidManifest.NODE_INSTRUMENTATION + |
| "/@" + AndroidXPathFactory.DEFAULT_NS_PREFIX + |
| ":" + AndroidManifest.ATTRIBUTE_TARGET_PACKAGE, |
| new InputSource(new FileInputStream(manifest))); |
| |
| if (value != null && !value.isEmpty()) { |
| System.out.println("Project Type: Self-Tested Application"); |
| |
| antProject.setProperty(mProjectTypeOut, "test-app"); |
| return; |
| } |
| } catch (XPathExpressionException e) { |
| throw new BuildException(e); |
| } catch (FileNotFoundException e) { |
| throw new BuildException(e); |
| } |
| |
| // default case |
| System.out.println("Project Type: Application"); |
| |
| antProject.setProperty(mProjectTypeOut, "app"); |
| } |
| } |