/* * Copyright (c) 2007-2009, Osmorc Development Team * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * Neither the name of 'Osmorc Development Team' nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.osmorc; import com.intellij.codeInspection.InspectionManager; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.facet.FacetManager; import com.intellij.facet.ModifiableFacetModel; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleWithNameAlreadyExists; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.*; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; import com.intellij.testFramework.fixtures.JavaTestFixtureFactory; import com.intellij.testFramework.fixtures.TestFixtureBuilder; import com.intellij.util.io.ZipUtil; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.osmorc.facet.OsmorcFacet; import org.osmorc.facet.OsmorcFacetType; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author Robert F. Beeger (robert@beeger.net) */ public class TestUtil { public static IdeaProjectTestFixture createTestFixture() { TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder = JavaTestFixtureFactory.createFixtureBuilder(); return fixtureBuilder.getFixture(); } public static void loadModules(final String projectName, final Project project, final String projectDirPath) throws Exception { final File projectZIP = new File(getTestDataDir(), projectName + ".zip"); assert projectZIP.exists() : projectZIP.getAbsoluteFile() + " not found"; assert !projectZIP.isDirectory() : projectZIP.getAbsolutePath() + " is a directory"; final File projectDir = new File(projectDirPath); ZipUtil.extract(projectZIP, projectDir, null); final ModifiableModuleModel moduleModel = ModuleManager.getInstance(project).getModifiableModel(); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { try { List<ModifiableRootModel> rootModels = new ArrayList<ModifiableRootModel>(); for (File moduleDir : projectDir.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() && !pathname.getName().startsWith("."); } })) { String moduleDirPath = moduleDir.getPath().replace(File.separatorChar, '/') + "/"; final String moduleFileName = moduleDirPath + moduleDir.getName() + ".iml"; if ( new File(moduleFileName).exists()) { Module module = moduleModel.loadModule(moduleFileName); ModifiableRootModel rootModel = ModuleRootManager.getInstance(module).getModifiableModel(); VirtualFile file = VirtualFileManager.getInstance().getFileSystem("file").findFileByPath(moduleDirPath); ContentEntry contentEntry = rootModel.addContentEntry(file); contentEntry.addSourceFolder(file.findChild("src"), false); rootModels.add(rootModel); } } ProjectRootManager.getInstance(project).multiCommit(moduleModel, rootModels.toArray(new ModifiableRootModel[rootModels.size()])); } catch (InvalidDataException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } catch (JDOMException e) { throw new RuntimeException(e); } catch (ModuleWithNameAlreadyExists e) { throw new RuntimeException(e); } } }); } public static void createOsmorcFacetForAllModules(final Project project) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final Module[] modules = ModuleManager.getInstance(project).getModules(); for (Module module : modules) { final ModifiableFacetModel modifiableFacetModel = FacetManager.getInstance(module).createModifiableModel(); final OsmorcFacet facet = new OsmorcFacet(module); facet.getConfiguration().setUseProjectDefaultManifestFileLocation(false); facet.getConfiguration().setManifestLocation("META-INF/MANIFEST.MF"); facet.getConfiguration().setOsmorcControlsManifest(false); modifiableFacetModel.addFacet(facet); modifiableFacetModel.commit(); } } }); } public static void createOsmorcFacetForModule(final Project project, final String moduleName, boolean isManifestGenerated) { final Module module = ModuleManager.getInstance(project).findModuleByName(moduleName); createOsmorcFacetForModule(module, isManifestGenerated); } public static void createOsmorcFacetForModule(final Module module, final boolean isManifestGenerated) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final ModifiableFacetModel modifiableFacetModel = FacetManager.getInstance(module).createModifiableModel(); final OsmorcFacet facet = new OsmorcFacet(module); facet.getConfiguration().setUseProjectDefaultManifestFileLocation(false); facet.getConfiguration().setManifestLocation("META-INF/MANIFEST.MF"); facet.getConfiguration().setOsmorcControlsManifest(isManifestGenerated); modifiableFacetModel.addFacet(facet); modifiableFacetModel.commit(); } }); } public static void removeOsmorcFacetOfModule(final Module module) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final ModifiableFacetModel modifiableFacetModel = FacetManager.getInstance(module).createModifiableModel(); OsmorcFacet facet = modifiableFacetModel.getFacetByType(OsmorcFacetType.ID); modifiableFacetModel.removeFacet(facet); modifiableFacetModel.commit(); } }); } public static void createModuleDependency(final Project project, final String fromModuleName, final String toModuleName) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final Module fromModule = ModuleManager.getInstance(project).findModuleByName(fromModuleName); final Module toModule = ModuleManager.getInstance(project).findModuleByName(toModuleName); ModifiableRootModel rootModel = ModuleRootManager.getInstance(fromModule).getModifiableModel(); rootModel.addModuleOrderEntry(toModule); rootModel.commit(); } }); } public static PsiFile loadPsiFile(Project project, String moduleName, String filePathInSource) { final ModuleRootManager rootManager = getModuleRootManager(project, moduleName); final VirtualFile root = rootManager.getSourceRoots()[0]; VirtualFile file = root.findFileByRelativePath(filePathInSource); PsiFile psiFile = PsiManager.getInstance(project).findFile(file); return psiFile; } public static PsiFile loadPsiFileUnderContent(Project project, String moduleName, String filePathInContent) { final ModuleRootManager rootManager = getModuleRootManager(project, moduleName); VirtualFile root = rootManager.getContentRoots()[0]; VirtualFile file = root.findFileByRelativePath(filePathInContent); return PsiManager.getInstance(project).findFile(file); } public static ModuleRootManager getModuleRootManager(Project project, String moduleName) { ModuleManager moduleManager = ModuleManager.getInstance(project); Module module = moduleManager.findModuleByName(moduleName); return ModuleRootManager.getInstance(module); } @NotNull public static List<ProblemDescriptor> runInspection(LocalInspectionTool inspection, PsiFile psiFile, Project project) { ProblemsHolder holder = new ProblemsHolder(InspectionManager.getInstance(project), psiFile, true); final PsiElementVisitor elementVisitor = inspection.buildVisitor(holder, true); psiFile.accept(new PsiRecursiveElementVisitor() { public void visitElement(PsiElement psielement) { psielement.accept(elementVisitor); super.visitElement(psielement); } }); List<ProblemDescriptor> results = holder.getResults(); return results == null ? Collections.<ProblemDescriptor>emptyList() : results; } private static File getTestDataDir() { if (TEST_DATA_DIR == null) { TEST_DATA_DIR = new File(TestUtil.class.getResource("/").getFile(), "../../../testdata"); if (!TEST_DATA_DIR.exists()) { TEST_DATA_DIR = new File(TestUtil.class.getResource("").getFile(), "../../../../../testdata"); } if (!TEST_DATA_DIR.exists()) { TEST_DATA_DIR = new File(PathManager.getHomePath(), "contrib/osmorc/testdata"); } assert TEST_DATA_DIR.exists(); assert TEST_DATA_DIR.isDirectory(); } return TEST_DATA_DIR; } public static ModuleOrderEntry getOrderEntry(Module forModule, Module inModule) { ModuleOrderEntry result = null; OrderEntry[] orderEntries = ModuleRootManager.getInstance(inModule).getOrderEntries(); for (OrderEntry orderEntry : orderEntries) { if (orderEntry instanceof ModuleOrderEntry && ((ModuleOrderEntry) orderEntry).getModule() == forModule) { result = (ModuleOrderEntry) orderEntry; break; } } return result; } private static File TEST_DATA_DIR; }