1dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet/* 2dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * Copyright (C) 2011 The Android Open Source Project 3dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * 4dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * you may not use this file except in compliance with the License. 6dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * You may obtain a copy of the License at 7dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * 8dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * http://www.eclipse.org/org/documents/epl-v10.php 9dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * 10dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software 11dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 12dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * See the License for the specific language governing permissions and 14dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * limitations under the License. 15dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet */ 16dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 17dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetpackage com.android.ide.eclipse.adt.internal.build; 18dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 19dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetimport org.eclipse.core.resources.IContainer; 20dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetimport org.eclipse.core.resources.IFile; 21dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetimport org.eclipse.core.resources.IResourceDelta; 22dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 23dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetimport java.util.HashSet; 24dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohetimport java.util.Set; 25dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 26dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet/** 27f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet * Base source change handler for the {@link SourceProcessor} classes. 28dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * 29f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet * It can be used as is, as long as the matching {@link SourceProcessor} properly implements 30f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet * its abstract methods, and the processor does not output resource files, 31dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * or can be extended to provide custom implementation for: 32dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * {@link #handleSourceFile(IFile, int)} 33dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * {@link #handleGeneratedFile(IFile, int)} 34dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * {@link #handleResourceFile(IFile, int)} 35dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * {@link #filterResourceFolder(IContainer)} 36dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet * 37dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet */ 38f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohetpublic class SourceChangeHandler { 39dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 40f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet private SourceProcessor mProcessor; 41dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 42dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet /** List of source files found that are modified or new. */ 43dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet private final Set<IFile> mToCompile = new HashSet<IFile>(); 44dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 45dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet /** List of source files that have been removed. */ 46dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet private final Set<IFile> mRemoved = new HashSet<IFile>(); 47dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 48dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet public boolean handleGeneratedFile(IFile file, int kind) { 49dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet if (kind == IResourceDelta.REMOVED || kind == IResourceDelta.CHANGED) { 50f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet IFile sourceFile = mProcessor.isOutput(file); 51dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet if (sourceFile != null) { 52dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mToCompile.add(sourceFile); 53dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet return true; 54dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 55dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 56dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 57dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet return false; 58dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 59dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 60dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet public void handleSourceFile(IFile file, int kind) { 61f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet // first the file itself if this is a match for the processor's extension 62f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet if (mProcessor.getExtension().equals(file.getFileExtension())) { 63dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet if (kind == IResourceDelta.REMOVED) { 64dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mRemoved.add(file); 65dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } else { 66dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mToCompile.add(file); 67dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 68dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 69dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 70dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet // now the dependencies. In all case we compile the files that depend on the 71dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet // added/changed/removed file. 72f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet mToCompile.addAll(mProcessor.isDependency(file)); 73dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 74dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 75dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet public void handleResourceFile(IFile file, int kind) { 76dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet if (filterResourceFolder(file.getParent())) { 77dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet handleGeneratedFile(file, kind); 78dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 79dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 80dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 81ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet /** 82ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet * Called to restrict {@link #handleResourceFile(IFile, int)} on selected resource folders. 83ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet * @param folder 84ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet * @return 85ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet */ 86ea803caeec48eb03db3b93c8098786a439199d54Xavier Ducrohet protected boolean filterResourceFolder(IContainer folder) { 87dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet return false; 88dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 89dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 909bf7eaf8969ed3c28467aae1f7d7debf5bc1917cXavier Ducrohet protected void addFileToCompile(IFile file) { 91dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mToCompile.add(file); 92dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 93dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 94dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet Set<IFile> getFilesToCompile() { 95dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet return mToCompile; 96dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 97dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 989bf7eaf8969ed3c28467aae1f7d7debf5bc1917cXavier Ducrohet protected void addRemovedFile(IFile file) { 99dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mRemoved.add(file); 100dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 101dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 102dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet Set<IFile> getRemovedFiles() { 103dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet return mRemoved; 104dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 105dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 106dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet public void reset() { 107dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mToCompile.clear(); 108dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet mRemoved.clear(); 109dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 110dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet 111f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet protected SourceProcessor getProcessor() { 112f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet return mProcessor; 1139bf7eaf8969ed3c28467aae1f7d7debf5bc1917cXavier Ducrohet } 1149bf7eaf8969ed3c28467aae1f7d7debf5bc1917cXavier Ducrohet 115f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet void init(SourceProcessor processor) { 116f2acae181fdbbf644915cfa0ddd571b24eda440aXavier Ducrohet mProcessor = processor; 117dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet } 118dec739da5551ddf52a8f3cff06c63de4aced2578Xavier Ducrohet} 119