downloadable Java EE jars;
[fedora-idea.git] / source / com / intellij / facet / impl / ui / libraries / FacetLibrariesValidatorImpl.java
blob8ab7d968aafc0a7db26a528b572979fefffaae52
1 /*
2 * Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
3 */
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;
24 import javax.swing.*;
25 import java.util.*;
27 /**
28 * @author nik
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) {
39 myContext = context;
40 myValidatorsManager = validatorsManager;
41 myRequiredLibraries = new RequiredLibrariesInfo(requiredLibraries);
42 myDescription = description;
45 public void setRequiredLibraries(final LibraryInfo[] requiredLibraries) {
46 myRequiredLibraries = new RequiredLibrariesInfo(requiredLibraries);
47 onChange();
50 public boolean isLibrariesAdded() {
51 return false;
54 public void setDescription(@NotNull final FacetLibrariesValidatorDescription description) {
55 myDescription = description;
56 onChange();
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()]));
67 if (info == null) {
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);
100 return 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)));
111 return value;
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);
122 return 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);
148 dialog.show();
149 onChange();
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) {
159 super(parent, true);
160 setTitle(IdeBundle.message("specify.libraries.dialog.title"));
161 myPanel = panel;
162 myMirrorsMap = mirrorsMap;
163 init();
166 protected JComponent createCenterPanel() {
167 return myPanel.getMainPanel();
170 protected void doOKAction() {
171 myPanel.apply();
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();
178 new WriteAction() {
179 protected void run(final Result result) {
180 settings.addLibraries(model, myAddedLibraries, librariesContainer);
181 model.commit();
183 }.execute();
185 else {
186 settings.addLibraries(rootModel, myAddedLibraries, librariesContainer);
188 super.doOKAction();