1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.adt.internal.build.builders; 18 19 import com.android.SdkConstants; 20 import com.android.annotations.NonNull; 21 import com.android.ide.eclipse.adt.AdtConstants; 22 import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper; 23 24 import org.eclipse.core.resources.IFolder; 25 import org.eclipse.core.resources.IProject; 26 import org.eclipse.core.resources.IResource; 27 import org.eclipse.core.runtime.IPath; 28 29 import java.util.ArrayList; 30 import java.util.List; 31 32 /** 33 * Helper class to generate {@link ChangedFileSet} for given projects. 34 * 35 * Also contains non project specific {@link ChangedFileSet} such as {@link #MANIFEST} 36 * and {@link #NATIVE_LIBS} 37 */ 38 class ChangedFileSetHelper { 39 40 final static ChangedFileSet MANIFEST; 41 final static ChangedFileSet NATIVE_LIBS; 42 43 static { 44 MANIFEST = new ChangedFileSet("manifest", //$NON-NLS-1$ 45 SdkConstants.FN_ANDROID_MANIFEST_XML); 46 47 // FIXME: move compiled native libs to bin/libs/ 48 NATIVE_LIBS = new ChangedFileSet( 49 "nativeLibs", 50 SdkConstants.FD_NATIVE_LIBS + "/*/*.so", //$NON-NLS-1$ 51 SdkConstants.FD_NATIVE_LIBS + "/*/" + SdkConstants.FN_GDBSERVER); //$NON-NLS-1$ 52 } 53 54 /** 55 * Returns a ChangedFileSet for Java resources inside a given project's source folders. 56 * @param project the project. 57 * @return a ChangedFileSet 58 */ getJavaResCfs(@onNull IProject project)59 static ChangedFileSet getJavaResCfs(@NonNull IProject project) { 60 61 // get the source folder for the given project. 62 IPath projectPath = project.getFullPath(); 63 64 // get the source folders. 65 List<IPath> srcPaths = BaseProjectHelper.getSourceClasspaths(project); 66 List<String> paths = new ArrayList<String>(srcPaths.size()); 67 68 // create a pattern for each of them. 69 for (IPath path : srcPaths) { 70 paths.add(path.makeRelativeTo(projectPath).toString() + "/**"); //$NON-NLS-1$ 71 } 72 73 // custom ChangedFileSet to ignore .java files. 74 return new JavaResChangedSet("javaRes", //$NON-NLS-1$ 75 paths.toArray(new String[paths.size()])); 76 } 77 78 /** 79 * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output 80 * file (compiled resources 81 * @param project the project 82 * @return a ChangeFileSet 83 */ getResCfs(@onNull IProject project)84 static ChangedFileSet getResCfs(@NonNull IProject project) { 85 // generated res is inside the project's android output folder 86 String path = getRelativeAndroidOut(project); 87 88 ChangedFileSet set = new ChangedFileSet( 89 "resources", //$NON-NLS-1$ 90 SdkConstants.FD_RES + "/**", //$NON-NLS-1$ 91 SdkConstants.FD_ASSETS + "/**", //$NON-NLS-1$ 92 path + '/' + AdtConstants.WS_BIN_RELATIVE_BC + "/**"); //$NON-NLS-1$ 93 94 // output file is based on the project's android output folder 95 set.setOutput(path + '/' + AdtConstants.FN_RESOURCES_AP_); 96 97 return set; 98 } 99 100 /** 101 * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output 102 * file (compiled resources 103 * @param project the project 104 * @return a ChangeFileSet 105 */ getMergedManifestCfs(@onNull IProject project)106 static ChangedFileSet getMergedManifestCfs(@NonNull IProject project) { 107 // input path is inside the project's android output folder 108 String path = getRelativeAndroidOut(project); 109 110 ChangedFileSet set = new ChangedFileSet( 111 "mergedManifest", //$NON-NLS-1$ 112 path + '/' + SdkConstants.FN_ANDROID_MANIFEST_XML); 113 114 return set; 115 } 116 117 /** 118 * Returns a {@link ChangedFileSet} for the generated R.txt file 119 * @param project the project 120 * @return a ChangeFileSet 121 */ getTextSymbols(@onNull IProject project)122 static ChangedFileSet getTextSymbols(@NonNull IProject project) { 123 // input path is inside the project's android output folder 124 String path = getRelativeAndroidOut(project); 125 126 ChangedFileSet set = new ChangedFileSet( 127 "textSymbols", //$NON-NLS-1$ 128 path + '/' + SdkConstants.FN_RESOURCE_TEXT); 129 130 return set; 131 } 132 133 /** 134 * Returns a {@link ChangedFileSet} for a project's javac output. 135 * @param project the project 136 * @return a ChangedFileSet 137 */ getByteCodeCfs(@onNull IProject project)138 static ChangedFileSet getByteCodeCfs(@NonNull IProject project) { 139 // input pattern is based on the project's Java compiler's output folder 140 String path = getRelativeJavaCOut(project); 141 142 ChangedFileSet set = new ChangedFileSet("compiledCode", //$NON-NLS-1$ 143 path + "/**/*" + SdkConstants.DOT_CLASS); //$NON-NLS-1$ 144 145 return set; 146 } 147 148 /** 149 * Returns a {@link ChangedFileSet} for a project's complete resources, including 150 * generated resources and crunch cache. 151 * @param project the project 152 * @return a ChangeFileSet 153 */ getFullResCfs(@onNull IProject project)154 static ChangedFileSet getFullResCfs(@NonNull IProject project) { 155 // generated res are in the project's android output folder 156 String path = getRelativeAndroidOut(project); 157 158 ChangedFileSet set = new ChangedFileSet("libResources", //$NON-NLS-1$ 159 SdkConstants.FD_RES + "/**", //$NON-NLS-1$ 160 path + '/' + SdkConstants.FD_RES + "/**"); //$NON-NLS-1$ 161 162 return set; 163 } 164 165 /** 166 * Returns a {@link ChangedFileSet} for a project's whole code, including 167 * compiled bytecode, 3rd party libs, and the output file containing the Dalvik 168 * bytecode file. 169 * @param project the project 170 * @return a ChangeFileSet 171 */ getCodeCfs(@onNull IProject project)172 static ChangedFileSet getCodeCfs(@NonNull IProject project) { 173 // input pattern is based on the project's Java compiler's output folder 174 String path = getRelativeJavaCOut(project); 175 176 ChangedFileSet set = new ChangedFileSet("classAndJars", //$NON-NLS-1$ 177 path + "/**/*" + SdkConstants.DOT_CLASS, //$NON-NLS-1$ 178 SdkConstants.FD_NATIVE_LIBS + "/*" + SdkConstants.DOT_JAR); //$NON-NLS-1$ 179 180 // output file is based on the project's android output folder 181 path = getRelativeAndroidOut(project); 182 set.setOutput(path + '/' + SdkConstants.FN_APK_CLASSES_DEX); 183 184 return set; 185 } 186 getRelativePath(@onNull IProject project, @NonNull IResource resource)187 private static String getRelativePath(@NonNull IProject project, @NonNull IResource resource) { 188 return resource.getFullPath().makeRelativeTo(project.getFullPath()).toString(); 189 } 190 getRelativeAndroidOut(@onNull IProject project)191 private static String getRelativeAndroidOut(@NonNull IProject project) { 192 IFolder folder = BaseProjectHelper.getAndroidOutputFolder(project); 193 return getRelativePath(project, folder); 194 } 195 getRelativeJavaCOut(@onNull IProject project)196 private static String getRelativeJavaCOut(@NonNull IProject project) { 197 IFolder folder = BaseProjectHelper.getJavaOutputFolder(project); 198 return getRelativePath(project, folder); 199 } 200 } 201