| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.intellij.facet.impl.ui.libraries; |
| |
| import com.intellij.facet.Facet; |
| import com.intellij.facet.ui.FacetConfigurationQuickFix; |
| import com.intellij.facet.ui.FacetValidatorsManager; |
| import com.intellij.facet.ui.ValidationResult; |
| import com.intellij.facet.ui.libraries.FacetLibrariesValidator; |
| import com.intellij.facet.ui.libraries.FacetLibrariesValidatorDescription; |
| import com.intellij.facet.ui.libraries.LibraryInfo; |
| import com.intellij.ide.IdeBundle; |
| import com.intellij.ide.util.frameworkSupport.OldCustomLibraryDescription; |
| import com.intellij.openapi.roots.ModuleRootModel; |
| import com.intellij.openapi.roots.OrderRootType; |
| import com.intellij.openapi.roots.libraries.Library; |
| import com.intellij.openapi.roots.ui.configuration.libraries.AddCustomLibraryDialog; |
| import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription; |
| import com.intellij.openapi.vfs.VfsUtil; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.util.Processor; |
| import com.intellij.util.containers.ContainerUtil; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * @author nik |
| */ |
| public class FacetLibrariesValidatorImpl extends FacetLibrariesValidator { |
| private final LibrariesValidatorContext myContext; |
| private final FacetValidatorsManager myValidatorsManager; |
| private RequiredLibrariesInfo myRequiredLibraries; |
| private FacetLibrariesValidatorDescription myDescription; |
| private final List<Library> myAddedLibraries = new ArrayList<Library>(); |
| |
| public FacetLibrariesValidatorImpl(LibraryInfo[] requiredLibraries, FacetLibrariesValidatorDescription description, |
| final LibrariesValidatorContext context, FacetValidatorsManager validatorsManager) { |
| myContext = context; |
| myValidatorsManager = validatorsManager; |
| myRequiredLibraries = new RequiredLibrariesInfo(requiredLibraries); |
| myDescription = description; |
| } |
| |
| public void setRequiredLibraries(final LibraryInfo[] requiredLibraries) { |
| myRequiredLibraries = new RequiredLibrariesInfo(requiredLibraries); |
| onChange(); |
| } |
| |
| public boolean isLibrariesAdded() { |
| return false; |
| } |
| |
| public void setDescription(@NotNull final FacetLibrariesValidatorDescription description) { |
| myDescription = description; |
| onChange(); |
| } |
| |
| @NotNull |
| public ValidationResult check() { |
| if (myRequiredLibraries == null) { |
| return ValidationResult.OK; |
| } |
| |
| List<VirtualFile> roots = collectRoots(myContext.getRootModel()); |
| RequiredLibrariesInfo.RequiredClassesNotFoundInfo info = myRequiredLibraries.checkLibraries(VfsUtil.toVirtualFileArray(roots)); |
| if (info == null) { |
| return ValidationResult.OK; |
| } |
| |
| String missingJars = IdeBundle.message("label.missed.libraries.prefix") + " " + info.getMissingJarsText(); |
| LibraryInfo[] missingLibraries = info.getLibraryInfos(); |
| CustomLibraryDescription description = new OldCustomLibraryDescription(missingLibraries, myDescription.getDefaultLibraryName()); |
| return new ValidationResult(missingJars, new LibrariesQuickFix(description)); |
| } |
| |
| private void onChange() { |
| if (myValidatorsManager != null) { |
| myValidatorsManager.validate(); |
| } |
| } |
| |
| public void onFacetInitialized(Facet facet) { |
| for (Library addedLibrary : myAddedLibraries) { |
| myDescription.onLibraryAdded(facet, addedLibrary); |
| } |
| } |
| |
| private List<VirtualFile> collectRoots(final @NotNull ModuleRootModel rootModel) { |
| final ArrayList<VirtualFile> roots = new ArrayList<VirtualFile>(); |
| rootModel.orderEntries().using(myContext.getModulesProvider()).recursively().librariesOnly().forEachLibrary(new Processor<Library>() { |
| @Override |
| public boolean process(Library library) { |
| ContainerUtil.addAll(roots, myContext.getLibrariesContainer().getLibraryFiles(library, OrderRootType.CLASSES)); |
| return true; |
| } |
| }); |
| return roots; |
| } |
| |
| private class LibrariesQuickFix extends FacetConfigurationQuickFix { |
| private CustomLibraryDescription myDescription; |
| |
| public LibrariesQuickFix(CustomLibraryDescription description) { |
| super(IdeBundle.message("button.fix")); |
| myDescription = description; |
| } |
| |
| public void run(final JComponent place) { |
| AddCustomLibraryDialog dialog = AddCustomLibraryDialog.createDialog(myDescription, myContext.getLibrariesContainer(), |
| myContext.getModule(), myContext.getModifiableRootModel(), null); |
| dialog.show(); |
| myAddedLibraries.addAll(dialog.getAddedLibraries()); |
| onChange(); |
| } |
| } |
| } |