2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.jetbrains
.idea
.maven
.importing
;
18 import com
.intellij
.openapi
.application
.ApplicationManager
;
19 import com
.intellij
.openapi
.module
.Module
;
20 import com
.intellij
.openapi
.module
.ModuleManager
;
21 import com
.intellij
.openapi
.project
.Project
;
22 import com
.intellij
.openapi
.roots
.ModifiableRootModel
;
23 import com
.intellij
.openapi
.roots
.ProjectRootManager
;
24 import org
.jetbrains
.idea
.maven
.importing
.MavenImporter
;
25 import org
.jetbrains
.idea
.maven
.project
.MavenImportingSettings
;
26 import org
.jetbrains
.idea
.maven
.project
.MavenProject
;
27 import org
.jetbrains
.idea
.maven
.project
.MavenProjectsManager
;
28 import org
.jetbrains
.idea
.maven
.project
.MavenResource
;
31 import java
.util
.ArrayList
;
32 import java
.util
.List
;
34 public class MavenFoldersImporter
{
35 private MavenProject myMavenProject
;
36 private MavenImportingSettings myImportingSettings
;
37 private MavenRootModelAdapter myModel
;
39 public static void updateProjectFolders(final Project project
, final boolean updateTargetFoldersOnly
) {
40 final MavenProjectsManager manager
= MavenProjectsManager
.getInstance(project
);
41 final MavenImportingSettings settings
= manager
.getImportingSettings();
43 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
45 List
<ModifiableRootModel
> rootModels
= new ArrayList
<ModifiableRootModel
>();
46 for (Module each
: ModuleManager
.getInstance(project
).getModules()) {
47 MavenProject mavenProject
= manager
.findProject(each
);
48 if (mavenProject
== null) continue;
50 MavenRootModelAdapter a
= new MavenRootModelAdapter(mavenProject
, each
, new MavenDefaultModifiableModelsProvider(project
));
51 new MavenFoldersImporter(mavenProject
, settings
, a
).config(updateTargetFoldersOnly
);
53 ModifiableRootModel model
= a
.getRootModel();
54 if (model
.isChanged()) {
55 rootModels
.add(model
);
62 if (!rootModels
.isEmpty()) {
63 ModifiableRootModel
[] modelsArray
= rootModels
.toArray(new ModifiableRootModel
[rootModels
.size()]);
64 ProjectRootManager
.getInstance(project
).multiCommit(modelsArray
);
70 public MavenFoldersImporter(MavenProject mavenProject
, MavenImportingSettings settings
, MavenRootModelAdapter model
) {
71 myMavenProject
= mavenProject
;
72 myImportingSettings
= settings
;
76 public void config() {
80 private void config(boolean updateTargetFoldersOnly
) {
81 if (!updateTargetFoldersOnly
) {
82 configSourceFolders();
83 configOutputFolders();
85 configExcludedFolders();
88 private void configSourceFolders() {
89 List
<String
> sourceFolders
= new ArrayList
<String
>();
90 List
<String
> testFolders
= new ArrayList
<String
>();
92 sourceFolders
.addAll(myMavenProject
.getSources());
93 testFolders
.addAll(myMavenProject
.getTestSources());
95 for (MavenResource each
: myMavenProject
.getResources()) {
96 sourceFolders
.add(each
.getDirectory());
98 for (MavenResource each
: myMavenProject
.getTestResources()) {
99 testFolders
.add(each
.getDirectory());
102 for (MavenImporter each
: MavenImporter
.getSuitableImporters(myMavenProject
)) {
103 each
.collectSourceFolders(myMavenProject
, sourceFolders
);
104 each
.collectTestFolders(myMavenProject
, testFolders
);
107 for (String each
: sourceFolders
) {
108 myModel
.addSourceFolder(each
, false);
110 for (String each
: testFolders
) {
111 myModel
.addSourceFolder(each
, true);
115 private void configOutputFolders() {
116 if (myImportingSettings
.isUseMavenOutput()) {
117 myModel
.useModuleOutput(myMavenProject
.getOutputDirectory(),
118 myMavenProject
.getTestOutputDirectory());
121 myModel
.addExcludedFolder(myMavenProject
.getOutputDirectory());
122 myModel
.addExcludedFolder(myMavenProject
.getTestOutputDirectory());
126 private void configExcludedFolders() {
127 File targetDir
= new File(myMavenProject
.getBuildDirectory());
128 File generatedDir
= new File(myMavenProject
.getGeneratedSourcesDirectory());
130 myModel
.unregisterAll(targetDir
.getPath(), true, false);
132 for (File f
: getChildren(targetDir
)) {
133 if (!f
.isDirectory()) continue;
135 if (f
.equals(generatedDir
)) {
136 addAllSubDirsAsSources(f
);
139 if (myModel
.hasRegisteredSourceSubfolder(f
)) continue;
140 if (myModel
.isAlreadyExcluded(f
)) continue;
141 myModel
.addExcludedFolder(f
.getPath());
145 List
<String
> facetExcludes
= new ArrayList
<String
>();
146 for (MavenImporter each
: MavenImporter
.getSuitableImporters(myMavenProject
)) {
147 each
.collectExcludedFolders(myMavenProject
, facetExcludes
);
149 for (String eachFolder
: facetExcludes
) {
150 myModel
.unregisterAll(eachFolder
, true, true);
151 myModel
.addExcludedFolder(eachFolder
);
154 if (!myModel
.hasRegisteredSourceSubfolder(targetDir
)) {
155 myModel
.addExcludedFolder(targetDir
.getPath());
159 private void addAllSubDirsAsSources(File dir
) {
160 for (File f
: getChildren(dir
)) {
161 if (!f
.isDirectory()) continue;
162 if (myModel
.hasRegisteredSourceSubfolder(f
)) continue;
163 myModel
.addSourceFolder(f
.getPath(), false);
167 private File
[] getChildren(File dir
) {
168 File
[] result
= dir
.listFiles();
169 return result
== null ?
new File
[0] : result
;