2 * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
5 package com
.intellij
.facet
.impl
.ui
.libraries
;
7 import com
.intellij
.facet
.Facet
;
8 import com
.intellij
.facet
.ui
.FacetConfigurationQuickFix
;
9 import com
.intellij
.facet
.ui
.FacetValidatorsManager
;
10 import com
.intellij
.facet
.ui
.ValidationResult
;
11 import com
.intellij
.facet
.ui
.libraries
.*;
12 import com
.intellij
.ide
.IdeBundle
;
13 import com
.intellij
.openapi
.module
.Module
;
14 import com
.intellij
.openapi
.roots
.*;
15 import com
.intellij
.openapi
.roots
.libraries
.Library
;
16 import com
.intellij
.openapi
.roots
.ui
.configuration
.projectRoot
.LibrariesContainer
;
17 import com
.intellij
.openapi
.ui
.DialogWrapper
;
18 import com
.intellij
.openapi
.vfs
.VirtualFile
;
19 import com
.intellij
.openapi
.application
.WriteAction
;
20 import com
.intellij
.openapi
.application
.Result
;
21 import org
.jetbrains
.annotations
.Nullable
;
22 import org
.jetbrains
.annotations
.NotNull
;
30 public class FacetLibrariesValidatorImpl
extends FacetLibrariesValidator
{
31 private final LibrariesValidatorContext myContext
;
32 private final FacetValidatorsManager myValidatorsManager
;
33 private RequiredLibrariesInfo myRequiredLibraries
;
34 private FacetLibrariesValidatorDescription myDescription
;
35 private final List
<Library
> myAddedLibraries
= new ArrayList
<Library
>();
37 public FacetLibrariesValidatorImpl(LibraryInfo
[] requiredLibraries
, FacetLibrariesValidatorDescription description
,
38 final LibrariesValidatorContext context
, FacetValidatorsManager validatorsManager
) {
40 myValidatorsManager
= validatorsManager
;
41 myRequiredLibraries
= new RequiredLibrariesInfo(requiredLibraries
);
42 myDescription
= description
;
45 public void setRequiredLibraries(final LibraryInfo
[] requiredLibraries
) {
46 myRequiredLibraries
= new RequiredLibrariesInfo(requiredLibraries
);
50 public boolean isLibrariesAdded() {
54 public void setDescription(@NotNull final FacetLibrariesValidatorDescription description
) {
55 myDescription
= description
;
59 public ValidationResult
check() {
60 if (myRequiredLibraries
== null) {
61 return ValidationResult
.OK
;
64 ModuleRootModel rootModel
= myContext
.getRootModel();
65 List
<VirtualFile
> roots
= collectRoots(rootModel
);
66 RequiredLibrariesInfo
.RequiredClassesNotFoundInfo info
= myRequiredLibraries
.checkLibraries(roots
.toArray(new VirtualFile
[roots
.size()]));
68 return ValidationResult
.OK
;
71 String missingJars
= IdeBundle
.message("label.missed.libraries.prefix") + " " + info
.getMissingJarsText();
72 final String text
= IdeBundle
.message("label.missed.libraries.text", missingJars
, info
.getClassNames()[0]);
73 LibraryInfo
[] missingLibraries
= info
.getLibraryInfos();
74 VirtualFile baseDir
= myContext
.getModule().getProject().getBaseDir();
75 final String baseDirPath
= baseDir
!= null ? baseDir
.getPath() : "";
76 LibraryCompositionSettings libraryCompositionSettings
= new LibraryCompositionSettings(missingLibraries
,
77 myDescription
.getDefaultLibraryName(), baseDirPath
,
78 myDescription
.getDefaultLibraryName(), null);
79 return new ValidationResult(text
, new LibrariesQuickFix(libraryCompositionSettings
));
82 private void onChange() {
83 if (myValidatorsManager
!= null) {
84 myValidatorsManager
.validate();
88 public void onFacetInitialized(Facet facet
) {
89 for (Library addedLibrary
: myAddedLibraries
) {
90 myDescription
.onLibraryAdded(facet
, addedLibrary
);
94 private List
<VirtualFile
> collectRoots(final @Nullable ModuleRootModel rootModel
) {
95 ArrayList
<VirtualFile
> roots
= new ArrayList
<VirtualFile
>();
96 if (rootModel
!= null) {
97 RootPolicy
<List
<VirtualFile
>> policy
= new CollectingLibrariesPolicy();
98 rootModel
.processOrder(policy
, roots
);
103 private class CollectingLibrariesPolicy
extends RootPolicy
<List
<VirtualFile
>> {
104 private final Set
<Module
> myProcessedModules
= new HashSet
<Module
>();
106 public List
<VirtualFile
> visitLibraryOrderEntry(final LibraryOrderEntry libraryOrderEntry
, final List
<VirtualFile
> value
) {
107 Library library
= libraryOrderEntry
.getLibrary();
108 if (library
!= null) {
109 value
.addAll(Arrays
.asList(myContext
.getLibrariesContainer().getLibraryFiles(library
, OrderRootType
.CLASSES
)));
114 public List
<VirtualFile
> visitModuleOrderEntry(final ModuleOrderEntry moduleOrderEntry
, final List
<VirtualFile
> value
) {
115 Module module
= moduleOrderEntry
.getModule();
116 if (module
!= null && myProcessedModules
.add(module
)) {
117 ModuleRootModel dependency
= myContext
.getModulesProvider().getRootModel(module
);
118 if (dependency
!= null) {
119 return dependency
.processOrder(this, value
);
127 private class LibrariesQuickFix
extends FacetConfigurationQuickFix
{
128 private final LibraryCompositionSettings myLibrarySettings
;
130 public LibrariesQuickFix(final LibraryCompositionSettings libraryCompositionSettings
) {
131 super(IdeBundle
.message("missing.libraries.fix.button"));
132 myLibrarySettings
= libraryCompositionSettings
;
135 public void run(final JComponent place
) {
136 LibraryDownloadingMirrorsMap mirrorsMap
= new LibraryDownloadingMirrorsMap();
137 for (LibraryInfo libraryInfo
: myLibrarySettings
.getLibraryInfos()) {
138 LibraryDownloadInfo downloadingInfo
= libraryInfo
.getDownloadingInfo();
139 if (downloadingInfo
!= null) {
140 RemoteRepositoryInfo repositoryInfo
= downloadingInfo
.getRemoteRepository();
141 if (repositoryInfo
!= null) {
142 mirrorsMap
.registerRepository(repositoryInfo
);
146 LibraryCompositionOptionsPanel panel
= new LibraryCompositionOptionsPanel(myContext
.getLibrariesContainer(), myLibrarySettings
, mirrorsMap
);
147 LibraryCompositionDialog dialog
= new LibraryCompositionDialog(place
, panel
, mirrorsMap
);
153 private class LibraryCompositionDialog
extends DialogWrapper
{
154 private final LibraryCompositionOptionsPanel myPanel
;
155 private final LibraryDownloadingMirrorsMap myMirrorsMap
;
157 private LibraryCompositionDialog(final JComponent parent
, final LibraryCompositionOptionsPanel panel
,
158 final LibraryDownloadingMirrorsMap mirrorsMap
) {
160 setTitle(IdeBundle
.message("specify.libraries.dialog.title"));
162 myMirrorsMap
= mirrorsMap
;
166 protected JComponent
createCenterPanel() {
167 return myPanel
.getMainPanel();
170 protected void doOKAction() {
172 final LibraryCompositionSettings settings
= myPanel
.getLibraryCompositionSettings();
173 final LibrariesContainer librariesContainer
= myContext
.getLibrariesContainer();
174 if (settings
.downloadFiles(myMirrorsMap
, librariesContainer
, myPanel
.getMainPanel())) {
175 ModifiableRootModel rootModel
= myContext
.getModifiableRootModel();
176 if (rootModel
== null) {
177 final ModifiableRootModel model
= ModuleRootManager
.getInstance(myContext
.getModule()).getModifiableModel();
179 protected void run(final Result result
) {
180 settings
.addLibraries(model
, myAddedLibraries
, librariesContainer
);
186 settings
.addLibraries(rootModel
, myAddedLibraries
, librariesContainer
);