diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java new file mode 100644 index 000000000..9fc19a7a6 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ChangedFileSetHelper.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php + * + * 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.ide.eclipse.adt.internal.build.builders; + +import com.android.SdkConstants; +import com.android.annotations.NonNull; +import com.android.ide.eclipse.adt.AdtConstants; +import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper; + +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; + +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class to generate {@link ChangedFileSet} for given projects. + * + * Also contains non project specific {@link ChangedFileSet} such as {@link #MANIFEST} + * and {@link #NATIVE_LIBS} + */ +class ChangedFileSetHelper { + + final static ChangedFileSet MANIFEST; + final static ChangedFileSet NATIVE_LIBS; + + static { + MANIFEST = new ChangedFileSet("manifest", //$NON-NLS-1$ + SdkConstants.FN_ANDROID_MANIFEST_XML); + + // FIXME: move compiled native libs to bin/libs/ + NATIVE_LIBS = new ChangedFileSet( + "nativeLibs", + SdkConstants.FD_NATIVE_LIBS + "/*/*.so", //$NON-NLS-1$ + SdkConstants.FD_NATIVE_LIBS + "/*/" + SdkConstants.FN_GDBSERVER); //$NON-NLS-1$ + } + + /** + * Returns a ChangedFileSet for Java resources inside a given project's source folders. + * @param project the project. + * @return a ChangedFileSet + */ + static ChangedFileSet getJavaResCfs(@NonNull IProject project) { + + // get the source folder for the given project. + IPath projectPath = project.getFullPath(); + + // get the source folders. + List<IPath> srcPaths = BaseProjectHelper.getSourceClasspaths(project); + List<String> paths = new ArrayList<String>(srcPaths.size()); + + // create a pattern for each of them. + for (IPath path : srcPaths) { + paths.add(path.makeRelativeTo(projectPath).toString() + "/**"); //$NON-NLS-1$ + } + + // custom ChangedFileSet to ignore .java files. + return new JavaResChangedSet("javaRes", //$NON-NLS-1$ + paths.toArray(new String[paths.size()])); + } + + /** + * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output + * file (compiled resources + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getResCfs(@NonNull IProject project) { + // generated res is inside the project's android output folder + String path = getRelativeAndroidOut(project); + + ChangedFileSet set = new ChangedFileSet( + "resources", //$NON-NLS-1$ + SdkConstants.FD_RES + "/**", //$NON-NLS-1$ + SdkConstants.FD_ASSETS + "/**", //$NON-NLS-1$ + path + '/' + AdtConstants.WS_BIN_RELATIVE_BC + "/**"); //$NON-NLS-1$ + + // output file is based on the project's android output folder + set.setOutput(path + '/' + AdtConstants.FN_RESOURCES_AP_); + + return set; + } + + /** + * Returns a {@link ChangedFileSet} for all the resources (included assets), and the output + * file (compiled resources + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getMergedManifestCfs(@NonNull IProject project) { + // input path is inside the project's android output folder + String path = getRelativeAndroidOut(project); + + ChangedFileSet set = new ChangedFileSet( + "mergedManifest", //$NON-NLS-1$ + path + '/' + SdkConstants.FN_ANDROID_MANIFEST_XML); + + return set; + } + + /** + * Returns a {@link ChangedFileSet} for the generated R.txt file + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getTextSymbols(@NonNull IProject project) { + // input path is inside the project's android output folder + String path = getRelativeAndroidOut(project); + + ChangedFileSet set = new ChangedFileSet( + "textSymbols", //$NON-NLS-1$ + path + '/' + SdkConstants.FN_RESOURCE_TEXT); + + return set; + } + + /** + * Returns a {@link ChangedFileSet} for a project's javac output. + * @param project the project + * @return a ChangedFileSet + */ + static ChangedFileSet getByteCodeCfs(@NonNull IProject project) { + // input pattern is based on the project's Java compiler's output folder + String path = getRelativeJavaCOut(project); + + ChangedFileSet set = new ChangedFileSet("compiledCode", //$NON-NLS-1$ + path + "/**/*" + SdkConstants.DOT_CLASS); //$NON-NLS-1$ + + return set; + } + + /** + * Returns a {@link ChangedFileSet} for a project's complete resources, including + * generated resources and crunch cache. + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getFullResCfs(@NonNull IProject project) { + // generated res are in the project's android output folder + String path = getRelativeAndroidOut(project); + + ChangedFileSet set = new ChangedFileSet("libResources", //$NON-NLS-1$ + SdkConstants.FD_RES + "/**", //$NON-NLS-1$ + path + '/' + SdkConstants.FD_RES + "/**"); //$NON-NLS-1$ + + return set; + } + + /** + * Returns a {@link ChangedFileSet} for a project's whole code, including + * compiled bytecode, 3rd party libs, and the output file containing the Dalvik + * bytecode file. + * @param project the project + * @return a ChangeFileSet + */ + static ChangedFileSet getCodeCfs(@NonNull IProject project) { + // input pattern is based on the project's Java compiler's output folder + String path = getRelativeJavaCOut(project); + + ChangedFileSet set = new ChangedFileSet("classAndJars", //$NON-NLS-1$ + path + "/**/*" + SdkConstants.DOT_CLASS, //$NON-NLS-1$ + SdkConstants.FD_NATIVE_LIBS + "/*" + SdkConstants.DOT_JAR); //$NON-NLS-1$ + + // output file is based on the project's android output folder + path = getRelativeAndroidOut(project); + set.setOutput(path + '/' + SdkConstants.FN_APK_CLASSES_DEX); + + return set; + } + + private static String getRelativePath(@NonNull IProject project, @NonNull IResource resource) { + return resource.getFullPath().makeRelativeTo(project.getFullPath()).toString(); + } + + private static String getRelativeAndroidOut(@NonNull IProject project) { + IFolder folder = BaseProjectHelper.getAndroidOutputFolder(project); + return getRelativePath(project, folder); + } + + private static String getRelativeJavaCOut(@NonNull IProject project) { + IFolder folder = BaseProjectHelper.getJavaOutputFolder(project); + return getRelativePath(project, folder); + } +} |