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