From 4411b639fb2264e4038a812430cf426d0f330609 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 28 May 2010 18:08:46 +0400 Subject: [PATCH 01/58] TreeUi: revalidation of element --- .../util/treeView/AbstractTreeStructure.java | 4 ++ .../ide/util/treeView/AbstractTreeUi.java | 25 ++++++++- .../treeView/AbstractTreeBuilderTest.java | 24 +++++++- .../ide/util/treeView/BaseTreeTestCase.java | 9 +++ .../ide/util/treeView/TreeUiTest.java | 55 ++++++++++++++++--- 5 files changed, 106 insertions(+), 11 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java index f383b43b6b86..4612aa83211c 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java @@ -39,4 +39,8 @@ public abstract class AbstractTreeStructure { return false; } + public Object revalidateElement(Object element) { + return element; + } + } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index a02f6ec482da..77ecd1f686f1 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -3447,16 +3447,37 @@ public class AbstractTreeUi { final boolean deferred, final boolean canBeCentered, final boolean scrollToVisible, - boolean canSmartExpand) { + final boolean canSmartExpand) { final Runnable _onDone = new Runnable() { public void run() { if (!checkDeferred(deferred, onDone)) return; - selectVisible(element, onDone, addToSelection, canBeCentered, scrollToVisible); + + checkPathAndMaybeRevalidate(element, new Runnable() { + public void run() { + selectVisible(element, onDone, addToSelection, canBeCentered, scrollToVisible); + } + }, true, false, canSmartExpand); } }; _expand(element, _onDone, true, false, canSmartExpand); } + private void checkPathAndMaybeRevalidate(Object element, Runnable onDone, boolean parentsOnly, boolean checkIfInStructure, boolean canSmartExpand) { + boolean toRevalidate = getNodeForElement(element, false) == null && isInStructure(element); + if (!toRevalidate) { + runDone(onDone); + return; + } + + Object actualElement = getTreeStructure().revalidateElement(element); + if (actualElement == null) { + runDone(onDone); + return; + } + + _expand(actualElement, onDone, parentsOnly, checkIfInStructure, canSmartExpand); + } + public void scrollSelectionToVisible(@Nullable Runnable onDone, boolean shouldBeCentered) { int[] rows = myTree.getSelectionRows(); if (rows == null || rows.length == 0) { diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java index 2b004f1e228d..a94f57214b68 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java @@ -108,6 +108,7 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase myChild2Parent = new HashMap(); private final Map myElement2Node = new HashMap(); private final Set myLeaves = new HashSet(); + private Revalidator myRevalidator; public Object getRootElement() { return myRoot.myElement; @@ -464,7 +472,8 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase extends FlyIdeaTestCase { public static class NodeElement extends ComparableObject.Impl implements Comparable{ final String myName; + private NodeElement myForcedParent; public NodeElement(String name) { super(name); @@ -461,6 +462,14 @@ abstract class BaseTreeTestCase extends FlyIdeaTestCase { public int compareTo(NodeElement o) { return myName.compareTo(o.myName); } + + public NodeElement getForcedParent() { + return myForcedParent; + } + + public void setForcedParent(NodeElement forcedParent) { + myForcedParent = forcedParent; + } } } diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java index c5ed81422547..3a44ccd3c1fa 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java @@ -1013,7 +1013,7 @@ public class TreeUiTest extends AbstractTreeBuilderTest { public void onElementAction(String action, Object element) { if (wasInterrupted[0]) { if (myCancelRequest == null) { - myCancelRequest = new AssertionError("Not supposed to be update after interruption request: action=" + action + " element=" + element); + myCancelRequest = new AssertionError("Not supposed to be update after interruption request: action=" + action + " element=" + element + " interruptAction=" + interruptAction + " interruptElement=" + interruptElement); } } else { if (element.equals(interruptElement) && action.equals(interruptAction)) { @@ -1411,6 +1411,50 @@ public class TreeUiTest extends AbstractTreeBuilderTest { doTestSelectionOnDelete(true); } + public void testRevalidateStructure() throws Exception { + final NodeElement com = new NodeElement("com"); + final NodeElement actionSystem = new NodeElement("actionSystem"); + actionSystem.setForcedParent(com); + + doAndWaitForBuilder(new Runnable() { + public void run() { + myRoot.addChild(com).addChild(actionSystem); + getBuilder().getUi().activate(true); + } + }); + + select(actionSystem, false); + + assertTree("-/\n" + + " -com\n" + + " [actionSystem]\n"); + + + removeFromParentButKeepRef(actionSystem); + + final NodeElement newActionSystem = new NodeElement("actionSystem"); + + myStructure.getNodeFor(com).addChild("intellij").addChild("openapi").addChild(newActionSystem); + + assertSame(com, myStructure.getParentElement(actionSystem)); + assertNotSame(com, newActionSystem); + assertEquals(new NodeElement("openapi"), myStructure.getParentElement(newActionSystem)); + + myStructure.setRevalidator(new Revalidator() { + public NodeElement revalidate(NodeElement element) { + return element == actionSystem ? newActionSystem : null; + } + }); + + updateFromRoot(); + + assertTree("-/\n" + + " -com\n" + + " -intellij\n" + + " -openapi\n" + + " [actionSystem]\n"); + } + private void doTestSelectionOnDelete(boolean keepRef) throws Exception { myComparator.setDelegate(new NodeDescriptor.NodeComparator() { public int compare(NodeDescriptor o1, NodeDescriptor o2) { @@ -1702,13 +1746,8 @@ public class TreeUiTest extends AbstractTreeBuilderTest { } @Override - public void testCancelUpdate() throws Exception { - super.testCancelUpdate(); - } - - @Override - public void testThrowingProcessCancelledInterruptsUpdate() throws Exception { - super.testThrowingProcessCancelledInterruptsUpdate(); + public void testRevalidateStructure() throws Exception { + super.testRevalidateStructure(); } } From 1bd7b6591d3a598da1f47073c393ff7f3d2948f4 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 28 May 2010 18:11:14 +0400 Subject: [PATCH 02/58] app icon tiny fix --- platform/platform-impl/src/com/intellij/ui/AppIcon.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/AppIcon.java b/platform/platform-impl/src/com/intellij/ui/AppIcon.java index 33e51d08c00b..cfd003fb6d90 100644 --- a/platform/platform-impl/src/com/intellij/ui/AppIcon.java +++ b/platform/platform-impl/src/com/intellij/ui/AppIcon.java @@ -130,8 +130,8 @@ public abstract class AppIcon { @Override public void applicationActivated(IdeFrame ideFrame) { hideProgress(myCurrentProcessId); - setOkBadge(false); - setErrorBadge(null); + _setOkBadge(false); + _setTextBadge(null); } }; app.addApplicationListener(myAppListener); From 4d706d696086c9636d3b06c50f2a4d01c8c82d74 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 28 May 2010 20:21:03 +0400 Subject: [PATCH 03/58] attempt to commite bg loading interruption tests --- .../src/com/intellij/openapi/util/SimpleTimer.java | 4 ++++ .../com/intellij/ide/util/treeView/TreeUiTest.java | 11 ++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/util/SimpleTimer.java b/platform/platform-api/src/com/intellij/openapi/util/SimpleTimer.java index 4569932702ef..c04d74b0a3e1 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/SimpleTimer.java +++ b/platform/platform-api/src/com/intellij/openapi/util/SimpleTimer.java @@ -16,6 +16,7 @@ package com.intellij.openapi.util; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import org.jetbrains.annotations.NonNls; import java.util.*; @@ -134,6 +135,9 @@ public class SimpleTimer { try { each.run(); } + catch (ProcessCanceledException e) { + throw e; + } catch (Throwable e) { LOG.error(e); } diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java index 3a44ccd3c1fa..5dfc46e85e55 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/TreeUiTest.java @@ -3,10 +3,7 @@ package com.intellij.ide.util.treeView; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Progressive; -import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.*; import com.intellij.util.Time; import com.intellij.util.WaitFor; import junit.framework.TestSuite; @@ -1441,8 +1438,8 @@ public class TreeUiTest extends AbstractTreeBuilderTest { assertEquals(new NodeElement("openapi"), myStructure.getParentElement(newActionSystem)); myStructure.setRevalidator(new Revalidator() { - public NodeElement revalidate(NodeElement element) { - return element == actionSystem ? newActionSystem : null; + public AsyncResult revalidate(NodeElement element) { + return element == actionSystem ? new AsyncResult.Done(newActionSystem) : null; } }); @@ -1730,7 +1727,7 @@ public class TreeUiTest extends AbstractTreeBuilderTest { buildAction.run(); - boolean released = new WaitFor(5000) { + boolean released = new WaitFor(60000) { @Override protected boolean condition() { return getBuilder().getUi() == null; From 72401ebaae804b86522ff13316981f4721b4894b Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 28 May 2010 20:23:08 +0400 Subject: [PATCH 04/58] revalidation of elements in TreeUi and BaseProjectTreeBuilder --- .../projectView/BaseProjectTreeBuilder.java | 11 +++- .../util/treeView/AbstractTreeStructure.java | 59 ++++++++++++++++++- .../ide/util/treeView/AbstractTreeUi.java | 22 ++++--- .../treeView/AbstractTreeBuilderTest.java | 5 +- .../ide/util/treeView/BaseTreeTestCase.java | 8 ++- 5 files changed, 91 insertions(+), 14 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java index 62c157186e1d..006410ff9375 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java @@ -52,10 +52,19 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { DefaultTreeModel treeModel, AbstractTreeStructure treeStructure, Comparator comparator) { - super(tree, treeModel, treeStructure, comparator); + init(tree, treeModel, new AbstractTreeStructure.Delegate(treeStructure) { + @Override + public AsyncResult revalidateElement(Object element) { + return _revalidateElement(element); + } + }, comparator, DEFAULT_UPDATE_INACTIVE); myProject = project; } + private AsyncResult _revalidateElement(Object element) { + return new AsyncResult.Done(element); + } + protected boolean isAlwaysShowPlus(NodeDescriptor nodeDescriptor) { return ((AbstractTreeNode)nodeDescriptor).isAlwaysShowPlus(); } diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java index 4612aa83211c..bff7c077e2ac 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java @@ -16,6 +16,7 @@ package com.intellij.ide.util.treeView; +import com.intellij.openapi.util.AsyncResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,8 +40,62 @@ public abstract class AbstractTreeStructure { return false; } - public Object revalidateElement(Object element) { - return element; + public AsyncResult revalidateElement(Object element) { + return new AsyncResult.Done(element); + } + + public static class Delegate extends AbstractTreeStructure { + private AbstractTreeStructure myDelegee; + + public Delegate(AbstractTreeStructure delegee) { + myDelegee = delegee; + } + + @Override + public Object getRootElement() { + return myDelegee.getRootElement(); + } + + @Override + public Object[] getChildElements(Object element) { + return myDelegee.getChildElements(element); + } + + @Override + public Object getParentElement(Object element) { + return myDelegee.getParentElement(element); + } + + @NotNull + @Override + public NodeDescriptor createDescriptor(Object element, NodeDescriptor parentDescriptor) { + return myDelegee.createDescriptor(element, parentDescriptor); + } + + @Override + public void commit() { + myDelegee.commit(); + } + + @Override + public boolean hasSomethingToCommit() { + return myDelegee.hasSomethingToCommit(); + } + + @Override + public boolean isToBuildChildrenInBackground(Object element) { + return myDelegee.isToBuildChildrenInBackground(element); + } + + @Override + public boolean isAlwaysLeaf(Object element) { + return myDelegee.isAlwaysLeaf(element); + } + + @Override + public AsyncResult revalidateElement(Object element) { + return myDelegee.revalidateElement(element); + } } } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 77ecd1f686f1..adbb791565a0 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -3462,20 +3462,26 @@ public class AbstractTreeUi { _expand(element, _onDone, true, false, canSmartExpand); } - private void checkPathAndMaybeRevalidate(Object element, Runnable onDone, boolean parentsOnly, boolean checkIfInStructure, boolean canSmartExpand) { + private void checkPathAndMaybeRevalidate(Object element, final Runnable onDone, final boolean parentsOnly, final boolean checkIfInStructure, final boolean canSmartExpand) { boolean toRevalidate = getNodeForElement(element, false) == null && isInStructure(element); if (!toRevalidate) { runDone(onDone); return; } - Object actualElement = getTreeStructure().revalidateElement(element); - if (actualElement == null) { - runDone(onDone); - return; - } - - _expand(actualElement, onDone, parentsOnly, checkIfInStructure, canSmartExpand); + getTreeStructure().revalidateElement(element).doWhenDone(new AsyncResult.Handler() { + public void run(final Object o) { + invokeLaterIfNeeded(new Runnable() { + public void run() { + _expand(o, onDone, parentsOnly, checkIfInStructure, canSmartExpand); + } + }); + } + }).doWhenRejected(new Runnable() { + public void run() { + runDone(onDone); + } + }); } public void scrollSelectionToVisible(@Nullable Runnable onDone, boolean shouldBeCentered) { diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java index a94f57214b68..2721428b3bdc 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/AbstractTreeBuilderTest.java @@ -1,5 +1,6 @@ package com.intellij.ide.util.treeView; +import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Condition; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.ui.treeStructure.Tree; @@ -525,7 +526,7 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase revalidateElement(Object element) { return myRevalidator != null ? myRevalidator.revalidate((NodeElement)element) : super.revalidateElement(element); } @@ -535,7 +536,7 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase revalidate(NodeElement element); } class MyBuilder extends BaseTreeBuilder { diff --git a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java index 9e55f0858cdf..9b53c5a35611 100644 --- a/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java +++ b/platform/platform-impl/testSrc/com/intellij/ide/util/treeView/BaseTreeTestCase.java @@ -226,7 +226,13 @@ abstract class BaseTreeTestCase extends FlyIdeaTestCase { } void _runBackgroundLoading(Runnable runnable) { - SimpleTimer.getInstance().setUp(runnable, getChildrenLoadingDelay()); + try { + Thread.currentThread().sleep(getChildrenLoadingDelay()); + runnable.run(); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } } From abc2d6a6e1b56d8fce3ef1d28fec1026a7abd7f7 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 28 May 2010 20:26:18 +0400 Subject: [PATCH 05/58] PackagesTreeStructureTest.testPackageView fix --- .../src/com/intellij/ide/util/treeView/AbstractTreeUi.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index adbb791565a0..cd7d9eedd2de 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -3127,8 +3127,10 @@ public class AbstractTreeUi { } myTreeModel.nodeStructureChanged(parentNode); - while (expanded.hasMoreElements()) { - expandSilently(expanded.nextElement()); + if (expanded != null) { + while (expanded.hasMoreElements()) { + expandSilently(expanded.nextElement()); + } } if (selected != null) { From aecbce3f7762c5c14587cb5eb4b341039a05893c Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 31 May 2010 14:32:03 +0400 Subject: [PATCH 06/58] IDEA-53847 Project view state is not preserved (including currently selected item) if Compact Empty Middle Packages option is changed --- .../projectView/BaseProjectTreeBuilder.java | 127 +++++++++++++----- 1 file changed, 95 insertions(+), 32 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java index 006410ff9375..ad1f4fd571c4 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java @@ -25,24 +25,22 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Progressive; import com.intellij.openapi.progress.util.StatusBarProgress; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.util.AsyncResult; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Conditions; +import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileSystemItem; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { protected final Project myProject; @@ -62,7 +60,42 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { } private AsyncResult _revalidateElement(Object element) { - return new AsyncResult.Done(element); + final AsyncResult result = new AsyncResult(); + + if (element instanceof AbstractTreeNode) { + AbstractTreeNode node = (AbstractTreeNode)element; + final Object value = node.getValue(); + VirtualFile vFile = null; + if (value instanceof PsiFileSystemItem) { + vFile = ((PsiFileSystemItem)value).getVirtualFile(); + } else if (value instanceof PsiElement) { + PsiFile psiFile = ((PsiElement)value).getContainingFile(); + if (psiFile != null) { + vFile = psiFile.getVirtualFile(); + } + } + final ActionCallback cb = new ActionCallback(); + + final VirtualFile finalVFile = vFile; + batch(new Progressive() { + public void run(@NotNull ProgressIndicator indicator) { + final Ref target = new Ref(); + _select(value, finalVFile, false, Conditions.alwaysTrue(), cb, indicator, target); + cb.doWhenDone(new Runnable() { + public void run() { + result.setDone(target.get()); + } + }).doWhenRejected(new Runnable() { + public void run() { + result.setRejected(); + } + }); + } + }); + } else { + result.setRejected(); + } + return result; } protected boolean isAlwaysShowPlus(NodeDescriptor nodeDescriptor) { @@ -141,7 +174,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { public void run() { batch(new Progressive() { public void run(@NotNull ProgressIndicator indicator) { - _select(element, file, requestFocus, nonStopCondition, result, indicator); + _select(element, file, requestFocus, nonStopCondition, result, indicator, null); } }); } @@ -157,12 +190,13 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { final boolean requestFocus, final Condition nonStopCondition, final ActionCallback result, - ProgressIndicator indicator) { + ProgressIndicator indicator, + @Nullable final Ref virtualSelectTarget) { AbstractTreeNode alreadySelected = alreadySelectedNode(element); final Runnable onDone = new Runnable() { public void run() { - if (requestFocus) { + if (requestFocus && virtualSelectTarget == null) { IdeFocusManager.getInstance(myProject).requestFocus(getTree(), true); } @@ -178,7 +212,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { }; if (alreadySelected == null) { - expandPathTo(file, (AbstractTreeNode)getTreeStructure().getRootElement(), element, condition, indicator) + expandPathTo(file, (AbstractTreeNode)getTreeStructure().getRootElement(), element, condition, indicator, virtualSelectTarget) .doWhenDone(new AsyncResult.Handler() { public void run(AbstractTreeNode node) { select(node, onDone); @@ -219,15 +253,21 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { final AbstractTreeNode root, final Object element, final Condition nonStopCondition, - final ProgressIndicator indicator) { + final ProgressIndicator indicator, + @Nullable final Ref target) { final AsyncResult async = new AsyncResult(); if (root.canRepresent(element)) { - expand(root, new Runnable() { - public void run() { - async.setDone(root); - } - }); + if (target == null) { + expand(root, new Runnable() { + public void run() { + async.setDone(root); + } + }); + } else { + target.set(root); + async.setDone(root); + } return async; } @@ -237,27 +277,50 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { } - expand(root, new Runnable() { - public void run() { - indicator.checkCanceled(); + if (target == null) { + expand(root, new Runnable() { + public void run() { + indicator.checkCanceled(); + final DefaultMutableTreeNode rootNode = getNodeForElement(root); + if (rootNode != null) { + final List kids = collectChildren(rootNode); + expandChild(kids, 0, nonStopCondition, file, element, async, indicator, target); + } + else { + async.setRejected(); + } + } + }); + } else { + if (indicator.isCanceled()) { + async.setRejected(); + } else { final DefaultMutableTreeNode rootNode = getNodeForElement(root); - if (rootNode != null) { - final List kids = collectChildren(rootNode); - expandChild(kids, 0, nonStopCondition, file, element, async, indicator); - } - else { - async.setRejected(); + final ArrayList kids = new ArrayList(); + if (rootNode != null && getTree().isExpanded(new TreePath(rootNode.getPath()))) { + kids.addAll(collectChildren(rootNode)); + } else { + List list = Arrays.asList(getTreeStructure().getChildElements(root)); + for (Object each : list) { + kids.add((AbstractTreeNode)each); + } } + + yield(new Runnable() { + public void run() { + expandChild(kids, 0, nonStopCondition, file, element, async, indicator, target); + } + }); } - }); + } return async; } private void expandChild(final List kids, final int i, final Condition nonStopCondition, final VirtualFile file, final Object element, - final AsyncResult async, final ProgressIndicator indicator) { + final AsyncResult async, final ProgressIndicator indicator, final Ref virtualSelectTarget) { if (i >= kids.size()) { async.setRejected(); @@ -272,7 +335,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { } if (nonStopCondition.value(eachKid)) { - expandPathTo(file, eachKid, element, nonStopCondition, indicator).doWhenDone(new AsyncResult.Handler() { + expandPathTo(file, eachKid, element, nonStopCondition, indicator, virtualSelectTarget).doWhenDone(new AsyncResult.Handler() { public void run(AbstractTreeNode abstractTreeNode) { indicator.checkCanceled(); @@ -282,10 +345,10 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { public void run() { indicator.checkCanceled(); - if (nodeWasCollapsed[0]) { + if (nodeWasCollapsed[0] && virtualSelectTarget == null) { collapseChildren(eachKid, null); } - expandChild(kids, i + 1, nonStopCondition, file, element, async, indicator); + expandChild(kids, i + 1, nonStopCondition, file, element, async, indicator, virtualSelectTarget); } }); } else { From ae62b9ef94607133c8f1910cadd612dd4a4b7d84 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 31 May 2010 15:35:16 +0400 Subject: [PATCH 07/58] project view scrolling fix - 1 --- .../ide/projectView/BaseProjectTreeBuilder.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java index ad1f4fd571c4..ae4abf72fef1 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/BaseProjectTreeBuilder.java @@ -215,12 +215,20 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder { expandPathTo(file, (AbstractTreeNode)getTreeStructure().getRootElement(), element, condition, indicator, virtualSelectTarget) .doWhenDone(new AsyncResult.Handler() { public void run(AbstractTreeNode node) { - select(node, onDone); + if (virtualSelectTarget == null) { + select(node, onDone); + } else if (onDone != null) { + onDone.run(); + } } }).notifyWhenRejected(result); } else { - select(alreadySelected, onDone); + if (virtualSelectTarget == null) { + select(alreadySelected, onDone); + } else if (onDone != null) { + onDone.run(); + } } } From e94405d911c4e44adc4cf2a0892da2642925bf0b Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 31 May 2010 15:56:40 +0400 Subject: [PATCH 08/58] tree holds size while updating to avoid viewport flickering --- .../ide/util/treeView/AbstractTreeUi.java | 14 ++++++++++++ .../com/intellij/ui/treeStructure/Tree.java | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index cd7d9eedd2de..49f18c1d7528 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -271,6 +271,13 @@ public class AbstractTreeUi { } } + private void setHoldSize(boolean holdSize) { + if (myTree instanceof com.intellij.ui.treeStructure.Tree) { + final com.intellij.ui.treeStructure.Tree tree = (Tree)myTree; + tree.setHoldSize(holdSize); + } + } + private void cleanUpAll() { final long now = System.currentTimeMillis(); final AbstractTreeUi[] uis = ourUi2Countdown.keySet().toArray(new AbstractTreeUi[ourUi2Countdown.size()]); @@ -962,7 +969,10 @@ public class AbstractTreeUi { } final void updateSubtreeNow(TreeUpdatePass pass, boolean canSmartExpand) { + + maybeSetBusyAndScheduleWaiterForReady(true); + setHoldSize(true); boolean consumed = initRootNodeNowIfNeeded(pass); if (consumed) return; @@ -1804,6 +1814,8 @@ public class AbstractTreeUi { } } + setHoldSize(false); + if (myTree.isShowing()) { if (getBuilder().isToEnsureSelectionOnFocusGained() && Registry.is("ide.tree.ensureSelectionOnFocusGained")) { TreeUtil.ensureSelection(myTree); @@ -3526,6 +3538,7 @@ public class AbstractTreeUi { } if (Registry.is("ide.tree.autoscrollToVCenter") && canBeCentered) { + setHoldSize(false); runDone(new Runnable() { public void run() { TreeUtil.showRowCentered(myTree, row, false, scroll).doWhenDone(new Runnable() { @@ -3537,6 +3550,7 @@ public class AbstractTreeUi { }); } else { + setHoldSize(false); TreeUtil.showAndSelect(myTree, row - 2, row + 2, row, -1, addToSelection, scroll).doWhenDone(new Runnable() { public void run() { runDone(onDone); diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java index 04fa252ddfdc..cdc6be22ccb1 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -47,6 +47,8 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q private boolean myBusy; private Rectangle myLastVisibleRec; + private Dimension myHoldSize; + public Tree() { initTree_(); } @@ -539,4 +541,24 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q public void reshape(int x, int y, int w, int h) { super.reshape(x, y, w, h); } + + public void setHoldSize(boolean hold) { + if (hold && myHoldSize == null) { + myHoldSize = getPreferredSize(); + } else if (!hold && myHoldSize != null) { + myHoldSize = null; + revalidate(); + } + } + + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + + if (myHoldSize != null) { + size.width = Math.max(size.width, myHoldSize.width); + size.height = Math.max(size.height, myHoldSize.height); + } + + return size; + } } \ No newline at end of file From 009a9f5b77f6c797d4b7fb45da7cb33fdebd40f5 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 31 May 2010 16:22:14 +0400 Subject: [PATCH 09/58] tree busy icon - click to cancel updating --- .../intellij/ide/util/treeView/AbstractTreeUi.java | 9 +++++++-- .../src/com/intellij/ui/treeStructure/Tree.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 49f18c1d7528..8d6d33e9c7f5 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -2082,8 +2082,13 @@ public class AbstractTreeUi { resetToReadyNow(); done.setDone(); } else { - requestCancel(); - getReady(this).notify(done); + if (isIdle() && hasPendingWork()) { + resetToReadyNow(); + done.setDone(); + } else { + requestCancel(); + getReady(this).notify(done); + } } maybeReady(); diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java index cdc6be22ccb1..3989ac967ec8 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -186,14 +186,26 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q myBusyIcon.setOpaque(false); myBusyIcon.setPaintPassiveIcon(false); add(myBusyIcon); + myBusyIcon.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (!UIUtil.isActionClick(e)) return; + AbstractTreeBuilder builder = AbstractTreeBuilder.getBuilderFor(Tree.this); + if (builder != null) { + builder.cancelUpdate(); + } + } + }); } } if (myBusyIcon != null) { if (myBusy) { myBusyIcon.resume(); + myBusyIcon.setToolTipText("Update is in progress. Click to cancel"); } else { myBusyIcon.suspend(); + myBusyIcon.setToolTipText(null); SwingUtilities.invokeLater(new Runnable() { public void run() { if (myBusyIcon != null) { From 31ce0fe7627abc66306c02bb529405b186886f79 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 11 May 2010 17:46:41 +0400 Subject: [PATCH 10/58] Maven: remote maven facade --- .../execution/rmi/RemoteProcessSupport.java | 33 +- .../impl/DocumentReferenceManagerImpl.java | 1 + .../com/intellij/util/io/fs}/FilePath.java | 2 +- .../lib/lucene-core-2.3.0.jar | Bin plugins/maven/facade-api/maven-facade-api.iml | 23 + .../idea/maven/facade/MavenFacade.java | 47 ++ .../idea/maven/facade/MavenFacadeConsole.java | 31 + .../maven/facade/MavenFacadeEmbedder.java | 74 +++ .../idea/maven/facade/MavenFacadeIndexer.java | 59 ++ .../facade/MavenFacadeIndexerException.java} | 17 +- .../idea/maven/facade/MavenFacadeLogger.java | 27 + .../MavenFacadeProcessCanceledException.java | 21 + .../facade/MavenFacadeProgressIndicator.java | 30 + .../maven/facade/MavenFacadeSettings.java | 107 +++ .../facade/MavenFacadeTransferListener.java} | 7 +- .../idea/maven/facade/MavenFacadeUtil.java | 69 ++ .../facade/MavenWrapperExecutionResult.java | 59 ++ .../facade/NativeMavenProjectHolder.java | 8 + .../facade/ProfileApplicationResult.java | 40 ++ .../idea/maven/facade/RemoteObject.java} | 54 +- .../idea/maven/model/MavenArchetype.java} | 19 +- .../idea/maven/model}/MavenArtifact.java | 166 ++--- .../idea/maven/model/MavenArtifactInfo.java | 86 +++ .../idea/maven/model}/MavenArtifactNode.java | 29 +- .../idea/maven/model}/MavenArtifactState.java | 2 +- .../idea/maven/model/MavenBuild.java | 72 ++ .../idea/maven/model/MavenBuildBase.java | 77 +++ .../idea/maven/model}/MavenConstants.java | 21 +- .../jetbrains/idea/maven/model}/MavenId.java | 21 +- .../idea/maven/model/MavenModel.java | 73 ++ .../idea/maven/model/MavenModelBase.java | 88 +++ .../idea/maven/model/MavenParent.java | 36 + .../idea/maven/model}/MavenPlugin.java | 100 +-- .../idea/maven/model/MavenProfile.java | 54 ++ .../maven/model/MavenProfileActivation.java | 66 ++ .../model/MavenProfileActivationFile.java | 36 + .../maven/model/MavenProfileActivationOS.java | 48 ++ .../model/MavenProfileActivationProperty.java | 36 + .../idea/maven/model/MavenProfileKind.java} | 6 +- .../idea/maven/model/MavenProjectProblem.java | 96 +++ .../maven/model/MavenRemoteRepository.java | 115 ++++ .../maven/model/MavenRepositoryInfo.java} | 33 +- .../idea/maven/model}/MavenResource.java | 35 +- .../{ => facade-impl}/lib/activation-1.1.jar | Bin .../archetype-common-2.0-alpha-4-SNAPSHOT.jar | Bin .../{ => facade-impl}/lib/classworlds-1.1.jar | Bin .../lib/commons-beanutils.jar | Bin .../lib/commons-logging-1.1.1.jar | Bin .../{ => facade-impl}/lib/jaxb-api-2.1.jar | Bin .../lib/jaxb-impl-2.1.10.jar | Bin .../lib/maven-2.2.1-uber.jar | Bin .../lib/maven-dependency-tree-1.2.jar | Bin .../lib/maven-embedder-1.0-SNAPSHOT.jar | Bin 0 -> 24562 bytes .../lib/mercury-artifact-1.0-alpha-6.jar | Bin .../lib/nexus-indexer-1.2.3.jar | Bin .../lib/plexus-utils-1.5.5.jar | Bin .../maven/{ => facade-impl}/lib/wadl-core.jar | Bin .../maven/facade-impl/maven-facade-impl.iml | 185 ++++++ .../idea/maven/facade/MavenFacadeImpl.java | 113 ++++ .../maven/facade}/MavenFacadeLocator.java | 41 +- .../facade/MavenFacadeLoggerManager.java | 31 + .../idea/maven/facade}/RemoteMavenServer.java | 4 +- .../facade}/embedder/CustomArtifact.java | 6 +- .../embedder/CustomArtifactFactory.java | 2 +- .../embedder/CustomArtifactResolver.java | 17 +- .../embedder/CustomModelInterpolator.java | 2 +- .../facade}/embedder/CustomWagonManager.java | 2 +- .../facade/embedder/ExecutorManager.java | 27 + .../maven/facade}/embedder/FieldAccessor.java | 2 +- .../embedder/MavenFacadeConsoleWrapper.java} | 48 +- .../embedder/MavenFacadeEmbedderImpl.java | 626 ++++++++++++++++++ .../embedder/MavenFacadeIndexerImpl.java | 296 +++++++++ .../embedder/MavenFacadeLoggerWrapper.java | 56 ++ .../MavenFacadeProgressIndicatorWrapper.java | 80 +++ .../facade/embedder}/MavenIndexFetcher.java | 7 +- .../facade/embedder/MavenModelConverter.java | 525 +++++++++++++++ .../RemoteNativeMavenProjectHolder.java | 31 + .../embedder}/TransferListenerAdapter.java | 43 +- .../UnresolvedArtifactsCollector.java | 6 +- .../idea/maven/facade/nexus/ArtifactType.java | 338 ++++++++++ .../idea/maven/facade/nexus/Endpoint.java | 0 .../maven/facade/nexus/ObjectFactory.java | 7 +- .../idea/maven/facade/nexus/Repositories.java | 4 +- .../facade/nexus/RepositoryMetaData.java | 0 .../maven/facade/nexus/RepositoryType.java | 0 .../idea/maven/facade/nexus/SearchResult.java | 4 +- .../maven/facade/nexus/SearchResults.java | 6 +- .../idea/maven/facade/nexus/nexus.wadl | 0 .../idea/maven/facade/nexus/nexus.xsd | 0 .../embedder/MavenFacadeEmbedderTest.java} | 144 ++-- .../maven/embedder}/NexusIndexerTest.java | 28 +- .../idea/maven/facade/nexus/ArtifactType.java | 371 ----------- .../idea/maven/facade/remote/MavenFacade.java | 98 --- .../facade/remote/impl/MavenFacadeImpl.java | 393 ----------- .../impl/RemoteTransferListenerImpl.java | 28 - .../maven/lib/maven-embedder-1.0-SNAPSHOT.jar | Bin 25822 -> 0 bytes plugins/maven/maven-facade.iml | 103 --- plugins/maven/maven.iml | 107 +-- .../maven/project/JBMavenProjectHelper.java | 29 - .../maven/compiler/MavenResourceCompiler.java | 2 +- .../dom/MavenDomProjectProcessorUtils.java | 1 + .../idea/maven/dom/MavenDomUtil.java | 6 +- .../idea/maven/dom/MavenPropertyResolver.java | 21 +- .../dom/annotator/MavenDomAnnotator.java | 6 +- ...rtifactCoordinatesArtifactIdConverter.java | 2 +- .../MavenArtifactCoordinatesConverter.java | 2 +- ...enArtifactCoordinatesGroupIdConverter.java | 5 +- .../MavenArtifactCoordinatesHelper.java | 2 +- ...enArtifactCoordinatesVersionConverter.java | 2 +- .../MavenDependencyScopeConverter.java | 3 +- .../MavenParentRelativePathConverter.java | 5 +- .../MavenRepositoriesProvider.java | 6 - .../beans/RepositoryBeanInfo.java | 7 - .../GenerateAddManagedDependencyAction.java | 2 - .../generate/GenerateDependencyAction.java | 3 +- .../MavenDuplicateDependenciesInspection.java | 2 +- .../AddMavenDependencyQuickFix.java | 2 +- .../references/MavenModulePsiReference.java | 4 +- .../references/MavenPropertyPsiReference.java | 1 + .../maven/embedder/CustomLoggerManager.java | 62 -- .../maven/embedder/MavenConsoleHelper.java | 33 - .../maven/embedder/MavenEmbedderUtilEx.java | 138 ---- .../maven/embedder/MavenEmbedderWrapper.java | 446 ------------- .../embedder/MavenWrapperExecutionResult.java | 52 -- .../MavenWrapperResolutionResult.java | 40 -- .../MavenExecutionOptions.java | 46 +- .../idea/maven/execution/MavenExecutor.java | 9 +- .../execution/MavenExternalExecutor.java | 5 +- .../execution/MavenExternalParameters.java | 10 +- .../MavenJavaClasspathPolicyExtender.java | 4 +- .../execution/MavenRunConfiguration.java | 4 +- .../idea/maven/execution/MavenRunner.java | 7 +- .../MavenRunnerParametersConfigurable.java | 2 +- .../maven/execution/SoutMavenConsole.java | 3 +- .../maven/facade/MavenEmbedderWrapper.java | 208 ++++++ .../idea/maven/facade/MavenFacadeManager.java | 375 +++++++++++ .../maven/facade/MavenIndexerWrapper.java | 137 ++++ .../facade/remote/MavenFacadeManagerImpl.java | 175 ----- .../idea/maven/importing/FacetImporter.java | 2 +- .../idea/maven/importing/GroovyImporter.java | 1 + .../maven/importing/MavenFoldersImporter.java | 2 +- .../idea/maven/importing/MavenImporter.java | 8 +- .../maven/importing/MavenModuleImporter.java | 3 +- .../importing/MavenModuleNameMapper.java | 2 +- .../maven/importing/MavenProjectImporter.java | 2 +- .../importing/MavenRootModelAdapter.java | 10 +- .../indices/MavenArchetypesProvider.java | 3 +- .../indices/MavenArtifactSearchDialog.java | 2 +- .../indices/MavenArtifactSearchPanel.java | 30 +- .../indices/MavenArtifactSearchResult.java | 7 +- .../maven/indices/MavenArtifactSearcher.java | 28 +- .../maven/indices/MavenClassSearcher.java | 17 +- .../idea/maven/indices/MavenIndex.java | 249 ++----- .../idea/maven/indices/MavenIndices.java | 40 +- .../maven/indices/MavenIndicesManager.java | 110 +-- .../indices/MavenProjectIndicesManager.java | 12 +- .../idea/maven/indices/MavenSearcher.java | 39 +- .../maven/navigator/MavenNavigationUtil.java | 4 +- .../navigator/MavenProjectsNavigator.java | 3 +- .../MavenProjectsNavigatorPanel.java | 9 +- .../navigator/MavenProjectsStructure.java | 20 +- .../project/MavenArtifactDownloader.java | 10 +- .../{embedder => project}/MavenConsole.java | 108 +-- .../MavenConsoleImpl.java | 4 +- .../maven/project/MavenEmbeddersManager.java | 38 +- .../maven/project/MavenEnvironmentForm.form | 23 +- .../maven/project/MavenEnvironmentForm.java | 22 +- .../project/MavenGeneralConfigurable.java | 2 +- .../maven/project/MavenGeneralSettings.java | 44 +- .../idea/maven/project/MavenParentDesc.java | 1 + .../MavenParentProjectFileProcessor.java | 3 +- .../idea/maven/project/MavenProject.java | 250 ++----- .../maven/project/MavenProjectProblem.java | 81 --- .../maven/project/MavenProjectReader.java | 598 ++++++----------- .../MavenProjectReaderProjectLocator.java | 4 +- .../project/MavenProjectReaderResult.java | 37 +- .../maven/project/MavenProjectsManager.java | 19 +- .../project/MavenProjectsManagerWatcher.java | 3 +- .../maven/project/MavenProjectsProcessor.java | 1 - ...ectsProcessorArtifactsDownloadingTask.java | 2 +- .../MavenProjectsProcessorEmptyTask.java | 1 - ...ProjectsProcessorFoldersResolvingTask.java | 6 +- ...ProjectsProcessorPluginsResolvingTask.java | 8 +- .../MavenProjectsProcessorReadingTask.java | 1 - .../MavenProjectsProcessorResolvingTask.java | 1 - .../project/MavenProjectsProcessorTask.java | 1 - .../idea/maven/project/MavenProjectsTree.java | 68 +- .../maven/project/MavenRemoteRepository.java | 132 ---- .../DownloadSelectedSourcesAndDocsAction.java | 3 +- .../maven/tasks/MavenKeymapExtension.java | 7 +- .../maven/tasks/MavenShortcutsManager.java | 9 +- .../idea/maven/utils/FileFinder.java | 2 +- .../idea/maven/utils/MavenArtifactUtil.java | 2 +- .../utils/MavenAttachSourcesProvider.java | 2 + .../idea/maven/utils/MavenDataKeys.java | 2 +- .../utils/MavenEnvironmentRegistrar.java | 4 +- .../idea/maven/utils/MavenPluginInfo.java | 6 +- .../idea/maven/utils/MavenRehighlighter.java | 5 +- .../idea/maven/utils/MavenUIUtil.java | 13 +- .../jetbrains/idea/maven/utils/MavenUtil.java | 230 +++++-- .../maven/utils/RepositoryAttachDialog.java | 52 +- .../maven/utils/RepositoryAttachHandler.java | 452 ++++++------- .../maven/utils/actions/MavenActionUtil.java | 2 +- .../wizards/MavenAddArchetypeDialog.java | 6 +- .../MavenFrameworkSupportProvider.java | 4 +- .../maven/wizards/MavenModuleBuilder.java | 10 +- .../wizards/MavenModuleBuilderHelper.java | 10 +- .../maven/wizards/MavenModuleWizardStep.java | 56 +- .../maven/wizards/MavenProjectBuilder.java | 1 + .../wizards/MavenProjectOpenProcessor.java | 2 +- .../main/resources/IndicesBundle.properties | 1 - .../src/main/resources/META-INF/plugin.xml | 12 +- .../main/resources/ProjectBundle.properties | 3 - .../MavenCustomRepositoryHelper.java | 2 +- .../idea/maven/MavenImportingTestCase.java | 1 + .../jetbrains/idea/maven/MavenTestCase.java | 3 +- .../idea/maven/NullMavenConsole.java | 6 +- .../maven/importing/AddingDependencyTest.java | 6 +- .../importing/ArtifactsDownloadingTest.java | 6 +- .../importing/DependenciesImportingTest.java | 6 +- .../importing/DependenciesManagementTest.java | 4 +- .../maven/importing/FoldersImportingTest.java | 4 +- .../InvalidProjectImportingTest.java | 4 +- .../maven/importing/MiscImportingTest.java | 5 +- .../indices/MavenIndicesManagerTest.java | 7 +- .../maven/indices/MavenIndicesStressTest.java | 21 +- .../idea/maven/indices/MavenIndicesTest.java | 106 ++- .../indices/MavenIndicesTestFixture.java | 3 +- .../indices/MavenPluginInfoReaderTest.java | 3 +- .../idea/maven/indices/MavenSearcherTest.java | 10 +- .../project/MavenEmbeddersManagerTest.java | 30 +- .../maven/project/MavenProjectReaderTest.java | 295 ++++----- .../idea/maven/project/MavenProjectTest.java | 22 +- .../project/MavenProjectsManagerTest.java | 3 +- .../project/MavenProjectsTreeReadingTest.java | 30 +- .../maven/wizards/MavenModuleBuilderTest.java | 11 +- 236 files changed, 6485 insertions(+), 4744 deletions(-) rename platform/{platform-api/src/com/intellij/openapi/vfs => util/src/com/intellij/util/io/fs}/FilePath.java (97%) rename plugins/maven/{ => facade-api}/lib/lucene-core-2.3.0.jar (100%) create mode 100644 plugins/maven/facade-api/maven-facade-api.iml create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacade.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeConsole.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeEmbedder.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexer.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManager.java => facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java} (64%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeLogger.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProcessCanceledException.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProgressIndicator.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeSettings.java rename plugins/maven/{facade/org/jetbrains/idea/maven/facade/remote/RemoteTransferListener.java => facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeTransferListener.java} (96%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenWrapperExecutionResult.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/NativeMavenProjectHolder.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/ProfileApplicationResult.java rename plugins/maven/{facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteImpl.java => facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java} (58%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/indices/ArchetypeInfo.java => facade-api/src/org/jetbrains/idea/maven/model/MavenArchetype.java} (82%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenArtifact.java (64%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactInfo.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenArtifactNode.java (82%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenArtifactState.java (94%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuild.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuildBase.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/utils => facade-api/src/org/jetbrains/idea/maven/model}/MavenConstants.java (58%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenId.java (84%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModel.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModelBase.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenParent.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenPlugin.java (63%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfile.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationFile.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationOS.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationProperty.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project/MavenProfileState.java => facade-api/src/org/jetbrains/idea/maven/model/MavenProfileKind.java} (83%) create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProjectProblem.java create mode 100644 plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRemoteRepository.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project/MavenProjectModelProblem.java => facade-api/src/org/jetbrains/idea/maven/model/MavenRepositoryInfo.java} (51%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-api/src/org/jetbrains/idea/maven/model}/MavenResource.java (74%) rename plugins/maven/{ => facade-impl}/lib/activation-1.1.jar (100%) rename plugins/maven/{ => facade-impl}/lib/archetype-common-2.0-alpha-4-SNAPSHOT.jar (100%) rename plugins/maven/{ => facade-impl}/lib/classworlds-1.1.jar (100%) rename plugins/maven/{ => facade-impl}/lib/commons-beanutils.jar (100%) rename plugins/maven/{ => facade-impl}/lib/commons-logging-1.1.1.jar (100%) rename plugins/maven/{ => facade-impl}/lib/jaxb-api-2.1.jar (100%) rename plugins/maven/{ => facade-impl}/lib/jaxb-impl-2.1.10.jar (100%) rename plugins/maven/{ => facade-impl}/lib/maven-2.2.1-uber.jar (100%) rename plugins/maven/{ => facade-impl}/lib/maven-dependency-tree-1.2.jar (100%) create mode 100644 plugins/maven/facade-impl/lib/maven-embedder-1.0-SNAPSHOT.jar rename plugins/maven/{ => facade-impl}/lib/mercury-artifact-1.0-alpha-6.jar (100%) rename plugins/maven/{ => facade-impl}/lib/nexus-indexer-1.2.3.jar (100%) rename plugins/maven/{ => facade-impl}/lib/plexus-utils-1.5.5.jar (100%) rename plugins/maven/{ => facade-impl}/lib/wadl-core.jar (100%) create mode 100644 plugins/maven/facade-impl/maven-facade-impl.iml create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java rename plugins/maven/{facade/org/jetbrains/idea/maven/facade/remote => facade-impl/src/org/jetbrains/idea/maven/facade}/MavenFacadeLocator.java (79%) create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLoggerManager.java rename plugins/maven/{facade/org/jetbrains/idea/maven/facade/remote => facade-impl/src/org/jetbrains/idea/maven/facade}/RemoteMavenServer.java (93%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/CustomArtifact.java (97%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/CustomArtifactFactory.java (99%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/CustomArtifactResolver.java (84%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/CustomModelInterpolator.java (97%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/CustomWagonManager.java (99%) create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/ExecutorManager.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/FieldAccessor.java (96%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/embedder/MavenLogger.java => facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeConsoleWrapper.java} (61%) create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeLoggerWrapper.java create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeProgressIndicatorWrapper.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/indices => facade-impl/src/org/jetbrains/idea/maven/facade/embedder}/MavenIndexFetcher.java (95%) create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/RemoteNativeMavenProjectHolder.java rename plugins/maven/{src/main/java/org/jetbrains/idea/maven/project => facade-impl/src/org/jetbrains/idea/maven/facade/embedder}/TransferListenerAdapter.java (61%) rename plugins/maven/{src/main/java/org/jetbrains/idea/maven => facade-impl/src/org/jetbrains/idea/maven/facade}/embedder/UnresolvedArtifactsCollector.java (88%) create mode 100644 plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/Endpoint.java (100%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java (90%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/Repositories.java (97%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/RepositoryMetaData.java (100%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java (100%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/SearchResult.java (98%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/SearchResults.java (97%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/nexus.wadl (100%) rename plugins/maven/{facade => facade-impl/src}/org/jetbrains/idea/maven/facade/nexus/nexus.xsd (100%) rename plugins/maven/{src/test/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapperTest.java => facade-impl/test/org/jetbrains/idea/maven/embedder/MavenFacadeEmbedderTest.java} (80%) rename plugins/maven/{src/test/java/org/jetbrains/idea/maven/indices => facade-impl/test/org/jetbrains/idea/maven/embedder}/NexusIndexerTest.java (91%) delete mode 100644 plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java delete mode 100644 plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java delete mode 100644 plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java delete mode 100644 plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteTransferListenerImpl.java delete mode 100644 plugins/maven/lib/maven-embedder-1.0-SNAPSHOT.jar delete mode 100644 plugins/maven/maven-facade.iml delete mode 100644 plugins/maven/src/main/java/org/apache/maven/project/JBMavenProjectHelper.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomLoggerManager.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleHelper.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderUtilEx.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapper.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperExecutionResult.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperResolutionResult.java rename plugins/maven/src/main/java/org/jetbrains/idea/maven/{embedder => execution}/MavenExecutionOptions.java (68%) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenEmbedderWrapper.java create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenIndexerWrapper.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManagerImpl.java rename plugins/maven/src/main/java/org/jetbrains/idea/maven/{embedder => project}/MavenConsole.java (62%) rename plugins/maven/src/main/java/org/jetbrains/idea/maven/{embedder => project}/MavenConsoleImpl.java (97%) delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectProblem.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenRemoteRepository.java rename plugins/maven/src/test/java/org/jetbrains/idea/maven/{indices => }/MavenCustomRepositoryHelper.java (98%) diff --git a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java index 9da838b8559e..6ae69943c34a 100644 --- a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java +++ b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java @@ -13,8 +13,8 @@ import com.intellij.execution.process.ProcessOutputTypes; import com.intellij.execution.runners.DefaultProgramRunner; import com.intellij.execution.runners.ProgramRunner; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; @@ -34,20 +34,16 @@ import java.util.List; * @author Gregory.Shrago */ public abstract class RemoteProcessSupport { - private final Project myProject; + public static final Logger LOG = Logger.getInstance("#" + RemoteProcessSupport.class); + private final Class myValueClass; private final HashMap, Object> myProcMap = new HashMap, Object>(); - public RemoteProcessSupport(Project project, Class valueClass) { - myProject = project; + public RemoteProcessSupport(Class valueClass) { myValueClass = valueClass; } - public Project getProject() { - return myProject; - } - protected abstract void fireModificationCountChanged(); protected abstract String getName(Target target); @@ -55,7 +51,6 @@ public abstract class RemoteProcessSupport { protected void logText(Parameters configuration, ProcessEvent event, Key outputType, Object info) { } - public void stopAll() { final ArrayList allHandlers = new ArrayList(); synchronized (myProcMap) { @@ -166,7 +161,8 @@ public abstract class RemoteProcessSupport { } } - protected abstract RunProfileState getRunProfileState(Target target, Parameters configuration, Executor executor) throws ExecutionException; + protected abstract RunProfileState getRunProfileState(Target target, Parameters configuration, Executor executor) + throws ExecutionException; private boolean getExistingInfo(Ref ref, final Pair key) { Object info; @@ -214,7 +210,7 @@ public abstract class RemoteProcessSupport { } private static T narrowImpl(Remote remote, Class to) { - return (T) (to.isInstance(remote)? remote : PortableRemoteObject.narrow(remote, to)); + return (T)(to.isInstance(remote) ? remote : PortableRemoteObject.narrow(remote, to)); } private ProcessListener getProcessListener(final Pair key) { @@ -240,6 +236,13 @@ public abstract class RemoteProcessSupport { } public void onTextAvailable(ProcessEvent event, Key outputType) { + if (outputType == ProcessOutputTypes.STDERR) { + LOG.warn(event.getText()); + } + else { + LOG.info(event.getText()); + } + Info result = null; final PendingInfo info; synchronized (myProcMap) { @@ -262,7 +265,9 @@ public abstract class RemoteProcessSupport { info.stderr.append(event.getText()); } } - else info = null; + else { + info = null; + } } if (result != null) { synchronized (info.ref) { @@ -280,8 +285,8 @@ public abstract class RemoteProcessSupport { final PendingInfo pendingInfo; synchronized (myProcMap) { o = myProcMap.remove(key); - pendingInfo = o instanceof PendingInfo? (PendingInfo)o : null; - if (pendingInfo != null && (pendingInfo.stderr.length() > 0 || pendingInfo.ref.isNull())) { + pendingInfo = o instanceof PendingInfo ? (PendingInfo)o : null; + if (pendingInfo != null && (pendingInfo.stderr.length() > 0 || pendingInfo.ref.isNull())) { if (errorMessage != null) pendingInfo.stderr.append(errorMessage); pendingInfo.ref.set(new Info(null, -1, pendingInfo.stderr.toString())); } diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java index 80e7c6a9bf2d..2fe3bdf3d4fa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/DocumentReferenceManagerImpl.java @@ -25,6 +25,7 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.util.containers.WeakValueHashMap; +import com.intellij.util.io.fs.FilePath; import org.jetbrains.annotations.NotNull; import java.lang.ref.Reference; diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/FilePath.java b/platform/util/src/com/intellij/util/io/fs/FilePath.java similarity index 97% rename from platform/platform-api/src/com/intellij/openapi/vfs/FilePath.java rename to platform/util/src/com/intellij/util/io/fs/FilePath.java index 5a9c1c295b2e..dbf200971743 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/FilePath.java +++ b/platform/util/src/com/intellij/util/io/fs/FilePath.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.openapi.vfs; +package com.intellij.util.io.fs; import com.intellij.openapi.util.io.FileUtil; diff --git a/plugins/maven/lib/lucene-core-2.3.0.jar b/plugins/maven/facade-api/lib/lucene-core-2.3.0.jar similarity index 100% rename from plugins/maven/lib/lucene-core-2.3.0.jar rename to plugins/maven/facade-api/lib/lucene-core-2.3.0.jar diff --git a/plugins/maven/facade-api/maven-facade-api.iml b/plugins/maven/facade-api/maven-facade-api.iml new file mode 100644 index 000000000000..8ba63b8dc7db --- /dev/null +++ b/plugins/maven/facade-api/maven-facade-api.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacade.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacade.java new file mode 100644 index 000000000000..20e57f894c1d --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacade.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenModel; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; + +import java.io.File; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Collection; +import java.util.List; + +public interface MavenFacade extends Remote { + void setLogger(MavenFacadeLogger logger) throws RemoteException; + + MavenFacadeEmbedder createEmbedder(MavenFacadeSettings settings) throws RemoteException; + + MavenFacadeIndexer createIndexer() throws RemoteException; + + MavenModel interpolateAndAlignModel(MavenModel model, File basedir) throws RemoteException; + + MavenModel assembleInheritance(MavenModel model, MavenModel parentModel) throws RemoteException; + + ProfileApplicationResult applyProfiles(MavenModel model, + File basedir, + Collection explicitProfiles, + Collection alwaysOnProfiles) throws RemoteException; + + List getRepositories(String nexusUrl) throws RemoteException; + + List findArtifacts(MavenArtifactInfo template, String nexusUrl) throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeConsole.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeConsole.java new file mode 100644 index 000000000000..84a3bafcf271 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeConsole.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface MavenFacadeConsole extends Remote { + // must be same as in org.codehaus.plexus.logging.Logger + int LEVEL_DEBUG = 0; + int LEVEL_INFO = 1; + int LEVEL_WARN = 2; + int LEVEL_ERROR = 3; + int LEVEL_FATAL = 4; + int LEVEL_DISABLED = 5; + + void printMessage(int level, String message, Throwable throwable) throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeEmbedder.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeEmbedder.java new file mode 100644 index 000000000000..e697ade5ee6c --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeEmbedder.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.*; + +import java.io.File; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface MavenFacadeEmbedder extends Remote { + void customizeForResolve(MavenFacadeConsole console, MavenFacadeProgressIndicator process) throws RemoteException; + + void customizeForResolve(Map projectIdToFileMap, + MavenFacadeConsole console, + MavenFacadeProgressIndicator process) throws RemoteException; + + void customizeForStrictResolve(Map projectIdToFileMap, + MavenFacadeConsole console, + MavenFacadeProgressIndicator process) throws RemoteException; + + @NotNull + MavenWrapperExecutionResult resolveProject(@NotNull File file, + @NotNull Collection activeProfiles) throws RemoteException, + MavenFacadeProcessCanceledException; + + @NotNull + MavenArtifact resolve(@NotNull MavenArtifactInfo info, + @NotNull List remoteRepositories) throws RemoteException, + MavenFacadeProcessCanceledException; + + @NotNull + List resolveTransitively(@NotNull List artifacts, + @NotNull List remoteRepositories) throws RemoteException, + MavenFacadeProcessCanceledException; + + Collection resolvePlugin(@NotNull MavenPlugin plugin, + @NotNull List repositories, + int nativeMavenProjectId, + boolean transitive) throws RemoteException, MavenFacadeProcessCanceledException; + + @NotNull + MavenWrapperExecutionResult execute(@NotNull File file, + @NotNull Collection activeProfiles, + @NotNull List goals) throws RemoteException, + MavenFacadeProcessCanceledException; + + void reset() throws RemoteException; + + void release() throws RemoteException; + + void clearCaches() throws RemoteException; + + void clearCachesFor(MavenId projectId) throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexer.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexer.java new file mode 100644 index 000000000000..99e1511f0076 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexer.java @@ -0,0 +1,59 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.apache.lucene.search.Query; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; + +import java.io.File; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +public interface MavenFacadeIndexer extends Remote { + String SEARCH_TERM_COORDINATES = "u"; // see org.sonatype.nexus.index.ArtifactInfo + String SEARCH_TERM_CLASS_NAMES = "c"; + + int createIndex(@NotNull String indexId, + @Nullable String repositoryId, + @Nullable File file, + @Nullable String url, + @NotNull File indexDir) throws RemoteException, MavenFacadeIndexerException; + + void releaseIndex(int id) throws RemoteException, MavenFacadeIndexerException; + + int getIndexCount() throws RemoteException; + + void updateIndex(int id, MavenFacadeSettings settings, MavenFacadeProgressIndicator indicator) throws RemoteException, + MavenFacadeIndexerException, + MavenFacadeProcessCanceledException; + + List getAllArtifacts(int indexId) throws RemoteException, MavenFacadeIndexerException; + + MavenId addArtifact(int indexId, File artifactFile) throws RemoteException, MavenFacadeIndexerException; + + Set search(int indexId, Query query, int maxResult) throws RemoteException, MavenFacadeIndexerException; + + Collection getArchetypes() throws RemoteException; + + void release() throws RemoteException; +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManager.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java similarity index 64% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManager.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java index 315333403fa7..92ed5ad26499 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManager.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.facade.remote; +package org.jetbrains.idea.maven.facade; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +public class MavenFacadeIndexerException extends Exception { + public MavenFacadeIndexerException(String message) { + super(message); + } -/** - * @author Gregory.Shrago - */ -public interface MavenFacadeManager { - MavenFacade getMavenFacade(@NotNull final Object key) throws Exception; - void releaseMavenFacade(@NotNull Object key); + public MavenFacadeIndexerException(Exception cause) { + super(null, cause); + } } diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeLogger.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeLogger.java new file mode 100644 index 000000000000..563492e56eed --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeLogger.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface MavenFacadeLogger extends Remote { + void info(Throwable e) throws RemoteException; + + void warn(Throwable e) throws RemoteException; + + void error(Throwable e) throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProcessCanceledException.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProcessCanceledException.java new file mode 100644 index 000000000000..f0d0d4a68dcb --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProcessCanceledException.java @@ -0,0 +1,21 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import java.rmi.RemoteException; + +public class MavenFacadeProcessCanceledException extends Exception { +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProgressIndicator.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProgressIndicator.java new file mode 100644 index 000000000000..48a400df6922 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeProgressIndicator.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface MavenFacadeProgressIndicator extends Remote { + void setText(String text) throws RemoteException; + void setText2(String text) throws RemoteException; + + boolean isCanceled() throws RemoteException; + + void setIndeterminate(boolean value) throws RemoteException; + + void setFraction(double fraction) throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeSettings.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeSettings.java new file mode 100644 index 000000000000..0253ede5222c --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeSettings.java @@ -0,0 +1,107 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.Serializable; + +public class MavenFacadeSettings implements Serializable { + public enum UpdatePolicy { + ALWAYS_UPDATE, DO_NOT_UPDATE + } + + private int myLoggingLevel; + @Nullable private File myMavenHome; + @Nullable private File myUserSettingsFile; + @Nullable private File myGlobalSettingsFile; + @Nullable private File myLocalRepository; + private boolean isOffline; + @NotNull private UpdatePolicy myPluginUpdatePolicy = UpdatePolicy.DO_NOT_UPDATE; + @NotNull private UpdatePolicy mySnapshotUpdatePolicy = UpdatePolicy.ALWAYS_UPDATE; + + public int getLoggingLevel() { + return myLoggingLevel; + } + + public void setLoggingLevel(int loggingLevel) { + myLoggingLevel = loggingLevel; + } + + @Nullable + public File getMavenHome() { + return myMavenHome; + } + + public void setMavenHome(@Nullable File mavenHome) { + myMavenHome = mavenHome; + } + + @Nullable + public File getUserSettingsFile() { + return myUserSettingsFile; + } + + public void setUserSettingsFile(@Nullable File userSettingsFile) { + myUserSettingsFile = userSettingsFile; + } + + @Nullable + public File getGlobalSettingsFile() { + return myGlobalSettingsFile; + } + + public void setGlobalSettingsFile(@Nullable File globalSettingsFile) { + myGlobalSettingsFile = globalSettingsFile; + } + + @Nullable + public File getLocalRepository() { + return myLocalRepository; + } + + public void setLocalRepository(@Nullable File localRepository) { + myLocalRepository = localRepository; + } + + public boolean isOffline() { + return isOffline; + } + + public void setOffline(boolean offline) { + isOffline = offline; + } + + @NotNull + public UpdatePolicy getPluginUpdatePolicy() { + return myPluginUpdatePolicy; + } + + public void setPluginUpdatePolicy(@NotNull UpdatePolicy pluginUpdatePolicy) { + myPluginUpdatePolicy = pluginUpdatePolicy; + } + + @NotNull + public UpdatePolicy getSnapshotUpdatePolicy() { + return mySnapshotUpdatePolicy; + } + + public void setSnapshotUpdatePolicy(@NotNull UpdatePolicy snapshotUpdatePolicy) { + mySnapshotUpdatePolicy = snapshotUpdatePolicy; + } +} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteTransferListener.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeTransferListener.java similarity index 96% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteTransferListener.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeTransferListener.java index 172c7a051476..42288d17f156 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteTransferListener.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeTransferListener.java @@ -1,4 +1,4 @@ -package org.jetbrains.idea.maven.facade.remote; +package org.jetbrains.idea.maven.facade; import java.io.File; import java.io.Serializable; @@ -8,7 +8,7 @@ import java.rmi.RemoteException; /** * @author Gregory.Shrago */ -public interface RemoteTransferListener extends Remote { +public interface MavenFacadeTransferListener extends Remote { void transferInitiated(TransferEvent transferEvent) throws RemoteException; void transferStarted(TransferEvent transferEvent) throws RemoteException; @@ -21,9 +21,7 @@ public interface RemoteTransferListener extends Remote { void debug(String s) throws RemoteException; - class TransferEvent implements Serializable { - public enum EventType { INITIATED, STARTED, COMPLETED, PROGRESS, ERROR } public enum RequestType { PUT, GET } @@ -74,7 +72,6 @@ public interface RemoteTransferListener extends Remote { } class Resource implements Serializable { - private final String myResourceName; private final long myResourceLastModified; private final long myResourceContentLength; diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java new file mode 100644 index 000000000000..164bbe44aaa3 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2009 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 org.jetbrains.idea.maven.facade; + +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +public class MavenFacadeUtil { + private static volatile Properties mySystemPropertiesCache; + + public static Properties collectSystemProperties() { + + if (mySystemPropertiesCache == null) { + Properties result = new Properties(); + result.putAll(getSystemProperties()); + + Properties envVars = getEnvProperties(); + for (Map.Entry each : envVars.entrySet()) { + result.setProperty("env." + each.getKey().toString(), each.getValue().toString()); + } + mySystemPropertiesCache = result; + } + + return mySystemPropertiesCache; + } + + public static void resetSystemPropertiesCache() { + mySystemPropertiesCache = null; + } + + @SuppressWarnings({"unchecked"}) + private static Properties getSystemProperties() { + Properties result = (Properties)System.getProperties().clone(); + for (String each : new HashSet((Set)result.keySet())) { + if (each.startsWith("idea.")) { + result.remove(each); + } + } + return result; + } + + private static Properties getEnvProperties() { + Properties result = new Properties(); + for (Map.Entry each : System.getenv().entrySet()) { + if (isMagicalProperty(each.getKey())) continue; + result.put(each.getKey(), each.getValue()); + } + return result; + } + + private static boolean isMagicalProperty(String key) { + return key.startsWith("="); + } +} \ No newline at end of file diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenWrapperExecutionResult.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenWrapperExecutionResult.java new file mode 100644 index 000000000000..c382aa546dc5 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenWrapperExecutionResult.java @@ -0,0 +1,59 @@ +/* + * Copyright 2000-2009 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenId; +import org.jetbrains.idea.maven.model.MavenModel; +import org.jetbrains.idea.maven.model.MavenProfile; +import org.jetbrains.idea.maven.model.MavenProjectProblem; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public class MavenWrapperExecutionResult implements Serializable { + @Nullable public final ProjectData projectData; + @NotNull public final Collection problems; + @NotNull public final Set unresolvedArtifacts; + + public MavenWrapperExecutionResult(ProjectData projectData, + Collection problems, + Set unresolvedArtifacts) { + this.projectData = projectData; + this.problems = problems; + this.unresolvedArtifacts = unresolvedArtifacts; + } + + public static class ProjectData implements Serializable { + public final MavenModel mavenModel; + public final Map mavenModelMap; + public final NativeMavenProjectHolder nativeMavenProject; + public final Collection activatedProfiles; + + public ProjectData(MavenModel mavenModel, + Map mavenModelMap, + NativeMavenProjectHolder nativeMavenProject, + Collection activatedProfiles) { + this.mavenModel = mavenModel; + this.mavenModelMap = mavenModelMap; + this.nativeMavenProject = nativeMavenProject; + this.activatedProfiles = activatedProfiles; + } + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/NativeMavenProjectHolder.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/NativeMavenProjectHolder.java new file mode 100644 index 000000000000..8569f96507a6 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/NativeMavenProjectHolder.java @@ -0,0 +1,8 @@ +package org.jetbrains.idea.maven.facade; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface NativeMavenProjectHolder extends Remote { + int getId() throws RemoteException; +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/ProfileApplicationResult.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/ProfileApplicationResult.java new file mode 100644 index 000000000000..8297c26cebba --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/ProfileApplicationResult.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.idea.maven.model.MavenModel; +import org.jetbrains.idea.maven.model.MavenProfile; + +import java.io.Serializable; +import java.util.List; + +public class ProfileApplicationResult implements Serializable { + private final MavenModel myModel; + private final List myActivatedProfiles; + + public ProfileApplicationResult(MavenModel model, List activatedProfiles) { + myModel = model; + myActivatedProfiles = activatedProfiles; + } + + public MavenModel getModel() { + return myModel; + } + + public List getActivatedProfiles() { + return myActivatedProfiles; + } +} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteImpl.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java similarity index 58% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteImpl.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java index 4f5b944710cb..9b9531ea6c72 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteImpl.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java @@ -1,4 +1,4 @@ -package org.jetbrains.idea.maven.facade.remote.impl; +package org.jetbrains.idea.maven.facade; import com.intellij.util.containers.ContainerUtil; @@ -12,50 +12,43 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -/** - * @author Gregory.Shrago - */ -public class RemoteImpl implements Remote, Unreferenced { - private final Map myChildren = new ConcurrentHashMap(); - private final WeakReference myWeakRef; - private RemoteImpl myParent; +public abstract class RemoteObject implements Remote, Unreferenced { + private final Map myChildren = new ConcurrentHashMap(); + private final WeakReference myWeakRef; + private RemoteObject myParent; - public RemoteImpl() { - myWeakRef = new WeakReference(this); + public RemoteObject() { + myWeakRef = new WeakReference(this); } - public WeakReference getWeakRef() { + public WeakReference getWeakRef() { return myWeakRef; } protected T export(final T child) throws RemoteException { if (child == null) return null; final T result = (T)UnicastRemoteObject.exportObject(child, 0); - myChildren.put((RemoteImpl)child, result); - ((RemoteImpl)child).myParent = this; + myChildren.put((RemoteObject)child, result); + ((RemoteObject)child).myParent = this; return result; } - protected T export2(final T child) throws RemoteException { - return export(child); - } - public void unexportChildren() throws RemoteException { - final ArrayList childrenRefs = new ArrayList(myChildren.keySet()); + final ArrayList childrenRefs = new ArrayList(myChildren.keySet()); myChildren.clear(); - for (RemoteImpl child : childrenRefs) { + for (RemoteObject child : childrenRefs) { child.unreferenced(); } } - protected void unexportChildren(Collection> children) throws RemoteException { + protected void unexportChildren(Collection> children) throws RemoteException { if (children.isEmpty()) return; - final ArrayList list = new ArrayList(children.size()); - for (WeakReference child : children) { + final ArrayList list = new ArrayList(children.size()); + for (WeakReference child : children) { ContainerUtil.addIfNotNull(child.get(), list); } myChildren.keySet().removeAll(list); - for (RemoteImpl child : list) { + for (RemoteObject child : list) { child.unreferenced(); } } @@ -65,14 +58,19 @@ public class RemoteImpl implements Remote, Unreferenced { while (cause.getCause() != null) { cause = cause.getCause(); } - if (!cause.getClass().getName().startsWith("java")) { - final Throwable replaceWith = new RuntimeException(cause.toString()); - replaceWith.setStackTrace(cause.getStackTrace()); - cause = replaceWith; - } + cause = wrapException(cause); throw cause instanceof RuntimeException ? (RuntimeException)cause : new RuntimeException(cause); } + public static Throwable wrapException(Throwable ex) { + if (!ex.getClass().getName().startsWith("java")) { + final Throwable replaceWith = new RuntimeException(ex.toString()); + replaceWith.setStackTrace(ex.getStackTrace()); + ex = replaceWith; + } + return ex; + } + public Object wrapIfNeeded(Object o) throws RemoteException { if (o == null) return o; if (o.getClass().getClassLoader() == null || diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/ArchetypeInfo.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArchetype.java similarity index 82% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/ArchetypeInfo.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArchetype.java index 1cde3f65f138..25736abe5ce5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/ArchetypeInfo.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArchetype.java @@ -13,29 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.indices; +package org.jetbrains.idea.maven.model; import com.intellij.openapi.util.text.StringUtil; -import org.apache.maven.archetype.catalog.Archetype; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class ArchetypeInfo { +import java.io.Serializable; + +public class MavenArchetype implements Serializable { public final String groupId; public final String artifactId; public final String version; public final String repository; public final String description; - public ArchetypeInfo(Archetype archetype) { - this(archetype.getGroupId(), - archetype.getArtifactId(), - archetype.getVersion(), - archetype.getRepository(), - archetype.getDescription()); - } - - public ArchetypeInfo(@NotNull String groupId, + public MavenArchetype(@NotNull String groupId, @NotNull String artifactId, @NotNull String version, @Nullable String repository, @@ -52,7 +45,7 @@ public class ArchetypeInfo { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ArchetypeInfo that = (ArchetypeInfo)o; + MavenArchetype that = (MavenArchetype)o; if (groupId != null ? !groupId.equals(that.groupId) : that.groupId != null) return false; if (artifactId != null ? !artifactId.equals(that.artifactId) : that.artifactId != null) return false; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifact.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java similarity index 64% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifact.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java index ba9f2b0c582d..a24d163340ed 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifact.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifact.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -14,95 +14,59 @@ * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.VirtualFileManager; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.handler.ArtifactHandler; -import org.codehaus.plexus.component.repository.ComponentDependency; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.CustomArtifact; -import org.jetbrains.idea.maven.utils.MavenConstants; import java.io.File; import java.io.Serializable; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; - -import static org.jetbrains.idea.maven.project.MavenId.append; public class MavenArtifact implements Serializable { - private String myGroupId; - private String myArtifactId; - private String myVersion; - private String myBaseVersion; - private String myType; - private String myClassifier; + private final String myGroupId; + private final String myArtifactId; + private final String myVersion; + private final String myBaseVersion; + private final String myType; + private final String myClassifier; private String myScope; - private boolean myOptional; + private final boolean myOptional; - private String myExtension; + private final String myExtension; - private File myFile; - private boolean myResolved; - private boolean myStubbed; - - protected MavenArtifact() { - } - - public MavenArtifact(Artifact artifact, File localRepository) { - myGroupId = artifact.getGroupId(); - myArtifactId = artifact.getArtifactId(); - myVersion = artifact.getVersion(); - myBaseVersion = artifact.getBaseVersion(); - myType = artifact.getType(); - myClassifier = artifact.getClassifier(); - - myScope = artifact.getScope(); - myOptional = artifact.isOptional(); - - myExtension = getExtension(artifact); - - myFile = artifact.getFile(); - if (myFile == null) { - myFile = new File(localRepository, getRelativePath()); - } - - myResolved = artifact.isResolved(); - myStubbed = artifact instanceof CustomArtifact && ((CustomArtifact)artifact).isStub(); - } - - public MavenArtifact(ComponentDependency dependency, File localRepository, String scope) { - myGroupId = dependency.getGroupId(); - myArtifactId = dependency.getArtifactId(); - myVersion = dependency.getVersion(); - myBaseVersion = null; - myType = dependency.getType(); - myClassifier = null; + private final File myFile; + private final boolean myResolved; + private final boolean myStubbed; + public MavenArtifact(String groupId, + String artifactId, + String version, + String baseVersion, + String type, + String classifier, + String scope, + boolean optional, + String extension, + @Nullable File file, + File localRepository, + boolean resolved, + boolean stubbed) { + myGroupId = groupId; + myArtifactId = artifactId; + myVersion = version; + myBaseVersion = baseVersion; + myType = type; + myClassifier = classifier; myScope = scope; - myOptional = false; - - myExtension = myType; - - myFile = new File(localRepository, getRelativePath()); - - myResolved = true; - myStubbed = false; - } - - private String getExtension(Artifact artifact) { - ArtifactHandler handler = artifact.getArtifactHandler(); - String result = null; - if (handler != null) result = handler.getExtension(); - if (result == null) result = artifact.getType(); - return result; + myOptional = optional; + myExtension = extension; + myFile = file != null ? file : new File(localRepository, getRelativePath()); + myResolved = resolved; + myStubbed = stubbed; } public String getGroupId() { @@ -143,7 +107,7 @@ public class MavenArtifact implements Serializable { public boolean isExportable() { if (myOptional) return false; - return Artifact.SCOPE_COMPILE.equals(myScope) || Artifact.SCOPE_RUNTIME.equals(myScope); + return MavenConstants.SCOPE_COMPILE.equals(myScope) || MavenConstants.SCOPE_RUNTIME.equals(myScope); } public String getExtension() { @@ -197,11 +161,7 @@ public class MavenArtifact implements Serializable { return result.toString(); } - public String getUrl() { - return getUrlForExtraArtifact(null, null); - } - - public String getUrlForExtraArtifact(@Nullable String extraArtifactClassifier, @Nullable String customExtension) { + public String getPathForExtraArtifact(@Nullable String extraArtifactClassifier, @Nullable String customExtension) { String path = getPath(); if (!StringUtil.isEmptyOrSpaces(extraArtifactClassifier)) { @@ -223,15 +183,15 @@ public class MavenArtifact implements Serializable { path = repoPath + getRelativePathForExtraArtifact(extraArtifactClassifier, customExtension); } } - return VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, path) + JarFileSystem.JAR_SEPARATOR; + return path; } public String getDisplayStringSimple() { StringBuilder builder = new StringBuilder(); - append(builder, myGroupId); - append(builder, myArtifactId); - append(builder, myVersion); + MavenId.append(builder, myGroupId); + MavenId.append(builder, myArtifactId); + MavenId.append(builder, myVersion); return builder.toString(); } @@ -239,10 +199,10 @@ public class MavenArtifact implements Serializable { public String getDisplayStringWithType() { StringBuilder builder = new StringBuilder(); - append(builder, myGroupId); - append(builder, myArtifactId); - append(builder, myType); - append(builder, myVersion); + MavenId.append(builder, myGroupId); + MavenId.append(builder, myArtifactId); + MavenId.append(builder, myType); + MavenId.append(builder, myVersion); return builder.toString(); } @@ -250,11 +210,11 @@ public class MavenArtifact implements Serializable { public String getDisplayStringWithTypeAndClassifier() { StringBuilder builder = new StringBuilder(); - append(builder, myGroupId); - append(builder, myArtifactId); - append(builder, myType); - if (!StringUtil.isEmptyOrSpaces(myClassifier)) append(builder, myClassifier); - append(builder, myVersion); + MavenId.append(builder, myGroupId); + MavenId.append(builder, myArtifactId); + MavenId.append(builder, myType); + if (!StringUtil.isEmptyOrSpaces(myClassifier)) MavenId.append(builder, myClassifier); + MavenId.append(builder, myVersion); return builder.toString(); } @@ -262,12 +222,12 @@ public class MavenArtifact implements Serializable { public String getDisplayStringFull() { StringBuilder builder = new StringBuilder(); - append(builder, myGroupId); - append(builder, myArtifactId); - append(builder, myType); - if (!StringUtil.isEmptyOrSpaces(myClassifier)) append(builder, myClassifier); - append(builder, myVersion); - if (!StringUtil.isEmptyOrSpaces(myScope)) append(builder, myScope); + MavenId.append(builder, myGroupId); + MavenId.append(builder, myArtifactId); + MavenId.append(builder, myType); + if (!StringUtil.isEmptyOrSpaces(myClassifier)) MavenId.append(builder, myClassifier); + MavenId.append(builder, myVersion); + if (!StringUtil.isEmptyOrSpaces(myScope)) MavenId.append(builder, myScope); return builder.toString(); } @@ -275,14 +235,14 @@ public class MavenArtifact implements Serializable { public String getDisplayStringForLibraryName() { StringBuilder builder = new StringBuilder(); - append(builder, myGroupId); - append(builder, myArtifactId); + MavenId.append(builder, myGroupId); + MavenId.append(builder, myArtifactId); - if (!StringUtil.isEmptyOrSpaces(myType) && !MavenConstants.TYPE_JAR.equals(myType)) append(builder, myType); - if (!StringUtil.isEmptyOrSpaces(myClassifier)) append(builder, myClassifier); + if (!StringUtil.isEmptyOrSpaces(myType) && !MavenConstants.TYPE_JAR.equals(myType)) MavenId.append(builder, myType); + if (!StringUtil.isEmptyOrSpaces(myClassifier)) MavenId.append(builder, myClassifier); String version = !StringUtil.isEmptyOrSpaces(myBaseVersion) ? myBaseVersion : myVersion; - if (!StringUtil.isEmptyOrSpaces(version)) append(builder, version); + if (!StringUtil.isEmptyOrSpaces(version)) MavenId.append(builder, version); return builder.toString(); } diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactInfo.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactInfo.java new file mode 100644 index 000000000000..04a025867119 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactInfo.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenArtifactInfo implements Serializable { + private final String myGroupId; + private final String myArtifactId; + private final String myVersion; + private final String myPackaging; + private final String myClassifier; + private final String myClassNames; + private final String myRepositoryId; + + public MavenArtifactInfo(MavenId id, + String packaging, + String classifier) { + this(id.getGroupId(), id.getArtifactId(), id.getVersion(), packaging, classifier); + } + + public MavenArtifactInfo(String groupId, + String artifactId, + String version, + String packaging, + String classifier) { + this(groupId, artifactId, version, packaging, classifier, null, null); + } + + public MavenArtifactInfo(String groupId, + String artifactId, + String version, + String packaging, + String classifier, + String classNames, + String repositoryId) { + myGroupId = groupId; + myArtifactId = artifactId; + myVersion = version; + myPackaging = packaging; + myClassifier = classifier; + myClassNames = classNames; + myRepositoryId = repositoryId; + } + + public String getGroupId() { + return myGroupId; + } + + public String getArtifactId() { + return myArtifactId; + } + + public String getVersion() { + return myVersion; + } + + public String getPackaging() { + return myPackaging; + } + + public String getClassifier() { + return myClassifier; + } + + public String getClassNames() { + return myClassNames; + } + + public String getRepositoryId() { + return myRepositoryId; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactNode.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactNode.java similarity index 82% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactNode.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactNode.java index 27760ef3cf97..e7f87d623f69 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactNode.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; @@ -23,23 +23,19 @@ import java.io.Serializable; import java.util.List; public class MavenArtifactNode implements Serializable { + private final MavenArtifactNode myParent; - private MavenArtifactNode myParent; + private final MavenArtifact myArtifact; + private final MavenArtifactState myState; + private final MavenArtifact myRelatedArtifact; - private MavenArtifact myArtifact; - private MavenArtifactState myState; - private MavenArtifact myRelatedArtifact; + private final String myOriginalScope; - private String myOriginalScope; - - private String myPremanagedVersion; - private String myPremanagedScope; + private final String myPremanagedVersion; + private final String myPremanagedScope; private List myDependencies; - protected MavenArtifactNode() { - } - public MavenArtifactNode(MavenArtifactNode parent, MavenArtifact artifact, MavenArtifactState state, @@ -62,7 +58,6 @@ public class MavenArtifactNode implements Serializable { } - public MavenArtifact getArtifact() { return myArtifact; } @@ -101,8 +96,10 @@ public class MavenArtifactNode implements Serializable { @Override public String toString() { - String result =myArtifact.getDisplayStringWithTypeAndClassifier(); - if (myState != MavenArtifactState.ADDED) result += "[" + myState + ":" + myRelatedArtifact.getDisplayStringWithTypeAndClassifier() + "]"; + String result = myArtifact.getDisplayStringWithTypeAndClassifier(); + if (myState != MavenArtifactState.ADDED) { + result += "[" + myState + ":" + myRelatedArtifact.getDisplayStringWithTypeAndClassifier() + "]"; + } return result += "->(" + formatNodesList(myDependencies) + ")"; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactState.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactState.java similarity index 94% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactState.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactState.java index aabf184d7000..6f519c809895 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactState.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenArtifactState.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; /** * @author Konstantin Bulenkov diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuild.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuild.java new file mode 100644 index 000000000000..e3143b3524f2 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuild.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import com.intellij.util.SmartList; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class MavenBuild extends MavenBuildBase implements Serializable { + private String myOutputDirectory; + private String myTestOutputDirectory; + private List mySources; + private List myTestSources; + + public String getOutputDirectory() { + return myOutputDirectory; + } + + public void setOutputDirectory(String outputDirectory) { + myOutputDirectory = outputDirectory; + } + + public String getTestOutputDirectory() { + return myTestOutputDirectory; + } + + public void setTestOutputDirectory(String testOutputDirectory) { + myTestOutputDirectory = testOutputDirectory; + } + + public List getSources() { + return mySources == null ? Collections.emptyList() : mySources; + } + + public void setSources(List sources) { + mySources = new ArrayList(sources); + } + + public void addSource(String source) { + if (mySources == null) mySources = new ArrayList(); + mySources.add(source); + } + + public List getTestSources() { + return myTestSources == null ? Collections.emptyList() : myTestSources; + } + + public void setTestSources(List testSources) { + myTestSources = new ArrayList(testSources); + } + + public void addTestSource(String source) { + if (myTestSources == null) myTestSources = new ArrayList(); + myTestSources.add(source); + } +} \ No newline at end of file diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuildBase.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuildBase.java new file mode 100644 index 000000000000..c4bf944a947c --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenBuildBase.java @@ -0,0 +1,77 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; +import java.util.Collections; +import java.util.List; + +public class MavenBuildBase implements Serializable { + private String myFinalName; + private String myDefaultGoal; + private String myDirectory; + private List myResources; + private List myTestResources; + private List myFilters; + + public String getFinalName() { + return myFinalName; + } + + public void setFinalName(String finalName) { + myFinalName = finalName; + } + + public String getDefaultGoal() { + return myDefaultGoal; + } + + public void setDefaultGoal(String defaultGoal) { + myDefaultGoal = defaultGoal; + } + + public String getDirectory() { + return myDirectory; + } + + public void setDirectory(String directory) { + myDirectory = directory; + } + + public List getResources() { + return myResources == null ? Collections.emptyList() : myResources; + } + + public void setResources(List resources) { + myResources = resources; + } + + public List getTestResources() { + return myTestResources == null ? Collections.emptyList() : myTestResources; + } + + public void setTestResources(List testResources) { + myTestResources = testResources; + } + + public List getFilters() { + return myFilters == null ? Collections.emptyList() : myFilters; + } + + public void setFilters(List filters) { + myFilters = filters; + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenConstants.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenConstants.java similarity index 58% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenConstants.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenConstants.java index ec46dd7be7af..74e29dd5c1c4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenConstants.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenConstants.java @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.utils; +package org.jetbrains.idea.maven.model; + +import java.util.Arrays; +import java.util.List; public class MavenConstants { public static final String POM_EXTENSION = "pom"; @@ -22,6 +25,10 @@ public class MavenConstants { public static final String PROFILES_XML = "profiles.xml"; public static final String SETTINGS_XML = "settings.xml"; + public static final String PROFILE_FROM_POM = "pom"; + public static final String PROFILE_FROM_PROFILES_XML = "profiles.xml"; + public static final String PROFILE_FROM_SETTINGS_XML = "settings.xml"; + public static final String TYPE_POM = "pom"; public static final String TYPE_JAR = "jar"; public static final String TYPE_TEST_JAR = "test-jar"; @@ -33,4 +40,16 @@ public class MavenConstants { public static final String SCOPE_TEST = "test"; public static final String SCOPE_SYSTEM = "system"; public static final String SCOPE_IMPORT = "import"; + + public static final List PHASES = + Arrays.asList("clean", "validate", "generate-sources", "process-sources", "generate-resources", + "process-resources", "compile", "process-classes", "generate-test-sources", "process-test-sources", + "generate-test-resources", + "process-test-resources", "test-compile", "test", "prepare-package", "package", "pre-integration-test", + "integration-test", + "post-integration-test", + "verify", "install", "site", "deploy"); + public static final List BASIC_PHASES = + Arrays.asList("clean", "validate", "compile", "test", "package", "install", "deploy", "site"); + } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenId.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenId.java similarity index 84% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenId.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenId.java index cb38c558d66f..7b354ceb9f48 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenId.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenId.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -13,10 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.model.Model; +package org.jetbrains.idea.maven.model; import java.io.Serializable; @@ -28,17 +25,9 @@ public class MavenId implements Serializable { private final String myVersion; public MavenId(String groupId, String artifactId, String version) { - this.myGroupId = groupId; - this.myArtifactId = artifactId; - this.myVersion = version; - } - - public MavenId(Model model) { - this(model.getGroupId(), model.getArtifactId(), model.getVersion()); - } - - public MavenId(Artifact artifact) { - this(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion()); + myGroupId = groupId; + myArtifactId = artifactId; + myVersion = version; } public String getGroupId() { diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModel.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModel.java new file mode 100644 index 000000000000..3eb8aa7d20d7 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModel.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.util.List; + +public class MavenModel extends MavenModelBase { + private MavenId myMavenId; + private MavenParent myParent; + private String myPackaging; + private String myName; + + private List myProfiles; + + private final MavenBuild myBuild = new MavenBuild(); + + public MavenId getMavenId() { + return myMavenId; + } + + public void setMavenId(MavenId mavenId) { + myMavenId = mavenId; + } + + public MavenParent getParent() { + return myParent; + } + + public void setParent(MavenParent parent) { + myParent = parent; + } + + public String getPackaging() { + return myPackaging; + } + + public void setPackaging(String packaging) { + myPackaging = packaging; + } + + public String getName() { + return myName; + } + + public void setName(String name) { + myName = name; + } + + public List getProfiles() { + return myProfiles; + } + + public void setProfiles(List profiles) { + myProfiles = profiles; + } + + public MavenBuild getBuild() { + return myBuild; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModelBase.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModelBase.java new file mode 100644 index 000000000000..6296b2971bf5 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenModelBase.java @@ -0,0 +1,88 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; +import java.util.List; +import java.util.Properties; + +public class MavenModelBase implements Serializable { + private Properties myProperties; + private List myPlugins; + private List myExtensions; + private List myDependencies; + private List myDependencyTree; + private List myRemoteRepositories; + + private List myModules; + + public Properties getProperties() { + if (myProperties == null) myProperties = new Properties(); + return myProperties; + } + + public void setProperties(Properties properties) { + myProperties = properties; + } + + public List getPlugins() { + return myPlugins; + } + + public void setPlugins(List plugins) { + myPlugins = plugins; + } + + public List getExtensions() { + return myExtensions; + } + + public void setExtensions(List extensions) { + myExtensions = extensions; + } + + public List getDependencies() { + return myDependencies; + } + + public void setDependencies(List dependencies) { + myDependencies = dependencies; + } + + public List getDependencyTree() { + return myDependencyTree; + } + + public void setDependencyTree(List dependencyTree) { + myDependencyTree = dependencyTree; + } + + public List getRemoteRepositories() { + return myRemoteRepositories; + } + + public void setRemoteRepositories(List remoteRepositories) { + myRemoteRepositories = remoteRepositories; + } + + public List getModules() { + return myModules; + } + + public void setModules(List modules) { + myModules = modules; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenParent.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenParent.java new file mode 100644 index 000000000000..b75d61e209f4 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenParent.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenParent implements Serializable { + private final MavenId myMavenId; + private final String myRelativePath; + + public MavenParent(MavenId id, String relativePath) { + myMavenId = id; + myRelativePath = relativePath; + } + + public MavenId getMavenId() { + return myMavenId; + } + + public String getRelativePath() { + return myRelativePath; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenPlugin.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenPlugin.java similarity index 63% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenPlugin.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenPlugin.java index 3f9245830bac..9f6c8efb1e84 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenPlugin.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -14,80 +14,43 @@ * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; import com.intellij.openapi.util.JDOMUtil; -import com.intellij.xml.util.XmlUtil; -import org.apache.maven.model.Dependency; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.PluginExecution; -import org.codehaus.plexus.util.xml.Xpp3Dom; import org.jdom.Element; -import org.jdom.IllegalNameException; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.utils.MavenLog; import java.io.Serializable; -import java.util.ArrayList; import java.util.List; -import static org.jetbrains.idea.maven.project.MavenId.append; +import static org.jetbrains.idea.maven.model.MavenId.append; public class MavenPlugin implements Serializable { - private String myGroupId; - private String myArtifactId; - private String myVersion; + private final String myGroupId; + private final String myArtifactId; + private final String myVersion; - private boolean myDefault; + private final boolean myDefault; - private Element myConfiguration; - private final List myExecutions = new ArrayList(); + private final Element myConfiguration; + private final List myExecutions; - private final List myDependencies = new ArrayList(); + private final List myDependencies; - protected MavenPlugin() { - } - - public MavenPlugin(Plugin plugin, boolean isDefault) { - myGroupId = plugin.getGroupId(); - myArtifactId = plugin.getArtifactId(); - myVersion = plugin.getVersion(); - - myDefault = isDefault; - - Xpp3Dom config = (Xpp3Dom)plugin.getConfiguration(); - myConfiguration = config == null ? null : xppToElement(config); - - for (PluginExecution each : plugin.getExecutions()) { - myExecutions.add(new Execution(each)); - } - - for (Dependency each : plugin.getDependencies()) { - myDependencies.add(new MavenId(each.getGroupId(), each.getArtifactId(), each.getVersion())); - } - } - - private static Element xppToElement(Xpp3Dom xpp) { - Element result = null; - try { - result = new Element(xpp.getName()); - } - catch (IllegalNameException e) { - MavenLog.LOG.warn("Cannot convert plugin configuration: " + xpp, e); - return null; - } - - Xpp3Dom[] children = xpp.getChildren(); - if (children == null || children.length == 0) { - result.setText(xpp.getValue()); - } - else { - for (Xpp3Dom each : children) { - Element child = xppToElement(each); - if (child != null) result.addContent(child); - } - } - return result; + public MavenPlugin(String groupId, + String artifactId, + String version, + boolean aDefault, + Element configuration, + List executions, + List dependencies) { + myGroupId = groupId; + myArtifactId = artifactId; + myVersion = version; + myDefault = aDefault; + myConfiguration = configuration; + myExecutions = executions; + myDependencies = dependencies; } public String getGroupId() { @@ -169,17 +132,12 @@ public class MavenPlugin implements Serializable { } public static class Execution implements Serializable { - private List myGoals; - private Element myConfiguration; + private final List myGoals; + private final Element myConfiguration; - public Execution() { - } - - public Execution(PluginExecution execution) { - myGoals = execution.getGoals(); - - Xpp3Dom config = (Xpp3Dom)execution.getConfiguration(); - myConfiguration = config == null ? null : xppToElement(config); + public Execution(List goals, Element configuration) { + myGoals = goals; + myConfiguration = configuration; } public List getGoals() { diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfile.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfile.java new file mode 100644 index 000000000000..d4e08bf3cd61 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfile.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import org.jetbrains.annotations.NotNull; + +import java.io.Serializable; +import java.util.List; + +public class MavenProfile extends MavenModelBase implements Serializable { + private final String myId; + private final String mySource; + private MavenProfileActivation myActivation; + private final MavenBuildBase myBuild = new MavenBuildBase(); + + public MavenProfile(String id, String source) { + myId = id; + mySource = source; + } + + @NotNull + public String getId() { + return myId; + } + + public String getSource() { + return mySource; + } + + public void setActivation(MavenProfileActivation activation) { + myActivation = activation; + } + + public MavenProfileActivation getActivation() { + return myActivation; + } + + public MavenBuildBase getBuild() { + return myBuild; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java new file mode 100644 index 000000000000..3643f3f20f86 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivation.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenProfileActivation implements Serializable { + private boolean myActiveByDefault; + private MavenProfileActivationOS myOs; + private String myJdk; + private MavenProfileActivationProperty myProperty; + private MavenProfileActivationFile myFile; + + public boolean isActiveByDefault() { + return myActiveByDefault; + } + + public void setActiveByDefault(boolean activeByDefault) { + myActiveByDefault = activeByDefault; + } + + public MavenProfileActivationOS getOs() { + return myOs; + } + + public void setOs(MavenProfileActivationOS os) { + myOs = os; + } + + public String getJdk() { + return myJdk; + } + + public void setJdk(String jdk) { + myJdk = jdk; + } + + public MavenProfileActivationProperty getProperty() { + return myProperty; + } + + public void setProperty(MavenProfileActivationProperty property) { + myProperty = property; + } + + public MavenProfileActivationFile getFile() { + return myFile; + } + + public void setFile(MavenProfileActivationFile file) { + myFile = file; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationFile.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationFile.java new file mode 100644 index 000000000000..58ce8934cb1b --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationFile.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenProfileActivationFile implements Serializable { + private final String myExists; + private final String myMissing; + + public MavenProfileActivationFile(String exists, String missing) { + myExists = exists; + myMissing = missing; + } + + public String getExists() { + return myExists; + } + + public String getMissing() { + return myMissing; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationOS.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationOS.java new file mode 100644 index 000000000000..155cf3630b3f --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationOS.java @@ -0,0 +1,48 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenProfileActivationOS implements Serializable { + private final String myName; + private final String myFamily; + private final String myArch; + private final String myVersion; + + public MavenProfileActivationOS(String name, String family, String arch, String version) { + myName = name; + myFamily = family; + myArch = arch; + myVersion = version; + } + + public String getName() { + return myName; + } + + public String getFamily() { + return myFamily; + } + + public String getArch() { + return myArch; + } + + public String getVersion() { + return myVersion; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationProperty.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationProperty.java new file mode 100644 index 000000000000..1bd5aabef228 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileActivationProperty.java @@ -0,0 +1,36 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.Serializable; + +public class MavenProfileActivationProperty implements Serializable { + private final String myName; + private final String myValue; + + public MavenProfileActivationProperty(String name, String value) { + myName = name; + myValue = value; + } + + public String getName() { + return myName; + } + + public String getValue() { + return myValue; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProfileState.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileKind.java similarity index 83% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProfileState.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileKind.java index a28e0361b402..d42ef7d89251 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProfileState.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProfileKind.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; -public enum MavenProfileState { +public enum MavenProfileKind { NONE, EXPLICIT, IMPLICIT } diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProjectProblem.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProjectProblem.java new file mode 100644 index 000000000000..1511c142d9f2 --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenProjectProblem.java @@ -0,0 +1,96 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import java.io.File; +import java.io.Serializable; +import java.text.MessageFormat; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; + +public class MavenProjectProblem implements Serializable { + public enum ProblemType { + SYNTAX, STRUCTURE, DEPENDENCY, PARENT, SETTINGS_OR_PROFILES + } + + private final String myPath; + private final String myDescription; + private final ProblemType myType; + + public static MavenProjectProblem createStructureProblem(String path, String description) { + return createProblem(path, description, MavenProjectProblem.ProblemType.STRUCTURE); + } + + public static MavenProjectProblem createSyntaxProblem(String path, MavenProjectProblem.ProblemType type) { + return createProblem(path, MessageFormat.format("''{0}'' has syntax errors", new File(path).getName()) , type); + } + + public static MavenProjectProblem createProblem(String path, String description, MavenProjectProblem.ProblemType type) { + return new MavenProjectProblem(path, description, type); + } + + public static Collection createProblemsList() { + return createProblemsList(Collections.emptySet()); + } + + public static Collection createProblemsList(Collection copyThis) { + return new LinkedHashSet(copyThis); + } + + public MavenProjectProblem(String path, String description, ProblemType type) { + myPath = path; + myDescription = description; + myType = type; + } + + public String getPath() { + return myPath; + } + + public String getDescription() { + return myDescription; + } + + public ProblemType getType() { + return myType; + } + + @Override + public String toString() { + return myType + ":" + myDescription + ":" + myPath; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MavenProjectProblem that = (MavenProjectProblem)o; + + if (!myDescription.equals(that.myDescription)) return false; + if (myType != that.myType) return false; + if (!myPath.equals(that.myPath)) return false; + + return true; + } + + public int hashCode() { + int result = myPath.hashCode(); + result = 31 * result + myDescription.hashCode(); + result = 31 * result + myType.hashCode(); + return result; + } +} diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRemoteRepository.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRemoteRepository.java new file mode 100644 index 000000000000..ade0b15278bd --- /dev/null +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRemoteRepository.java @@ -0,0 +1,115 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.model; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.Serializable; + +public class MavenRemoteRepository implements Serializable { + private final String myId; + private final String myName; + private final String myUrl; + private final String myLayout; + private final Policy myReleasesPolicy; + private final Policy mySnapshotsPolicy; + + public MavenRemoteRepository(@NotNull String id, + @Nullable String name, + @NotNull String url, + @Nullable String layout, + @Nullable Policy releasesPolicy, + @Nullable Policy snapshotsPolicy) { + myId = id; + myName = name; + myUrl = url; + myLayout = layout; + myReleasesPolicy = releasesPolicy; + mySnapshotsPolicy = snapshotsPolicy; + } + + @NotNull + public String getId() { + return myId; + } + + @Nullable + public String getName() { + return myName; + } + + @NotNull + public String getUrl() { + return myUrl; + } + + @Nullable + public String getLayout() { + return myLayout; + } + + @Nullable + public Policy getReleasesPolicy() { + return myReleasesPolicy; + } + + @Nullable + public Policy getSnapshotsPolicy() { + return mySnapshotsPolicy; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MavenRemoteRepository that = (MavenRemoteRepository)o; + + if (myId != null ? !myId.equals(that.myId) : that.myId != null) return false; + + return true; + } + + @Override + public int hashCode() { + return myId != null ? myId.hashCode() : 0; + } + + public static class Policy implements Serializable { + private final boolean myEnabled; + private final String myUpdatePolicy; + private final String myChecksumPolicy; + + public Policy(boolean enabled, String updatePolicy, String checksumPolicy) { + myEnabled = enabled; + myUpdatePolicy = updatePolicy; + myChecksumPolicy = checksumPolicy; + } + + public boolean isEnabled() { + return myEnabled; + } + + public String getUpdatePolicy() { + return myUpdatePolicy; + } + + public String getChecksumPolicy() { + return myChecksumPolicy; + } + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectModelProblem.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRepositoryInfo.java similarity index 51% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectModelProblem.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRepositoryInfo.java index 64b378b79779..dd9fd21dc93b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectModelProblem.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenRepositoryInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -13,27 +13,30 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.model; -public class MavenProjectModelProblem { - private final String myDescription; - private final boolean isCritical; +import java.io.Serializable; - public MavenProjectModelProblem(String description, boolean critical) { - myDescription = description; - isCritical = critical; +public class MavenRepositoryInfo implements Serializable { + private final String myId; + private final String myName; + private final String myUrl; + + public MavenRepositoryInfo(String id, String name, String url) { + myId = id; + myName = name; + myUrl = url; } - public String getDescription() { - return myDescription; + public String getId() { + return myId; } - public boolean isCritical() { - return isCritical; + public String getName() { + return myName; } - @Override - public String toString() { - return (isCritical ? "!!!" : "") + myDescription; + public String getUrl() { + return myUrl; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResource.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenResource.java similarity index 74% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResource.java rename to plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenResource.java index 07f139c7cf6a..2f1485934a88 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenResource.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/model/MavenResource.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -13,33 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; - -import org.apache.maven.model.Resource; +package org.jetbrains.idea.maven.model; import java.io.Serializable; -import java.util.Collections; import java.util.List; public class MavenResource implements Serializable { - private String myDirectory; - private boolean myFiltered; - private String myTargetPath; - private List myIncludes; - private List myExcludes; + private final String myDirectory; + private final boolean myFiltered; + private final String myTargetPath; + private final List myIncludes; + private final List myExcludes; - protected MavenResource() { - } - - public MavenResource(Resource resource) { - myDirectory = resource.getDirectory(); - myFiltered = resource.isFiltering(); - myTargetPath = resource.getTargetPath(); - myIncludes = resource.getIncludes(); - myExcludes = resource.getExcludes(); - - if (myIncludes == null) myIncludes = Collections.EMPTY_LIST; - if (myExcludes == null) myExcludes = Collections.EMPTY_LIST; + public MavenResource(String directory, boolean filtered, String targetPath, List includes, List excludes) { + myDirectory = directory; + myFiltered = filtered; + myTargetPath = targetPath; + myIncludes = includes; + myExcludes = excludes; } public String getDirectory() { diff --git a/plugins/maven/lib/activation-1.1.jar b/plugins/maven/facade-impl/lib/activation-1.1.jar similarity index 100% rename from plugins/maven/lib/activation-1.1.jar rename to plugins/maven/facade-impl/lib/activation-1.1.jar diff --git a/plugins/maven/lib/archetype-common-2.0-alpha-4-SNAPSHOT.jar b/plugins/maven/facade-impl/lib/archetype-common-2.0-alpha-4-SNAPSHOT.jar similarity index 100% rename from plugins/maven/lib/archetype-common-2.0-alpha-4-SNAPSHOT.jar rename to plugins/maven/facade-impl/lib/archetype-common-2.0-alpha-4-SNAPSHOT.jar diff --git a/plugins/maven/lib/classworlds-1.1.jar b/plugins/maven/facade-impl/lib/classworlds-1.1.jar similarity index 100% rename from plugins/maven/lib/classworlds-1.1.jar rename to plugins/maven/facade-impl/lib/classworlds-1.1.jar diff --git a/plugins/maven/lib/commons-beanutils.jar b/plugins/maven/facade-impl/lib/commons-beanutils.jar similarity index 100% rename from plugins/maven/lib/commons-beanutils.jar rename to plugins/maven/facade-impl/lib/commons-beanutils.jar diff --git a/plugins/maven/lib/commons-logging-1.1.1.jar b/plugins/maven/facade-impl/lib/commons-logging-1.1.1.jar similarity index 100% rename from plugins/maven/lib/commons-logging-1.1.1.jar rename to plugins/maven/facade-impl/lib/commons-logging-1.1.1.jar diff --git a/plugins/maven/lib/jaxb-api-2.1.jar b/plugins/maven/facade-impl/lib/jaxb-api-2.1.jar similarity index 100% rename from plugins/maven/lib/jaxb-api-2.1.jar rename to plugins/maven/facade-impl/lib/jaxb-api-2.1.jar diff --git a/plugins/maven/lib/jaxb-impl-2.1.10.jar b/plugins/maven/facade-impl/lib/jaxb-impl-2.1.10.jar similarity index 100% rename from plugins/maven/lib/jaxb-impl-2.1.10.jar rename to plugins/maven/facade-impl/lib/jaxb-impl-2.1.10.jar diff --git a/plugins/maven/lib/maven-2.2.1-uber.jar b/plugins/maven/facade-impl/lib/maven-2.2.1-uber.jar similarity index 100% rename from plugins/maven/lib/maven-2.2.1-uber.jar rename to plugins/maven/facade-impl/lib/maven-2.2.1-uber.jar diff --git a/plugins/maven/lib/maven-dependency-tree-1.2.jar b/plugins/maven/facade-impl/lib/maven-dependency-tree-1.2.jar similarity index 100% rename from plugins/maven/lib/maven-dependency-tree-1.2.jar rename to plugins/maven/facade-impl/lib/maven-dependency-tree-1.2.jar diff --git a/plugins/maven/facade-impl/lib/maven-embedder-1.0-SNAPSHOT.jar b/plugins/maven/facade-impl/lib/maven-embedder-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..259be18e5d66d3ee88b20209f23ca05f37cad339 GIT binary patch literal 24562 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%0AMYE$|Udivom*R8Z=ey5j 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 ejQ>qH4rz|EA3aSx{6jYzWWb_$8bgf literal 0 HcmV?d00001 diff --git a/plugins/maven/lib/mercury-artifact-1.0-alpha-6.jar b/plugins/maven/facade-impl/lib/mercury-artifact-1.0-alpha-6.jar similarity index 100% rename from plugins/maven/lib/mercury-artifact-1.0-alpha-6.jar rename to plugins/maven/facade-impl/lib/mercury-artifact-1.0-alpha-6.jar diff --git a/plugins/maven/lib/nexus-indexer-1.2.3.jar b/plugins/maven/facade-impl/lib/nexus-indexer-1.2.3.jar similarity index 100% rename from plugins/maven/lib/nexus-indexer-1.2.3.jar rename to plugins/maven/facade-impl/lib/nexus-indexer-1.2.3.jar diff --git a/plugins/maven/lib/plexus-utils-1.5.5.jar b/plugins/maven/facade-impl/lib/plexus-utils-1.5.5.jar similarity index 100% rename from plugins/maven/lib/plexus-utils-1.5.5.jar rename to plugins/maven/facade-impl/lib/plexus-utils-1.5.5.jar diff --git a/plugins/maven/lib/wadl-core.jar b/plugins/maven/facade-impl/lib/wadl-core.jar similarity index 100% rename from plugins/maven/lib/wadl-core.jar rename to plugins/maven/facade-impl/lib/wadl-core.jar diff --git a/plugins/maven/facade-impl/maven-facade-impl.iml b/plugins/maven/facade-impl/maven-facade-impl.iml new file mode 100644 index 000000000000..44f5bdc8b03c --- /dev/null +++ b/plugins/maven/facade-impl/maven-facade-impl.iml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java new file mode 100644 index 000000000000..457628449ae7 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java @@ -0,0 +1,113 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.facade.embedder.MavenFacadeEmbedderImpl; +import org.jetbrains.idea.maven.facade.embedder.MavenFacadeIndexerImpl; +import org.jetbrains.idea.maven.facade.embedder.MavenModelConverter; +import org.jetbrains.idea.maven.facade.nexus.ArtifactType; +import org.jetbrains.idea.maven.facade.nexus.Endpoint; +import org.jetbrains.idea.maven.facade.nexus.RepositoryType; +import org.jetbrains.idea.maven.facade.nexus.SearchResults; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenModel; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; + +import java.io.File; +import java.math.BigInteger; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +public class MavenFacadeImpl extends RemoteObject implements MavenFacade { + public void setLogger(MavenFacadeLogger logger) throws RemoteException { + MavenFacadeLoggerManager.setLogger(logger); + } + + public MavenFacadeEmbedder createEmbedder(MavenFacadeSettings settings) throws RemoteException { + MavenFacadeEmbedderImpl result = MavenFacadeEmbedderImpl.create(settings); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + + public MavenFacadeIndexer createIndexer() throws RemoteException { + MavenFacadeIndexerImpl result = new MavenFacadeIndexerImpl(); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + + public MavenModel interpolateAndAlignModel(MavenModel model, File basedir) { + return MavenFacadeEmbedderImpl.interpolateAndAlignModel(model, basedir); + } + + public MavenModel assembleInheritance(MavenModel model, MavenModel parentModel) { + return MavenFacadeEmbedderImpl.assembleInheritance(model, parentModel); + } + + public ProfileApplicationResult applyProfiles(MavenModel model, + File basedir, + Collection explicitProfiles, + Collection alwaysOnProfiles) { + return MavenFacadeEmbedderImpl.applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); + } + + public List getRepositories(String nexusUrl) throws RemoteException { + try { + List repos = new Endpoint.Repositories(nexusUrl).getRepolistAsRepositories().getData().getRepositoriesItem(); + List result = new ArrayList(repos.size()); + for (RepositoryType repo : repos) { + if (!"maven2".equals(repo.getProvider())) continue; + result.add(MavenModelConverter.convertRepositoryInfo(repo)); + } + return result; + } + catch (Exception e) { + handleException(e); + throw new AssertionError(); + } + } + + @Nullable + public List findArtifacts(MavenArtifactInfo template, String nexusUrl) throws RemoteException { + try { + SearchResults results = new Endpoint.DataIndex(nexusUrl) + .getArtifactlistAsSearchResults(null, template.getGroupId(), template.getArtifactId(), template.getVersion(), + template.getClassifier(), template.getClassNames()); + final boolean canTrySwitchGAV = template.getArtifactId() == null && template.getGroupId() != null; + final boolean tooManyResults = results.isTooManyResults(); + if (canTrySwitchGAV && (tooManyResults || BigInteger.ZERO.equals(results.getTotalCount()))) { + results = new Endpoint.DataIndex(nexusUrl) + .getArtifactlistAsSearchResults(null, null, template.getGroupId(), template.getVersion(), + template.getClassifier(), template.getClassNames()); + } + if (tooManyResults || results.isTooManyResults()) return null; + + ArrayList result = new ArrayList(); + for (ArtifactType each : results.getData().getArtifact()) { + result.add(MavenModelConverter.convertArtifactInfo(each)); + } + return result; + } + catch (Exception ex) { + handleException(ex); + throw new AssertionError(); + } + } +} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacadeLocator.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLocator.java similarity index 79% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacadeLocator.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLocator.java index b6f8f052ea48..17a3c96670af 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacadeLocator.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLocator.java @@ -1,14 +1,18 @@ -package org.jetbrains.idea.maven.facade.remote; +package org.jetbrains.idea.maven.facade; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; -import org.jetbrains.idea.maven.facade.nexus.ArtifactType; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; -import java.io.*; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.net.URL; import java.net.URLClassLoader; import java.nio.CharBuffer; import java.rmi.registry.LocateRegistry; +import java.util.Collections; import java.util.List; /** @@ -43,8 +47,12 @@ public class MavenFacadeLocator { result.wait(); } } - if (result.isNull()) throw new RuntimeException(); - else return Pair.create((MavenFacade)LocateRegistry.getRegistry(result.get().first).lookup(result.get().second), process); + if (result.isNull()) { + throw new RuntimeException(); + } + else { + return Pair.create((MavenFacade)LocateRegistry.getRegistry(result.get().first).lookup(result.get().second), process); + } } private static void eatOutStreams(Process process, Ref> result) throws Exception { @@ -125,26 +133,23 @@ public class MavenFacadeLocator { final Pair pair = acquireFacade(new String[]{"java", "-cp", systemPath, debug1, debug2, RemoteMavenServer.class.getName()}, null, null); final MavenFacade facade = pair.first; - final MavenFacade.MavenFacadeSettings settings = new MavenFacade.MavenFacadeSettings(); - facade.setMavenSettings(settings); final String lookup = args.length > 0 ? args[0] : "hibernate"; - System.out.println("Looking up: "+lookup); - final List result = facade.findArtifacts(createTemplate(lookup), "http://oss.sonatype.org/service/local/"); - int i=1; - for (ArtifactType type : result) { - System.out.println((++i)+". "+type.getGroupId()+":"+type.getArtifactId()+":"+type.getVersion()); + System.out.println("Looking up: " + lookup); + final List result = facade.findArtifacts(createTemplate(lookup), "http://repository.sonatype.org/service/local/"); + int i = 1; + for (MavenArtifactInfo type : result) { + System.out.println((++i) + ". " + type.getGroupId() + ":" + type.getArtifactId() + ":" + type.getVersion()); } pair.second.destroy(); System.exit(0); } - private static ArtifactType createTemplate(String coord) { - final ArtifactType template = new ArtifactType(); + private static MavenArtifactInfo createTemplate(String coord) { final String[] parts = coord.split(":"); - template.setGroupId(parts.length > 0 ? parts[0] : null); - template.setArtifactId(parts.length > 1 ? parts[1] : null); - template.setVersion(parts.length > 2 ? parts[2] : null); - return template; + return new MavenArtifactInfo(parts.length > 0 ? parts[0] : null, + parts.length > 1 ? parts[1] : null, + parts.length > 2 ? parts[2] : null, + null, null, null, null); } } diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLoggerManager.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLoggerManager.java new file mode 100644 index 000000000000..6f43c766686a --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeLoggerManager.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.jetbrains.idea.maven.facade.embedder.MavenFacadeLoggerWrapper; + +public class MavenFacadeLoggerManager { + private static MavenFacadeLoggerWrapper myLogger; + + public static MavenFacadeLoggerWrapper getLogger() { + return myLogger; + } + + + public static void setLogger(MavenFacadeLogger logger) { + myLogger = new MavenFacadeLoggerWrapper(logger); + } +} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteMavenServer.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/RemoteMavenServer.java similarity index 93% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteMavenServer.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/RemoteMavenServer.java index bbb4223cdb72..dd53d5a269e4 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/RemoteMavenServer.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/RemoteMavenServer.java @@ -13,9 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.facade.remote; - -import org.jetbrains.idea.maven.facade.remote.impl.MavenFacadeImpl; +package org.jetbrains.idea.maven.facade; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifact.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifact.java similarity index 97% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifact.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifact.java index d474223b4a0b..a9ec34ca7a93 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifact.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifact.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import com.intellij.openapi.util.io.FileUtil; import gnu.trove.THashMap; @@ -25,7 +25,7 @@ import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; -import org.jetbrains.idea.maven.utils.MavenLog; +import org.jetbrains.idea.maven.facade.MavenFacadeLoggerManager; import java.io.File; import java.io.FileOutputStream; @@ -143,7 +143,7 @@ public class CustomArtifact implements Artifact { ourStubCache.put(getId(), f); } catch (IOException e) { - MavenLog.LOG.warn(e); + MavenFacadeLoggerManager.getLogger().warn(e); } finally { ourCacheWriteLock.unlock(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactFactory.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactFactory.java similarity index 99% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactFactory.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactFactory.java index 2aacb9eda2a7..aaecc85738ab 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactFactory.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.versioning.VersionRange; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactResolver.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactResolver.java similarity index 84% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactResolver.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactResolver.java index 7e8f8d425379..c7b578cd4e7f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomArtifactResolver.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomArtifactResolver.java @@ -13,26 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; -import com.intellij.openapi.vfs.VirtualFile; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.DefaultArtifactResolver; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.io.File; import java.util.List; import java.util.Map; public class CustomArtifactResolver extends DefaultArtifactResolver { - private Map myProjectIdToFileMap; + private Map myProjectIdToFileMap; private UnresolvedArtifactsCollector myUnresolvedCollector; - public void customize(Map projectIdToFileMap, boolean failOnUnresolved) { + public void customize(Map projectIdToFileMap, boolean failOnUnresolved) { myProjectIdToFileMap = projectIdToFileMap; myUnresolvedCollector = new UnresolvedArtifactsCollector(failOnUnresolved); } @@ -71,15 +70,15 @@ public class CustomArtifactResolver extends DefaultArtifactResolver { } private boolean resolveAsModule(Artifact a) { - // method is called from different threads, so we have to copy the reference so ensure there is no race cconditions. - Map map = myProjectIdToFileMap; + // method is called from different threads, so we have to copy the reference so ensure there is no race conditions. + Map map = myProjectIdToFileMap; if (map == null) return false; - VirtualFile file = map.get(new MavenId(a)); + File file = map.get(MavenModelConverter.createMavenId(a)); if (file == null) return false; a.setResolved(true); - a.setFile(new File(file.getPath())); + a.setFile(file); return true; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomModelInterpolator.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomModelInterpolator.java similarity index 97% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomModelInterpolator.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomModelInterpolator.java index 154074a281d9..da173c05e560 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomModelInterpolator.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomModelInterpolator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import org.apache.maven.model.Model; import org.apache.maven.project.ProjectBuilderConfiguration; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomWagonManager.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomWagonManager.java similarity index 99% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomWagonManager.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomWagonManager.java index bfb89a87c51e..73d4d8f8289d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomWagonManager.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/CustomWagonManager.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import gnu.trove.THashMap; import org.apache.maven.artifact.Artifact; diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/ExecutorManager.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/ExecutorManager.java new file mode 100644 index 000000000000..ad085bcb71de --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/ExecutorManager.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import java.util.concurrent.*; + +public class ExecutorManager { + private final static ExecutorService myExecutor = new ThreadPoolExecutor(3, Integer.MAX_VALUE, 30 * 60L, TimeUnit.SECONDS, + new SynchronousQueue()); + + public static Future execute(Runnable r) { + return myExecutor.submit(r); + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/FieldAccessor.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/FieldAccessor.java similarity index 96% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/FieldAccessor.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/FieldAccessor.java index 72ad744ea383..5514a2fd9c5d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/FieldAccessor.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/FieldAccessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import java.lang.reflect.Field; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenLogger.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeConsoleWrapper.java similarity index 61% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenLogger.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeConsoleWrapper.java index 10e869b059f1..c57d9fae1d56 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenLogger.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeConsoleWrapper.java @@ -15,48 +15,58 @@ * ========================================================================= */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import org.codehaus.plexus.logging.Logger; +import org.jetbrains.idea.maven.facade.MavenFacadeConsole; -public class MavenLogger implements Logger { - private MavenConsole myConsole; +import java.rmi.RemoteException; + +public class MavenFacadeConsoleWrapper implements Logger { + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + private MavenFacadeConsole myWrappee; private int myThreshold; void doPrint(int level, String message, Throwable throwable) { if (level < myThreshold) return; - if (!message.endsWith(MavenConsole.LINE_SEPARATOR)) { - message += MavenConsole.LINE_SEPARATOR; + if (!message.endsWith(LINE_SEPARATOR)) { + message += LINE_SEPARATOR; } - if (myConsole != null) { - myConsole.printMessage(level, message, throwable); + if (myWrappee != null) { + try { + myWrappee.printMessage(level, message, throwable); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } } } - public void setConsole(MavenConsole console) { - myConsole = console; + public void setWrappee(MavenFacadeConsole wrappee) { + myWrappee = wrappee; } public void debug(String string, Throwable throwable) { - doPrint(MavenConsole.LEVEL_DEBUG, string, throwable); + doPrint(MavenFacadeConsole.LEVEL_DEBUG, string, throwable); } public void info(String string, Throwable throwable) { - doPrint(MavenConsole.LEVEL_INFO, string, throwable); + doPrint(MavenFacadeConsole.LEVEL_INFO, string, throwable); } public void warn(String string, Throwable throwable) { - doPrint(MavenConsole.LEVEL_WARN, string, throwable); + doPrint(MavenFacadeConsole.LEVEL_WARN, string, throwable); } public void error(String string, Throwable throwable) { - doPrint(MavenConsole.LEVEL_ERROR, string, throwable); + doPrint(MavenFacadeConsole.LEVEL_ERROR, string, throwable); } public void fatalError(String string, Throwable throwable) { - doPrint(MavenConsole.LEVEL_FATAL, string, throwable); + doPrint(MavenFacadeConsole.LEVEL_FATAL, string, throwable); } public void debug(String message) { @@ -64,7 +74,7 @@ public class MavenLogger implements Logger { } public boolean isDebugEnabled() { - return getThreshold() <= MavenConsole.LEVEL_DEBUG; + return getThreshold() <= MavenFacadeConsole.LEVEL_DEBUG; } public void info(String message) { @@ -72,7 +82,7 @@ public class MavenLogger implements Logger { } public boolean isInfoEnabled() { - return getThreshold() <= MavenConsole.LEVEL_INFO; + return getThreshold() <= MavenFacadeConsole.LEVEL_INFO; } public void warn(String message) { @@ -80,7 +90,7 @@ public class MavenLogger implements Logger { } public boolean isWarnEnabled() { - return getThreshold() <= MavenConsole.LEVEL_WARN; + return getThreshold() <= MavenFacadeConsole.LEVEL_WARN; } public void error(String message) { @@ -88,7 +98,7 @@ public class MavenLogger implements Logger { } public boolean isErrorEnabled() { - return getThreshold() <= MavenConsole.LEVEL_ERROR; + return getThreshold() <= MavenFacadeConsole.LEVEL_ERROR; } public void fatalError(String message) { @@ -96,7 +106,7 @@ public class MavenLogger implements Logger { } public boolean isFatalErrorEnabled() { - return getThreshold() <= MavenConsole.LEVEL_FATAL; + return getThreshold() <= MavenFacadeConsole.LEVEL_FATAL; } public void setThreshold(int threshold) { diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java new file mode 100644 index 000000000000..c900a0a13d12 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java @@ -0,0 +1,626 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; +import com.intellij.util.Function; +import gnu.trove.THashMap; +import gnu.trove.THashSet; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.InvalidRepositoryException; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.manager.WagonManager; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.resolver.ResolutionListener; +import org.apache.maven.model.Activation; +import org.apache.maven.model.Model; +import org.apache.maven.model.Plugin; +import org.apache.maven.model.Profile; +import org.apache.maven.plugin.PluginManager; +import org.apache.maven.plugin.descriptor.PluginDescriptor; +import org.apache.maven.profiles.activation.*; +import org.apache.maven.project.*; +import org.apache.maven.project.artifact.ProjectArtifactFactory; +import org.apache.maven.project.inheritance.DefaultModelInheritanceAssembler; +import org.apache.maven.project.injection.DefaultProfileInjector; +import org.apache.maven.project.interpolation.AbstractStringBasedModelInterpolator; +import org.apache.maven.project.interpolation.ModelInterpolationException; +import org.apache.maven.project.interpolation.ModelInterpolator; +import org.apache.maven.project.path.DefaultPathTranslator; +import org.apache.maven.project.path.PathTranslator; +import org.apache.maven.project.validation.ModelValidationResult; +import org.apache.maven.shared.dependency.tree.DependencyNode; +import org.apache.maven.shared.dependency.tree.DependencyTreeResolutionListener; +import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.component.repository.ComponentDependency; +import org.codehaus.plexus.context.ContextException; +import org.codehaus.plexus.context.DefaultContext; +import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.facade.*; +import org.jetbrains.idea.maven.model.*; +import org.jetbrains.maven.embedder.MavenEmbedder; +import org.jetbrains.maven.embedder.MavenEmbedderSettings; +import org.jetbrains.maven.embedder.MavenExecutionResult; +import org.jetbrains.maven.embedder.PlexusComponentConfigurator; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.rmi.RemoteException; +import java.rmi.server.RemoteObject; +import java.rmi.server.UnicastRemoteObject; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacadeEmbedder { + private final MavenEmbedder myImpl; + private final MavenFacadeConsoleWrapper myConsoleWrapper; + private volatile MavenFacadeProgressIndicator myCurrentIndicator; + + public static MavenFacadeEmbedderImpl create(MavenFacadeSettings facadeSettings) { + MavenEmbedderSettings settings = new MavenEmbedderSettings(); + + settings.setConfigurator(new PlexusComponentConfigurator() { + public void configureComponents(@NotNull PlexusContainer c) { + setupContainer(c); + } + }); + MavenFacadeConsoleWrapper consoleWrapper = new MavenFacadeConsoleWrapper(); + consoleWrapper.setThreshold(facadeSettings.getLoggingLevel()); + settings.setLogger(consoleWrapper); + settings.setRecursive(false); + + settings.setWorkOffline(facadeSettings.isOffline()); + settings.setUsePluginRegistry(false); + + settings.setMavenHome(facadeSettings.getMavenHome()); + settings.setUserSettingsFile(facadeSettings.getUserSettingsFile()); + settings.setGlobalSettingsFile(facadeSettings.getGlobalSettingsFile()); + settings.setLocalRepository(facadeSettings.getLocalRepository()); + + settings.setSnapshotUpdatePolicy(convertUpdatePolicy(facadeSettings.getSnapshotUpdatePolicy())); + settings.setPluginUpdatePolicy(convertUpdatePolicy(facadeSettings.getPluginUpdatePolicy())); + settings.setProperties(MavenFacadeUtil.collectSystemProperties()); + + return new MavenFacadeEmbedderImpl(MavenEmbedder.create(settings), consoleWrapper); + } + + private static MavenEmbedderSettings.UpdatePolicy convertUpdatePolicy(MavenFacadeSettings.UpdatePolicy policy) { + switch (policy) { + case ALWAYS_UPDATE: + return MavenEmbedderSettings.UpdatePolicy.ALWAYS_UPDATE; + case DO_NOT_UPDATE: + return MavenEmbedderSettings.UpdatePolicy.DO_NOT_UPDATE; + default: + MavenFacadeLoggerManager.getLogger().error(new Throwable("unexpected update policy")); + } + return MavenEmbedderSettings.UpdatePolicy.DO_NOT_UPDATE; + } + + private MavenFacadeEmbedderImpl(MavenEmbedder impl, MavenFacadeConsoleWrapper consoleWrapper) { + myImpl = impl; + myConsoleWrapper = consoleWrapper; + } + + @NotNull + public MavenWrapperExecutionResult resolveProject(@NotNull final File file, + @NotNull final Collection activeProfiles) + throws MavenFacadeProcessCanceledException { + return doExecute(new Executor() { + public MavenWrapperExecutionResult execute() throws Exception { + DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); + MavenExecutionResult result = myImpl.resolveProject(file, + new ArrayList(activeProfiles), + Arrays.asList(listener)); + return createExecutionResult(file, result, listener.getRootNode()); + } + }); + } + + @NotNull + private MavenWrapperExecutionResult createExecutionResult(File file, MavenExecutionResult result, DependencyNode rootNode) { + Collection problems = MavenProjectProblem.createProblemsList(); + THashSet unresolvedArtifacts = new THashSet(); + + validate(file, result.getExceptions(), problems, unresolvedArtifacts); + + MavenProject mavenProject = result.getMavenProject(); + if (mavenProject == null) return new MavenWrapperExecutionResult(null, problems, unresolvedArtifacts); + + MavenModel model = MavenModelConverter.convertModel(mavenProject.getModel(), + mavenProject.getCompileSourceRoots(), + mavenProject.getTestCompileSourceRoots(), + mavenProject.getArtifacts(), + (rootNode == null ? Collections.emptyList() : rootNode.getChildren()), + mavenProject.getExtensionArtifacts(), + getLocalRepositoryFile()); + + Collection activatedProfiles = MavenModelConverter.convertProfiles(mavenProject.getActiveProfiles()); + + RemoteNativeMavenProjectHolder holder = new RemoteNativeMavenProjectHolder(mavenProject); + try { + UnicastRemoteObject.exportObject(holder, 0); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + + MavenWrapperExecutionResult.ProjectData data = new MavenWrapperExecutionResult.ProjectData( + model, MavenModelConverter.convertToMap(mavenProject.getModel()), holder, activatedProfiles); + return new MavenWrapperExecutionResult(data, problems, unresolvedArtifacts); + } + + @NotNull + public MavenArtifact resolve(@NotNull final MavenArtifactInfo info, + @NotNull final List remoteRepositories) throws MavenFacadeProcessCanceledException { + return doExecute(new Executor() { + public MavenArtifact execute() throws Exception { + return doResolve(info, remoteRepositories); + } + }); + } + + @NotNull + public List resolveTransitively( + @NotNull final List artifacts, + @NotNull final List remoteRepositories) { + + Set toResolve = new LinkedHashSet(); + for (MavenArtifactInfo each : artifacts) { + toResolve.add(createArtifact(each)); + } + try { + return MavenModelConverter.convertArtifacts(myImpl.resolveTransitively(toResolve, convertRepositories(remoteRepositories)), + new THashMap(), getLocalRepositoryFile()); + } + catch (ArtifactResolutionException e) { + MavenFacadeLoggerManager.getLogger().info(e); + } + catch (ArtifactNotFoundException e) { + MavenFacadeLoggerManager.getLogger().info(e); + } + return Collections.emptyList(); + } + + private MavenArtifact doResolve(MavenArtifactInfo info, List remoteRepositories) { + Artifact resolved = doResolve(createArtifact(info), convertRepositories(remoteRepositories)); + return MavenModelConverter.convertArtifact(resolved, getLocalRepositoryFile()); + } + + private Artifact createArtifact(MavenArtifactInfo info) { + return getComponent(ArtifactFactory.class).createArtifactWithClassifier(info.getGroupId(), + info.getArtifactId(), + info.getVersion(), + info.getPackaging(), + info.getClassifier()); + } + + private Artifact doResolve(Artifact artifact, List remoteRepositories) { + try { + myImpl.resolve(artifact, remoteRepositories); + return artifact; + } + catch (Exception e) { + MavenFacadeLoggerManager.getLogger().info(e); + } + return artifact; + } + + private List convertRepositories(List repositories) { + List result = new ArrayList(); + for (MavenRemoteRepository each : repositories) { + try { + ArtifactRepositoryFactory factory = getComponent(ArtifactRepositoryFactory.class); + result.add(ProjectUtils.buildArtifactRepository(MavenModelConverter.toNativeRepository(each), factory, getContainer())); + } + catch (InvalidRepositoryException e) { + MavenFacadeLoggerManager.getLogger().warn(e); + } + } + return result; + } + + public Collection resolvePlugin(@NotNull final MavenPlugin plugin, + @NotNull final List repositories, + final int nativeMavenProjectId, + final boolean transitive) throws MavenFacadeProcessCanceledException { + return doExecute(new Executor>() { + public Collection execute() throws Exception { + try { + Plugin mavenPlugin = new Plugin(); + mavenPlugin.setGroupId(plugin.getGroupId()); + mavenPlugin.setArtifactId(plugin.getArtifactId()); + mavenPlugin.setVersion(plugin.getVersion()); + MavenProject project = RemoteNativeMavenProjectHolder.findprojectById(nativeMavenProjectId); + PluginDescriptor result = getComponent(PluginManager.class).verifyPlugin(mavenPlugin, project, + myImpl.getSettings(), myImpl.getLocalRepository()); + if (!transitive) return Collections.emptyList(); + + // todo try to use parallel downloading + + Map resolvedArtifacts = new THashMap(); + for (Artifact each : (Iterable)result.getIntroducedDependencyArtifacts()) { + resolveIfNecessary(new MavenArtifactInfo(each.getGroupId(), each.getArtifactId(), each.getVersion(), each.getType(), null), + repositories, resolvedArtifacts); + } + for (ComponentDependency each : (List)result.getDependencies()) { + resolveIfNecessary(new MavenArtifactInfo(each.getGroupId(), each.getArtifactId(), each.getVersion(), each.getType(), null), + repositories, resolvedArtifacts); + } + return new THashSet(resolvedArtifacts.values()); + } + catch (Exception e) { + MavenFacadeLoggerManager.getLogger().info(e); + return Collections.emptyList(); + } + } + }); + } + + private void resolveIfNecessary(MavenArtifactInfo info, + List repos, + Map resolvedArtifacts) { + if (resolvedArtifacts.containsKey(info)) return; + resolvedArtifacts.put(info, doResolve(info, repos)); + } + + @NotNull + public MavenWrapperExecutionResult execute(@NotNull final File file, + @NotNull final Collection activeProfiles, + @NotNull final List goals) + throws MavenFacadeProcessCanceledException { + return doExecute(new Executor() { + public MavenWrapperExecutionResult execute() throws Exception { + MavenExecutionResult result = myImpl.execute(file, new ArrayList(activeProfiles), goals); + return createExecutionResult(file, result, null); + } + }); + } + + private void validate(File file, + Collection exceptions, + Collection problems, + Collection unresolvedArtifacts) { + for (Exception each : exceptions) { + MavenFacadeLoggerManager.getLogger().info(each); + + if (each instanceof InvalidProjectModelException) { + ModelValidationResult modelValidationResult = ((InvalidProjectModelException)each).getValidationResult(); + if (modelValidationResult != null) { + for (Object eachValidationProblem : modelValidationResult.getMessages()) { + problems.add(MavenProjectProblem.createStructureProblem(file.getPath(), (String)eachValidationProblem)); + } + } + else { + problems.add(MavenProjectProblem.createStructureProblem(file.getPath(), each.getCause().getMessage())); + } + } + else if (each instanceof ProjectBuildingException) { + String causeMessage = each.getCause() != null ? each.getCause().getMessage() : each.getMessage(); + problems.add(MavenProjectProblem.createStructureProblem(file.getPath(), causeMessage)); + } + else { + problems.add(MavenProjectProblem.createStructureProblem(file.getPath(), each.getMessage())); + } + } + unresolvedArtifacts.addAll(retrieveUnresolvedArtifactIds()); + } + + private Set retrieveUnresolvedArtifactIds() { + Set result = new THashSet(); + ((CustomWagonManager)getComponent(WagonManager.class)).getUnresolvedCollector().retrieveUnresolvedIds(result); + ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).getUnresolvedCollector().retrieveUnresolvedIds(result); + return result; + } + + public static MavenModel interpolateAndAlignModel(MavenModel model, File basedir) { + Model result = MavenModelConverter.toNativeModel(model); + result = doInterpolate(result, basedir); + + PathTranslator pathTranslator = new DefaultPathTranslator(); + pathTranslator.alignToBaseDirectory(result, basedir); + + return MavenModelConverter.convertModel(result, null); + } + + private static Model doInterpolate(Model result, File basedir) { + try { + AbstractStringBasedModelInterpolator interpolator = new CustomModelInterpolator(new DefaultPathTranslator()); + interpolator.initialize(); + + Properties props = MavenFacadeUtil.collectSystemProperties(); + ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration().setExecutionProperties(props); + result = interpolator.interpolate(result, basedir, config, false); + } + catch (ModelInterpolationException e) { + MavenFacadeLoggerManager.getLogger().warn(e); + } + catch (InitializationException e) { + MavenFacadeLoggerManager.getLogger().error(e); + } + return result; + } + + public static MavenModel assembleInheritance(MavenModel model, MavenModel parentModel) { + Model result = MavenModelConverter.toNativeModel(model); + new DefaultModelInheritanceAssembler().assembleModelInheritance(result, MavenModelConverter.toNativeModel(parentModel)); + return MavenModelConverter.convertModel(result, null); + } + + public static ProfileApplicationResult applyProfiles(MavenModel model, + File basedir, + Collection explicitProfiles, + Collection alwaysOnProfiles) { + Model nativeModel = MavenModelConverter.toNativeModel(model); + + List activatedPom = new ArrayList(); + List activatedExternal = new ArrayList(); + List activeByDefault = new ArrayList(); + + List rawProfiles = nativeModel.getProfiles(); + List expandedProfilesCache = null; + + for (int i = 0; i < rawProfiles.size(); i++) { + Profile eachRawProfile = rawProfiles.get(i); + + boolean shouldAdd = explicitProfiles.contains(eachRawProfile.getId()) || alwaysOnProfiles.contains(eachRawProfile.getId()); + + Activation activation = eachRawProfile.getActivation(); + if (activation != null) { + if (activation.isActiveByDefault()) { + activeByDefault.add(eachRawProfile); + } + + // expand only if necessary + if (expandedProfilesCache == null) expandedProfilesCache = doInterpolate(nativeModel, basedir).getProfiles(); + Profile eachExpandedProfile = expandedProfilesCache.get(i); + + for (ProfileActivator eachActivator : getProfileActivators()) { + try { + if (eachActivator.canDetermineActivation(eachExpandedProfile) && eachActivator.isActive(eachExpandedProfile)) { + shouldAdd = true; + break; + } + } + catch (ProfileActivationException e) { + MavenFacadeLoggerManager.getLogger().warn(e); + } + } + } + + if (shouldAdd) { + if (MavenConstants.PROFILE_FROM_POM.equals(eachRawProfile.getSource())) { + activatedPom.add(eachRawProfile); + } + else { + activatedExternal.add(eachRawProfile); + } + } + } + + List activatedProfiles = new ArrayList(activatedPom.isEmpty() ? activeByDefault : activatedPom); + activatedProfiles.addAll(activatedExternal); + + for (Profile each : activatedProfiles) { + new DefaultProfileInjector().inject(each, nativeModel); + } + + return new ProfileApplicationResult(MavenModelConverter.convertModel(nativeModel, null), + MavenModelConverter.convertProfiles(activatedProfiles)); + } + + private static ProfileActivator[] getProfileActivators() { + SystemPropertyProfileActivator sysPropertyActivator = new SystemPropertyProfileActivator(); + DefaultContext context = new DefaultContext(); + context.put("SystemProperties", MavenFacadeUtil.collectSystemProperties()); + try { + sysPropertyActivator.contextualize(context); + } + catch (ContextException e) { + MavenFacadeLoggerManager.getLogger().error(e); + return new ProfileActivator[0]; + } + + return new ProfileActivator[]{new FileProfileActivator(), + sysPropertyActivator, + new JdkPrefixProfileActivator(), + new OperatingSystemProfileActivator()}; + } + + @NotNull + public File getLocalRepositoryFile() { + return myImpl.getLocalRepositoryFile(); + } + + public T getComponent(Class clazz) { + return myImpl.getComponent(clazz); + } + + public T getComponent(Class clazz, String roleHint) { + return myImpl.getComponent(clazz, roleHint); + } + + public PlexusContainer getContainer() { + return myImpl.getContainer(); + } + + private interface Executor { + T execute() throws Exception; + + } + + private T doExecute(final Executor executor) throws MavenFacadeProcessCanceledException { + final Ref result = new Ref(); + final boolean[] cancelled = new boolean[1]; + final Throwable[] exception = new Throwable[1]; + + Future future = ExecutorManager.execute(new Runnable() { + public void run() { + try { + result.set(executor.execute()); + } + catch (ProcessCanceledException e) { + cancelled[0] = true; + } + catch (Throwable e) { + exception[0] = e; + } + } + }); + + MavenFacadeProgressIndicator indicator = myCurrentIndicator; + while (true) { + boolean canceled = false; + try { + canceled = indicator.isCanceled(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + if (canceled) throw new MavenFacadeProcessCanceledException(); + try { + future.get(50, TimeUnit.MILLISECONDS); + } + catch (TimeoutException ignore) { + } + catch (ExecutionException e) { + throw new RuntimeException(e.getCause()); + } + catch (InterruptedException e) { + throw new MavenFacadeProcessCanceledException(); + } + + if (future.isDone()) break; + } + + if (cancelled[0]) throw new MavenFacadeProcessCanceledException(); + if (exception[0] != null) { + throw getRethrowable(exception[0]); + } + + return result.get(); + } + + private RuntimeException getRethrowable(Throwable throwable) { + if (throwable instanceof InvocationTargetException) throwable = throwable.getCause(); + if (throwable instanceof RuntimeException) return (RuntimeException)throwable; + return new RuntimeException(throwable); + } + + private static void setupContainer(PlexusContainer c) { + MavenEmbedder.setImplementation(c, ArtifactFactory.class, CustomArtifactFactory.class); + MavenEmbedder.setImplementation(c, ProjectArtifactFactory.class, CustomArtifactFactory.class); + MavenEmbedder.setImplementation(c, ArtifactResolver.class, CustomArtifactResolver.class); + MavenEmbedder.setImplementation(c, WagonManager.class, CustomWagonManager.class); + MavenEmbedder.setImplementation(c, ModelInterpolator.class, CustomModelInterpolator.class); + } + + public void customizeForResolve(MavenFacadeConsole console, MavenFacadeProgressIndicator process) { + doCustomize(null, false, console, process); + } + + public void customizeForResolve(Map projectIdToFileMap, MavenFacadeConsole console, MavenFacadeProgressIndicator process) { + doCustomize(projectIdToFileMap, false, console, process); + } + + public void customizeForStrictResolve(Map projectIdToFileMap, + MavenFacadeConsole console, + MavenFacadeProgressIndicator process) { + doCustomize(projectIdToFileMap, true, console, process); + } + + private void doCustomize(Map projectIdToFileMap, + boolean strict, + MavenFacadeConsole logger, + MavenFacadeProgressIndicator process) { + ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).customize(); + ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).customize(); + ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).customize(projectIdToFileMap, strict); + ((CustomWagonManager)getComponent(WagonManager.class)).customize(strict); + + setConsoleAndLogger(logger, process); + } + + private void setConsoleAndLogger(MavenFacadeConsole logger, MavenFacadeProgressIndicator process) { + myCurrentIndicator = process; + myConsoleWrapper.setWrappee(logger); + + WagonManager wagon = getComponent(WagonManager.class); + wagon.setDownloadMonitor(process == null ? null : new TransferListenerAdapter(new MavenFacadeProgressIndicatorWrapper(process))); + } + + public void reset() { + setConsoleAndLogger(null, null); + + ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).reset(); + ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).reset(); + ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).reset(); + ((CustomWagonManager)getComponent(WagonManager.class)).reset(); + } + + public void release() { + myImpl.release(); + } + + public void clearCaches() { + withProjectCachesDo(new Function() { + public Object fun(Map map) { + map.clear(); + return null; + } + }); + } + + public void clearCachesFor(final MavenId projectId) { + withProjectCachesDo(new Function() { + public Object fun(Map map) { + map.remove(projectId.getKey()); + return null; + } + }); + } + + private void withProjectCachesDo(Function func) { + MavenProjectBuilder builder = myImpl.getComponent(MavenProjectBuilder.class); + Field field; + try { + field = builder.getClass().getDeclaredField("rawProjectCache"); + field.setAccessible(true); + func.fun(((Map)field.get(builder))); + + field = builder.getClass().getDeclaredField("processedProjectCache"); + field.setAccessible(true); + func.fun(((Map)field.get(builder))); + } + catch (NoSuchFieldException e) { + MavenFacadeLoggerManager.getLogger().info(e); + } + catch (IllegalAccessException e) { + MavenFacadeLoggerManager.getLogger().info(e); + } + } +} + diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java new file mode 100644 index 000000000000..a67c97653f1a --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java @@ -0,0 +1,296 @@ +/* +* Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import com.intellij.openapi.util.text.StringUtil; +import gnu.trove.THashSet; +import gnu.trove.TIntObjectHashMap; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TopDocs; +import org.apache.maven.archetype.catalog.Archetype; +import org.apache.maven.archetype.catalog.ArchetypeCatalog; +import org.apache.maven.archetype.source.ArchetypeDataSource; +import org.apache.maven.archetype.source.ArchetypeDataSourceException; +import org.apache.maven.artifact.manager.WagonManager; +import org.apache.maven.wagon.events.TransferEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.facade.*; +import org.jetbrains.idea.maven.facade.RemoteObject; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; +import org.sonatype.nexus.index.*; +import org.sonatype.nexus.index.context.IndexUtils; +import org.sonatype.nexus.index.context.IndexingContext; +import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; +import org.sonatype.nexus.index.updater.IndexUpdateRequest; +import org.sonatype.nexus.index.updater.IndexUpdater; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeIndexer { + private MavenFacadeEmbedderImpl myEmbedder; + private final NexusIndexer myIndexer; + private final IndexUpdater myUpdater; + private final ArtifactContextProducer myArtifactContextProducer; + + private final TIntObjectHashMap myIndices = new TIntObjectHashMap(); + + public MavenFacadeIndexerImpl() { + myEmbedder = MavenFacadeEmbedderImpl.create(new MavenFacadeSettings()); + + myIndexer = myEmbedder.getComponent(NexusIndexer.class); + myUpdater = myEmbedder.getComponent(IndexUpdater.class); + myArtifactContextProducer = myEmbedder.getComponent(ArtifactContextProducer.class); + } + + public int createIndex(@NotNull String indexId, + @Nullable String repositoryId, + @Nullable File file, + @Nullable String url, + @NotNull File indexDir) throws MavenFacadeIndexerException { + try { + IndexingContext context = myIndexer.addIndexingContext(indexId, + repositoryId, + file, + indexDir, + url, + null, // repo update url + NexusIndexer.FULL_INDEX); + int id = System.identityHashCode(context); + myIndices.put(id, context); + return id; + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + catch (UnsupportedExistingLuceneIndexException e) { + throw new MavenFacadeIndexerException(e.getMessage()); + } + } + + public void releaseIndex(int id) throws MavenFacadeIndexerException { + try { + myIndexer.removeIndexingContext(getIndex(id), false); + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + } + + @NotNull + private IndexingContext getIndex(int id) { + IndexingContext index = myIndices.get(id); + if (index == null) throw new RuntimeException("Index not found for id: " + id); + return index; + } + + private String getRepositoryPathOrUrl(IndexingContext index) { + File file = index.getRepository(); + return file == null ? index.getRepositoryUrl() : file.getPath(); + } + + private boolean isLocal(IndexingContext index) { + return index.getRepository() != null; + } + + public int getIndexCount() { + return myIndexer.getIndexingContexts().size(); + } + + public void updateIndex(int id, MavenFacadeSettings settings, MavenFacadeProgressIndicator indicator) throws + MavenFacadeIndexerException, + MavenFacadeProcessCanceledException { + IndexingContext index = getIndex(id); + MavenFacadeProgressIndicatorWrapper indicatorWrapper = new MavenFacadeProgressIndicatorWrapper(indicator); + + try { + if (isLocal(index)) { + indicatorWrapper.setIndeterminate(true); + try { + myIndexer.scan(index, new MyScanningListener(indicatorWrapper), false); + } + finally { + indicatorWrapper.setIndeterminate(false); + } + } + else { + IndexUpdateRequest request = new IndexUpdateRequest(index); + MavenFacadeEmbedderImpl embedder = MavenFacadeEmbedderImpl.create(settings); + try { + request.setResourceFetcher(new MavenIndexFetcher(index.getRepositoryId(), + index.getRepositoryUrl(), + embedder.getComponent(WagonManager.class), + new TransferListenerAdapter(indicatorWrapper) { + @Override + protected void doUpdateProgress(long downloaded, long total) { + super.doUpdateProgress(downloaded, total); + myIndicator.setFraction(((double)downloaded) / total); + } + + @Override + public void transferCompleted(TransferEvent event) { + super.transferCompleted(event); + myIndicator.setText2("Processing indices..."); + } + })); + myUpdater.fetchAndUpdateIndex(request); + } + finally { + embedder.release(); + } + } + } + catch (MavenFacadeProgressIndicatorWrapper.RuntimeCanceledException e) { + throw new MavenFacadeProcessCanceledException(); + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + } + + public List getAllArtifacts(int indexId) throws MavenFacadeIndexerException { + try { + List result = new ArrayList(); + IndexReader r = getIndex(indexId).getIndexReader(); + int total = r.numDocs(); + for (int i = 0; i < total; i++) { + if (r.isDeleted(i)) continue; + + Document doc = r.document(i); + String uinfo = doc.get(SEARCH_TERM_COORDINATES); + if (uinfo == null) continue; + List parts = StringUtil.split(uinfo, "|"); + String groupId = parts.get(0); + String artifactId = parts.get(1); + String version = parts.get(2); + if (groupId == null || artifactId == null || version == null) continue; + + result.add(new MavenId(groupId, artifactId, version)); + } + return result; + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + } + + public MavenId addArtifact(int indexId, File artifactFile) throws MavenFacadeIndexerException { + try { + IndexingContext index = getIndex(indexId); + ArtifactContext artifactContext = myArtifactContextProducer.getArtifactContext(index, artifactFile); + if (artifactContext == null) return null; + + myIndexer.addArtifactToIndex(artifactContext, index); + + org.sonatype.nexus.index.ArtifactInfo a = artifactContext.getArtifactInfo(); + return new MavenId(a.groupId, a.artifactId, a.version); + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + } + + public Set search(int indexId, Query query, int maxResult) throws MavenFacadeIndexerException { + try { + IndexingContext index = getIndex(indexId); + + TopDocs docs = null; + try { + BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE); + docs = index.getIndexSearcher().search(query, null, maxResult); + } + catch (BooleanQuery.TooManyClauses ignore) { + // this exception occurs when too wide wildcard is used on too big data. + } + + if (docs == null || docs.scoreDocs.length == 0) return Collections.emptySet(); + + Set result = new THashSet(); + + for (int i = 0; i < docs.scoreDocs.length; i++) { + int docIndex = docs.scoreDocs[i].doc; + Document doc = index.getIndexReader().document(docIndex); + ArtifactInfo a = IndexUtils.constructArtifactInfo(doc, index); + if (a == null) continue; + + a.repository = getRepositoryPathOrUrl(index); + result.add(MavenModelConverter.convertArtifactInfo(a)); + } + return result; + } + catch (IOException e) { + throw new MavenFacadeIndexerException(e); + } + } + + public Collection getArchetypes() { + Set result = new THashSet(); + doCollectArchetypes("internal-catalog", result); + doCollectArchetypes("nexus", result); + return result; + } + + private void doCollectArchetypes(String roleHint, Set result) { + try { + ArchetypeDataSource source = myEmbedder.getComponent(ArchetypeDataSource.class, roleHint); + ArchetypeCatalog catalog = source.getArchetypeCatalog(new Properties()); + + for (Archetype each : (Iterable)catalog.getArchetypes()) { + result.add(MavenModelConverter.convertArchetype(each)); + } + } + catch (ArchetypeDataSourceException e) { + MavenFacadeLoggerManager.getLogger().warn(e); + } + } + + public void release() { + myEmbedder.release(); + } + + + private static class MyScanningListener implements ArtifactScanningListener { + private final MavenFacadeProgressIndicatorWrapper p; + + public MyScanningListener(MavenFacadeProgressIndicatorWrapper indicator) { + p = indicator; + } + + public void scanningStarted(IndexingContext ctx) { + p.checkCanceled(); + } + + public void scanningFinished(IndexingContext ctx, ScanningResult result) { + p.checkCanceled(); + } + + public void artifactError(ArtifactContext ac, Exception e) { + } + + public void artifactDiscovered(ArtifactContext ac) { + p.checkCanceled(); + ArtifactInfo info = ac.getArtifactInfo(); + p.setText2(info.groupId + ":" + info.artifactId + ":" + info.version); + } + } +} diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeLoggerWrapper.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeLoggerWrapper.java new file mode 100644 index 000000000000..1fdff7a724e5 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeLoggerWrapper.java @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import org.jetbrains.idea.maven.facade.MavenFacadeLogger; +import org.jetbrains.idea.maven.facade.RemoteObject; + +import java.rmi.RemoteException; + +public class MavenFacadeLoggerWrapper { + MavenFacadeLogger myWrappee; + + public MavenFacadeLoggerWrapper(MavenFacadeLogger wrappee) { + myWrappee = wrappee; + } + + public void info(Throwable e) { + try { + myWrappee.info(RemoteObject.wrapException(e)); + } + catch (RemoteException e1) { + throw new RuntimeException(e1); + } + } + + public void warn(Throwable e) { + try { + myWrappee.warn(RemoteObject.wrapException(e)); + } + catch (RemoteException e1) { + throw new RuntimeException(e1); + } + } + + public void error(Throwable e) { + try { + myWrappee.error(RemoteObject.wrapException(e)); + } + catch (RemoteException e1) { + throw new RuntimeException(e1); + } + } +} diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeProgressIndicatorWrapper.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeProgressIndicatorWrapper.java new file mode 100644 index 000000000000..a4e0a06eb718 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeProgressIndicatorWrapper.java @@ -0,0 +1,80 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import org.jetbrains.idea.maven.facade.MavenFacadeProgressIndicator; + +import java.rmi.RemoteException; + +public class MavenFacadeProgressIndicatorWrapper { + private final MavenFacadeProgressIndicator myWrappee; + + public MavenFacadeProgressIndicatorWrapper(MavenFacadeProgressIndicator wrappee) { + myWrappee = wrappee; + } + + public void setText(String text) { + try { + myWrappee.setText(text); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void setText2(String text) { + try { + myWrappee.setText2(text); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public boolean isCanceled() { + try { + return myWrappee.isCanceled(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void checkCanceled() { + if (isCanceled()) throw new RuntimeCanceledException(); + } + + public void setIndeterminate(boolean value) { + try { + myWrappee.setIndeterminate(value); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void setFraction(double fraction) { + try { + myWrappee.setFraction(fraction); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public static class RuntimeCanceledException extends RuntimeException { + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndexFetcher.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenIndexFetcher.java similarity index 95% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndexFetcher.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenIndexFetcher.java index 341972ae56dc..1535cecf05c1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndexFetcher.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenIndexFetcher.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.indices; +package org.jetbrains.idea.maven.facade.embedder; import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.artifact.repository.DefaultArtifactRepository; @@ -25,12 +25,13 @@ import org.apache.maven.wagon.authentication.AuthenticationException; import org.apache.maven.wagon.authorization.AuthorizationException; import org.apache.maven.wagon.events.TransferListener; import org.apache.maven.wagon.repository.Repository; -import org.jetbrains.idea.maven.utils.MavenLog; +import org.jetbrains.idea.maven.facade.MavenFacadeLoggerManager; import org.sonatype.nexus.index.updater.ResourceFetcher; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.rmi.RemoteException; public class MavenIndexFetcher implements ResourceFetcher { private final String myOriginalRepositoryId; @@ -80,7 +81,7 @@ public class MavenIndexFetcher implements ResourceFetcher { myWagon.disconnect(); } catch (ConnectionException ex) { - MavenLog.LOG.warn(ex); + MavenFacadeLoggerManager.getLogger().warn(ex); } } diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java new file mode 100644 index 000000000000..65557c7a7101 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java @@ -0,0 +1,525 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.embedder; + +import com.intellij.util.ReflectionUtil; +import gnu.trove.THashMap; +import gnu.trove.THashSet; +import org.apache.maven.archetype.catalog.Archetype; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.handler.ArtifactHandler; +import org.apache.maven.model.*; +import org.apache.maven.shared.dependency.tree.DependencyNode; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.jdom.Element; +import org.jdom.IllegalNameException; +import org.jetbrains.idea.maven.facade.MavenFacadeLoggerManager; +import org.jetbrains.idea.maven.facade.nexus.ArtifactType; +import org.jetbrains.idea.maven.facade.nexus.RepositoryType; +import org.jetbrains.idea.maven.model.*; +import org.sonatype.nexus.index.ArtifactInfo; + +import java.io.File; +import java.lang.reflect.Field; +import java.util.*; + +public class MavenModelConverter { + public static MavenModel convertModel(Model model, File localRepository) { + Build build = model.getBuild(); + return convertModel(model, + asSourcesList(build.getSourceDirectory()), + asSourcesList(build.getTestSourceDirectory()), + Collections.emptyList(), + Collections.emptyList(), + Collections.emptyList(), + localRepository); + } + + private static List asSourcesList(String directory) { + return directory == null ? Collections.emptyList() : Collections.singletonList(directory); + } + + public static MavenModel convertModel(Model model, + List sources, + List testSources, + Collection dependencies, + Collection dependencyTree, + Collection extensions, + File localRepository) { + MavenModel result = new MavenModel(); + result.setMavenId(new MavenId(model.getGroupId(), model.getArtifactId(), model.getVersion())); + + Parent parent = model.getParent(); + if (parent != null) { + result.setParent(new MavenParent(new MavenId(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()), + parent.getRelativePath())); + } + result.setPackaging(model.getPackaging()); + result.setName(model.getName()); + result.setProperties(model.getProperties() == null ? new Properties() : model.getProperties()); + result.setPlugins(convertPlugins(model)); + + Map convertedArtifacts = new THashMap(); + result.setExtensions(convertArtifacts(extensions, convertedArtifacts, localRepository)); + result.setDependencies(convertArtifacts(dependencies, convertedArtifacts, localRepository)); + result.setDependencyTree(convertDependencyNodes(null, dependencyTree, convertedArtifacts, localRepository)); + + result.setRemoteRepositories(convertRepositories(model.getRepositories())); + result.setProfiles(convertProfiles(model.getProfiles())); + result.setModules(model.getModules()); + + convertBuild(result.getBuild(), model.getBuild(), sources, testSources); + return result; + } + + private static void convertBuild(MavenBuild result, Build build, List sources, List testSources) { + convertBuildBase(result, build); + result.setOutputDirectory(build.getOutputDirectory()); + result.setTestOutputDirectory(build.getTestOutputDirectory()); + result.setSources(sources); + result.setTestSources(testSources); + } + + private static void convertBuildBase(MavenBuildBase result, BuildBase build) { + result.setFinalName(build.getFinalName()); + result.setDefaultGoal(build.getDefaultGoal()); + result.setDirectory(build.getDirectory()); + result.setResources(convertResources(build.getResources())); + result.setTestResources(convertResources(build.getTestResources())); + result.setFilters(build.getFilters() == null ? Collections.emptyList() : build.getFilters()); + } + + public static MavenId createMavenId(Artifact artifact) { + return new MavenId(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion()); + } + + private static List convertResources(List resources) { + if (resources == null) return new ArrayList(); + + List result = new ArrayList(resources.size()); + for (Resource each : resources) { + result.add(new MavenResource(each.getDirectory(), + each.isFiltering(), + each.getTargetPath(), + ensurePatterns(each.getIncludes()), + ensurePatterns(each.getExcludes()))); + } + return result; + } + + private static List ensurePatterns(List patterns) { + return patterns == null ? Collections.EMPTY_LIST : patterns; + } + + private static List convertRepositories(List repositories) { + if (repositories == null) return new ArrayList(); + + List result = new ArrayList(repositories.size()); + for (Repository each : repositories) { + result.add(new MavenRemoteRepository(each.getId(), + each.getName(), + each.getUrl(), + each.getLayout(), + convertPolicy(each.getReleases()), + convertPolicy(each.getSnapshots()))); + } + return result; + } + + private static MavenRemoteRepository.Policy convertPolicy(RepositoryPolicy policy) { + return policy != null + ? new MavenRemoteRepository.Policy(policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy()) + : null; + } + + public static List convertArtifacts(Collection artifacts, + Map nativeToConvertedMap, + File localRepository) { + if (artifacts == null) return new ArrayList(); + + List result = new ArrayList(artifacts.size()); + for (Artifact each : artifacts) { + result.add(convertArtifact(each, nativeToConvertedMap, localRepository)); + } + return result; + } + + public static List convertDependencyNodes(MavenArtifactNode parent, + Collection nodes, + Map nativeToConvertedMap, + File localRepository) { + List result = new ArrayList(nodes.size()); + for (DependencyNode each : nodes) { + Artifact a = each.getArtifact(); + MavenArtifact ma = convertArtifact(a, nativeToConvertedMap, localRepository); + + MavenArtifactState state = MavenArtifactState.ADDED; + switch (each.getState()) { + case DependencyNode.INCLUDED: + break; + case DependencyNode.OMITTED_FOR_CONFLICT: + state = MavenArtifactState.CONFLICT; + break; + case DependencyNode.OMITTED_FOR_DUPLICATE: + state = MavenArtifactState.DUPLICATE; + break; + case DependencyNode.OMITTED_FOR_CYCLE: + state = MavenArtifactState.CYCLE; + break; + default: + assert false : "unknown dependency node state: " + each.getState(); + } + MavenArtifact relatedMA = each.getRelatedArtifact() == null ? null + : convertArtifact(each.getRelatedArtifact(), nativeToConvertedMap, + localRepository); + MavenArtifactNode newNode = new MavenArtifactNode(parent, ma, state, relatedMA, each.getOriginalScope(), + each.getPremanagedVersion(), each.getPremanagedScope()); + newNode.setDependencies(convertDependencyNodes(newNode, each.getChildren(), nativeToConvertedMap, localRepository)); + result.add(newNode); + } + return result; + } + + private static MavenArtifact convertArtifact(Artifact artifact, Map nativeToConvertedMap, File localRepository) { + MavenArtifact result = nativeToConvertedMap.get(artifact); + if (result == null) { + result = convertArtifact(artifact, localRepository); + nativeToConvertedMap.put(artifact, result); + } + return result; + } + + public static MavenArtifact convertArtifact(Artifact artifact, File localRepository) { + return new MavenArtifact(artifact.getGroupId(), artifact.getArtifactId(), + artifact.getVersion(), + artifact.getBaseVersion(), + artifact.getType(), + artifact.getClassifier(), + + artifact.getScope(), + artifact.isOptional(), + + convertExtension(artifact), + + artifact.getFile(), + localRepository, + + artifact.isResolved(), + artifact instanceof CustomArtifact && ((CustomArtifact)artifact).isStub()); + } + + private static String convertExtension(Artifact artifact) { + ArtifactHandler handler = artifact.getArtifactHandler(); + String result = null; + if (handler != null) result = handler.getExtension(); + if (result == null) result = artifact.getType(); + return result; + } + + private static List convertPlugins(Model mavenModel) { + List result = new ArrayList(); + Set pluginKeys = new THashSet(); + Build build = mavenModel.getBuild(); + doConvertPlugins(build, false, result, pluginKeys); + if (build != null) doConvertPlugins(build.getPluginManagement(), true, result, pluginKeys); + return result; + } + + private static void doConvertPlugins(PluginContainer container, + boolean management, + List result, + Set pluginKeys) { + if (container == null) return; + + List plugins = container.getPlugins(); + if (plugins == null) return; + + for (Plugin each : plugins) { + String key = each.getGroupId() + ":" + each.getArtifactId(); + result.add(convertPlugin(management, each)); + pluginKeys.add(key); + } + } + + private static MavenPlugin convertPlugin(boolean isDefault, Plugin plugin) { + List executions = new ArrayList(plugin.getExecutions().size()); + for (PluginExecution each : plugin.getExecutions()) { + executions.add(convertExecution(each)); + } + + List deps = new ArrayList(plugin.getDependencies().size()); + for (Dependency each : plugin.getDependencies()) { + deps.add(new MavenId(each.getGroupId(), each.getArtifactId(), each.getVersion())); + } + + return new MavenPlugin(plugin.getGroupId(), + plugin.getArtifactId(), + plugin.getVersion(), + isDefault, + convertConfiguration(plugin.getConfiguration()), + executions, deps); + } + + public static MavenPlugin.Execution convertExecution(PluginExecution execution) { + return new MavenPlugin.Execution(execution.getGoals(), convertConfiguration(execution.getConfiguration())); + } + + private static Element convertConfiguration(Object config) { + return config == null ? null : xppToElement((Xpp3Dom)config); + } + + private static Element xppToElement(Xpp3Dom xpp) { + Element result = null; + try { + result = new Element(xpp.getName()); + } + catch (IllegalNameException e) { + MavenFacadeLoggerManager.getLogger().error(e); + return null; + } + + Xpp3Dom[] children = xpp.getChildren(); + if (children == null || children.length == 0) { + result.setText(xpp.getValue()); + } + else { + for (Xpp3Dom each : children) { + Element child = xppToElement(each); + if (child != null) result.addContent(child); + } + } + return result; + } + + public static List convertProfiles(Collection profiles) { + if (profiles == null) return Collections.emptyList(); + List result = new ArrayList(); + for (Profile each : profiles) { + String id = each.getId(); + if (id == null) continue; + MavenProfile profile = new MavenProfile(id, each.getSource()); + List modules = each.getModules(); + profile.setModules(modules == null ? Collections.emptyList() : modules); + if (each.getBuild() != null) convertBuildBase(profile.getBuild(), each.getBuild()); + result.add(profile); + } + return result; + } + + public static Map convertToMap(Object object) { + try { + Map result = new THashMap(); + doConvert(object, "", result); + return result; + } + catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private static void doConvert(Object object, String prefix, Map result) throws IllegalAccessException { + for (Field each : ReflectionUtil.collectFields(object.getClass())) { + Class type = each.getType(); + if (shouldSkip(type)) continue; + + each.setAccessible(true); + Object value = each.get(object); + + String name = prefix + each.getName(); + result.put(name, String.valueOf(value)); + if (value != null) { + Package pack = type.getPackage(); + if (pack != null && Model.class.getPackage().getName().equals(pack.getName())) { + doConvert(value, name + ".", result); + } + } + } + } + + public static boolean shouldSkip(Class clazz) { + return clazz.isArray() + || Collection.class.isAssignableFrom(clazz) + || Map.class.isAssignableFrom(clazz) + || Xpp3Dom.class.isAssignableFrom(clazz); + } + + public static MavenArchetype convertArchetype(Archetype archetype) { + return new MavenArchetype(archetype.getGroupId(), + archetype.getArtifactId(), + archetype.getVersion(), + archetype.getRepository(), + archetype.getDescription()); + } + + public static Model toNativeModel(MavenModel model) { + Model result = new Model(); + result.setArtifactId(model.getMavenId().getArtifactId()); + result.setGroupId(model.getMavenId().getGroupId()); + result.setVersion(model.getMavenId().getVersion()); + result.setPackaging(model.getPackaging()); + result.setName(model.getName()); + + if (model.getParent() != null) { + Parent parent = new Parent(); + parent.setArtifactId(model.getParent().getMavenId().getArtifactId()); + parent.setGroupId(model.getParent().getMavenId().getGroupId()); + parent.setVersion(model.getParent().getMavenId().getVersion()); + parent.setRelativePath(model.getParent().getRelativePath()); + result.setParent(parent); + } + toNativeModelBase(model, result); + + result.setBuild(new Build()); + MavenBuild modelBuild = model.getBuild(); + toNativeBuildBase(modelBuild, result.getBuild()); + result.getBuild().setOutputDirectory(modelBuild.getOutputDirectory()); + result.getBuild().setTestOutputDirectory(modelBuild.getTestOutputDirectory()); + + if (modelBuild.getSources().size() > 1) throw new RuntimeException("too many source directories: " + modelBuild.getSources()); + if (modelBuild.getTestSources().size() > 1) throw new RuntimeException("too many test directories: " + modelBuild.getTestSources()); + + if (modelBuild.getSources().size() == 1) { + result.getBuild().setSourceDirectory(modelBuild.getSources().get(0)); + } + if (modelBuild.getTestSources().size() == 1) { + result.getBuild().setTestSourceDirectory(modelBuild.getTestSources().get(0)); + } + + result.setProfiles(toNativeProfiles(model.getProfiles())); + + return result; + } + + private static List toNativeProfiles(List profiles) { + List result = new ArrayList(profiles.size()); + for (MavenProfile each : profiles) { + Profile p = new Profile(); + p.setId(each.getId()); + p.setSource(each.getSource()); + p.setBuild(new Build()); + p.setActivation(toNativeActivation(each.getActivation())); + toNativeModelBase(each, p); + toNativeBuildBase(each.getBuild(), p.getBuild()); + result.add(p); + } + return result; + } + + private static Activation toNativeActivation(MavenProfileActivation activation) { + if (activation == null) return null; + Activation result = new Activation(); + result.setActiveByDefault(activation.isActiveByDefault()); + result.setJdk(activation.getJdk()); + result.setOs(toNativeOsActivation(activation.getOs())); + result.setFile(toNativeFileActivation(activation.getFile())); + result.setProperty(toNativePropertyActivation(activation.getProperty())); + return result; + } + + private static ActivationOS toNativeOsActivation(MavenProfileActivationOS os) { + if (os == null) return null; + ActivationOS result = new ActivationOS(); + result.setArch(os.getArch()); + result.setFamily(os.getFamily()); + result.setName(os.getName()); + result.setVersion(os.getVersion()); + return result; + } + + private static ActivationFile toNativeFileActivation(MavenProfileActivationFile file) { + if (file == null) return null; + ActivationFile result = new ActivationFile(); + result.setExists(file.getExists()); + result.setMissing(file.getMissing()); + return result; + } + + private static ActivationProperty toNativePropertyActivation(MavenProfileActivationProperty property) { + if (property == null) return null; + ActivationProperty result = new ActivationProperty(); + result.setName(property.getName()); + result.setValue(property.getValue()); + return result; + } + + private static void toNativeModelBase(MavenModelBase from, ModelBase to) { + to.setModules(from.getModules()); + to.setProperties(from.getProperties()); + } + + private static void toNativeBuildBase(MavenBuildBase from, BuildBase to) { + to.setFinalName(from.getFinalName()); + to.setDefaultGoal(from.getDefaultGoal()); + to.setDirectory(from.getDirectory()); + to.setFilters(from.getFilters()); + to.setResources(toNativeResources(from.getResources())); + to.setTestResources(toNativeResources(from.getTestResources())); + } + + private static List toNativeResources(List resources) { + List result = new ArrayList(resources.size()); + for (MavenResource each : resources) { + Resource r = new Resource(); + r.setDirectory(each.getDirectory()); + r.setTargetPath(each.getTargetPath()); + r.setFiltering(each.isFiltered()); + r.setIncludes(each.getIncludes()); + r.setExcludes(each.getExcludes()); + result.add(r); + } + return result; + } + + public static Repository toNativeRepository(MavenRemoteRepository r) { + Repository result = new Repository(); + result.setId(r.getId()); + result.setName(r.getName()); + result.setUrl(r.getUrl()); + result.setLayout(r.getLayout()); + + if (r.getReleasesPolicy() != null) result.setReleases(toNativePolicy(r.getReleasesPolicy())); + if (r.getSnapshotsPolicy() != null) result.setSnapshots(toNativePolicy(r.getSnapshotsPolicy())); + + return result; + } + + private static RepositoryPolicy toNativePolicy(MavenRemoteRepository.Policy policy) { + RepositoryPolicy result = new RepositoryPolicy(); + result.setEnabled(policy.isEnabled()); + result.setUpdatePolicy(policy.getUpdatePolicy()); + result.setChecksumPolicy(policy.getChecksumPolicy()); + return result; + } + + public static MavenArtifactInfo convertArtifactInfo(ArtifactInfo a) { + return new MavenArtifactInfo(a.groupId, a.artifactId, a.version, a.packaging, a.classifier, a.classNames, a.repository); + } + + public static MavenArtifactInfo convertArtifactInfo(ArtifactType t) { + return new MavenArtifactInfo(t.getGroupId(), + t.getArtifactId(), + t.getVersion(), + t.getPackaging(), + t.getClassifier(), + t.getClassNames(), + t.getRepoId()); + } + + public static MavenRepositoryInfo convertRepositoryInfo(RepositoryType repo) { + return new MavenRepositoryInfo(repo.getId(), repo.getName(), repo.getContentResourceURI()); + } +} + diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/RemoteNativeMavenProjectHolder.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/RemoteNativeMavenProjectHolder.java new file mode 100644 index 000000000000..8b99bedf99e6 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/RemoteNativeMavenProjectHolder.java @@ -0,0 +1,31 @@ +package org.jetbrains.idea.maven.facade.embedder; + +import com.intellij.util.containers.WeakValueHashMap; +import org.apache.maven.project.MavenProject; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; + +public class RemoteNativeMavenProjectHolder implements NativeMavenProjectHolder { + private static final WeakValueHashMap myMap = + new WeakValueHashMap(); + + private final MavenProject myMavenProject; + + public RemoteNativeMavenProjectHolder(@NotNull MavenProject mavenProject) { + myMavenProject = mavenProject; + myMap.put(getId(), this); + } + + public int getId() { + return System.identityHashCode(this); + } + + @NotNull + public static MavenProject findprojectById(int id) { + RemoteNativeMavenProjectHolder result = myMap.get(id); + if (result == null) { + throw new RuntimeException("NativeMavenProjectHolder not found for id: " + id); + } + return result.myMavenProject; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/TransferListenerAdapter.java similarity index 61% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/TransferListenerAdapter.java index 12008224ecca..e585869b5c0a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/TransferListenerAdapter.java @@ -13,30 +13,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.project; +package org.jetbrains.idea.maven.facade.embedder; import org.apache.maven.wagon.events.TransferEvent; import org.apache.maven.wagon.events.TransferListener; -import org.jetbrains.idea.maven.indices.MavenIndicesManager; -import org.jetbrains.idea.maven.utils.MavenProgressIndicator; + +import java.text.MessageFormat; public class TransferListenerAdapter implements TransferListener { - protected final MavenProgressIndicator myIndicator; + protected final MavenFacadeProgressIndicatorWrapper myIndicator; private String myRepository; private String myResource; private long mySize; private long myProgress; - //private static long total; - //private long started; - - public TransferListenerAdapter(MavenProgressIndicator indicator) { + public TransferListenerAdapter(MavenFacadeProgressIndicatorWrapper indicator) { myIndicator = indicator; } public void transferInitiated(TransferEvent event) { - myIndicator.checkCanceledNative(); + checkCanceled(); + } + + private void checkCanceled() { + myIndicator.checkCanceled(); } public void transferStarted(TransferEvent event) { @@ -53,39 +54,31 @@ public class TransferListenerAdapter implements TransferListener { } protected void doUpdateProgress(long downloaded, long total) { - myIndicator.setText2(ProjectBundle.message("maven.transfer.progress", downloaded, total == 0 ? "?" : total, myRepository, myResource)); + myIndicator.setText2(MessageFormat.format("{0}/{1}Kb [{2}] {3}", downloaded, total == 0 ? "?" : total, myRepository, myResource)); } public void transferProgress(TransferEvent event, byte[] bytes, int i) { - myIndicator.checkCanceledNative(); + checkCanceled(); myProgress += i; updateProgress(); } public void transferCompleted(TransferEvent event) { addArtifactToIndex(event); - myIndicator.checkCanceledNative(); - updateTiming(true); + checkCanceled(); } public void transferError(TransferEvent event) { - myIndicator.checkCanceledNative(); - updateTiming(false); + checkCanceled(); } public void debug(String s) { - myIndicator.checkCanceledNative(); - } - - private void updateTiming(boolean ok) { - //long finished = System.currentTimeMillis(); - //long time = finished - started; - //total += time; - //System.out.println((ok ? "OK: " : "ERROR: ") + time + " (" + total + ")"); + checkCanceled(); } private void addArtifactToIndex(TransferEvent event) { - MavenIndicesManager.getInstance().addArtifact(event.getLocalFile(), - event.getResource().getName()); + // todo + //MavenIndicesManager.getInstance().addArtifact(event.getLocalFile(), + // event.getResource().getName()); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/UnresolvedArtifactsCollector.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/UnresolvedArtifactsCollector.java similarity index 88% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/UnresolvedArtifactsCollector.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/UnresolvedArtifactsCollector.java index aab5d047aad9..99b65bf3c0d5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/UnresolvedArtifactsCollector.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/UnresolvedArtifactsCollector.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.facade.embedder; import gnu.trove.THashSet; import org.apache.maven.artifact.Artifact; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.util.Set; @@ -39,7 +39,7 @@ public class UnresolvedArtifactsCollector { public void collectAndSetResolved(Artifact artifact) { if (!artifact.isResolved()) { synchronized (myUnresolvedIds) { - myUnresolvedIds.add(new MavenId(artifact)); + myUnresolvedIds.add(MavenModelConverter.createMavenId(artifact)); } } if (!myFailOnUnresolved) artifact.setResolved(true); diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java new file mode 100644 index 000000000000..ca9fc8a040c7 --- /dev/null +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java @@ -0,0 +1,338 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.nexus; + +import org.jetbrains.annotations.Nullable; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; +import java.io.Serializable; + + +/** + *

Java class for artifactType complex type. + *

+ *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <complexType name="artifactType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="resourceUri" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="groupId" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="artifactId" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="classifier" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="packaging" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="extension" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="repoId" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="contextId" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="pomLink" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         <element name="artifactLink" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "artifactType", propOrder = { + "resourceUri", + "groupId", + "artifactId", + "version", + "classifier", + "packaging", + "extension", + "repoId", + "contextId", + "pomLink", + "artifactLink" +}) +public class ArtifactType implements Serializable { + + @XmlElement(required = true) + protected String resourceUri; + @XmlElement(required = true) + protected String groupId; + @XmlElement(required = true) + protected String artifactId; + @XmlElement(required = true) + protected String version; + @XmlElement(required = true) + protected String classifier; + @XmlElement(required = true) + protected String packaging; + @XmlElement(required = true) + protected String extension; + @XmlElement(required = true) + protected String repoId; + @XmlElement(required = true) + protected String contextId; + @XmlElement(required = true) + protected String pomLink; + @XmlElement(required = true) + protected String artifactLink; + + protected String classNames; + + public ArtifactType() { + + } + + public ArtifactType(String groupId, String artifactId, String version) { + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + } + + /** + * Gets the value of the resourceUri property. + * + * @return possible object is + * {@link String } + */ + public String getResourceUri() { + return resourceUri; + } + + /** + * Sets the value of the resourceUri property. + * + * @param value allowed object is + * {@link String } + */ + public void setResourceUri(String value) { + this.resourceUri = value; + } + + /** + * Gets the value of the groupId property. + * + * @return possible object is + * {@link String } + */ + public String getGroupId() { + return groupId; + } + + /** + * Sets the value of the groupId property. + * + * @param value allowed object is + * {@link String } + */ + public void setGroupId(String value) { + this.groupId = value; + } + + /** + * Gets the value of the artifactId property. + * + * @return possible object is + * {@link String } + */ + public String getArtifactId() { + return artifactId; + } + + /** + * Sets the value of the artifactId property. + * + * @param value allowed object is + * {@link String } + */ + public void setArtifactId(String value) { + this.artifactId = value; + } + + /** + * Gets the value of the version property. + * + * @return possible object is + * {@link String } + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value allowed object is + * {@link String } + */ + public void setVersion(String value) { + this.version = value; + } + + /** + * Gets the value of the classifier property. + * + * @return possible object is + * {@link String } + */ + public String getClassifier() { + return classifier; + } + + /** + * Sets the value of the classifier property. + * + * @param value allowed object is + * {@link String } + */ + public void setClassifier(String value) { + this.classifier = value; + } + + /** + * Gets the value of the packaging property. + * + * @return possible object is + * {@link String } + */ + public String getPackaging() { + return packaging; + } + + /** + * Sets the value of the packaging property. + * + * @param value allowed object is + * {@link String } + */ + public void setPackaging(String value) { + this.packaging = value; + } + + /** + * Gets the value of the extension property. + * + * @return possible object is + * {@link String } + */ + public String getExtension() { + return extension; + } + + /** + * Sets the value of the extension property. + * + * @param value allowed object is + * {@link String } + */ + public void setExtension(String value) { + this.extension = value; + } + + /** + * Gets the value of the repoId property. + * + * @return possible object is + * {@link String } + */ + public String getRepoId() { + return repoId; + } + + /** + * Sets the value of the repoId property. + * + * @param value allowed object is + * {@link String } + */ + public void setRepoId(String value) { + this.repoId = value; + } + + /** + * Gets the value of the contextId property. + * + * @return possible object is + * {@link String } + */ + public String getContextId() { + return contextId; + } + + /** + * Sets the value of the contextId property. + * + * @param value allowed object is + * {@link String } + */ + public void setContextId(String value) { + this.contextId = value; + } + + /** + * Gets the value of the pomLink property. + * + * @return possible object is + * {@link String } + */ + public String getPomLink() { + return pomLink; + } + + /** + * Sets the value of the pomLink property. + * + * @param value allowed object is + * {@link String } + */ + public void setPomLink(String value) { + this.pomLink = value; + } + + /** + * Gets the value of the artifactLink property. + * + * @return possible object is + * {@link String } + */ + public String getArtifactLink() { + return artifactLink; + } + + /** + * Sets the value of the artifactLink property. + * + * @param value allowed object is + * {@link String } + */ + public void setArtifactLink(String value) { + this.artifactLink = value; + } + + @Nullable + public String getClassNames() { + return classNames; + } + + public void setClassNames(@Nullable String classNames) { + this.classNames = classNames; + } + + @Override + public String toString() { + return groupId + ":" + artifactId + ":" + version; + } +} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/Endpoint.java similarity index 100% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Endpoint.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/Endpoint.java diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java similarity index 90% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java index cd6d3df8eba7..ac8b88c44420 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ObjectFactory.java @@ -16,6 +16,9 @@ */ package org.jetbrains.idea.maven.facade.nexus; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; + import javax.xml.bind.annotation.XmlRegistry; @@ -69,7 +72,7 @@ public class ObjectFactory { } /** - * Create an instance of {@link RepositoryType } + * Create an instance of {@link MavenRepositoryInfo } * */ public RepositoryType createRepositoryType() { @@ -77,7 +80,7 @@ public class ObjectFactory { } /** - * Create an instance of {@link ArtifactType } + * Create an instance of {@link org.jetbrains.idea.maven.model.MavenArtifactInfo } * */ public ArtifactType createArtifactType() { diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Repositories.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/Repositories.java similarity index 97% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Repositories.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/Repositories.java index 178e258a0512..ef5f063d86ad 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/Repositories.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/Repositories.java @@ -16,6 +16,8 @@ */ package org.jetbrains.idea.maven.facade.nexus; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; + import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; @@ -135,7 +137,7 @@ public class Repositories { * *

* Objects of the following type(s) are allowed in the list - * {@link RepositoryType } + * {@link MavenRepositoryInfo } * * */ diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryMetaData.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/RepositoryMetaData.java similarity index 100% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryMetaData.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/RepositoryMetaData.java diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java similarity index 100% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/RepositoryType.java diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResult.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResult.java similarity index 98% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResult.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResult.java index 7e1c447f5f3c..acb063297260 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResult.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResult.java @@ -16,6 +16,8 @@ */ package org.jetbrains.idea.maven.facade.nexus; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; + import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -238,7 +240,7 @@ public class SearchResult { * *

* Objects of the following type(s) are allowed in the list - * {@link ArtifactType } + * {@link org.jetbrains.idea.maven.model.MavenArtifactInfo } * * */ diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResults.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResults.java similarity index 97% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResults.java rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResults.java index 6cfe85d0c162..c2a03fa81e87 100644 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/SearchResults.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/SearchResults.java @@ -16,6 +16,8 @@ */ package org.jetbrains.idea.maven.facade.nexus; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; + import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -217,7 +219,7 @@ public class SearchResults { }) public static class Data { - protected List artifact; + protected ArrayList artifact; /** * Gets the value of the artifact property. @@ -237,7 +239,7 @@ public class SearchResults { * *

* Objects of the following type(s) are allowed in the list - * {@link ArtifactType } + * {@link org.jetbrains.idea.maven.model.MavenArtifactInfo } * * */ diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/nexus.wadl b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/nexus.wadl similarity index 100% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/nexus.wadl rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/nexus.wadl diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/nexus.xsd b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/nexus.xsd similarity index 100% rename from plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/nexus.xsd rename to plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/nexus.xsd diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapperTest.java b/plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/MavenFacadeEmbedderTest.java similarity index 80% rename from plugins/maven/src/test/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapperTest.java rename to plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/MavenFacadeEmbedderTest.java index 04d256c8d721..c622d30d69bd 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapperTest.java +++ b/plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/MavenFacadeEmbedderTest.java @@ -17,20 +17,24 @@ package org.jetbrains.idea.maven.embedder; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; -import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.handler.ArtifactHandler; -import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.repository.ComponentDescriptor; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.MavenWrapperExecutionResult; +import org.jetbrains.idea.maven.facade.embedder.MavenFacadeEmbedderImpl; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.execution.SoutMavenConsole; +import org.jetbrains.idea.maven.model.MavenModel; import java.io.File; import java.util.Arrays; import java.util.Collections; -public class MavenEmbedderWrapperTest extends MavenImportingTestCase { +public class MavenFacadeEmbedderTest extends MavenImportingTestCase { private MavenEmbedderWrapper myEmbedder; + private MavenFacadeEmbedderImpl myEmbedderImpl; @Override protected void setUp() throws Exception { @@ -46,7 +50,9 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { private void initEmbedder() { if (myEmbedder != null) releaseEmbedder(); - myEmbedder = MavenEmbedderWrapper.create(getMavenGeneralSettings()); + + myEmbedderImpl = MavenFacadeEmbedderImpl.create(MavenFacadeManager.convertSettings(getMavenGeneralSettings())); + myEmbedder = new MavenEmbedderWrapper(myEmbedderImpl); } private void releaseEmbedder() { @@ -55,7 +61,13 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { } public void testSettingLocalRepository() throws Exception { - assertEquals(getRepositoryFile(), myEmbedder.getLocalRepositoryFile()); + assertEquals(getRepositoryFile(), myEmbedderImpl.getLocalRepositoryFile()); + + File repo = new File(myDir, "/repo"); + setRepositoryPath(repo.getPath()); + + initEmbedder(); + assertEquals(getRepositoryFile(), myEmbedderImpl.getLocalRepositoryFile()); } public void testReleasingTwice() throws Exception { @@ -73,14 +85,13 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.execute(myProjectPom, Collections.EMPTY_LIST, Arrays.asList("compile")); + assertNotNull(result.projectData); assertNotNull(new File(getProjectPath(), "target").exists()); + assertOrderedElementsAreEqual(result.unresolvedArtifacts); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds()); - - MavenProject project = result.getMavenProject(); + MavenModel project = result.projectData.mavenModel; assertNotNull(project); - assertEquals("project", project.getArtifactId()); + assertEquals("project", project.getMavenId().getArtifactId()); } public void testResolvingProject() throws Exception { @@ -98,14 +109,13 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds()); - - MavenProject project = result.getMavenProject(); + MavenModel project = result.projectData.mavenModel; assertNotNull(project); - assertEquals("project", project.getArtifactId()); - assertEquals(1, project.getArtifacts().size()); + assertEquals("project", project.getMavenId().getArtifactId()); + assertEquals(1, project.getDependencies().size()); } public void testResolvingProjectPropertiesInFolders() throws Exception { @@ -116,11 +126,11 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - MavenProject project = result.getMavenProject(); + MavenModel project = result.projectData.mavenModel; assertNotNull(project); - assertEquals("project", project.getArtifactId()); + assertEquals("project", project.getMavenId().getArtifactId()); assertPathEquals(myProjectRoot.getPath() + "/target", project.getBuild().getDirectory()); - assertPathEquals(myProjectRoot.getPath() + "/src/main/java", (String)project.getCompileSourceRoots().get(0)); + assertPathEquals(myProjectRoot.getPath() + "/src/main/java", project.getBuild().getSources().get(0)); } public void testResolvingProjectWithExtensions() throws Exception { @@ -152,10 +162,12 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts); - assertEquals(1, result.getMavenProject().getArtifacts().size()); - assertEquals("rb.swc", ((Artifact)result.getMavenProject().getArtifacts().iterator().next()).getArtifactHandler().getExtension()); + MavenModel p = result.projectData.mavenModel; + assertEquals(1, p.getDependencies().size()); + assertEquals("rb.swc", p.getDependencies().get(0).getExtension()); } public void testResolvingProjectWithRegisteredExtensions() throws Exception { @@ -163,7 +175,7 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { desc.setRole(ArtifactHandler.ROLE); desc.setRoleHint("foo"); desc.setImplementation(MyArtifactHandler.class.getName()); - myEmbedder.getContainer().addComponentDescriptor(desc); + myEmbedderImpl.getContainer().addComponentDescriptor(desc); createProjectPom("test" + "project" + @@ -182,11 +194,41 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds()); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts); - assertEquals(1, result.getMavenProject().getArtifacts().size()); - assertEquals("pom", ((Artifact)result.getMavenProject().getArtifacts().iterator().next()).getArtifactHandler().getExtension()); + MavenModel p = result.projectData.mavenModel; + assertEquals(1, p.getDependencies().size()); + assertEquals("pom", p.getDependencies().get(0).getExtension()); + } + public static class MyArtifactHandler implements ArtifactHandler { + public String getExtension() { + return "pom"; + } + + public String getDirectory() { + throw new UnsupportedOperationException(); + } + + public String getClassifier() { + return null; + } + + public String getPackaging() { + return "foo"; + } + + public boolean isIncludesDependencies() { + return false; + } + + public String getLanguage() { + return "java"; + } + + public boolean isAddedToClasspath() { + return true; + } } public void testUnresolvedArtifacts() throws Exception { @@ -205,8 +247,8 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds(), new MavenId("fff", "zzz", "666")); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts, new MavenId("fff", "zzz", "666")); } public void testUnresolvedSystemArtifacts() throws Exception { @@ -227,8 +269,8 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds(), new MavenId("fff", "zzz", "666")); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts, new MavenId("fff", "zzz", "666")); } public void testDependencyWithUnresolvedParent() throws Exception { @@ -280,8 +322,8 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds(), new MavenId("test", "foo-parent", "1")); + assertNotNull(result.projectData); + assertOrderedElementsAreEqual(result.unresolvedArtifacts, new MavenId("test", "foo-parent", "1")); } public void testUnresolvedSystemArtifactsWithoutPath() throws Exception { @@ -302,37 +344,7 @@ public class MavenEmbedderWrapperTest extends MavenImportingTestCase { myEmbedder.customizeForResolve(new SoutMavenConsole(), EMPTY_MAVEN_PROCESS); MavenWrapperExecutionResult result = myEmbedder.resolveProject(myProjectPom, Collections.EMPTY_LIST); - assertOrderedElementsAreEqual(result.getExceptions()); - assertOrderedElementsAreEqual(result.getUnresolvedArtifactIds(), new MavenId("fff", "zzz", "666")); - } - - public static class MyArtifactHandler implements ArtifactHandler { - public String getExtension() { - return "pom"; - } - - public String getDirectory() { - throw new UnsupportedOperationException(); - } - - public String getClassifier() { - return null; - } - - public String getPackaging() { - return "foo"; - } - - public boolean isIncludesDependencies() { - return false; - } - - public String getLanguage() { - return "java"; - } - - public boolean isAddedToClasspath() { - return true; - } + assertNotNull(result); + assertOrderedElementsAreEqual(result.unresolvedArtifacts, new MavenId("fff", "zzz", "666")); } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/NexusIndexerTest.java b/plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/NexusIndexerTest.java similarity index 91% rename from plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/NexusIndexerTest.java rename to plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/NexusIndexerTest.java index 4f3c1f68ca46..e2eaad4c3edd 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/NexusIndexerTest.java +++ b/plugins/maven/facade-impl/test/org/jetbrains/idea/maven/embedder/NexusIndexerTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.indices; +package org.jetbrains.idea.maven.embedder; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; @@ -22,7 +22,11 @@ import org.apache.lucene.search.*; import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.wagon.events.TransferEvent; import org.apache.maven.wagon.events.TransferListener; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.embedder.MavenFacadeEmbedderImpl; +import org.jetbrains.idea.maven.facade.embedder.MavenIndexFetcher; +import org.jetbrains.idea.maven.indices.MavenIndicesTestCase; import org.sonatype.nexus.index.*; import org.sonatype.nexus.index.context.IndexingContext; import org.sonatype.nexus.index.updater.IndexUpdateRequest; @@ -35,8 +39,8 @@ import java.util.Collection; import java.util.List; public class NexusIndexerTest extends MavenIndicesTestCase { + private MavenFacadeEmbedderImpl myEmbedder; private MavenCustomRepositoryHelper myRepositoryHelper; - private MavenEmbedderWrapper myEmbedder; private NexusIndexer myIndexer; private IndexUpdater myUpdater; private File myIndexDir; @@ -46,7 +50,7 @@ public class NexusIndexerTest extends MavenIndicesTestCase { super.setUp(); myRepositoryHelper = new MavenCustomRepositoryHelper(myDir, "local1_index", "local1", "remote"); - myEmbedder = MavenEmbedderWrapper.create(getMavenGeneralSettings()); + myEmbedder = MavenFacadeEmbedderImpl.create(MavenFacadeManager.convertSettings(getMavenGeneralSettings())); myIndexer = myEmbedder.getComponent(NexusIndexer.class); myUpdater = myEmbedder.getComponent(IndexUpdater.class); @@ -153,7 +157,7 @@ public class NexusIndexerTest extends MavenIndicesTestCase { myIndexer.removeIndexingContext(i1, false); myIndexer.removeIndexingContext(i2, false); - + addContext("id", new File(myIndexDir, "one"), null, null); addContext("id", new File(myIndexDir, "two"), null, null); } @@ -171,13 +175,13 @@ public class NexusIndexerTest extends MavenIndicesTestCase { private IndexingContext addContext(String id, File indexDir, File repoDir, String repoUrl) throws Exception { return myIndexer.addIndexingContext( - id, - id, - repoDir, - indexDir, - repoUrl, - null, // repo update url - NexusIndexer.FULL_INDEX); + id, + id, + repoDir, + indexDir, + repoUrl, + null, // repo update url + NexusIndexer.FULL_INDEX); } private void assertSearchWorks() throws IOException { diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java deleted file mode 100644 index 70ff84eaf0cf..000000000000 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java +++ /dev/null @@ -1,371 +0,0 @@ - -/* - * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.nexus; - -import com.intellij.util.xmlb.annotations.Transient; - -import javax.xml.bind.annotation.*; -import java.io.Serializable; - - -/** - *

Java class for artifactType complex type. - * - *

The following schema fragment specifies the expected content contained within this class. - * - *

- * <complexType name="artifactType">
- *   <complexContent>
- *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
- *       <sequence>
- *         <element name="resourceUri" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="groupId" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="artifactId" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="classifier" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="packaging" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="extension" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="repoId" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="contextId" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="pomLink" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *         <element name="artifactLink" type="{http://www.w3.org/2001/XMLSchema}string"/>
- *       </sequence>
- *     </restriction>
- *   </complexContent>
- * </complexType>
- * 
- * - * - */ -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "artifactType", propOrder = { - "resourceUri", - "groupId", - "artifactId", - "version", - "classifier", - "packaging", - "extension", - "repoId", - "contextId", - "pomLink", - "artifactLink" -}) -public class ArtifactType implements Serializable { - - @XmlElement(required = true) - protected String resourceUri; - @XmlElement(required = true) - protected String groupId; - @XmlElement(required = true) - protected String artifactId; - @XmlElement(required = true) - protected String version; - @XmlElement(required = true) - protected String classifier; - @XmlElement(required = true) - protected String packaging; - @XmlElement(required = true) - protected String extension; - @XmlElement(required = true) - protected String repoId; - @XmlElement(required = true) - protected String contextId; - @XmlElement(required = true) - protected String pomLink; - @XmlElement(required = true) - protected String artifactLink; - - public ArtifactType() { - - } - - public ArtifactType(String groupId, String artifactId, String version) { - this.groupId = groupId; - this.artifactId = artifactId; - this.version = version; - } - - /** - * Gets the value of the resourceUri property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getResourceUri() { - return resourceUri; - } - - /** - * Sets the value of the resourceUri property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setResourceUri(String value) { - this.resourceUri = value; - } - - /** - * Gets the value of the groupId property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getGroupId() { - return groupId; - } - - /** - * Sets the value of the groupId property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setGroupId(String value) { - this.groupId = value; - } - - /** - * Gets the value of the artifactId property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getArtifactId() { - return artifactId; - } - - /** - * Sets the value of the artifactId property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setArtifactId(String value) { - this.artifactId = value; - } - - /** - * Gets the value of the version property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getVersion() { - return version; - } - - /** - * Sets the value of the version property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setVersion(String value) { - this.version = value; - } - - /** - * Gets the value of the classifier property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getClassifier() { - return classifier; - } - - /** - * Sets the value of the classifier property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setClassifier(String value) { - this.classifier = value; - } - - /** - * Gets the value of the packaging property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getPackaging() { - return packaging; - } - - /** - * Sets the value of the packaging property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setPackaging(String value) { - this.packaging = value; - } - - /** - * Gets the value of the extension property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getExtension() { - return extension; - } - - /** - * Sets the value of the extension property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setExtension(String value) { - this.extension = value; - } - - /** - * Gets the value of the repoId property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getRepoId() { - return repoId; - } - - /** - * Sets the value of the repoId property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setRepoId(String value) { - this.repoId = value; - } - - /** - * Gets the value of the contextId property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getContextId() { - return contextId; - } - - /** - * Sets the value of the contextId property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setContextId(String value) { - this.contextId = value; - } - - /** - * Gets the value of the pomLink property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getPomLink() { - return pomLink; - } - - /** - * Sets the value of the pomLink property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setPomLink(String value) { - this.pomLink = value; - } - - /** - * Gets the value of the artifactLink property. - * - * @return - * possible object is - * {@link String } - * - */ - public String getArtifactLink() { - return artifactLink; - } - - /** - * Sets the value of the artifactLink property. - * - * @param value - * allowed object is - * {@link String } - * - */ - public void setArtifactLink(String value) { - this.artifactLink = value; - } - - @Override - public String toString() { - return groupId +":"+artifactId+":"+version; - } -} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java deleted file mode 100644 index 77f698a89f4f..000000000000 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/MavenFacade.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.remote; - -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.facade.nexus.ArtifactType; -import org.jetbrains.idea.maven.facade.nexus.RepositoryType; - -import java.io.Serializable; -import java.rmi.Remote; -import java.rmi.RemoteException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * @author Gregory.Shrago - */ -public interface MavenFacade extends Remote { - - List getRepositories(String nexusUrl) throws RemoteException; - - @Nullable - List findArtifacts(ArtifactType template, String nexusUrl) throws RemoteException; - - Map> resolveDependencies(List artifacts) throws RemoteException; - - void setTransferListener(RemoteTransferListener listener) throws RemoteException; - - void setMavenSettings(MavenFacadeSettings settings) throws RemoteException; - - class MavenFacadeSettings implements Serializable { - private Repository myLocalRepository; - private final List myRemoteRepositories = new ArrayList(); - - public Repository getLocalRepository() { - return myLocalRepository; - } - - public void setLocalRepository(Repository localRepository) { - myLocalRepository = localRepository; - } - - public List getRemoteRepositories() { - return myRemoteRepositories; - } - } - - class Repository implements Serializable { - private String myId; - private String myUrl; - private String myLayout; - - public Repository(String id, String url, String layout) { - myUrl = url; - myId = id; - myLayout = layout; - } - - public String getId() { - return myId; - } - - public void setId(String id) { - myId = id; - } - - public String getUrl() { - return myUrl; - } - - public void setUrl(String url) { - myUrl = url; - } - - public String getLayout() { - return myLayout; - } - - public void setLayout(String layout) { - myLayout = layout; - } - } - -} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java deleted file mode 100644 index 90389f53cf7d..000000000000 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/MavenFacadeImpl.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.remote.impl; - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.DefaultArtifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.manager.WagonManager; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.DefaultArtifactRepository; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.artifact.resolver.*; -import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; -import org.apache.maven.artifact.versioning.VersionRange; -import org.apache.maven.settings.MavenSettingsBuilder; -import org.apache.maven.settings.RuntimeInfo; -import org.apache.maven.settings.Settings; -import org.apache.maven.artifact.versioning.ArtifactVersion; -import org.apache.maven.wagon.events.TransferEvent; -import org.apache.maven.wagon.events.TransferListener; -import org.codehaus.classworlds.ClassWorld; -import org.codehaus.plexus.DefaultPlexusContainer; -import org.codehaus.plexus.PlexusContainerException; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; -import org.codehaus.plexus.util.xml.pull.XmlPullParserException; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.facade.nexus.ArtifactType; -import org.jetbrains.idea.maven.facade.nexus.Endpoint; -import org.jetbrains.idea.maven.facade.nexus.RepositoryType; -import org.jetbrains.idea.maven.facade.nexus.SearchResults; -import org.jetbrains.idea.maven.facade.remote.MavenFacade; -import org.jetbrains.idea.maven.facade.remote.RemoteTransferListener; - -import java.io.IOException; -import java.math.BigInteger; -import java.net.MalformedURLException; -import java.rmi.RemoteException; -import java.util.*; - -/** - * @author Gregory.Shrago - */ -public class MavenFacadeImpl extends RemoteImpl implements MavenFacade { - - private static final DefaultPlexusContainer ourContainer = initializeMaven(); - private MavenFacadeSettings mySettings; - - public static DefaultPlexusContainer initializeMaven() { - DefaultPlexusContainer container; - try { - container = new DefaultPlexusContainer(); - } - catch (RuntimeException e) { - String s = "Cannot initialize Maven. Please make sure that your IDEA installation is correct and has no old libraries."; - throw new RuntimeException(s, e); - } - - container.setClassWorld(new ClassWorld("plexus.core", Thread.currentThread().getContextClassLoader())); -// CustomLoggerManager loggerManager = new CustomLoggerManager(generalSettings.getLoggingLevel()); -// container.setLoggerManager(loggerManager); - - try { - container.initialize(); - container.start(); - } - catch (PlexusContainerException e) { - throw new RuntimeException(e); - } - -// System.setProperty("maven.home", "<...>"); -// System.setProperty(MavenSettingsBuilder.ALT_GLOBAL_SETTINGS_XML_LOCATION, "<..>"); - - Settings settings = null; - - try { - MavenSettingsBuilder builder = (MavenSettingsBuilder)container.lookup(MavenSettingsBuilder.ROLE); -// File userSettingsFile = generalSettings.getEffectiveUserSettingsIoFile(); -// if (userSettingsFile != null && userSettingsFile.exists() && !userSettingsFile.isDirectory()) { -// settings = builder.buildSettings(userSettingsFile, false); -// } - if (settings == null) { - settings = builder.buildSettings(); - } - } - catch (ComponentLookupException e) { - e.printStackTrace(); - } - catch (IOException e) { - e.printStackTrace(); - } - catch (XmlPullParserException e) { - e.printStackTrace(); - } - - if (settings == null) { - settings = new Settings(); - } - -// settings.setLocalRepository("<...>"); - - settings.setOffline(false); - settings.setInteractiveMode(false); - settings.setUsePluginRegistry(false); - - RuntimeInfo runtimeInfo = new RuntimeInfo(settings); -// runtimeInfo.setPluginUpdateOverride(generalSettings.getPluginUpdatePolicy() == MavenExecutionOptions.PluginUpdatePolicy.UPDATE); - settings.setRuntimeInfo(runtimeInfo); - - return container; - - } - - public List getRepositories(String nexusUrl) throws RemoteException { - try { - return new Endpoint.Repositories(nexusUrl).getRepolistAsRepositories().getData().getRepositoriesItem(); - } - catch (Exception ex) { - handleException(ex); - throw new AssertionError(); - } - } - - @Nullable - public List findArtifacts(ArtifactType template, String nexusUrl) throws RemoteException { - try { - SearchResults results = new Endpoint.DataIndex(nexusUrl) - .getArtifactlistAsSearchResults(null, template.getGroupId(), template.getArtifactId(), template.getVersion(), - template.getClassifier(), template.getContextId()); - final boolean canTrySwitchGAV = template.getArtifactId() == null && template.getGroupId() != null; - final boolean tooManyResults = results.isTooManyResults(); - if (canTrySwitchGAV && (tooManyResults || BigInteger.ZERO.equals(results.getTotalCount()))) { - results = new Endpoint.DataIndex(nexusUrl) - .getArtifactlistAsSearchResults(null, null, template.getGroupId(), template.getVersion(), - template.getClassifier(), template.getContextId()); - } - if (tooManyResults || results.isTooManyResults()) return null; - return new ArrayList(results.getData().getArtifact()); - } - catch (Exception ex) { - handleException(ex); - throw new AssertionError(); - } - } - - private void addMissingVersions(final Map result) { - try { - final ArtifactMetadataSource metadataSource = (ArtifactMetadataSource)ourContainer.lookup(ArtifactMetadataSource.ROLE); - final ArtifactFactory artifactFactory = (ArtifactFactory)ourContainer.lookup(ArtifactFactory.ROLE); - final ArtifactRepository localRepo = getRepository(mySettings.getLocalRepository()); - final List remoteRepos = new ArrayList(); - for (Repository repository : mySettings.getRemoteRepositories()) { - remoteRepos.add(getRepository(repository)); - } - final HashSet visitedIds = new HashSet(); - for (ArtifactType artifactType : result.values()) { - if (!visitedIds.add(artifactType.getGroupId()+":"+artifactType.getArtifactId())) continue; - if (artifactType.getPackaging() == null) continue; - final Artifact artifact = createArtifact(artifactFactory, artifactType); - try { - final List list = metadataSource.retrieveAvailableVersions(artifact, localRepo, remoteRepos); - for (ArtifactVersion version : list) { - final String coord = artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" + version; - if (!result.containsKey(coord)) { - final ArtifactType type = new ArtifactType(artifactType.getGroupId(), artifactType.getArtifactId(), version.toString()); - type.setPackaging(artifact.getType()); - result.put(coord, type); - } - } - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - } - catch (Exception e) { - handleException(e); - throw new AssertionError(); - } - } - - public Map> resolveDependencies(List artifacts) throws RemoteException { - try { - return resolveDependenciesInner(artifacts); - } - catch (Exception e) { - handleException(e); - throw new AssertionError(); - } - } - - public void setTransferListener(final RemoteTransferListener listener) throws RemoteException { - try { - final WagonManager wagonManager = (WagonManager)ourContainer.lookup(WagonManager.ROLE); - if (listener == null) { - wagonManager.setDownloadMonitor(null); - return; - } - wagonManager.setDownloadMonitor(new TransferListener() { - public void transferInitiated(TransferEvent transferEvent) { - try { - listener.transferInitiated(convert(transferEvent)); - } - catch (RemoteException ignored) { } - } - - public void transferStarted(TransferEvent transferEvent) { - try { - listener.transferStarted(convert(transferEvent)); - } - catch (RemoteException ignored) { - } - } - - public void transferProgress(TransferEvent transferEvent, byte[] bytes, int i) { - try { - listener.transferProgress(convert(transferEvent), i); - } - catch (RemoteException ignored) { - } - } - - public void transferCompleted(TransferEvent transferEvent) { - try { - listener.transferCompleted(convert(transferEvent)); - } - catch (RemoteException ignored) { - } - } - - public void transferError(TransferEvent transferEvent) { - try { - listener.transferError(convert(transferEvent)); - } - catch (RemoteException ignored) { - } - } - - public void debug(String s) { - try { - listener.debug(s); - } - catch (RemoteException ignored) { - } - } - }); - } - catch (Exception e) { - handleException(e); - throw new AssertionError(); - } - } - - public void setMavenSettings(MavenFacadeSettings settings) throws RemoteException { - mySettings = settings; - } - - private static RemoteTransferListener.TransferEvent convert(TransferEvent transferEvent) { - final RemoteTransferListener.TransferEvent.EventType et; - switch (transferEvent.getEventType()) { - case TransferEvent.TRANSFER_INITIATED: et = RemoteTransferListener.TransferEvent.EventType.INITIATED; break; - case TransferEvent.TRANSFER_STARTED: et = RemoteTransferListener.TransferEvent.EventType.STARTED; break; - case TransferEvent.TRANSFER_PROGRESS: et = RemoteTransferListener.TransferEvent.EventType.PROGRESS; break; - case TransferEvent.TRANSFER_COMPLETED: et = RemoteTransferListener.TransferEvent.EventType.COMPLETED; break; - case TransferEvent.TRANSFER_ERROR: et = RemoteTransferListener.TransferEvent.EventType.ERROR; break; - default: throw new AssertionError(transferEvent.getEventType()); - } - final RemoteTransferListener.TransferEvent.RequestType reqType = transferEvent.getRequestType() == TransferEvent.REQUEST_GET - ? RemoteTransferListener.TransferEvent.RequestType.GET - : RemoteTransferListener.TransferEvent.RequestType.PUT; - final RemoteTransferListener.Resource resource = new RemoteTransferListener.Resource(transferEvent.getResource().getName(), - transferEvent.getResource().getLastModified(), - transferEvent.getResource().getContentLength()); - return new RemoteTransferListener.TransferEvent(transferEvent.getLocalFile(), et, reqType, resource, transferEvent.getException(), transferEvent.getWagon().getRepository().getUrl()); - } - - - private Map> resolveDependenciesInner(List artifactsToResolve) throws Exception { - final ArtifactResolver resolver = (ArtifactResolver)ourContainer.lookup(ArtifactResolver.ROLE); - final ArtifactFactory artifactFactory = (ArtifactFactory)ourContainer.lookup(ArtifactFactory.ROLE); - final ArtifactMetadataSource metadataSource = (ArtifactMetadataSource)ourContainer.lookup(ArtifactMetadataSource.ROLE); - - final ArtifactRepository localRepo = getRepository(mySettings.getLocalRepository()); - final List remoteRepos = new ArrayList(); - for (Repository repository : mySettings.getRemoteRepositories()) { - remoteRepos.add(getRepository(repository)); - } - - - final Artifact project = artifactFactory.createBuildArtifact("local", "project", "1.0", "pom"); - final Set toResolve = new HashSet(); - for (ArtifactType template : artifactsToResolve) { - toResolve.add(createArtifact(artifactFactory, template)); - } - - final Map> resultMap = new HashMap>(); - for (Artifact artifact : toResolve) { - try { - final ArtifactResolutionResult result = resolver.resolveTransitively( - Collections.singleton(artifact), project, Collections.EMPTY_MAP, localRepo, remoteRepos, - metadataSource, new ScopeArtifactFilter(DefaultArtifact.SCOPE_RUNTIME)); - resultMap.put(getCoordinate(artifact), toArtifactTypeList(result.getArtifacts())); - } - catch (MultipleArtifactsNotFoundException e) { - resultMap.put(getCoordinate(artifact), toArtifactTypeList(e.getResolvedArtifacts())); - //System.out.println("Missing: -------------------"); - //toArtifactTypeList(e.getMissingArtifacts()); - } - catch (ArtifactResolutionException e) { - //throw e; - } - catch (ArtifactNotFoundException e) { - //throw e; - //System.out.println("Missing: -------------------"); - //toArtifactTypeList(Collections.singletonList(e.getArtifact())); - } - } - return resultMap; - } - - private Artifact createArtifact(ArtifactFactory artifactFactory, ArtifactType template) { - return artifactFactory.createDependencyArtifact( - template.getGroupId(), - template.getArtifactId(), - template.getVersion() == null? null : VersionRange.createFromVersion(template.getVersion()), - template.getPackaging(), - null, - "runtime"); - } - - private static ArtifactRepository getRepository(Repository r) throws ComponentLookupException { - final ArtifactRepositoryLayout repoLayout = (ArtifactRepositoryLayout)ourContainer.lookup(ArtifactRepositoryLayout.ROLE, r.getLayout()); - return new DefaultArtifactRepository(r.getId(), r.getUrl(), repoLayout); - } - - private static Map> toArtifactTypeMap(Collection toResolve, Collection resolvedArtifacts) { - final Map> result = new HashMap>(); - final Map idMap = new HashMap(); - for (Artifact artifact : toResolve) { - idMap.put(artifact.getId(), getCoordinate(artifact)); - result.put(getCoordinate(artifact), new ArrayList()); - } - for (Artifact artifact : resolvedArtifacts) { - List list = null; - for (String s : artifact.getDependencyTrail()) { - list = result.get(idMap.get(s)); - if (list != null) { - list.add(toArtifactType(artifact)); - break; - } - } - if (list == null) { - throw new AssertionError(getCoordinate(artifact)); - } - } - return result; - } - - private static String getCoordinate(Artifact artifact) { - return artifact.getGroupId()+":"+artifact.getArtifactId()+":"+artifact.getVersion(); - } - - private static List toArtifactTypeList(Collection artifacts) throws MalformedURLException { - final ArrayList result = new ArrayList(artifacts.size()); - for (Artifact artifact : artifacts) { - result.add(toArtifactType(artifact)); - } - return result; - } - - private static ArtifactType toArtifactType(Artifact artifact) { - final ArtifactType type = new ArtifactType(); - type.setGroupId(artifact.getGroupId()); - type.setArtifactId(artifact.getArtifactId()); - type.setVersion(artifact.getVersion()); - type.setClassifier(artifact.getClassifier()); - type.setResourceUri(artifact.getFile().toURI().toASCIIString()); - return type; - } -} diff --git a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteTransferListenerImpl.java b/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteTransferListenerImpl.java deleted file mode 100644 index d418cc5ed90d..000000000000 --- a/plugins/maven/facade/org/jetbrains/idea/maven/facade/remote/impl/RemoteTransferListenerImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.jetbrains.idea.maven.facade.remote.impl; - -import org.jetbrains.idea.maven.facade.remote.RemoteTransferListener; - -/** - * @author Gregory.Shrago - */ -public class RemoteTransferListenerImpl extends RemoteImpl implements RemoteTransferListener { - - public void transferInitiated(TransferEvent transferEvent) { - } - - public void transferStarted(TransferEvent transferEvent) { - } - - public void transferProgress(TransferEvent transferEvent, int length) { - } - - public void transferCompleted(TransferEvent transferEvent) { - } - - public void transferError(TransferEvent transferEvent) { - } - - public void debug(String s) { - } - -} diff --git a/plugins/maven/lib/maven-embedder-1.0-SNAPSHOT.jar b/plugins/maven/lib/maven-embedder-1.0-SNAPSHOT.jar deleted file mode 100644 index 0670771f4a8d42a3f9bebf011236b385e75c6dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25822 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 diff --git a/plugins/maven/maven-facade.iml b/plugins/maven/maven-facade.iml deleted file mode 100644 index c7e166df27e9..000000000000 --- a/plugins/maven/maven-facade.iml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/maven/maven.iml b/plugins/maven/maven.iml index 714f1b53190b..276526c316bf 100644 --- a/plugins/maven/maven.iml +++ b/plugins/maven/maven.iml @@ -10,110 +10,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -121,14 +23,13 @@ - + + - - diff --git a/plugins/maven/src/main/java/org/apache/maven/project/JBMavenProjectHelper.java b/plugins/maven/src/main/java/org/apache/maven/project/JBMavenProjectHelper.java deleted file mode 100644 index b771720203a7..000000000000 --- a/plugins/maven/src/main/java/org/apache/maven/project/JBMavenProjectHelper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2009 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 org.apache.maven.project; - -import java.util.List; - -public class JBMavenProjectHelper { - public static void setSourceRoots(MavenProject project, - List compileSourceRoots, - List testCompileSourceRoots, - List scriptSourceRoots) { - project.setCompileSourceRoots(compileSourceRoots); - project.setTestCompileSourceRoots(testCompileSourceRoots); - project.setScriptSourceRoots(scriptSourceRoots); - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/compiler/MavenResourceCompiler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/compiler/MavenResourceCompiler.java index f674f9c1444e..55e25132e819 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/compiler/MavenResourceCompiler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/compiler/MavenResourceCompiler.java @@ -44,7 +44,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.MavenPropertyResolver; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.project.MavenResource; +import org.jetbrains.idea.maven.model.MavenResource; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomProjectProcessorUtils.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomProjectProcessorUtils.java index 72fe08125678..75d2cc0fae74 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomProjectProcessorUtils.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomProjectProcessorUtils.java @@ -26,6 +26,7 @@ import com.intellij.util.xml.DomUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.*; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java index ef805034e20b..1bf3b6815219 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenDomUtil.java @@ -28,7 +28,6 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; @@ -42,8 +41,11 @@ import com.intellij.util.xml.reflect.DomCollectionChildDescription; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.*; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenId; +import org.jetbrains.idea.maven.model.MavenResource; import org.jetbrains.idea.maven.project.*; -import org.jetbrains.idea.maven.utils.MavenConstants; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPropertyResolver.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPropertyResolver.java index 385ac14d8797..060067ba2cda 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPropertyResolver.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenPropertyResolver.java @@ -18,16 +18,13 @@ package org.jetbrains.idea.maven.dom; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.xml.XmlTag; -import org.apache.commons.beanutils.BeanAccessLanguageException; -import org.apache.commons.beanutils.BeanUtils; import org.jetbrains.idea.maven.dom.model.MavenDomProfile; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.dom.model.MavenDomProperties; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeUtil; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.Properties; import java.util.Stack; @@ -137,7 +134,7 @@ public class MavenPropertyResolver { private static String doResolveProperty(String propName, MavenProject project, Properties additionalProperties) { String result; - result = MavenEmbedderWrapper.collectSystemProperties().getProperty(propName); + result = MavenFacadeUtil.collectSystemProperties().getProperty(propName); if (result != null) return result; if (propName.startsWith("project.") || propName.startsWith("pom.")) { @@ -151,19 +148,7 @@ public class MavenPropertyResolver { if (propName.equals("basedir")) return project.getDirectory(); - try { - result = BeanUtils.getNestedProperty(project.getMavenModel(), propName); - } - catch (IllegalAccessException e) { - } - catch (BeanAccessLanguageException e) { - } - catch (InvocationTargetException e) { - } - catch (NoSuchMethodException e) { - } - catch (IllegalArgumentException e) { - } + result = project.getModelMap().get(propName); if (result != null) return result; result = additionalProperties.getProperty(propName); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/annotator/MavenDomAnnotator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/annotator/MavenDomAnnotator.java index 6314cd034ae7..1227c5e913bc 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/annotator/MavenDomAnnotator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/annotator/MavenDomAnnotator.java @@ -20,8 +20,8 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ArrayUtil; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomUtil; import com.intellij.util.xml.highlighting.DomElementAnnotationHolder; @@ -31,8 +31,8 @@ import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomParent; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; +import org.jetbrains.idea.maven.model.MavenProjectProblem; import org.jetbrains.idea.maven.project.MavenProject; -import org.jetbrains.idea.maven.project.MavenProjectProblem; import java.util.Arrays; @@ -56,7 +56,7 @@ public class MavenDomAnnotator implements DomElementsAnnotator { for (MavenProjectProblem each : mavenProject.getProblems()) { MavenProjectProblem.ProblemType type = each.getType(); if (!Arrays.asList(types).contains(type)) continue; - VirtualFile problemFile = each.findFile(); + VirtualFile problemFile = LocalFileSystem.getInstance().findFileByPath(each.getPath()); LocalQuickFix[] fixes = LocalQuickFix.EMPTY_ARRAY; if (problemFile != null && mavenProject.getFile() != problemFile) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesArtifactIdConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesArtifactIdConverter.java index b0af15571625..ed8cc955fc80 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesArtifactIdConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesArtifactIdConverter.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.dom.converters; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xml.ConvertContext; import org.jetbrains.idea.maven.indices.MavenProjectIndicesManager; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.util.Set; import java.util.Collections; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java index 06164dc2818d..2d2b055af365 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java @@ -36,7 +36,7 @@ import org.jetbrains.idea.maven.dom.model.*; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.indices.MavenProjectIndicesManager; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java index ada8abd01195..6a471d5b7f53 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java @@ -3,13 +3,10 @@ package org.jetbrains.idea.maven.dom.converters; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.hash.HashSet; import com.intellij.util.xml.ConvertContext; -import com.intellij.util.xml.impl.ConvertContextImpl; -import org.jetbrains.idea.maven.dom.model.MavenDomShortArtifactCoordinates; import org.jetbrains.idea.maven.indices.MavenProjectIndicesManager; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.util.Collection; -import java.util.Collections; import java.util.Set; public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoordinatesConverter { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java index 7429a956ad35..9867a927256a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java @@ -19,7 +19,7 @@ import com.intellij.util.xml.ConvertContext; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.MavenDomArtifactCoordinates; import org.jetbrains.idea.maven.dom.model.MavenDomShortArtifactCoordinates; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; public class MavenArtifactCoordinatesHelper { public static MavenId getId(ConvertContext context) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesVersionConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesVersionConverter.java index 9812834abde7..22194e67adeb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesVersionConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesVersionConverter.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.dom.converters; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.xml.ConvertContext; import org.jetbrains.idea.maven.indices.MavenProjectIndicesManager; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.util.Collections; import java.util.Set; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenDependencyScopeConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenDependencyScopeConverter.java index 92d2ebac7cdf..a37b2a0d6ba1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenDependencyScopeConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenDependencyScopeConverter.java @@ -16,9 +16,8 @@ package org.jetbrains.idea.maven.dom.converters; import com.intellij.util.xml.ConvertContext; -import com.intellij.util.xml.DomManager; import org.jetbrains.idea.maven.dom.model.MavenDomDependencyManagement; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import java.util.Arrays; import java.util.List; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java index 8833a4c11af5..99e83a9809d4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java @@ -30,13 +30,12 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; -import org.jetbrains.idea.maven.dom.converters.MavenArtifactCoordinatesHelper; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.MavenDomBundle; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenConstants; import java.util.ArrayList; import java.util.Collection; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java index eb1250fcc0f3..73f1dfa9c3b3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java @@ -69,10 +69,4 @@ public class MavenRepositoriesProvider { RepositoryBeanInfo pair = myRepositoriesMap.get(id); return pair != null ? pair.getUrl() : null; } - - @Nullable - public String getRepositoryLayout(@Nullable String id) { - RepositoryBeanInfo pair = myRepositoriesMap.get(id); - return pair != null ? pair.getLayout() : null; - } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java index e3767bbfac57..96f918b3e937 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java @@ -32,9 +32,6 @@ public class RepositoryBeanInfo { @Attribute("url") public String myUrl; - @Attribute("layout") - public String myLayout; - public String getId() { return myId; } @@ -46,8 +43,4 @@ public class RepositoryBeanInfo { public String getUrl() { return myUrl; } - - public String getLayout() { - return myLayout; - } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateAddManagedDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateAddManagedDependencyAction.java index 8124b2118b9e..479896edef4d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateAddManagedDependencyAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateAddManagedDependencyAction.java @@ -29,8 +29,6 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomDependencies; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; -import org.jetbrains.idea.maven.project.MavenId; -import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenIcons; import java.util.List; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java index 313848c9281c..c0a3647a023f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java @@ -19,8 +19,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiDocumentManager; import com.intellij.util.xml.ui.actions.generate.GenerateDomElementAction; import org.jetbrains.idea.maven.dom.MavenDomBundle; -import org.jetbrains.idea.maven.dom.model.MavenDomBuild; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.indices.MavenArtifactSearchDialog; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java index 7579c0e46897..694a384e69f1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java @@ -34,7 +34,7 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomArtifactCoordinates; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import java.util.HashMap; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/intentions/AddMavenDependencyQuickFix.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/intentions/AddMavenDependencyQuickFix.java index 88ed35d1064c..f54784386e4d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/intentions/AddMavenDependencyQuickFix.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/intentions/AddMavenDependencyQuickFix.java @@ -27,9 +27,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.indices.MavenArtifactSearchDialog; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.project.MavenId; public class AddMavenDependencyQuickFix implements IntentionAction, LowPriorityAction { private final PsiJavaCodeReferenceElement myRef; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenModulePsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenModulePsiReference.java index 48fde73e1ec1..5e94047a700e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenModulePsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenModulePsiReference.java @@ -33,8 +33,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; -import org.jetbrains.idea.maven.project.MavenId; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.utils.MavenUtil; import java.io.IOException; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java index 9921ceb0cc14..d9d441333e65 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenPropertyPsiReference.java @@ -44,6 +44,7 @@ import org.jetbrains.idea.maven.dom.MavenDomProjectProcessorUtils; import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.MavenSchemaProvider; import org.jetbrains.idea.maven.dom.model.*; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenIcons; import org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomLoggerManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomLoggerManager.java deleted file mode 100644 index a6b533b783fa..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/CustomLoggerManager.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.embedder; - -import org.codehaus.plexus.logging.AbstractLoggerManager; -import org.codehaus.plexus.logging.Logger; - -public class CustomLoggerManager extends AbstractLoggerManager { - private final MavenLogger myLogger; - - - - public CustomLoggerManager(MavenExecutionOptions.LoggingLevel loggingLevel) { - myLogger = new MavenLogger(); - myLogger.setThreshold(loggingLevel.getLevel()); - } - - public MavenLogger getLogger() { - return myLogger; - } - - public void setThreshold(int i) { - } - - public int getThreshold() { - return myLogger.getThreshold(); - } - - public void setThresholds(int i) { - } - - public void setThreshold(String s, String s1, int i) { - } - - public int getThreshold(String s, String s1) { - return myLogger.getThreshold(); - } - - public Logger getLoggerForComponent(String s, String s1) { - return myLogger; - } - - public void returnComponentLogger(String s, String s1) { - } - - public int getActiveLoggerCount() { - return 1; - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleHelper.java deleted file mode 100644 index ee064e97da09..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleHelper.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.embedder; - -import org.jetbrains.idea.maven.execution.RunnerBundle; - -import java.util.List; - -public class MavenConsoleHelper { - public static void printException(MavenConsole console, Throwable throwable) { - console.systemMessage(MavenConsole.LEVEL_ERROR, RunnerBundle.message("embedded.build.failed"), throwable); - } - - public static void printExecutionExceptions(MavenConsole console, MavenWrapperExecutionResult result) { - for (Exception each : (List)result.getExceptions()) { - Throwable cause = each.getCause(); - printException(console, cause == null ? each : cause); - } - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderUtilEx.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderUtilEx.java deleted file mode 100644 index 56265d1f313b..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderUtilEx.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.embedder; - -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.utils.MavenConstants; -import org.jetbrains.idea.maven.utils.MavenJDOMUtil; -import org.jetbrains.maven.embedder.MavenEmbedderUtil; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.*; -import java.util.regex.Pattern; - -public class MavenEmbedderUtilEx extends MavenEmbedderUtil { - private static final String REPOSITORY_DIR = "repository"; - - private static final String LIB_DIR = "lib"; - private static final String SUPER_POM_PATH = "org/apache/maven/project/" + MavenConstants.SUPER_POM_XML; - - @NotNull - public static VirtualFile resolveSuperPomFile(@Nullable String overrideMavenHome) { - VirtualFile result = doResolveSuperPomFile(overrideMavenHome); - if (result == null) { - URL resource = MavenEmbedderUtilEx.class.getResource("/" + SUPER_POM_PATH); - return VfsUtil.findFileByURL(resource); - } - return result; - } - - @Nullable - private static VirtualFile doResolveSuperPomFile(String overrideMavenHome) { - File lib = resolveMavenLib(overrideMavenHome); - if (lib == null) return null; - - VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(lib); - if (file == null) return null; - - VirtualFile root = JarFileSystem.getInstance().getJarRootForLocalFile(file); - if (root == null) return null; - - return root.findFileByRelativePath(SUPER_POM_PATH); - } - - @Nullable - private static File resolveMavenLib(String overrideMavenHome) { - File directory = resolveMavenHomeDirectory(overrideMavenHome); - if (directory == null) return null; - File libs = new File(directory, LIB_DIR); - File[] files = libs.listFiles(); - if (files != null) { - Pattern pattern = Pattern.compile("maven-\\d+\\.\\d+\\.\\d+-uber\\.jar"); - for (File each : files) { - if (pattern.matcher(each.getName()).matches()) { - return each; - } - } - } - return null; - } - - @NotNull - public static File resolveLocalRepository(@Nullable String mavenHome, @Nullable String userSettings, @Nullable String override) { - File result = doResolveLocalRepository(mavenHome, userSettings, override); - try { - return result.getCanonicalFile(); - } - catch (IOException e) { - return result; - } - } - - @NotNull - private static File doResolveLocalRepository(String mavenHome, String userSettings, String override) { - if (!StringUtil.isEmpty(override)) { - return new File(override); - } - - final File userSettingsFile = resolveUserSettingsFile(userSettings); - if (userSettingsFile != null) { - final String fromUserSettings = getRepositoryFromSettings(userSettingsFile); - if (!StringUtil.isEmpty(fromUserSettings)) { - return new File(fromUserSettings); - } - } - - final File globalSettingsFile = resolveGlobalSettingsFile(mavenHome); - if (globalSettingsFile != null) { - final String fromGlobalSettings = getRepositoryFromSettings(globalSettingsFile); - if (!StringUtil.isEmpty(fromGlobalSettings)) { - return new File(fromGlobalSettings); - } - } - - return new File(resolveM2Dir(), REPOSITORY_DIR); - } - - @Nullable - private static String getRepositoryFromSettings(final File file) { - try { - byte[] bytes = FileUtil.loadFileBytes(file); - return expandProperties(MavenJDOMUtil.findChildValueByPath(MavenJDOMUtil.read(bytes, null), "localRepository", null)); - } - catch (IOException e) { - return null; - } - } - - private static String expandProperties(String text) { - if (StringUtil.isEmptyOrSpaces(text)) return text; - Properties props = MavenEmbedderWrapper.collectSystemProperties(); - for (Map.Entry each : props.entrySet()) { - text = text.replace("${" + each.getKey() + "}", (CharSequence)each.getValue()); - } - return text; - } -} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapper.java deleted file mode 100644 index 9e2bf2a1ee3c..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenEmbedderWrapper.java +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.embedder; - -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.util.Ref; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Function; -import gnu.trove.THashSet; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.InvalidRepositoryException; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.manager.WagonManager; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; -import org.apache.maven.artifact.resolver.ArtifactResolver; -import org.apache.maven.artifact.resolver.ResolutionListener; -import org.apache.maven.model.Build; -import org.apache.maven.model.Model; -import org.apache.maven.model.Plugin; -import org.apache.maven.plugin.PluginManager; -import org.apache.maven.plugin.descriptor.PluginDescriptor; -import org.apache.maven.project.*; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.artifact.ProjectArtifactFactory; -import org.apache.maven.project.interpolation.AbstractStringBasedModelInterpolator; -import org.apache.maven.project.interpolation.ModelInterpolationException; -import org.apache.maven.project.interpolation.ModelInterpolator; -import org.apache.maven.project.path.DefaultPathTranslator; -import org.apache.maven.project.path.PathTranslator; -import org.apache.maven.shared.dependency.tree.DependencyNode; -import org.apache.maven.shared.dependency.tree.DependencyTreeResolutionListener; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.component.repository.ComponentDependency; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.project.*; -import org.jetbrains.idea.maven.utils.MavenLog; -import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; -import org.jetbrains.idea.maven.utils.MavenProgressIndicator; -import org.jetbrains.maven.embedder.MavenEmbedder; -import org.jetbrains.maven.embedder.MavenEmbedderSettings; -import org.jetbrains.maven.embedder.MavenExecutionResult; -import org.jetbrains.maven.embedder.PlexusComponentConfigurator; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class MavenEmbedderWrapper { - public static final List PHASES = - Arrays.asList("clean", "validate", "generate-sources", "process-sources", "generate-resources", - "process-resources", "compile", "process-classes", "generate-test-sources", "process-test-sources", - "generate-test-resources", - "process-test-resources", "test-compile", "test", "prepare-package", "package", "pre-integration-test", - "integration-test", - "post-integration-test", - "verify", "install", "site", "deploy"); - public static final List BASIC_PHASES = - Arrays.asList("clean", "validate", "compile", "test", "package", "install", "deploy", "site"); - - private final MavenEmbedder myImpl; - private final MavenLogger myLogger; - private volatile MavenProgressIndicator myCurrentIndicator; - - public static MavenEmbedderWrapper create(MavenGeneralSettings generalSettings) { - MavenEmbedderSettings settings = new MavenEmbedderSettings(); - - settings.setConfigurator(new PlexusComponentConfigurator() { - public void configureComponents(@NotNull PlexusContainer c) { - setupContainer(c); - } - }); - MavenLogger logger = new MavenLogger(); - logger.setThreshold(generalSettings.getLoggingLevel().getLevel()); - settings.setLogger(logger); - settings.setRecursive(false); - - settings.setWorkOffline(generalSettings.isWorkOffline()); - settings.setUsePluginRegistry(generalSettings.isUsePluginRegistry()); - - settings.setMavenHome(generalSettings.getMavenHome()); - settings.setMavenSettingsFile(generalSettings.getMavenSettingsFile()); - settings.setLocalRepository(generalSettings.getEffectiveLocalRepository().getPath()); - - settings.setSnapshotUpdatePolicy(generalSettings.getSnapshotUpdatePolicy().getEmbedderPolicy()); - settings.setPluginUpdatePolicy(generalSettings.getPluginUpdatePolicy().getEmbedderPolicy()); - - return new MavenEmbedderWrapper(MavenEmbedder.create(settings), logger); - } - - private MavenEmbedderWrapper(MavenEmbedder impl, MavenLogger logger) { - myImpl = impl; - myLogger = logger; - } - - public MavenWrapperResolutionResult resolveProject(@NotNull final VirtualFile file, - @NotNull final Collection activeProfiles) - throws MavenProcessCanceledException { - return doExecute(new Executor() { - public MavenWrapperResolutionResult execute() throws Exception { - DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myLogger); - - MavenExecutionResult result = myImpl.resolveProject(new File(file.getPath()), - new ArrayList(activeProfiles), - Arrays.asList(listener)); - - DependencyNode rootNode = listener.getRootNode(); - Collection depsTree = rootNode == null ? Collections.emptyList() : rootNode.getChildren(); - return new MavenWrapperResolutionResult(result.getMavenProject(), - depsTree, retrieveUnresolvedArtifactIds(), result.getExceptions()); - } - }); - } - - public void resolve(@NotNull final Artifact artifact, @NotNull final List remoteRepositories) - throws MavenProcessCanceledException { - doExecute(new Executor() { - public Object execute() throws Exception { - doResolve(artifact, convertRepositories(remoteRepositories)); - return null; - } - }); - } - - public MavenArtifact resolve(@NotNull final MavenId id, - @NotNull final String type, - @Nullable final String classifier, - @NotNull final List remoteRepositories) - throws MavenProcessCanceledException { - return doExecute(new Executor() { - public MavenArtifact execute() throws Exception { - return new MavenArtifact(doResolve(id, type, classifier, convertRepositories(remoteRepositories)), getLocalRepositoryFile()); - } - }); - } - - private Artifact doResolve(MavenId id, String type, String classifier, List remoteRepositories) { - Artifact artifact = getComponent(ArtifactFactory.class).createArtifactWithClassifier(id.getGroupId(), - id.getArtifactId(), - id.getVersion(), - type, - classifier); - return doResolve(artifact, remoteRepositories); - } - - private Artifact doResolve(Artifact artifact, List remoteRepositories) { - try { - myImpl.resolve(artifact, remoteRepositories); - return artifact; - } - catch (Exception e) { - MavenLog.LOG.info(e); - } - return artifact; - } - - private List convertRepositories(List repositories) { - List result = new ArrayList(); - for (MavenRemoteRepository each : repositories) { - try { - ArtifactRepositoryFactory factory = getComponent(ArtifactRepositoryFactory.class); - result.add(ProjectUtils.buildArtifactRepository(each.toRepository(), factory, getContainer())); - } - catch (InvalidRepositoryException e) { - MavenLog.LOG.warn(e); - } - } - return result; - } - - public boolean resolvePlugin(@NotNull final MavenPlugin plugin, @NotNull final MavenProject nativeMavenProject, final boolean transitive) - throws MavenProcessCanceledException { - return doExecute(new Executor() { - public Boolean execute() throws Exception { - try { - Plugin mavenPlugin = new Plugin(); - mavenPlugin.setGroupId(plugin.getGroupId()); - mavenPlugin.setArtifactId(plugin.getArtifactId()); - mavenPlugin.setVersion(plugin.getVersion()); - PluginDescriptor result = - getComponent(PluginManager.class).verifyPlugin(mavenPlugin, nativeMavenProject, - myImpl.getSettings(), myImpl.getLocalRepository()); - if (!transitive) return true; - - // todo try to use parallel downloading - - List repos = nativeMavenProject.getRemoteArtifactRepositories(); - for (Artifact each : (Iterable)result.getIntroducedDependencyArtifacts()) { - doResolve(new MavenId(each.getGroupId(), each.getArtifactId(), each.getVersion()), each.getType(), null, repos); - } - for (ComponentDependency each : (List)result.getDependencies()) { - doResolve(new MavenId(each.getGroupId(), each.getArtifactId(), each.getVersion()), each.getType(), null, repos); - } - } - catch (Exception e) { - MavenLog.LOG.info(e); - return false; - } - return true; - } - }); - } - - @NotNull - public MavenWrapperExecutionResult execute(@NotNull final VirtualFile file, - @NotNull final Collection activeProfiles, - @NotNull final List goals) - throws MavenProcessCanceledException { - return doExecute(new Executor() { - public MavenWrapperExecutionResult execute() throws Exception { - MavenExecutionResult result = myImpl.execute(new File(file.getPath()), new ArrayList(activeProfiles), goals); - return new MavenWrapperExecutionResult(result.getMavenProject(), retrieveUnresolvedArtifactIds(), result.getExceptions()); - } - }); - } - - private Set retrieveUnresolvedArtifactIds() { - Set result = new THashSet(); - ((CustomWagonManager)getComponent(WagonManager.class)).getUnresolvedCollector().retrieveUnresolvedIds(result); - ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).getUnresolvedCollector().retrieveUnresolvedIds(result); - return result; - } - - public static Model interpolate(Model model, File basedir) { - try { - AbstractStringBasedModelInterpolator interpolator = new CustomModelInterpolator(new DefaultPathTranslator()); - interpolator.initialize(); - - Properties context = collectSystemProperties(); - - ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration().setExecutionProperties(context); - model = interpolator.interpolate(ModelUtils.cloneModel(model), basedir, config, false); - } - catch (ModelInterpolationException e) { - MavenLog.LOG.warn(e); - } - catch (InitializationException e) { - MavenLog.LOG.error(e); - } - - return model; - } - - public static void alignModel(Model model, File basedir) { - PathTranslator pathTranslator = new DefaultPathTranslator(); - pathTranslator.alignToBaseDirectory(model, basedir); - Build build = model.getBuild(); - build.setScriptSourceDirectory(pathTranslator.alignToBaseDirectory(build.getScriptSourceDirectory(), basedir)); - } - - @NotNull - public File getLocalRepositoryFile() { - return myImpl.getLocalRepositoryFile(); - } - - public T getComponent(Class clazz) { - return myImpl.getComponent(clazz); - } - - public T getComponent(Class clazz, String roleHint) { - return myImpl.getComponent(clazz, roleHint); - } - - public PlexusContainer getContainer() { - return myImpl.getContainer(); - } - - private interface Executor { - T execute() throws Exception; - } - - private T doExecute(final Executor executor) throws MavenProcessCanceledException { - final Ref result = new Ref(); - final boolean[] cancelled = new boolean[1]; - final Throwable[] exception = new Throwable[1]; - - Future future = ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - public void run() { - try { - result.set(executor.execute()); - } - catch (ProcessCanceledException e) { - cancelled[0] = true; - } - catch (Throwable e) { - exception[0] = e; - } - } - }); - - MavenProgressIndicator indicator = myCurrentIndicator; - while (true) { - indicator.checkCanceled(); - try { - future.get(50, TimeUnit.MILLISECONDS); - } - catch (TimeoutException ignore) { - } - catch (ExecutionException e) { - throw new RuntimeException(e.getCause()); - } - catch (InterruptedException e) { - throw new MavenProcessCanceledException(); - } - - if (future.isDone()) break; - } - - if (cancelled[0]) throw new MavenProcessCanceledException(); - if (exception[0] != null) { - throw getRethrowable(exception[0]); - } - - return result.get(); - } - - private RuntimeException getRethrowable(Throwable throwable) { - if (throwable instanceof InvocationTargetException) throwable = throwable.getCause(); - if (throwable instanceof RuntimeException) return (RuntimeException)throwable; - return new RuntimeException(throwable); - } - - private static void setupContainer(PlexusContainer c) { - MavenEmbedder.setImplementation(c, ArtifactFactory.class, CustomArtifactFactory.class); - MavenEmbedder.setImplementation(c, ProjectArtifactFactory.class, CustomArtifactFactory.class); - MavenEmbedder.setImplementation(c, ArtifactResolver.class, CustomArtifactResolver.class); - MavenEmbedder.setImplementation(c, WagonManager.class, CustomWagonManager.class); - MavenEmbedder.setImplementation(c, ModelInterpolator.class, CustomModelInterpolator.class); - } - - public void customizeForResolve(MavenConsole console, MavenProgressIndicator process) { - doCustomize(null, false, console, process); - } - - public void customizeForResolve(Map projectIdToFileMap, MavenConsole console, MavenProgressIndicator process) { - doCustomize(projectIdToFileMap, false, console, process); - } - - public void customizeForStrictResolve(Map projectIdToFileMap, - MavenConsole console, - MavenProgressIndicator process) { - doCustomize(projectIdToFileMap, true, console, process); - } - - private void doCustomize(Map projectIdToFileMap, - boolean strict, - MavenConsole console, - MavenProgressIndicator process) { - ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).customize(); - ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).customize(); - ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).customize(projectIdToFileMap, strict); - ((CustomWagonManager)getComponent(WagonManager.class)).customize(strict); - - setConsoleAndLogger(console, process); - } - - private void setConsoleAndLogger(MavenConsole console, MavenProgressIndicator process) { - myCurrentIndicator = process; - myLogger.setConsole(console); - - WagonManager wagon = getComponent(WagonManager.class); - wagon.setDownloadMonitor(process == null ? null : new TransferListenerAdapter(process)); - } - - public void reset() { - setConsoleAndLogger(null, null); - - ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).reset(); - ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).reset(); - ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).reset(); - ((CustomWagonManager)getComponent(WagonManager.class)).reset(); - } - - public void release() { - myImpl.release(); - } - - public void clearCaches() { - withProjectCachesDo(new Function() { - public Object fun(Map map) { - map.clear(); - return null; - } - }); - } - - public void clearCachesFor(final MavenId projectId) { - withProjectCachesDo(new Function() { - public Object fun(Map map) { - map.remove(projectId.getKey()); - return null; - } - }); - } - - private void withProjectCachesDo(Function func) { - MavenProjectBuilder builder = myImpl.getComponent(MavenProjectBuilder.class); - Field field; - try { - field = builder.getClass().getDeclaredField("rawProjectCache"); - field.setAccessible(true); - func.fun(((Map)field.get(builder))); - - field = builder.getClass().getDeclaredField("processedProjectCache"); - field.setAccessible(true); - func.fun(((Map)field.get(builder))); - } - catch (NoSuchFieldException e) { - MavenLog.LOG.error(e); - } - catch (IllegalAccessException e) { - MavenLog.LOG.error(e); - } - } - - public static Properties collectSystemProperties() { - return MavenEmbedder.collectSystemProperties(); - } - - public static void resetSystemPropertiesCacheInTests() { - MavenEmbedder.resetSystemPropertiesCache(); - } - -} - diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperExecutionResult.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperExecutionResult.java deleted file mode 100644 index a9232e87aa2a..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperExecutionResult.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.embedder; - -import org.apache.maven.project.MavenProject; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.project.MavenId; - -import java.util.List; -import java.util.Set; - -public class MavenWrapperExecutionResult { - private final MavenProject myMavenProject; - private final Set myUnresolvedArtifactIds; - private final List myExceptions; - - public MavenWrapperExecutionResult(MavenProject mavenProject, Set unresolvedArtifactIds, List exceptions) { - myMavenProject = mavenProject; - myUnresolvedArtifactIds = unresolvedArtifactIds; - myExceptions = exceptions; - } - - @Nullable - public MavenProject getMavenProject() { - return myMavenProject; - } - - public Set getUnresolvedArtifactIds() { - return myUnresolvedArtifactIds; - } - - public List getExceptions() { - return myExceptions; - } - - public boolean hasExceptions() { - return !myExceptions.isEmpty(); - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperResolutionResult.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperResolutionResult.java deleted file mode 100644 index 78ccf27a1ae1..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenWrapperResolutionResult.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2010 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 org.jetbrains.idea.maven.embedder; - -import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.dependency.tree.DependencyNode; -import org.jetbrains.idea.maven.project.MavenId; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -public class MavenWrapperResolutionResult extends MavenWrapperExecutionResult { - private final Collection myOriginalDependencyTree; - - public MavenWrapperResolutionResult(MavenProject mavenProject, - Collection originalDependencyTree, - Set unresolvedArtifactIds, - List exceptions) { - super(mavenProject, unresolvedArtifactIds, exceptions); - myOriginalDependencyTree = originalDependencyTree; - } - - public Collection getOriginalDependencyTree() { - return myOriginalDependencyTree; - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenExecutionOptions.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutionOptions.java similarity index 68% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenExecutionOptions.java rename to plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutionOptions.java index 05c4a909aa82..ffe9f3e31652 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenExecutionOptions.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutionOptions.java @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.execution; -import org.codehaus.plexus.logging.Logger; -import org.jetbrains.maven.embedder.MavenEmbedderSettings; +import org.jetbrains.idea.maven.facade.MavenFacadeConsole; +import org.jetbrains.idea.maven.facade.MavenFacadeSettings; public class MavenExecutionOptions { public enum LoggingLevel { - DEBUG("Debug", Logger.LEVEL_DEBUG), - INFO("Info", Logger.LEVEL_INFO), - WARN("Warn", Logger.LEVEL_WARN), - ERROR("Error", Logger.LEVEL_ERROR), - FATAL("Fatal", Logger.LEVEL_FATAL), - DISABLED("Disabled", Logger.LEVEL_DISABLED); + DEBUG("Debug", MavenFacadeConsole.LEVEL_DEBUG), + INFO("Info", MavenFacadeConsole.LEVEL_INFO), + WARN("Warn", MavenFacadeConsole.LEVEL_WARN), + ERROR("Error", MavenFacadeConsole.LEVEL_ERROR), + FATAL("Fatal", MavenFacadeConsole.LEVEL_FATAL), + DISABLED("Disabled", MavenFacadeConsole.LEVEL_DISABLED); private final String myDisplayString; private final int myLevel; @@ -87,17 +87,17 @@ public class MavenExecutionOptions { } public enum SnapshotUpdatePolicy { - ALWAYS_UPDATE("Always Update", "--update-snapshots", MavenEmbedderSettings.SnapshotUpdatePolicy.ALWAYS_UPDATE), - DO_NOT_UPDATE("Do Not Update", "", MavenEmbedderSettings.SnapshotUpdatePolicy.DO_NOT_UPDATE); + ALWAYS_UPDATE("Always Update", "--update-snapshots", MavenFacadeSettings.UpdatePolicy.ALWAYS_UPDATE), + DO_NOT_UPDATE("Do Not Update", "", MavenFacadeSettings.UpdatePolicy.DO_NOT_UPDATE); private final String myDisplayString; private final String myCommandLineOption; - private final MavenEmbedderSettings.SnapshotUpdatePolicy myEmbedderPolicy; + private final MavenFacadeSettings.UpdatePolicy myFacadePolicy; - private SnapshotUpdatePolicy(String displayString, String commandLineOption, MavenEmbedderSettings.SnapshotUpdatePolicy policy) { + private SnapshotUpdatePolicy(String displayString, String commandLineOption, MavenFacadeSettings.UpdatePolicy policy) { myDisplayString = displayString; myCommandLineOption = commandLineOption; - myEmbedderPolicy = policy; + myFacadePolicy = policy; } public String getDisplayString() { @@ -108,23 +108,23 @@ public class MavenExecutionOptions { return myCommandLineOption; } - public MavenEmbedderSettings.SnapshotUpdatePolicy getEmbedderPolicy() { - return myEmbedderPolicy; + public MavenFacadeSettings.UpdatePolicy getFacadePolicy() { + return myFacadePolicy; } } public enum PluginUpdatePolicy { - UPDATE("Check For Updates", "--check-plugin-updates", MavenEmbedderSettings.PluginUpdatePolicy.UPDATE), - DO_NOT_UPDATE("Do Not Update", "--no-plugin-updates", MavenEmbedderSettings.PluginUpdatePolicy.DO_NOT_UPDATE); + UPDATE("Check For Updates", "--check-plugin-updates", MavenFacadeSettings.UpdatePolicy.ALWAYS_UPDATE), + DO_NOT_UPDATE("Do Not Update", "--no-plugin-updates", MavenFacadeSettings.UpdatePolicy.DO_NOT_UPDATE); private final String myDisplayString; private final String myCommandLineOption; - private final MavenEmbedderSettings.PluginUpdatePolicy myEmbedderPolicy; + private final MavenFacadeSettings.UpdatePolicy myFacadePolicy; - private PluginUpdatePolicy(String displayString, String commandLineOption, MavenEmbedderSettings.PluginUpdatePolicy policy) { + private PluginUpdatePolicy(String displayString, String commandLineOption, MavenFacadeSettings.UpdatePolicy policy) { myDisplayString = displayString; myCommandLineOption = commandLineOption; - myEmbedderPolicy = policy; + myFacadePolicy = policy; } public String getDisplayString() { @@ -135,8 +135,8 @@ public class MavenExecutionOptions { return myCommandLineOption; } - public MavenEmbedderSettings.PluginUpdatePolicy getEmbedderPolicy() { - return myEmbedderPolicy; + public MavenFacadeSettings.UpdatePolicy getFacadePolicy() { + return myFacadePolicy; } } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java index 3861e55616ff..41f0ec94040d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExecutor.java @@ -20,7 +20,8 @@ package org.jetbrains.idea.maven.execution; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; -import org.jetbrains.idea.maven.embedder.MavenConsole; +import org.jetbrains.idea.maven.facade.MavenFacadeConsole; +import org.jetbrains.idea.maven.project.MavenConsole; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import java.text.MessageFormat; @@ -98,15 +99,15 @@ public abstract class MavenExecutor { protected boolean printExitSummary() { if (isCancelled()) { - myConsole.systemMessage(MavenConsole.LEVEL_INFO, RunnerBundle.message("maven.execution.aborted"), null); + myConsole.systemMessage(MavenFacadeConsole.LEVEL_INFO, RunnerBundle.message("maven.execution.aborted"), null); return false; } else if (exitCode == 0) { - myConsole.systemMessage(MavenConsole.LEVEL_INFO, RunnerBundle.message("maven.execution.finished"), null); + myConsole.systemMessage(MavenFacadeConsole.LEVEL_INFO, RunnerBundle.message("maven.execution.finished"), null); return true; } else { - myConsole.systemMessage(MavenConsole.LEVEL_ERROR, RunnerBundle.message("maven.execution.terminated.abnormally", exitCode), null); + myConsole.systemMessage(MavenFacadeConsole.LEVEL_ERROR, RunnerBundle.message("maven.execution.terminated.abnormally", exitCode), null); return false; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java index aeaefbd5cadb..34001b661226 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalExecutor.java @@ -25,8 +25,9 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NonNls; +import org.jetbrains.idea.maven.facade.MavenFacadeConsole; +import org.jetbrains.idea.maven.project.MavenConsole; import org.jetbrains.idea.maven.project.MavenGeneralSettings; -import org.jetbrains.idea.maven.embedder.MavenConsole; public class MavenExternalExecutor extends MavenExecutor { @@ -60,7 +61,7 @@ public class MavenExternalExecutor extends MavenExecutor { myConsole.attachToProcess(myProcessHandler); } catch (ExecutionException e) { - myConsole.systemMessage(MavenConsole.LEVEL_FATAL, RunnerBundle.message("external.startup.failed", e.getMessage()), null); + myConsole.systemMessage(MavenFacadeConsole.LEVEL_FATAL, RunnerBundle.message("external.startup.failed", e.getMessage()), null); return false; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java index b80689fda03b..9abf973de823 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java @@ -28,9 +28,9 @@ import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.embedder.MavenEmbedderUtilEx; -import org.jetbrains.idea.maven.embedder.MavenExecutionOptions; +import org.jetbrains.idea.maven.facade.MavenFacadeUtil; import org.jetbrains.idea.maven.project.MavenGeneralSettings; +import org.jetbrains.idea.maven.utils.MavenUtil; import java.io.File; import java.io.IOException; @@ -123,7 +123,7 @@ public class MavenExternalParameters { addParameters(list, StringUtil.notNullize(System.getenv(MAVEN_OPTS))); - addProperty(list, "classworlds.conf", MavenEmbedderUtilEx.getMavenConfFile(new File(mavenHome)).getPath()); + addProperty(list, "classworlds.conf", MavenUtil.getMavenConfFile(new File(mavenHome)).getPath()); addProperty(list, "maven.home", mavenHome); @@ -180,7 +180,7 @@ public class MavenExternalParameters { } private static String resolveMavenHome(@NotNull MavenGeneralSettings coreSettings) throws ExecutionException { - final File file = MavenEmbedderUtilEx.resolveMavenHomeDirectory(coreSettings.getMavenHome()); + final File file = MavenUtil.resolveMavenHomeDirectory(coreSettings.getMavenHome()); if (file == null) { throw new ExecutionException(RunnerBundle.message("external.maven.home.no.default")); @@ -190,7 +190,7 @@ public class MavenExternalParameters { throw new ExecutionException(RunnerBundle.message("external.maven.home.does.not.exist", file.getPath())); } - if (!MavenEmbedderUtilEx.isValidMavenHome(file)) { + if (!MavenUtil.isValidMavenHome(file)) { throw new ExecutionException(RunnerBundle.message("external.maven.home.invalid", file.getPath())); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenJavaClasspathPolicyExtender.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenJavaClasspathPolicyExtender.java index 586f55bb7318..04ae3b1f4b9e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenJavaClasspathPolicyExtender.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenJavaClasspathPolicyExtender.java @@ -20,10 +20,10 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; import java.util.Collections; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java index 4bcb75c40891..6b66d051ddca 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfiguration.java @@ -33,10 +33,10 @@ import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.xmlb.XmlSerializer; import org.jdom.Element; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.embedder.MavenConsoleImpl; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.project.MavenConsoleImpl; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; import java.io.File; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java index 94b9de4e86ba..50e13af90540 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java @@ -28,9 +28,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.embedder.MavenConsoleHelper; -import org.jetbrains.idea.maven.embedder.MavenConsoleImpl; +import org.jetbrains.idea.maven.project.MavenConsole; +import org.jetbrains.idea.maven.project.MavenConsoleImpl; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.SimpleProjectComponent; @@ -108,7 +107,7 @@ public class MavenRunner extends SimpleProjectComponent implements PersistentSta }); } catch (Exception e) { - MavenConsoleHelper.printException(console, e); + console.printException(e); console.finish(); MavenLog.LOG.warn(e); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java index 68fa448b7b3c..1857b7433e6f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java @@ -24,7 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.utils.Strings; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import javax.swing.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/SoutMavenConsole.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/SoutMavenConsole.java index a8ca698fd075..f2bde943581b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/SoutMavenConsole.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/SoutMavenConsole.java @@ -19,8 +19,7 @@ import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessHandler; import com.intellij.openapi.util.Key; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.embedder.MavenExecutionOptions; +import org.jetbrains.idea.maven.project.MavenConsole; public class SoutMavenConsole extends MavenConsole { public SoutMavenConsole() { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenEmbedderWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenEmbedderWrapper.java new file mode 100644 index 000000000000..9957dc3c7532 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenEmbedderWrapper.java @@ -0,0 +1,208 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.*; +import org.jetbrains.idea.maven.project.MavenConsole; +import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; +import org.jetbrains.idea.maven.utils.MavenProgressIndicator; + +import java.io.File; +import java.rmi.NoSuchObjectException; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class MavenEmbedderWrapper { + private final MavenFacadeEmbedder myWrappee; + + private MavenFacadeConsole myConsole; + private MavenFacadeProgressIndicator myIndicator; + + public MavenEmbedderWrapper(MavenFacadeEmbedder wrappee) { + myWrappee = wrappee; + } + + public void customizeForResolve(MavenConsole console, MavenProgressIndicator indicator) { + try { + resetConsole(MavenFacadeManager.wrapandExport(console)); + resetIndicator(MavenFacadeManager.wrapAndExport(indicator)); + + myWrappee.customizeForResolve(myConsole, myIndicator); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void customizeForResolve(Map projectIdToFileMap, MavenConsole console, MavenProgressIndicator indicator) { + try { + resetConsole(MavenFacadeManager.wrapandExport(console)); + resetIndicator(MavenFacadeManager.wrapAndExport(indicator)); + + myWrappee.customizeForResolve(projectIdToFileMap, myConsole, myIndicator); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void customizeForStrictResolve(Map projectIdToFileMap, + MavenConsole console, + MavenProgressIndicator indicator) { + try { + resetConsole(MavenFacadeManager.wrapandExport(console)); + resetIndicator(MavenFacadeManager.wrapAndExport(indicator)); + + myWrappee.customizeForStrictResolve(projectIdToFileMap, myConsole, myIndicator); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + @NotNull + public MavenWrapperExecutionResult resolveProject(@NotNull VirtualFile file, + @NotNull Collection activeProfiles) throws MavenProcessCanceledException { + try { + return myWrappee.resolveProject(new File(file.getPath()), activeProfiles); + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + @NotNull + public MavenArtifact resolve(@NotNull MavenArtifactInfo info, + @NotNull List remoteRepositories) throws MavenProcessCanceledException { + try { + return myWrappee.resolve(info, remoteRepositories); + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + @NotNull + public List resolveTransitively( + @NotNull List artifacts, + @NotNull List remoteRepositories) throws MavenProcessCanceledException { + try { + return myWrappee.resolveTransitively(artifacts, remoteRepositories); + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public Collection resolvePlugin(@NotNull MavenPlugin plugin, + @NotNull List repositories, + @NotNull NativeMavenProjectHolder nativeMavenProject, + boolean transitive) throws MavenProcessCanceledException { + try { + return myWrappee.resolvePlugin(plugin, repositories, nativeMavenProject.getId(), transitive); + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + @NotNull + public MavenWrapperExecutionResult execute(@NotNull VirtualFile file, + @NotNull Collection activeProfiles, + @NotNull List goals) throws MavenProcessCanceledException { + try { + return myWrappee.execute(new File(file.getPath()), activeProfiles, goals); + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void reset() { + try { + myWrappee.reset(); + resetConsole(null); + resetIndicator(null); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + private void resetConsole(MavenFacadeConsole console) throws NoSuchObjectException { + if (myConsole != null) { + UnicastRemoteObject.unexportObject(myConsole, true); + } + myConsole = console; + } + + private void resetIndicator(MavenFacadeProgressIndicator indicator) throws NoSuchObjectException { + if (myIndicator != null) { + UnicastRemoteObject.unexportObject(myIndicator, true); + } + myIndicator = indicator; + } + + public void release() { + try { + myWrappee.release(); + resetConsole(null); + resetIndicator(null); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void clearCaches() { + try { + myWrappee.clearCaches(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void clearCachesFor(MavenId projectId) { + try { + myWrappee.clearCachesFor(projectId); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java new file mode 100644 index 000000000000..9a7cab28c6d9 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java @@ -0,0 +1,375 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import com.intellij.execution.DefaultExecutionResult; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.ExecutionResult; +import com.intellij.execution.Executor; +import com.intellij.execution.configurations.CommandLineState; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.configurations.SimpleJavaParameters; +import com.intellij.execution.process.OSProcessHandler; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.process.ProcessTerminatedListener; +import com.intellij.execution.rmi.RemoteProcessSupport; +import com.intellij.execution.runners.ProgramRunner; +import com.intellij.ide.DataManager; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JdkUtil; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.SimpleJavaSdkType; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.CommonClassNames; +import com.intellij.util.PathUtil; +import com.intellij.util.PathsList; +import com.intellij.util.SystemProperties; +import com.intellij.util.containers.ContainerUtil; +import gnu.trove.THashSet; +import org.apache.lucene.search.Query; +import org.jdom.Element; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenModel; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; +import org.jetbrains.idea.maven.project.MavenConsole; +import org.jetbrains.idea.maven.project.MavenGeneralSettings; +import org.jetbrains.idea.maven.project.MavenProjectsManager; +import org.jetbrains.idea.maven.utils.MavenLog; +import org.jetbrains.idea.maven.utils.MavenProgressIndicator; + +import java.io.File; +import java.nio.charset.Charset; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class MavenFacadeManager { + @NonNls private static final String MAIN_CLASS = "org.jetbrains.idea.maven.facade.RemoteMavenServer"; + private final RemoteProcessSupport mySupport; + private MavenFacade myFacade; + private RemoteMavenFacadeLogger myLogger; + + public static MavenFacadeManager getInstance() { + return ServiceManager.getService(MavenFacadeManager.class); + } + + public MavenFacadeManager() throws RemoteException { + mySupport = new RemoteProcessSupport(MavenFacade.class) { + @Override + protected void fireModificationCountChanged() { + } + + @Override + protected String getName(Object file) { + return MavenFacadeManager.class.getSimpleName(); + } + + @Override + protected RunProfileState getRunProfileState(Object target, Object configuration, Executor executor) throws ExecutionException { + return createRunProfileState(); + } + }; + + Disposer.register(ApplicationManager.getApplication(), new Disposable() { + public void dispose() { + mySupport.stopAll(); + + if (myLogger != null) { + try { + UnicastRemoteObject.unexportObject(myLogger, true); + } + catch (RemoteException e) { + MavenLog.LOG.error(e); + } + } + } + }); + } + + private synchronized MavenFacade getFacade() { + if (myFacade == null) { + try { + myFacade = mySupport.acquire(this, ""); + + myLogger = new RemoteMavenFacadeLogger(); + UnicastRemoteObject.exportObject(myLogger, 0); + myFacade.setLogger(myLogger); + } + catch (Exception e) { + // todo + throw new RuntimeException(e); + } + } + return myFacade; + } + + + private RunProfileState createRunProfileState() { + return new CommandLineState(null) { + private SimpleJavaParameters createJavaParameters() throws ExecutionException { + final SimpleJavaParameters params = new SimpleJavaParameters(); + + final Sdk ideaJdk = new SimpleJavaSdkType().createJdk("tmp", SystemProperties.getJavaHome()); + params.setJdk(ideaJdk); + + params.setWorkingDirectory(PathManager.getBinPath()); + final ArrayList classPath = new ArrayList(); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(NotNull.class), classPath); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(StringUtil.class), classPath); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(THashSet.class), classPath); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(Element.class), classPath); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(Query.class), classPath); + params.getClassPath().addAll(classPath); + addPluginLibraries(params.getClassPath()); + + params.setMainClass(MAIN_CLASS); + params.getVMParametersList().add("-Xmx512m -agentlib:yjpagent=disablej2ee"); + return params; + } + + @Override + public ExecutionResult execute(@NotNull Executor executor, @NotNull ProgramRunner runner) throws ExecutionException { + ProcessHandler processHandler = startProcess(); + return new DefaultExecutionResult(null, processHandler, AnAction.EMPTY_ARRAY); + } + + protected OSProcessHandler startProcess() throws ExecutionException { + SimpleJavaParameters params = createJavaParameters(); + Sdk sdk = params.getJdk(); + + final GeneralCommandLine commandLine = JdkUtil.setupJVMCommandLine(((JavaSdkType)sdk.getSdkType()).getVMExecutablePath(sdk), params, + JdkUtil.useDynamicClasspath(PlatformDataKeys + .PROJECT.getData( + DataManager.getInstance().getDataContext()))); + final OSProcessHandler processHandler = new OSProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString()) { + @Override + public Charset getCharset() { + return commandLine.getCharset(); + } + }; + ProcessTerminatedListener.attach(processHandler); + return processHandler; + } + + }; + } + + private void addPluginLibraries(PathsList classPath) { + File pluginFileOrDir = new File(PathUtil.getJarPathForClass(this.getClass())); + + File libDir; + + if (pluginFileOrDir.isDirectory()) { + classPath.add(new File(pluginFileOrDir.getParent(), "maven-facade-api")); + classPath.add(new File(pluginFileOrDir.getParent(), "maven-facade-impl")); + File luceneLib = new File(PathUtil.getJarPathForClass(Query.class)); + libDir = new File(luceneLib.getParentFile().getParentFile().getParentFile(), "facade-impl/lib"); + } + else { + libDir = pluginFileOrDir; + } + MavenLog.LOG.assertTrue(libDir.exists() && libDir.isDirectory(), "Maven Facade libraries dir not found: " + libDir); + + File[] files = libDir.listFiles(); + for (File jar : files) { + if (jar.isFile() && jar.getName().endsWith(".jar") && !jar.equals(pluginFileOrDir)) { + classPath.add(jar.getPath()); + } + } + } + + public static String getJarPath(@NotNull final Class context, @NotNull final String mainClassName) { + final String s = PathManager.getResourceRoot(context, "/" + mainClassName.replace('.', '/') + CommonClassNames.CLASS_FILE_EXTENSION); + return new File(s).getAbsoluteFile().getAbsolutePath(); + } + + public MavenEmbedderWrapper createEmbedder(Project project) { + MavenFacade facade = getFacade(); + MavenGeneralSettings settings = MavenProjectsManager.getInstance(project).getGeneralSettings(); + try { + return new MavenEmbedderWrapper(facade.createEmbedder(convertSettings(settings))); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public MavenIndexerWrapper createIndexer() { + try { + return new MavenIndexerWrapper(getFacade().createIndexer()); + } + catch (RemoteException e) { + //todo + throw new RuntimeException(e); + } + } + + public List getRepositories(String nexusUrl) { + try { + return getFacade().getRepositories(nexusUrl); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public List findArtifacts(MavenArtifactInfo template, String nexusUrl) { + try { + return getFacade().findArtifacts(template, nexusUrl); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public MavenModel interpolateAndAlignModel(MavenModel model, File basedir) { + try { + return getFacade().interpolateAndAlignModel(model, basedir); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public MavenModel assembleInheritance(MavenModel model, MavenModel parentModel) { + try { + return getFacade().assembleInheritance(model, parentModel); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public ProfileApplicationResult applyProfiles(MavenModel model, + File basedir, + Collection explicitProfiles, + Collection alwaysOnProfiles) { + try { + return getFacade().applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); + } + catch (RemoteException e) { + // todo + throw new RuntimeException(e); + } + } + + public static MavenFacadeSettings convertSettings(MavenGeneralSettings settings) { + MavenFacadeSettings result = new MavenFacadeSettings(); + result.setLoggingLevel(settings.getLoggingLevel().getLevel()); + result.setOffline(settings.isWorkOffline()); + result.setMavenHome(settings.getEffectiveMavenHome()); + result.setUserSettingsFile(settings.getEffectiveUserSettingsIoFile()); + result.setGlobalSettingsFile(settings.getEffectiveGlobalSettingsIoFile()); + result.setLocalRepository(settings.getEffectiveLocalRepository()); + result.setPluginUpdatePolicy(settings.getPluginUpdatePolicy().getFacadePolicy()); + result.setSnapshotUpdatePolicy(settings.getSnapshotUpdatePolicy().getFacadePolicy()); + return result; + } + + public static MavenFacadeConsole wrapandExport(final MavenConsole console) { + try { + RemoteMavenFacadeConsole result = new RemoteMavenFacadeConsole(console); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public static MavenFacadeProgressIndicator wrapAndExport(final MavenProgressIndicator process) { + try { + RemoteMavenFacadeProgressIndicator result = new RemoteMavenFacadeProgressIndicator(process); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + private static class RemoteMavenFacadeLogger extends RemoteObject implements MavenFacadeLogger { + public void info(Throwable e) { + MavenLog.LOG.info(e); + } + + public void warn(Throwable e) { + MavenLog.LOG.warn(e); + } + + public void error(Throwable e) { + MavenLog.LOG.error(e); + } + } + + private static class RemoteMavenFacadeProgressIndicator extends RemoteObject implements MavenFacadeProgressIndicator { + private final MavenProgressIndicator myProcess; + + public RemoteMavenFacadeProgressIndicator(MavenProgressIndicator process) { + myProcess = process; + } + + public void setText(String text) { + myProcess.setText(text); + } + + public void setText2(String text) { + myProcess.setText2(text); + } + + public boolean isCanceled() { + return myProcess.isCanceled(); + } + + public void setIndeterminate(boolean value) { + myProcess.getIndicator().setIndeterminate(value); + } + + public void setFraction(double fraction) { + myProcess.setFraction(fraction); + } + } + + private static class RemoteMavenFacadeConsole extends RemoteObject implements MavenFacadeConsole { + private final MavenConsole myConsole; + + public RemoteMavenFacadeConsole(MavenConsole console) { + myConsole = console; + } + + public void printMessage(int level, String message, Throwable throwable) { + myConsole.printMessage(level, message, throwable); + } + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenIndexerWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenIndexerWrapper.java new file mode 100644 index 000000000000..22d518fe1cb0 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenIndexerWrapper.java @@ -0,0 +1,137 @@ +/* + * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade; + +import org.apache.lucene.search.Query; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; +import org.jetbrains.idea.maven.project.MavenGeneralSettings; +import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; +import org.jetbrains.idea.maven.utils.MavenProgressIndicator; + +import java.io.File; +import java.rmi.RemoteException; +import java.rmi.server.UnicastRemoteObject; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +public class MavenIndexerWrapper { + private final MavenFacadeIndexer myWrappee; + + public MavenIndexerWrapper(MavenFacadeIndexer wrappee) { + myWrappee = wrappee; + } + + public int createIndex(@NotNull String indexId, + @Nullable String repositoryId, + @Nullable File file, + @Nullable String url, + @NotNull File indexDir) throws MavenFacadeIndexerException { + try { + return myWrappee.createIndex(indexId, repositoryId, file, url, indexDir); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void releaseIndex(int id) throws MavenFacadeIndexerException { + try { + myWrappee.releaseIndex(id); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public int getIndexCount() { + try { + return myWrappee.getIndexCount(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void updateIndex(int id, MavenGeneralSettings settings, MavenProgressIndicator indicator) throws MavenProcessCanceledException, + MavenFacadeIndexerException { + try { + MavenFacadeProgressIndicator indicatorWrapper = MavenFacadeManager.wrapAndExport(indicator); + try { + myWrappee.updateIndex(id, MavenFacadeManager.convertSettings(settings), indicatorWrapper); + } + finally { + UnicastRemoteObject.unexportObject(indicatorWrapper, true); + } + } + catch (MavenFacadeProcessCanceledException e) { + throw new MavenProcessCanceledException(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public List getAllArtifacts(int indexId) throws MavenFacadeIndexerException { + try { + return myWrappee.getAllArtifacts(indexId); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public MavenId addArtifact(int indexId, File artifactFile) throws MavenFacadeIndexerException { + try { + return myWrappee.addArtifact(indexId, artifactFile); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public Set search(int indexId, Query query, int maxResult) throws MavenFacadeIndexerException { + try { + return myWrappee.search(indexId, query, maxResult); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public Collection getArchetypes() { + try { + return myWrappee.getArchetypes(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + public void release() { + try { + myWrappee.release(); + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } +} + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManagerImpl.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManagerImpl.java deleted file mode 100644 index 87186c62a9ac..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/remote/MavenFacadeManagerImpl.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2000-2010 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 org.jetbrains.idea.maven.facade.remote; - -import com.intellij.execution.DefaultExecutionResult; -import com.intellij.execution.ExecutionException; -import com.intellij.execution.ExecutionResult; -import com.intellij.execution.Executor; -import com.intellij.execution.configurations.*; -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.execution.process.ProcessTerminatedListener; -import com.intellij.execution.rmi.RemoteProcessSupport; -import com.intellij.execution.runners.ProgramRunner; -import com.intellij.ide.DataManager; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.application.PathManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.JavaSdkType; -import com.intellij.openapi.projectRoots.JdkUtil; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.SimpleJavaSdkType; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.encoding.EncodingProjectManager; -import com.intellij.psi.CommonClassNames; -import com.intellij.util.PathUtil; -import com.intellij.util.SystemProperties; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.execution.MavenExternalParameters; -import org.jetbrains.idea.maven.execution.MavenRunner; -import org.jetbrains.idea.maven.execution.MavenRunnerParameters; -import org.jetbrains.idea.maven.execution.MavenRunnerSettings; -import org.jetbrains.idea.maven.project.MavenProjectsManager; - -import javax.xml.stream.XMLStreamException; -import java.io.File; -import java.nio.charset.Charset; -import java.util.ArrayList; - -/** - * @author Gregory.Shrago - */ -public class MavenFacadeManagerImpl implements MavenFacadeManager { - @NonNls private static final String MAIN_CLASS = "org.jetbrains.idea.maven.facade.remote.RemoteMavenServer"; - - private final RemoteProcessSupport mySupport; - - public MavenFacadeManagerImpl(final Project project) { - mySupport = new RemoteProcessSupport(project, MavenFacade.class) { - @Override - protected void fireModificationCountChanged() { - } - - @Override - protected String getName(Object file) { - return file.toString(); - } - - @Override - protected RunProfileState getRunProfileState(Object project, Object configuration, Executor executor) throws ExecutionException { - return createRunProfileState(); - } - }; - Disposer.register(project, new Disposable() { - public void dispose() { - mySupport.stopAll(); - } - }); - } - - public MavenFacade getMavenFacade(@NotNull final Object key) throws Exception { - return mySupport.acquire(key, ""); - } - - public void releaseMavenFacade(@NotNull Object key) { - mySupport.release(key, ""); - } - - private RunProfileState createRunProfileState() { - final CommandLineState state = new CommandLineState(null) { - private SimpleJavaParameters createJavaParameters() throws ExecutionException { - final SimpleJavaParameters params = new SimpleJavaParameters(); - - final Project project = mySupport.getProject(); - params.setCharset(EncodingProjectManager.getInstance(project).getDefaultCharset()); - - final MavenRunnerSettings runnerSettings = MavenRunner.getInstance(project).getState(); - MavenExternalParameters.configureSimpleJavaParameters(params, new MavenRunnerParameters(), - MavenProjectsManager.getInstance(project).getGeneralSettings(), - runnerSettings); - - - final Sdk ideaJdk = new SimpleJavaSdkType().createJdk("tmp", SystemProperties.getJavaHome()); - params.setJdk(ideaJdk); - - params.setWorkingDirectory(PathManager.getBinPath()); - final ArrayList classPath = new ArrayList(); - ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(StringUtil.class), classPath); - ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(NotNull.class), classPath); - ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(XMLStreamException.class), classPath); - - params.getClassPath().addAll(classPath); - params.setMainClass(MAIN_CLASS); - params.getClassPath().addFirst(getJarPath(MavenFacadeManagerImpl.this.getClass(), MAIN_CLASS)); - tuneParams(params); - return params; - } - - @Override - public ExecutionResult execute(@NotNull final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException { - final ProcessHandler processHandler = startProcess(); - return new DefaultExecutionResult(null, processHandler, AnAction.EMPTY_ARRAY); - } - - protected OSProcessHandler startProcess() throws ExecutionException { - final SimpleJavaParameters params = createJavaParameters(); - final Sdk sdk = params.getJdk(); - final GeneralCommandLine commandLine = JdkUtil.setupJVMCommandLine(((JavaSdkType)sdk.getSdkType()).getVMExecutablePath(sdk), params, - JdkUtil.useDynamicClasspath(PlatformDataKeys - .PROJECT.getData(DataManager.getInstance().getDataContext()))); - final OSProcessHandler processHandler = new OSProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString()) { - @Override - public Charset getCharset() { - return commandLine.getCharset(); - } - }; - ProcessTerminatedListener.attach(processHandler); - return processHandler; - } - - }; - return state; - } - - private void tuneParams(SimpleJavaParameters params) { - final String path = getJarPath(getClass(), MAIN_CLASS); - File file = new File(path); - if (file.isDirectory()) { - params.getClassPath().add(file.getPath()); - file = new File(getJarPath(getClass(), "org.apache.maven.artifact.resolver.ArtifactNotFoundException")); - } - - if (file.isFile()) { - final File[] files = file.getParentFile().listFiles(); - for (File jar : files) { - if (jar.isFile() && jar.getName().endsWith(".jar") && !jar.getName().equals("maven.jar")) { - params.getClassPath().add(jar.getPath()); - } - } - } - } - - public static String getJarPath(@NotNull final Class context, @NotNull final String mainClassName) { - final String s = PathManager.getResourceRoot(context, "/" + mainClassName.replace('.', '/') + CommonClassNames.CLASS_FILE_EXTENSION); - return new File(s).getAbsoluteFile().getAbsolutePath(); - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java index c7f0db91e427..f18e551e7bae 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java @@ -21,7 +21,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.PathUtil; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.*; import java.io.File; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java index 47c884a902c9..159cf0c7f581 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java @@ -2,6 +2,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.module.Module; import org.jdom.Element; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java index e6ca55c6dc73..7c006e43f603 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java @@ -21,10 +21,10 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ProjectRootManager; +import org.jetbrains.idea.maven.model.MavenResource; import org.jetbrains.idea.maven.project.MavenImportingSettings; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.project.MavenResource; import java.io.File; import java.util.ArrayList; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java index 9f0b9704a58c..880f46cd217e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java @@ -18,12 +18,12 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Pair; -import org.apache.maven.project.*; import org.jdom.Element; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.*; -import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; @@ -65,7 +65,7 @@ public abstract class MavenImporter { return null; } - public void resolve(MavenProject project, org.apache.maven.project.MavenProject nativeMavenProject, MavenEmbedderWrapper embedder) + public void resolve(MavenProject project, NativeMavenProjectHolder nativeMavenProject, MavenEmbedderWrapper embedder) throws MavenProcessCanceledException { } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index 0161d147559a..1b4e3e54ed60 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -21,8 +21,9 @@ import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.util.Pair; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.project.*; -import org.jetbrains.idea.maven.utils.MavenConstants; import org.jetbrains.idea.maven.utils.MavenUtil; import java.util.List; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleNameMapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleNameMapper.java index 14836bc6fc94..90429eb9e831 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleNameMapper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleNameMapper.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.text.StringUtil; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import java.io.File; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java index 58cb185187d0..b0ffdf219a63 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java @@ -37,7 +37,7 @@ import com.intellij.util.Function; import com.intellij.util.containers.Stack; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.jetbrains.idea.maven.embedder.MavenConsole; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java index 5ebda0447bf8..e678d1a840b0 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java @@ -23,17 +23,17 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.utils.Path; import org.jetbrains.idea.maven.utils.Url; import java.io.File; -import java.util.List; public class MavenRootModelAdapter { private static final String MAVEN_LIB_PREFIX = "Maven: "; @@ -250,7 +250,9 @@ public class MavenRootModelAdapter { extension = result.second; } - String newUrl = artifact.getUrlForExtraArtifact(classifier, extension); + + String newPath = artifact.getPathForExtraArtifact(classifier, extension); + String newUrl = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, newPath) + JarFileSystem.JAR_SEPARATOR; for (String url : library.getUrls(type)) { if (newUrl.equals(url)) return; if (clearAll || isRepositoryUrl(artifact, url, classifier, extension)) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArchetypesProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArchetypesProvider.java index db8dde2246d4..adafd0b80517 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArchetypesProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArchetypesProvider.java @@ -16,11 +16,12 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.extensions.ExtensionPointName; +import org.jetbrains.idea.maven.model.MavenArchetype; import java.util.Collection; public interface MavenArchetypesProvider { ExtensionPointName EP_NAME = ExtensionPointName.create("org.jetbrains.idea.maven.archetypesProvider"); - Collection getArchetypes(); + Collection getArchetypes(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java index ea7ebf7ddd60..034a16e657da 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import gnu.trove.THashMap; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import javax.swing.*; import javax.swing.event.ChangeEvent; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java index 7c1b3d290b7d..dd69617045b4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java @@ -24,9 +24,9 @@ import com.intellij.ui.treeStructure.Tree; import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.utils.MavenLog; -import org.sonatype.nexus.index.ArtifactInfo; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -171,15 +171,15 @@ public class MavenArtifactSearchPanel extends JPanel { public MavenId getResult() { Object sel = myResultList.getLastSelectedPathComponent(); - ArtifactInfo info; - if (sel instanceof ArtifactInfo) { - info = (ArtifactInfo)sel; + MavenArtifactInfo info; + if (sel instanceof MavenArtifactInfo) { + info = (MavenArtifactInfo)sel; } else { info = ((MavenArtifactSearchResult)sel).versions.get(0); } - return new MavenId(info.groupId, info.artifactId, info.version); + return new MavenId(info.getGroupId(), info.getArtifactId(), info.getVersion()); } private static class MyTreeModel implements TreeModel { @@ -260,9 +260,9 @@ public class MavenArtifactSearchPanel extends JPanel { else if (value instanceof MavenArtifactSearchResult) { formatSearchResult(tree, (MavenArtifactSearchResult)value); } - else if (value instanceof ArtifactInfo) { - ArtifactInfo info = (ArtifactInfo)value; - myLeftComponent.append(info.groupId + ":" + info.artifactId + ":" + info.version, + else if (value instanceof MavenArtifactInfo) { + MavenArtifactInfo info = (MavenArtifactInfo)value; + myLeftComponent.append(info.getGroupId() + ":" + info.getArtifactId() + ":" + info.getVersion(), SimpleTextAttributes.GRAY_ATTRIBUTES); } @@ -277,10 +277,10 @@ public class MavenArtifactSearchPanel extends JPanel { } protected void formatSearchResult(JTree tree, MavenArtifactSearchResult searchResult) { - ArtifactInfo first = searchResult.versions.get(0); - ArtifactInfo last = searchResult.versions.get(searchResult.versions.size() - 1); - myLeftComponent.append(first.groupId + ":" + first.artifactId, SimpleTextAttributes.REGULAR_ATTRIBUTES); - myLeftComponent.append(":" + last.version + "-" + first.version, SimpleTextAttributes.GRAY_ATTRIBUTES); + MavenArtifactInfo first = searchResult.versions.get(0); + MavenArtifactInfo last = searchResult.versions.get(searchResult.versions.size() - 1); + myLeftComponent.append(first.getGroupId() + ":" + first.getArtifactId(), SimpleTextAttributes.REGULAR_ATTRIBUTES); + myLeftComponent.append(":" + last.getVersion() + "-" + first.getVersion(), SimpleTextAttributes.GRAY_ATTRIBUTES); } } @@ -288,12 +288,12 @@ public class MavenArtifactSearchPanel extends JPanel { @Override protected void formatSearchResult(JTree tree, MavenArtifactSearchResult searchResult) { MavenClassSearchResult classResult = (MavenClassSearchResult)searchResult; - ArtifactInfo info = searchResult.versions.get(0); + MavenArtifactInfo info = searchResult.versions.get(0); myLeftComponent.append(classResult.className, SimpleTextAttributes.REGULAR_ATTRIBUTES); myLeftComponent.append(" (" + classResult.packageName + ")", SimpleTextAttributes.GRAY_ATTRIBUTES); - myRightComponent.append(" " + info.groupId + ":" + info.artifactId, + myRightComponent.append(" " + info.getGroupId() + ":" + info.getArtifactId(), SimpleTextAttributes.GRAY_ATTRIBUTES); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchResult.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchResult.java index 574bcc1907fb..93b2c328b0f2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchResult.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchResult.java @@ -15,11 +15,12 @@ */ package org.jetbrains.idea.maven.indices; -import org.sonatype.nexus.index.ArtifactInfo; -import java.util.List; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; + import java.util.ArrayList; +import java.util.List; public class MavenArtifactSearchResult { - public List versions = new ArrayList(); + public List versions = new ArrayList(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearcher.java index 3e28e44396c3..dd8893f3bb8d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearcher.java @@ -20,11 +20,14 @@ import com.intellij.openapi.util.text.StringUtil; import gnu.trove.THashMap; import org.apache.lucene.index.Term; import org.apache.lucene.search.*; -import org.sonatype.nexus.index.ArtifactInfo; +import org.jetbrains.idea.maven.facade.MavenFacadeIndexer; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; import java.util.*; public class MavenArtifactSearcher extends MavenSearcher { + public static final String TERM = MavenFacadeIndexer.SEARCH_TERM_COORDINATES; + protected Pair preparePatternAndQuery(String pattern) { pattern = pattern.toLowerCase(); if (pattern.trim().length() == 0) return Pair.create(pattern, (Query)new MatchAllDocsQuery()); @@ -37,31 +40,28 @@ public class MavenArtifactSearcher extends MavenSearcher= 3) { String s = "*" + parts.get(0) + "*|*" + parts.get(1) + "*|" + parts.get(2) + "*|*"; - query.add(new WildcardQuery(new Term(ArtifactInfo.UINFO, s)), BooleanClause.Occur.MUST); + query.add(new WildcardQuery(new Term(TERM, s)), BooleanClause.Occur.MUST); } return Pair.create(pattern, (Query)query); } - protected Collection processResults(Set infos, String pattern, int maxResult) { + protected Collection processResults(Set infos, String pattern, int maxResult) { Map result = new THashMap(); - for (ArtifactInfo each : infos) { - if (!StringUtil.isEmptyOrSpaces(each.classifier)) continue; // todo skip for now - + for (MavenArtifactInfo each : infos) { + if (!StringUtil.isEmptyOrSpaces(each.getClassifier())) continue; // todo skip for now + String key = makeKey(each); MavenArtifactSearchResult searchResult = result.get(key); if (searchResult == null) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenClassSearcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenClassSearcher.java index 231e6afc5586..805d1a7166b4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenClassSearcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenClassSearcher.java @@ -22,7 +22,8 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.WildcardQuery; -import org.sonatype.nexus.index.ArtifactInfo; +import org.jetbrains.idea.maven.facade.MavenFacadeIndexer; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; import java.util.*; import java.util.regex.Matcher; @@ -30,6 +31,8 @@ import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; public class MavenClassSearcher extends MavenSearcher { + public static final String TERM = MavenFacadeIndexer.SEARCH_TERM_CLASS_NAMES; + protected Pair preparePatternAndQuery(String pattern) { pattern = pattern.toLowerCase(); if (pattern.trim().length() == 0) { @@ -53,10 +56,10 @@ public class MavenClassSearcher extends MavenSearcher { pattern = newPattern.toString(); String queryPattern = "*/" + pattern.replaceAll("\\.", "/"); - return new Pair(pattern, new WildcardQuery(new Term(ArtifactInfo.NAMES, queryPattern))); + return new Pair(pattern, new WildcardQuery(new Term(TERM, queryPattern))); } - protected Collection processResults(Set infos, String pattern, int maxResult) { + protected Collection processResults(Set infos, String pattern, int maxResult) { if (pattern.length() == 0 || pattern.equals("*")) { pattern = "^/(.*)$"; } @@ -84,10 +87,10 @@ public class MavenClassSearcher extends MavenSearcher { } Map result = new THashMap(); - for (ArtifactInfo each : infos) { - if (each.classNames == null) continue; + for (MavenArtifactInfo each : infos) { + if (each.getClassNames() == null) continue; - Matcher matcher = p.matcher(each.classNames); + Matcher matcher = p.matcher(each.getClassNames()); while (matcher.find()) { String classFQName = matcher.group(1); classFQName = classFQName.replace("/", "."); @@ -124,7 +127,7 @@ public class MavenClassSearcher extends MavenSearcher { return makeKey(result.className, result.versions.get(0)); } - private String makeKey(String className, ArtifactInfo info) { + private String makeKey(String className, MavenArtifactInfo info) { return className + " " + super.makeKey(info); } } \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java index 0931a02e86b7..f20318243e41 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java @@ -15,35 +15,22 @@ */ package org.jetbrains.idea.maven.indices; -import com.intellij.openapi.progress.EmptyProgressIndicator; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.*; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.apache.lucene.document.Document; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.Filter; import org.apache.lucene.search.Query; -import org.apache.lucene.search.TopDocs; -import org.apache.maven.artifact.manager.WagonManager; -import org.apache.maven.wagon.events.TransferEvent; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; -import org.jetbrains.idea.maven.project.TransferListenerAdapter; +import org.jetbrains.idea.maven.facade.MavenFacadeIndexerException; +import org.jetbrains.idea.maven.facade.MavenIndexerWrapper; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; +import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.utils.MavenLog; +import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; -import org.sonatype.nexus.index.*; -import org.sonatype.nexus.index.context.IndexUtils; -import org.sonatype.nexus.index.context.IndexingContext; -import org.sonatype.nexus.index.context.UnsupportedExistingLuceneIndexException; -import org.sonatype.nexus.index.updater.IndexUpdateRequest; -import org.sonatype.nexus.index.updater.IndexUpdater; import java.io.*; import java.util.*; @@ -75,8 +62,7 @@ public class MavenIndex { LOCAL, REMOTE } - private final NexusIndexer myIndexer; - private final ArtifactContextProducer myArtifactContextProducer; + private final MavenIndexerWrapper myIndexer; private final File myDir; private final String myRepositoryId; @@ -92,15 +78,13 @@ public class MavenIndex { private volatile boolean isBroken; private final IndexListener myListener; - public MavenIndex(NexusIndexer indexer, - ArtifactContextProducer artifactContextProducer, + public MavenIndex(MavenIndexerWrapper indexer, File dir, String repositoryId, String repositoryPathOrUrl, Kind kind, IndexListener listener) throws MavenIndexException { myIndexer = indexer; - myArtifactContextProducer = artifactContextProducer; myDir = dir; myRepositoryId = repositoryId; myRepositoryPathOrUrl = normalizePathOrUrl(repositoryPathOrUrl); @@ -110,12 +94,10 @@ public class MavenIndex { open(); } - public MavenIndex(NexusIndexer indexer, - ArtifactContextProducer artifactContextProducer, + public MavenIndex(MavenIndexerWrapper indexer, File dir, IndexListener listener) throws MavenIndexException { myIndexer = indexer; - myArtifactContextProducer = artifactContextProducer; myDir = dir; myListener = listener; @@ -211,7 +193,7 @@ public class MavenIndex { try { if (myData != null) myData.close(); } - catch (IOException e) { + catch (MavenIndexException e) { MavenLog.LOG.warn(e); } myData = null; @@ -278,19 +260,17 @@ public class MavenIndex { return myFailureMessage; } - public void updateOrRepair(MavenEmbedderWrapper embedderToUse, - IndexUpdater updater, - boolean fullUpdate, - ProgressIndicator progress) { + public void updateOrRepair(boolean fullUpdate, MavenGeneralSettings settings, MavenProgressIndicator progress) + throws MavenProcessCanceledException { try { if (fullUpdate) { if (myKind == Kind.LOCAL) FileUtil.delete(getUpdateDir()); - IndexingContext context = createContext(getUpdateDir(), "update"); + int context = createContext(getUpdateDir(), "update"); try { - updateContext(embedderToUse, context, updater, progress); + updateContext(context, settings, progress); } finally { - myIndexer.removeIndexingContext(context, false); + myIndexer.releaseIndex(context); } } updateData(progress); @@ -298,10 +278,10 @@ public class MavenIndex { isBroken = false; myFailureMessage = null; } - catch (IOException e) { - handleUpdateException(e); + catch (MavenProcessCanceledException e) { + throw e; } - catch (UnsupportedExistingLuceneIndexException e) { + catch (Exception e) { handleUpdateException(e); } @@ -313,64 +293,37 @@ public class MavenIndex { MavenLog.LOG.info("Failed to update Maven indices for: [" + myRepositoryId + "] " + myRepositoryPathOrUrl, e); } - private IndexingContext createContext(File contextDir, String suffix) throws IOException, UnsupportedExistingLuceneIndexException { + private int createContext(File contextDir, String suffix) throws MavenFacadeIndexerException { String indexId = myDir.getName() + "-" + suffix; // Nexus cannot update index if the id does not equal to the stored one. String repoId = contextDir.exists() ? null : myDir.getName(); - return myIndexer.addIndexingContext(indexId, - repoId, - getRepositoryFile(), - contextDir, - getRepositoryUrl(), - null, // repo update url - NexusIndexer.FULL_INDEX); + return myIndexer.createIndex(indexId, + repoId, + getRepositoryFile(), + getRepositoryUrl(), + contextDir); } private File getUpdateDir() { return new File(myDir, UPDATE_DIR); } - private void updateContext(MavenEmbedderWrapper embedder, - IndexingContext context, - IndexUpdater updater, - ProgressIndicator progress) throws IOException, UnsupportedExistingLuceneIndexException { - if (Kind.LOCAL == myKind) { - progress.setIndeterminate(true); - try { - myIndexer.scan(context, new MyScanningListener(), false); - } - finally { - progress.setIndeterminate(false); - } - } - else { - IndexUpdateRequest request = new IndexUpdateRequest(context); - request.setResourceFetcher(new MavenIndexFetcher(myRepositoryId, - getRepositoryUrl(), - embedder.getComponent(WagonManager.class), - new TransferListenerAdapter(new MavenProgressIndicator(progress)) { - @Override - protected void doUpdateProgress(long downloaded, long total) { - super.doUpdateProgress(downloaded, total); - myIndicator.setFraction(((double)downloaded) / total); - } - - @Override - public void transferCompleted(TransferEvent event) { - super.transferCompleted(event); - myIndicator.setText2(IndicesBundle.message("maven.indices.updating.processing")); - } - })); - updater.fetchAndUpdateIndex(request); - } + private void updateContext(int indexId, MavenGeneralSettings settings, MavenProgressIndicator progress) + throws MavenFacadeIndexerException, MavenProcessCanceledException { + myIndexer.updateIndex(indexId, settings, progress); } - private void updateData(ProgressIndicator progress) throws IOException, UnsupportedExistingLuceneIndexException { + private void updateData(MavenProgressIndicator progress) throws MavenIndexException { String newDataDirName; IndexData newData; newDataDirName = findAvailableDataDirName(); - FileUtil.copyDir(getUpdateDir(), getDataContextDir(getDataDir(newDataDirName))); + try { + FileUtil.copyDir(getUpdateDir(), getDataContextDir(getDataDir(newDataDirName))); + } + catch (IOException e) { + throw new MavenIndexException(e); + } newData = openData(newDataDirName); try { @@ -381,7 +334,8 @@ public class MavenIndex { newData.close(); FileUtil.delete(getDataDir(newDataDirName)); - if (e instanceof IOException) throw (IOException)e; + if (e instanceof MavenFacadeIndexerException) throw new MavenIndexException(e); + if (e instanceof IOException) throw new MavenIndexException(e); throw new RuntimeException(e); } @@ -402,7 +356,7 @@ public class MavenIndex { } private void doUpdateIndexData(IndexData data, - ProgressIndicator progress) throws IOException { + MavenProgressIndicator progress) throws IOException, MavenFacadeIndexerException { Set groups = new THashSet(); Set groupsWithArtifacts = new THashSet(); Set groupsWithArtifactsWithVersions = new THashSet(); @@ -410,23 +364,15 @@ public class MavenIndex { Map> groupToArtifactMap = new THashMap>(); Map> groupWithArtifactToVersionMap = new THashMap>(); - IndexReader r = data.context.getIndexReader(); - int total = r.numDocs(); + List artifacts = myIndexer.getAllArtifacts(data.indexId); + int total = artifacts.size(); for (int i = 0; i < total; i++) { progress.setFraction(i / total); + MavenId each = artifacts.get(i); - if (r.isDeleted(i)) continue; - - Document doc = r.document(i); - String uinfo = doc.get(ArtifactInfo.UINFO); - if (uinfo == null) continue; - - List parts = StringUtil.split(uinfo, "|"); - String groupId = parts.get(0); - String artifactId = parts.get(1); - String version = parts.get(2); - - if (groupId == null || artifactId == null || version == null) continue; + String groupId = each.getGroupId(); + String artifactId = each.getArtifactId(); + String version = each.getVersion(); groups.add(groupId); groupsWithArtifacts.add(groupId + ":" + artifactId); @@ -465,7 +411,7 @@ public class MavenIndex { } } - private IndexData openData(String dataDir) throws IOException, UnsupportedExistingLuceneIndexException { + private IndexData openData(String dataDir) throws MavenIndexException { File dir = getDataDir(dataDir); dir.mkdirs(); return new IndexData(dir); @@ -506,18 +452,11 @@ public class MavenIndex { public synchronized void addArtifact(final File artifactFile) { doIndexTask(new IndexTask() { public Object doTask() throws Exception { - ArtifactContext artifactContext = myArtifactContextProducer.getArtifactContext(myData.context, artifactFile); - if (artifactContext == null) return null; + MavenId id = myIndexer.addArtifact(myData.indexId, artifactFile); - myIndexer.addArtifactToIndex(artifactContext, myData.context); - - ArtifactInfo artifactInfo = artifactContext.getArtifactInfo(); - - String groupId = artifactInfo.groupId; - String artifactId = artifactInfo.artifactId; - String version = artifactInfo.version; - - if (groupId == null || artifactId == null || version == null) return null; + String groupId = id.getGroupId(); + String artifactId = id.getArtifactId(); + String version = id.getVersion(); myData.groups.enumerate(groupId); myData.hasGroupCache.put(groupId, true); @@ -615,36 +554,12 @@ public class MavenIndex { return result; } - public synchronized Set search(final Query query, final int maxResult) { - return doIndexTask(new IndexTask>() { - public Set doTask() throws Exception { - TopDocs docs = null; - - try { - BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE); - docs = myData.context.getIndexSearcher().search(query, (Filter)null, maxResult); - } - catch (BooleanQuery.TooManyClauses ignore) { - // this exception occurs when too wide wildcard is used on too big data. - } - - if (docs.scoreDocs.length == 0) return Collections.emptySet(); - - Set result = new THashSet(); - - for (int i = 0; i < docs.scoreDocs.length; i++) { - int docIndex = docs.scoreDocs[i].doc; - Document doc = myData.context.getIndexReader().document(docIndex); - ArtifactInfo artifactInfo = IndexUtils.constructArtifactInfo(doc, myData.context); - - if (artifactInfo == null) continue; - - artifactInfo.repository = myRepositoryPathOrUrl; - result.add(artifactInfo); - } - return result; + public synchronized Set search(final Query query, final int maxResult) { + return doIndexTask(new IndexTask>() { + public Set doTask() throws Exception { + return myIndexer.search(myData.indexId, query, maxResult); } - }, Collections.emptySet()); + }, Collections.emptySet()); } private T doIndexTask(IndexTask task, T defaultValue) { @@ -672,7 +587,7 @@ public class MavenIndex { return defaultValue; } - private static interface IndexTask { + private interface IndexTask { T doTask() throws Exception; } @@ -688,9 +603,9 @@ public class MavenIndex { final Map hasArtifactCache = new THashMap(); final Map hasVersionCache = new THashMap(); - final IndexingContext context; + final int indexId; - public IndexData(File dir) throws IOException, UnsupportedExistingLuceneIndexException { + public IndexData(File dir) throws MavenIndexException { try { groups = new PersistentStringEnumerator(new File(dir, GROUP_IDS_FILE)); groupsWithArtifacts = new PersistentStringEnumerator(new File(dir, ARTIFACT_IDS_FILE)); @@ -699,15 +614,15 @@ public class MavenIndex { groupToArtifactMap = createPersistentMap(new File(dir, ARTIFACT_IDS_MAP_FILE)); groupWithArtifactToVersionMap = createPersistentMap(new File(dir, VERSIONS_MAP_FILE)); - context = createContext(getDataContextDir(dir), dir.getName()); + indexId = createContext(getDataContextDir(dir), dir.getName()); } catch (IOException e) { close(); - throw e; + throw new MavenIndexException(e); } - catch (UnsupportedExistingLuceneIndexException e) { + catch (MavenFacadeIndexerException e) { close(); - throw e; + throw new MavenIndexException(e); } } @@ -715,15 +630,15 @@ public class MavenIndex { return new PersistentHashMap>(f, new EnumeratorStringDescriptor(), new SetDescriptor()); } - public void close() throws IOException { - IOException[] exceptions = new IOException[1]; + public void close() throws MavenIndexException { + MavenIndexException[] exceptions = new MavenIndexException[1]; try { - if (context!= null) myIndexer.removeIndexingContext(context, false); + if (indexId != 0) myIndexer.releaseIndex(indexId); } - catch (IOException e) { + catch (MavenFacadeIndexerException e) { MavenLog.LOG.info(e); - if (exceptions[0] == null) exceptions[0] = e; + if (exceptions[0] == null) exceptions[0] = new MavenIndexException(e); } safeClose(groups, exceptions); @@ -736,13 +651,13 @@ public class MavenIndex { if (exceptions[0] != null) throw exceptions[0]; } - private void safeClose(PersistentEnumerator enumerator, IOException[] exceptions) throws IOException { + private void safeClose(PersistentEnumerator enumerator, MavenIndexException[] exceptions) { try { if (enumerator != null) enumerator.close(); } catch (IOException e) { MavenLog.LOG.info(e); - if (exceptions[0] == null) exceptions[0] = e; + if (exceptions[0] == null) exceptions[0] = new MavenIndexException(e); } } @@ -774,35 +689,7 @@ public class MavenIndex { } } - private static class MyScanningListener implements ArtifactScanningListener { - private final ProgressIndicator p; - - public MyScanningListener() { - ProgressIndicator p = ProgressManager.getInstance().getProgressIndicator(); - if (p == null) p = new EmptyProgressIndicator(); - this.p = p; - } - - public void scanningStarted(IndexingContext ctx) { - p.checkCanceled(); - } - - public void scanningFinished(IndexingContext ctx, ScanningResult result) { - p.checkCanceled(); - } - - public void artifactError(ArtifactContext ac, Exception e) { - } - - public void artifactDiscovered(ArtifactContext ac) { - p.checkCanceled(); - ArtifactInfo info = ac.getArtifactInfo(); - String artifact = info.groupId + ":" + info.artifactId + ":" + info.version; - p.setText2(artifact); - } - } - - public static interface IndexListener { + public interface IndexListener { void indexIsBroken(MavenIndex index); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndices.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndices.java index 2517688fb621..62ea3dd5282c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndices.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndices.java @@ -16,24 +16,19 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.io.FileUtil; -import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenIndexerWrapper; +import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.utils.MavenLog; -import org.sonatype.nexus.index.ArtifactContextProducer; -import org.sonatype.nexus.index.NexusIndexer; -import org.sonatype.nexus.index.updater.IndexUpdater; +import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; +import org.jetbrains.idea.maven.utils.MavenProgressIndicator; import java.io.File; import java.util.ArrayList; import java.util.List; public class MavenIndices { - private final MavenEmbedderWrapper myEmbedder; - private final NexusIndexer myIndexer; - private final IndexUpdater myUpdater; - private final ArtifactContextProducer myArtifactContextProducer; + private final MavenIndexerWrapper myIndexer; private final File myIndicesDir; private final MavenIndex.IndexListener myListener; @@ -41,15 +36,11 @@ public class MavenIndices { private final List myIndices = new ArrayList(); private static final Object ourDirectoryLock = new Object(); - public MavenIndices(MavenEmbedderWrapper embedder, File indicesDir, MavenIndex.IndexListener listener) { - myEmbedder = embedder; + public MavenIndices(MavenIndexerWrapper indexer, File indicesDir, MavenIndex.IndexListener listener) { + myIndexer = indexer; myIndicesDir = indicesDir; myListener = listener; - myIndexer = myEmbedder.getComponent(NexusIndexer.class); - myUpdater = myEmbedder.getComponent(IndexUpdater.class); - myArtifactContextProducer = myEmbedder.getComponent(ArtifactContextProducer.class); - load(); } @@ -62,7 +53,7 @@ public class MavenIndices { if (!each.isDirectory()) continue; try { - MavenIndex index = new MavenIndex(myIndexer, myArtifactContextProducer, each, myListener); + MavenIndex index = new MavenIndex(myIndexer, each, myListener); if (find(index.getRepositoryId(), index.getRepositoryPathOrUrl(), index.getKind()) != null) { index.close(); FileUtil.delete(each); @@ -77,11 +68,6 @@ public class MavenIndices { } } - @TestOnly - public NexusIndexer getIndexer() { - return myIndexer; - } - public synchronized void close() { for (MavenIndex each : myIndices) { each.close(); @@ -98,7 +84,7 @@ public class MavenIndices { if (index != null) return index; File dir = getAvailableIndexDir(); - index = new MavenIndex(myIndexer, myArtifactContextProducer, dir, repositoryId, repositoryPathOrUrl, kind, myListener); + index = new MavenIndex(myIndexer, dir, repositoryId, repositoryPathOrUrl, kind, myListener); myIndices.add(index); return index; } @@ -129,10 +115,8 @@ public class MavenIndices { } } - public void updateOrRepair(MavenIndex index, - MavenEmbedderWrapper embedderToUse, - boolean fullUpdate, - ProgressIndicator progress)throws ProcessCanceledException { - index.updateOrRepair(embedderToUse, myUpdater, fullUpdate, progress); + public void updateOrRepair(MavenIndex index, boolean fullUpdate, MavenGeneralSettings settings, MavenProgressIndicator progress) + throws MavenProcessCanceledException { + index.updateOrRepair(fullUpdate, settings, progress); } } \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java index 859381cbb4f2..272ae3852f30 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java @@ -16,8 +16,6 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.application.Result; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.progress.BackgroundTaskQueue; @@ -25,27 +23,25 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import gnu.trove.THashSet; -import org.apache.maven.archetype.catalog.Archetype; -import org.apache.maven.archetype.catalog.ArchetypeCatalog; -import org.apache.maven.archetype.source.ArchetypeDataSource; -import org.apache.maven.archetype.source.ArchetypeDataSourceException; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.utils.MavenRehighlighter; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeIndexer; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.MavenIndexerWrapper; +import org.jetbrains.idea.maven.model.MavenArchetype; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenLog; -import org.jetbrains.idea.maven.utils.MavenUtil; +import org.jetbrains.idea.maven.utils.*; import java.io.File; import java.io.IOException; @@ -68,7 +64,7 @@ public class MavenIndicesManager implements ApplicationComponent { private volatile File myTestIndicesDir; - private volatile MavenEmbedderWrapper myEmbedder; + private volatile MavenIndexerWrapper myIndexer = MavenFacadeManager.getInstance().createIndexer(); private volatile MavenIndices myIndices; private final Object myUpdatingIndicesLock = new Object(); @@ -76,7 +72,7 @@ public class MavenIndicesManager implements ApplicationComponent { private volatile MavenIndex myUpdatingIndex; private final BackgroundTaskQueue myUpdatingQueue = new BackgroundTaskQueue(IndicesBundle.message("maven.indices.updating")); - private volatile List myUserArchetypes = new ArrayList(); + private volatile List myUserArchetypes = new ArrayList(); public static MavenIndicesManager getInstance() { return ApplicationManager.getApplication().getComponent(MavenIndicesManager.class); @@ -103,9 +99,9 @@ public class MavenIndicesManager implements ApplicationComponent { private synchronized void ensureInitialized() { if (myIndices != null) return; - MavenGeneralSettings defaultSettings = new MavenGeneralSettings(); - myEmbedder = MavenEmbedderWrapper.create(defaultSettings); - myIndices = new MavenIndices(myEmbedder, getIndicesDir(), new MavenIndex.IndexListener() { + // todo remove defaultProject + myIndexer = MavenFacadeManager.getInstance().createIndexer(); + myIndices = new MavenIndices(myIndexer, getIndicesDir(), new MavenIndex.IndexListener() { public void indexIsBroken(MavenIndex index) { scheduleUpdate(null, Collections.singletonList(index), false); } @@ -144,14 +140,14 @@ public class MavenIndicesManager implements ApplicationComponent { myIndices = null; } - if (myEmbedder != null) { + if (myIndexer != null) { try { - myEmbedder.release(); + myIndexer.release(); } catch (Exception e) { MavenLog.LOG.error("", e); } - myEmbedder = null; + myIndexer = null; } } @@ -236,12 +232,19 @@ public class MavenIndicesManager implements ApplicationComponent { myUpdatingQueue.run(new Task.Backgroundable(projectOrNull, IndicesBundle.message("maven.indices.updating"), true) { public void run(@NotNull ProgressIndicator indicator) { - doUpdateIndices(projectOrNull, toSchedule, fullUpdate, indicator); + try { + doUpdateIndices(projectOrNull, toSchedule, fullUpdate, new MavenProgressIndicator(indicator)); + } + catch (MavenProcessCanceledException ignore) { + } } }); } - private void doUpdateIndices(final Project projectOrNull, List indices, boolean fullUpdate, ProgressIndicator indicator) { + private void doUpdateIndices(final Project projectOrNull, List indices, boolean fullUpdate, MavenProgressIndicator indicator) + throws MavenProcessCanceledException { + MavenLog.LOG.assertTrue(!fullUpdate || projectOrNull != null); + List remainingWaiting = new ArrayList(indices); try { @@ -259,28 +262,8 @@ public class MavenIndicesManager implements ApplicationComponent { } try { - MavenEmbedderWrapper embedderToUse = null; - if (fullUpdate) { - embedderToUse = new ReadAction() { - @Override - protected void run(Result result) throws Throwable { - if (!projectOrNull.isDisposed()) { - MavenGeneralSettings settings = MavenProjectsManager.getInstance(projectOrNull).getGeneralSettings(); - result.setResult(MavenEmbedderWrapper.create(settings)); - } - } - }.execute().getResultObject(); - if (embedderToUse == null /* project disposed */) throw new ProcessCanceledException(); - } - - try { - getIndicesObject().updateOrRepair(each, embedderToUse, fullUpdate, indicator); - } - finally { - if (embedderToUse != null) embedderToUse.release(); - } - - scheduleRehighlightAllPoms(projectOrNull); + getIndicesObject().updateOrRepair(each, fullUpdate, fullUpdate ? getMavenSettings(projectOrNull) : null, indicator); + if (projectOrNull != null) MavenRehighlighter.rehighlight(projectOrNull); } finally { synchronized (myUpdatingIndicesLock) { @@ -289,8 +272,6 @@ public class MavenIndicesManager implements ApplicationComponent { } } } - catch (ProcessCanceledException ignore) { - } finally { synchronized (myUpdatingIndicesLock) { myWaitingIndices.removeAll(remainingWaiting); @@ -298,6 +279,10 @@ public class MavenIndicesManager implements ApplicationComponent { } } + private MavenGeneralSettings getMavenSettings(Project project) { + return MavenProjectsManager.getInstance(project).getGeneralSettings(); + } + public IndexUpdatingState getUpdatingState(MavenIndex index) { synchronized (myUpdatingIndicesLock) { if (myUpdatingIndex == index) return IndexUpdatingState.UPDATING; @@ -306,16 +291,9 @@ public class MavenIndicesManager implements ApplicationComponent { } } - private void scheduleRehighlightAllPoms(final Project projectOrNull) { - if (projectOrNull == null) return; - MavenRehighlighter.rehighlight(projectOrNull); - } - - public synchronized Set getArchetypes() { + public synchronized Set getArchetypes() { ensureInitialized(); - Set result = new THashSet(); - result.addAll(getArchetypesFrom("internal-catalog")); - result.addAll(getArchetypesFrom("nexus")); + Set result = new THashSet(myIndexer.getArchetypes()); result.addAll(myUserArchetypes); for (MavenArchetypesProvider each : Extensions.getExtensions(MavenArchetypesProvider.EP_NAME)) { @@ -324,7 +302,7 @@ public class MavenIndicesManager implements ApplicationComponent { return result; } - public synchronized void addArchetype(ArchetypeInfo archetype) { + public synchronized void addArchetype(MavenArchetype archetype) { ensureInitialized(); myUserArchetypes.add(archetype); saveUserArchetypes(); @@ -338,7 +316,7 @@ public class MavenIndicesManager implements ApplicationComponent { Document doc = JDOMUtil.loadDocument(file); Element root = doc.getRootElement(); if (root == null) return; - List result = new ArrayList(); + List result = new ArrayList(); for (Element each : (Iterable)root.getChildren(ELEMENT_ARCHETYPE)) { String groupId = each.getAttributeValue(ELEMENT_GROUP_ID); String artifactId = each.getAttributeValue(ELEMENT_ARTIFACT_ID); @@ -352,7 +330,7 @@ public class MavenIndicesManager implements ApplicationComponent { continue; } - result.add(new ArchetypeInfo(groupId, artifactId, version, repository, description)); + result.add(new MavenArchetype(groupId, artifactId, version, repository, description)); } myUserArchetypes = result; @@ -367,7 +345,7 @@ public class MavenIndicesManager implements ApplicationComponent { private void saveUserArchetypes() { Element root = new Element(ELEMENT_ARCHETYPES); - for (ArchetypeInfo each : myUserArchetypes) { + for (MavenArchetype each : myUserArchetypes) { Element childElement = new Element(ELEMENT_ARCHETYPE); childElement.setAttribute(ELEMENT_GROUP_ID, each.groupId); childElement.setAttribute(ELEMENT_ARTIFACT_ID, each.artifactId); @@ -393,22 +371,4 @@ public class MavenIndicesManager implements ApplicationComponent { private File getUserArchetypesFile() { return new File(getIndicesDir(), "UserArchetypes.xml"); } - - private List getArchetypesFrom(String roleHint) { - try { - ArchetypeDataSource source = myEmbedder.getComponent(ArchetypeDataSource.class, roleHint); - ArchetypeCatalog catalog = source.getArchetypeCatalog(new Properties()); - - List result = new ArrayList(); - for (Archetype each : (Iterable)catalog.getArchetypes()) { - result.add(new ArchetypeInfo(each)); - } - - return result; - } - catch (ArchetypeDataSourceException e) { - MavenLog.LOG.warn(e); - } - return Collections.emptyList(); - } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenProjectIndicesManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenProjectIndicesManager.java index 05c197ae05ea..5d9434c6fd0b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenProjectIndicesManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenProjectIndicesManager.java @@ -23,11 +23,13 @@ import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import gnu.trove.THashSet; import org.apache.lucene.search.Query; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenId; +import org.jetbrains.idea.maven.model.MavenRemoteRepository; import org.jetbrains.idea.maven.project.*; -import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.utils.MavenMergingUpdateQueue; import org.jetbrains.idea.maven.utils.SimpleProjectComponent; -import org.sonatype.nexus.index.ArtifactInfo; import java.io.File; import java.util.ArrayList; @@ -75,7 +77,7 @@ public class MavenProjectIndicesManager extends SimpleProjectComponent { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { scheduleUpdateIndicesList(); } @@ -191,8 +193,8 @@ public class MavenProjectIndicesManager extends SimpleProjectComponent { return checkLocalRepository(groupId, artifactId, version); } - public Set search(Query query, int maxResult) { - Set result = new THashSet(); + public Set search(Query query, int maxResult) { + Set result = new THashSet(); for (MavenIndex each : myProjectIndices) { int remained = maxResult - result.size(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenSearcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenSearcher.java index d1a0d030408a..7b9771eaa048 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenSearcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenSearcher.java @@ -16,18 +16,21 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import org.apache.lucene.search.Query; -import org.sonatype.nexus.index.ArtifactInfo; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; import java.util.*; public abstract class MavenSearcher { + public static final VersionComparator COMPARATOR = new VersionComparator(); + public List search(Project project, String pattern, int maxResult) { Pair patternAndQuery = preparePatternAndQuery(pattern); MavenProjectIndicesManager m = MavenProjectIndicesManager.getInstance(project); - Set infos = m.search(patternAndQuery.second, maxResult); + Set infos = m.search(patternAndQuery.second, maxResult); List result = new ArrayList(processResults(infos, patternAndQuery.first, maxResult)); sort(result); @@ -35,11 +38,12 @@ public abstract class MavenSearcher preparePatternAndQuery(String pattern); - protected abstract Collection processResults(Set infos, String pattern, int maxResult); + + protected abstract Collection processResults(Set infos, String pattern, int maxResult); private void sort(List result) { - for (RESULT_TYPE each : result) { - Collections.sort(each.versions, ArtifactInfo.VERSION_COMPARATOR); + for (RESULT_TYPE each : result) { + Collections.sort(each.versions, COMPARATOR); } Collections.sort(result, new Comparator() { @@ -53,7 +57,28 @@ public abstract class MavenSearcher { + public int compare(MavenArtifactInfo f1, MavenArtifactInfo f2) { + int result = f1.getGroupId().compareTo(f2.getGroupId()); + if (result != 0) return result; + + result = f1.getArtifactId().compareTo(f2.getArtifactId()); + if (result != 0) return result; + + result = f2.getVersion().compareTo(f1.getVersion()); + if (result != 0) return result; + + result = Comparing.compare(f1.getClassifier(), f2. getClassifier()); + if (result != 0) return result; + + result = Comparing.compare(f1.getPackaging(), f2.getPackaging()); + if (result != 0) return result; + + return Comparing.compare(f1.getRepositoryId(), f2.getGroupId()); + } } } \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenNavigationUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenNavigationUtil.java index 0977a7c4e440..e8bdb82fbace 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenNavigationUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenNavigationUtil.java @@ -25,8 +25,8 @@ import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.project.MavenArtifact; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java index 2f9497a9ac23..2fed5ca3415d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java @@ -37,6 +37,7 @@ import com.intellij.ui.treeStructure.SimpleTree; import com.intellij.util.containers.ContainerUtil; import org.jdom.Element; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.tasks.MavenShortcutsManager; import org.jetbrains.idea.maven.tasks.MavenTasksManager; @@ -348,7 +349,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe } public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { scheduleUpdateProjects(Collections.singletonList(projectWithChanges.first), Collections.EMPTY_LIST); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java index a746dc289a89..95252e187fab 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java @@ -29,9 +29,9 @@ import gnu.trove.THashMap; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; import org.jetbrains.idea.maven.execution.MavenGoalLocation; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.utils.MavenDataKeys; @@ -210,7 +210,8 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement for (MavenProjectsStructure.BaseDependenciesNode each : nodes) { if (each instanceof MavenProjectsStructure.DependenciesNode) { result.addAll(each.getMavenProject().getDependencies()); - } else { + } + else { result.add(((MavenProjectsStructure.DependencyNode)each).getArtifact()); } } @@ -242,7 +243,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement if (standardGoalOrder == null) { standardGoalOrder = new THashMap(); int i = 0; - for (String aGoal : MavenEmbedderWrapper.PHASES) { + for (String aGoal : MavenConstants.PHASES) { standardGoalOrder.put(aGoal, i++); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java index fc0b30bd0703..366428862934 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java @@ -30,7 +30,9 @@ import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.tasks.MavenShortcutsManager; import org.jetbrains.idea.maven.tasks.MavenTasksManager; @@ -48,8 +50,8 @@ import static org.jetbrains.idea.maven.project.ProjectBundle.message; public class MavenProjectsStructure extends SimpleTreeStructure { private static final URL ERROR_ICON_URL = MavenProjectsStructure.class.getResource("/images/error.png"); - private static final Collection BASIC_PHASES = MavenEmbedderWrapper.BASIC_PHASES; - private static final Collection PHASES = MavenEmbedderWrapper.PHASES; + private static final Collection BASIC_PHASES = MavenConstants.BASIC_PHASES; + private static final Collection PHASES = MavenConstants.PHASES; private static final Comparator NODE_COMPARATOR = new Comparator() { public int compare(MavenSimpleNode o1, MavenSimpleNode o2) { @@ -106,7 +108,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } public MavenUIUtil.CheckBoxState getState(Object userObject) { - MavenProfileState state = ((ProfileNode)userObject).getState(); + MavenProfileKind state = ((ProfileNode)userObject).getState(); switch (state) { case NONE: return MavenUIUtil.CheckBoxState.UNCHECKED; case EXPLICIT: return MavenUIUtil.CheckBoxState.CHECKED; @@ -563,10 +565,10 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } public void updateProfiles() { - Collection> profiles = myProjectsManager.getProfilesWithStates(); + Collection> profiles = myProjectsManager.getProfilesWithStates(); List newNodes = new ArrayList(profiles.size()); - for (Pair each : profiles) { + for (Pair each : profiles) { ProfileNode node = findOrCreateNodeFor(each.first); node.setState(each.second); newNodes.add(node); @@ -587,7 +589,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public class ProfileNode extends MavenSimpleNode { private final String myProfileName; - private MavenProfileState myState; + private MavenProfileKind myState; public ProfileNode(ProfilesNode parent, String profileName) { super(parent); @@ -603,11 +605,11 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return myProfileName; } - public MavenProfileState getState() { + public MavenProfileKind getState() { return myState; } - private void setState(MavenProfileState state) { + private void setState(MavenProfileKind state) { myState = state; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactDownloader.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactDownloader.java index 05d8ba911168..cf5399ad8dec 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactDownloader.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenArtifactDownloader.java @@ -20,10 +20,10 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.LocalFileSystem; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.apache.maven.artifact.Artifact; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; import org.jetbrains.idea.maven.importing.MavenExtraArtifactType; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; @@ -115,7 +115,7 @@ public class MavenArtifactDownloader { for (MavenArtifact eachDependency : eachProject.getDependencies()) { if (myArtifacts != null && !myArtifacts.contains(eachDependency)) continue; - if (Artifact.SCOPE_SYSTEM.equalsIgnoreCase(eachDependency.getScope())) continue; + if (MavenConstants.SCOPE_SYSTEM.equalsIgnoreCase(eachDependency.getScope())) continue; if (myProjectsTree.findProject(eachDependency.getMavenId()) != null) continue; if (!eachProject.isSupportedDependency(eachDependency)) continue; @@ -164,8 +164,8 @@ public class MavenArtifactDownloader { myProgress.checkCanceled(); myProgress.setFraction(((double)downloaded.getAndIncrement()) / finalTotal); - MavenArtifact a = myEmbedder.resolve(id, eachElement.extension, eachElement.classifier, - new ArrayList(data.repositories)); + MavenArtifact a = myEmbedder.resolve(new MavenArtifactInfo(id, eachElement.extension, eachElement.classifier), + new ArrayList(data.repositories)); File file = a.getFile(); if (file.exists()) { synchronized (downloadedFiles) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsole.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsole.java similarity index 62% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsole.java rename to plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsole.java index 3aee5c9e4126..46fe999eff04 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsole.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsole.java @@ -13,45 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.project; import com.intellij.execution.process.ProcessHandler; import com.intellij.openapi.util.text.StringUtil; import gnu.trove.THashMap; -import org.apache.maven.plugin.AbstractMojoExecutionException; +import org.jetbrains.idea.maven.execution.MavenExecutionOptions; +import org.jetbrains.idea.maven.execution.RunnerBundle; +import org.jetbrains.idea.maven.facade.MavenFacadeConsole; import java.text.MessageFormat; import java.util.Map; public abstract class MavenConsole { - public static final int LEVEL_AUTO = -1; - public static final int LEVEL_DEBUG = 0; - public static final int LEVEL_INFO = 1; - public static final int LEVEL_WARN = 2; - public static final int LEVEL_ERROR = 3; - public static final int LEVEL_FATAL = 4; - public static final int LEVEL_DISABLED = 5; - public static final int LEVEL_ALWAYS = 6; - - public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); public enum OutputType { NORMAL, SYSTEM, ERROR } private final int myOutputLevel; - private final boolean myPrintStrackTrace; private boolean isFinished; private static final Map PREFIX_TO_LEVEL = new THashMap(); private static final Map LEVEL_TO_PREFIX = new THashMap(); static { - map("DEBUG", LEVEL_DEBUG); - map("INFO", LEVEL_INFO); - map("WARNING", LEVEL_WARN); - map("ERROR", LEVEL_ERROR); - map("FATAL_ERROR", LEVEL_FATAL); + map("DEBUG", MavenFacadeConsole.LEVEL_DEBUG); + map("INFO", MavenFacadeConsole.LEVEL_INFO); + map("WARNING", MavenFacadeConsole.LEVEL_WARN); + map("ERROR", MavenFacadeConsole.LEVEL_ERROR); + map("FATAL_ERROR", MavenFacadeConsole.LEVEL_FATAL); } private static void map(String prefix, int level) { @@ -61,7 +53,6 @@ public abstract class MavenConsole { public MavenConsole(MavenExecutionOptions.LoggingLevel outputLevel, boolean printStrackTrace) { myOutputLevel = outputLevel.getLevel(); - myPrintStrackTrace = printStrackTrace; } public boolean isSuppressed(int level) { @@ -88,6 +79,10 @@ public abstract class MavenConsole { public abstract void attachToProcess(ProcessHandler processHandler); + public void printException(Throwable throwable) { + systemMessage(MavenFacadeConsole.LEVEL_ERROR, RunnerBundle.message("embedded.build.failed"), throwable); + } + public void systemMessage(int level, String string, Throwable throwable) { printMessage(level, string, throwable); } @@ -96,51 +91,62 @@ public abstract class MavenConsole { if (isSuppressed(level)) return; OutputType type = OutputType.NORMAL; - if (throwable != null || level == LEVEL_WARN || level == LEVEL_ERROR || level == LEVEL_FATAL) { + if (throwable != null + || level == MavenFacadeConsole.LEVEL_WARN + || level == MavenFacadeConsole.LEVEL_ERROR + || level == MavenFacadeConsole.LEVEL_FATAL) { type = OutputType.ERROR; } doPrint(composeLine(level, string), type); - if (level == LEVEL_FATAL) { + if (level == MavenFacadeConsole.LEVEL_FATAL) { setOutputPaused(false); } if (throwable != null) { - String message = null; - - Throwable temp = throwable; - while (temp != null) { - if (temp instanceof AbstractMojoExecutionException) { - message = appendExecutionFailureMessage(message, temp.getMessage()); - message = appendExecutionFailureMessage(message, ((AbstractMojoExecutionException)temp).getLongMessage()); - - if (temp.getCause() != null) { - message = appendExecutionFailureMessage(message, temp.getCause().getMessage()); - } - break; - } - temp = temp.getCause(); - } - - if (message == null) message = throwable.getMessage(); - + String message = throwable.getMessage(); if (message != null) { message += LINE_SEPARATOR; - doPrint(LINE_SEPARATOR + composeLine(LEVEL_ERROR, message), type); - } - - if (myPrintStrackTrace) { - doPrint(LINE_SEPARATOR + StringUtil.getThrowableText(throwable), OutputType.ERROR); - } - else { - doPrint(LINE_SEPARATOR + - "To view full stack traces, please go to the Settings->Maven and check the 'Print Exception Stack Traces' box." + - LINE_SEPARATOR, - type); + doPrint(LINE_SEPARATOR + composeLine(MavenFacadeConsole.LEVEL_ERROR, message), type); } } } + // todo + // if (throwable != null) { + // String message = null; + // + // Throwable temp = throwable; + // while (temp != null) { + // if (temp instanceof AbstractMojoExecutionException) { + // message = appendExecutionFailureMessage(message, temp.getMessage()); + // message = appendExecutionFailureMessage(message, ((AbstractMojoExecutionException)temp).getLongMessage()); + // + // if (temp.getCause() != null) { + // message = appendExecutionFailureMessage(message, temp.getCause().getMessage()); + // } + // break; + // } + // temp = temp.getCause(); + // } + // + // if (message == null) message = throwable.getMessage(); + // + // if (message != null) { + // message += LINE_SEPARATOR; + // doPrint(LINE_SEPARATOR + composeLine(LEVEL_ERROR, message), type); + // } + // + // if (myPrintStrackTrace) { + // doPrint(LINE_SEPARATOR + StringUtil.getThrowableText(throwable), OutputType.ERROR); + // } + // else { + // doPrint(LINE_SEPARATOR + + // "To view full stack traces, please go to the Settings->Maven and check the 'Print Exception Stack Traces' box." + + // LINE_SEPARATOR, + // type); + // } + //} private String appendExecutionFailureMessage(String message, String newMessage) { if (message == null) return newMessage; @@ -166,7 +172,7 @@ public abstract class MavenConsole { private static int getLevelByPrefix(String prefix) { Integer level = PREFIX_TO_LEVEL.get(prefix); - return level != null ? level : LEVEL_ALWAYS; + return level != null ? level : MavenFacadeConsole.LEVEL_WARN; } private static String composeLine(int level, String message) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleImpl.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java similarity index 97% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleImpl.java rename to plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java index f14e66faf49d..7d04d8dba13b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/embedder/MavenConsoleImpl.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.embedder; +package org.jetbrains.idea.maven.project; import com.intellij.execution.filters.*; import com.intellij.execution.process.ProcessAdapter; @@ -30,8 +30,6 @@ import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.ui.content.MessageView; -import org.jetbrains.idea.maven.project.MavenGeneralSettings; -import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.execution.MavenRunnerParameters; import org.jetbrains.idea.maven.execution.MavenRunnerSettings; import org.jetbrains.idea.maven.utils.MavenUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEmbeddersManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEmbeddersManager.java index a187b202b565..cf00a48dacad 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEmbeddersManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEmbeddersManager.java @@ -15,32 +15,36 @@ */ package org.jetbrains.idea.maven.project; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; import com.intellij.util.Function; import com.intellij.util.containers.SoftValueHashMap; import gnu.trove.THashSet; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; import org.jetbrains.idea.maven.utils.MavenLog; import java.util.Map; import java.util.Set; public class MavenEmbeddersManager { - public enum EmbedderKind { - FOR_DEPENDENCIES_RESOLVE, - FOR_PLUGINS_RESOLVE, - FOR_FOLDERS_RESOLVE, - FOR_DOWNLOAD, - FOR_POST_PROCESSING, - } + public static final Key FOR_DEPENDENCIES_RESOLVE = Key.create(MavenEmbeddersManager.class + ".FOR_DEPENDENCIES_RESOLVE"); + public static final Key FOR_PLUGINS_RESOLVE = Key.create(MavenEmbeddersManager.class + ".FOR_PLUGINS_RESOLVE"); + public static final Key FOR_FOLDERS_RESOLVE = Key.create(MavenEmbeddersManager.class + ".FOR_FOLDERS_RESOLVE"); + public static final Key FOR_DOWNLOAD = Key.create(MavenEmbeddersManager.class + ".FOR_DOWNLOAD"); + public static final Key FOR_POST_PROCESSING = Key.create(MavenEmbeddersManager.class + ".FOR_POST_PROCESSING"); - private final MavenGeneralSettings myGeneralSettings; + private final Project myProject; - private final Map myPool = new SoftValueHashMap(); + private final Map myPool = new SoftValueHashMap(); private final Set myEmbeddersInUse = new THashSet(); private final Set myEmbeddersToClear = new THashSet(); - public MavenEmbeddersManager(MavenGeneralSettings generalSettings) { - myGeneralSettings = generalSettings; + public MavenEmbeddersManager(Project project) { + myProject = project; } public synchronized void reset() { @@ -57,16 +61,16 @@ public class MavenEmbeddersManager { myEmbeddersToClear.addAll(myEmbeddersInUse); } - public synchronized MavenEmbedderWrapper getEmbedder(EmbedderKind kind) { + public synchronized MavenEmbedderWrapper getEmbedder(Key kind) { MavenEmbedderWrapper result = myPool.get(kind); if (result == null) { - result = MavenEmbedderWrapper.create(myGeneralSettings); + result = MavenFacadeManager.getInstance().createEmbedder(myProject); myPool.put(kind, result); } if (myEmbeddersInUse.contains(result)) { MavenLog.LOG.warn("embedder " + kind + " is already used"); - return MavenEmbedderWrapper.create(myGeneralSettings); + return MavenFacadeManager.getInstance().createEmbedder(myProject); } myEmbeddersInUse.add(result); @@ -80,7 +84,9 @@ public class MavenEmbeddersManager { return; } + embedder.reset(); myEmbeddersInUse.remove(embedder); + if (myEmbeddersToClear.contains(embedder)) { embedder.clearCaches(); myEmbeddersToClear.remove(embedder); @@ -111,7 +117,7 @@ public class MavenEmbeddersManager { } private void forEachPooled(boolean includeInUse, Function func) { - for (EmbedderKind each : myPool.keySet()) { + for (Key each : myPool.keySet()) { MavenEmbedderWrapper embedder = myPool.get(each); if (embedder == null) continue; // collected if (!includeInUse && myEmbeddersInUse.contains(embedder)) continue; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.form index fd0eca592c95..f972ad1dd8c4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.form +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.form @@ -1,9 +1,9 @@
- + - + @@ -42,26 +42,9 @@ - - - - - - - - - - - - - - - - - - + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java index 90e727fc62dc..7faa4c0da883 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java @@ -17,12 +17,12 @@ package org.jetbrains.idea.maven.project; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenEmbedderUtilEx; +import org.jetbrains.idea.maven.utils.MavenUtil; import javax.swing.*; import java.awt.event.ActionEvent; @@ -36,17 +36,15 @@ public class MavenEnvironmentForm { private LabeledComponent mavenSettingsFileComponent; private JCheckBox mavenHomeOverrideCheckBox; private JCheckBox mavenSettingsFileOverrideCheckBox; - private JCheckBox localRepositoryOverrideCheckBox; private final PathOverrider mavenHomeOverrider; private final PathOverrider mavenSettingsFileOverrider; - private final PathOverrider localRepositoryOverrider; public MavenEnvironmentForm() { mavenHomeOverrider = new PathOverrider(mavenHomeComponent, mavenHomeOverrideCheckBox, new PathOverrider.PathProvider() { @Nullable protected File getFile() { - return MavenEmbedderUtilEx.resolveMavenHomeDirectory(""); + return MavenUtil.resolveMavenHomeDirectory(""); } }); @@ -54,17 +52,7 @@ public class MavenEnvironmentForm { new PathOverrider(mavenSettingsFileComponent, mavenSettingsFileOverrideCheckBox, new PathOverrider.PathProvider() { @Nullable protected File getFile() { - return MavenEmbedderUtilEx.resolveUserSettingsFile(""); - } - }); - - localRepositoryOverrider = - new PathOverrider(localRepositoryComponent, localRepositoryOverrideCheckBox, new PathOverrider.PathProvider() { - @Nullable - protected File getFile() { - return MavenEmbedderUtilEx.resolveLocalRepository(mavenHomeOverrider.getText(), - mavenSettingsFileOverrider.getText(), - ""); + return MavenUtil.resolveUserSettingsFile(""); } }); } @@ -78,13 +66,11 @@ public class MavenEnvironmentForm { public void setData(MavenGeneralSettings data) { data.setMavenHome(mavenHomeOverrider.getText()); data.setMavenSettingsFile(mavenSettingsFileOverrider.getText()); - data.setLocalRepository(localRepositoryOverrider.getText()); } public void getData(MavenGeneralSettings data) { mavenHomeOverrider.setText(data.getMavenHome()); mavenSettingsFileOverrider.setText(data.getMavenSettingsFile()); - localRepositoryOverrider.setText(data.getLocalRepository()); } public JComponent createComponent() { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralConfigurable.java index f20b862ef215..a2857989698e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralConfigurable.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralConfigurable.java @@ -23,7 +23,7 @@ import com.intellij.util.Function; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenExecutionOptions; +import org.jetbrains.idea.maven.execution.MavenExecutionOptions; import org.jetbrains.idea.maven.utils.ComboBoxUtil; import javax.swing.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralSettings.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralSettings.java index d3ab6ad2d966..8294bbeec711 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralSettings.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenGeneralSettings.java @@ -23,9 +23,9 @@ import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenEmbedderUtilEx; -import org.jetbrains.idea.maven.embedder.MavenExecutionOptions; +import org.jetbrains.idea.maven.execution.MavenExecutionOptions; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; +import org.jetbrains.idea.maven.utils.MavenUtil; import java.io.File; import java.util.ArrayList; @@ -37,7 +37,7 @@ public class MavenGeneralSettings implements Cloneable { private boolean workOffline = false; private String mavenHome = ""; private String mavenSettingsFile = ""; - private String localRepository = ""; + private String overridenLocalRepository = ""; private boolean printErrorStackTraces = false; private boolean usePluginRegistry = false; private boolean nonRecursive = false; @@ -52,7 +52,9 @@ public class MavenGeneralSettings implements Cloneable { private List myListeners = ContainerUtil.createEmptyCOWList(); - public @NotNull MavenExecutionOptions.PluginUpdatePolicy getPluginUpdatePolicy() { + public + @NotNull + MavenExecutionOptions.PluginUpdatePolicy getPluginUpdatePolicy() { return pluginUpdatePolicy; } @@ -81,7 +83,9 @@ public class MavenGeneralSettings implements Cloneable { this.failureBehavior = value; } - public @NotNull MavenExecutionOptions.LoggingLevel getLoggingLevel() { + public + @NotNull + MavenExecutionOptions.LoggingLevel getLoggingLevel() { return outputLevel; } @@ -90,7 +94,9 @@ public class MavenGeneralSettings implements Cloneable { this.outputLevel = value; } - public @NotNull MavenExecutionOptions.SnapshotUpdatePolicy getSnapshotUpdatePolicy() { + public + @NotNull + MavenExecutionOptions.SnapshotUpdatePolicy getSnapshotUpdatePolicy() { return snapshotUpdatePolicy; } @@ -108,23 +114,23 @@ public class MavenGeneralSettings implements Cloneable { } @NotNull - public String getLocalRepository() { - return localRepository; + public String getOverridenLocalRepository() { + return overridenLocalRepository; } public File getEffectiveLocalRepository() { File result = myEffectiveLocalRepositoryCache; if (result != null) return result; - result = MavenEmbedderUtilEx.resolveLocalRepository(mavenHome, mavenSettingsFile, localRepository); + result = MavenUtil.resolveLocalRepository(overridenLocalRepository, mavenHome, mavenSettingsFile); myEffectiveLocalRepositoryCache = result; return result; } - public void setLocalRepository(final @Nullable String localRepository) { - if (localRepository != null) { - if (!Comparing.equal(this.localRepository, localRepository)) { - this.localRepository = localRepository; + public void setOverridenLocalRepository(final @Nullable String overridenLocalRepository) { + if (overridenLocalRepository != null) { + if (!Comparing.equal(this.overridenLocalRepository, overridenLocalRepository)) { + this.overridenLocalRepository = overridenLocalRepository; localRepositoryChanged(); } @@ -147,7 +153,7 @@ public class MavenGeneralSettings implements Cloneable { @Nullable public File getEffectiveMavenHome() { - return MavenEmbedderUtilEx.resolveMavenHomeDirectory(getMavenHome()); + return MavenUtil.resolveMavenHomeDirectory(getMavenHome()); } @NotNull @@ -175,12 +181,12 @@ public class MavenGeneralSettings implements Cloneable { @Nullable public File getEffectiveUserSettingsIoFile() { - return MavenEmbedderUtilEx.resolveUserSettingsFile(getMavenSettingsFile()); + return MavenUtil.resolveUserSettingsFile(getMavenSettingsFile()); } @Nullable public File getEffectiveGlobalSettingsIoFile() { - return MavenEmbedderUtilEx.resolveGlobalSettingsFile(getMavenHome()); + return MavenUtil.resolveGlobalSettingsFile(getMavenHome()); } @Nullable @@ -206,7 +212,7 @@ public class MavenGeneralSettings implements Cloneable { @NotNull public VirtualFile getEffectiveSuperPom() { - return MavenEmbedderUtilEx.resolveSuperPomFile(getMavenHome()); + return MavenUtil.resolveSuperPomFile(getEffectiveMavenHome()); } public boolean isDefaultPlugin(String groupId, String artifactId) { @@ -269,7 +275,7 @@ public class MavenGeneralSettings implements Cloneable { if (workOffline != that.workOffline) return false; if (!checksumPolicy.equals(that.checksumPolicy)) return false; if (!failureBehavior.equals(that.failureBehavior)) return false; - if (!localRepository.equals(that.localRepository)) return false; + if (!overridenLocalRepository.equals(that.overridenLocalRepository)) return false; if (!mavenHome.equals(that.mavenHome)) return false; if (!mavenSettingsFile.equals(that.mavenSettingsFile)) return false; @@ -281,7 +287,7 @@ public class MavenGeneralSettings implements Cloneable { result = (workOffline ? 1 : 0); result = 31 * result + mavenHome.hashCode(); result = 31 * result + mavenSettingsFile.hashCode(); - result = 31 * result + localRepository.hashCode(); + result = 31 * result + overridenLocalRepository.hashCode(); result = 31 * result + (printErrorStackTraces ? 1 : 0); result = 31 * result + (usePluginRegistry ? 1 : 0); result = 31 * result + (nonRecursive ? 1 : 0); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentDesc.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentDesc.java index 8080ce11ff7f..4a497b4fd8ca 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentDesc.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentDesc.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.model.MavenId; public class MavenParentDesc { private final MavenId myParentId; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentProjectFileProcessor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentProjectFileProcessor.java index 543b71d587d9..6c243cbaa20d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentProjectFileProcessor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenParentProjectFileProcessor.java @@ -19,8 +19,9 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; -import org.jetbrains.idea.maven.utils.MavenConstants; import java.io.File; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index b16a233d3891..e418cf3d073c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -26,17 +26,14 @@ import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; -import gnu.trove.TObjectIdentityHashingStrategy; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.model.*; -import org.apache.maven.shared.dependency.tree.DependencyNode; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.importing.MavenExtraArtifactType; import org.jetbrains.idea.maven.importing.MavenImporter; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.*; import java.io.*; @@ -100,51 +97,44 @@ public class MavenProject { } private MavenProjectChanges set(MavenProjectReaderResult readerResult, + MavenGeneralSettings settings, boolean updateLastReadStamp, boolean resetArtifacts, boolean resetProfiles) { State newState = myState.clone(); - if (updateLastReadStamp) newState.myLastReadStamp++; - - org.apache.maven.project.MavenProject nativeMavenProject = readerResult.nativeMavenProject; + if (updateLastReadStamp) newState.myLastReadStamp = myState.myLastReadStamp + 1; newState.myReadingProblems = readerResult.readingProblems; - newState.myLocalRepository = readerResult.localRepository; + newState.myLocalRepository = settings.getEffectiveLocalRepository(); - Collection activeProfiles = collectActivateProfiles(nativeMavenProject); + Collection activeProfiles = readerResult.activatedProfiles; newState.myActiveProfilesIds = collectProfilesIds(activeProfiles); - Model model = nativeMavenProject.getModel(); + MavenModel model = readerResult.mavenModel; - newState.myMavenId = new MavenId(model.getGroupId(), - model.getArtifactId(), - model.getVersion()); - - Parent parent = model.getParent(); - newState.myParentId = parent != null - ? new MavenId(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()) - : null; + newState.myMavenId = model.getMavenId(); + if (model.getParent() != null) { + newState.myParentId = model.getParent().getMavenId(); + } newState.myPackaging = model.getPackaging(); newState.myName = model.getName(); - Build build = model.getBuild(); + newState.myFinalName = model.getBuild().getFinalName(); + newState.myDefaultGoal = model.getBuild().getDefaultGoal(); - newState.myFinalName = build.getFinalName(); - newState.myDefaultGoal = build.getDefaultGoal(); - - newState.myBuildDirectory = build.getDirectory(); - newState.myOutputDirectory = build.getOutputDirectory(); - newState.myTestOutputDirectory = build.getTestOutputDirectory(); + newState.myBuildDirectory = model.getBuild().getDirectory(); + newState.myOutputDirectory = model.getBuild().getOutputDirectory(); + newState.myTestOutputDirectory = model.getBuild().getTestOutputDirectory(); doSetFolders(newState, readerResult); - newState.myFilters = build.getFilters() == null ? Collections.EMPTY_LIST : build.getFilters(); - newState.myProperties = model.getProperties() != null ? model.getProperties() : new Properties(); + newState.myFilters = model.getBuild().getFilters(); + newState.myProperties = model.getProperties(); - doSetResolvedAttributes(newState, readerResult, resetArtifacts); + doSetResolvedAttributes(newState, readerResult, settings, resetArtifacts); newState.myModulesPathsAndNames = collectModulePathsAndNames(model, getDirectory(), activeProfiles); Collection newProfiles = collectProfilesIds(model.getProfiles()); @@ -157,8 +147,7 @@ public class MavenProject { newState.myProfilesIds = new ArrayList(mergedProfiles); } - newState.myStrippedMavenModel = MavenUtil.cloneObject(model); - MavenUtil.stripDown(newState.myStrippedMavenModel); + newState.myModelMap = readerResult.nativeModelMap; return setState(newState); } @@ -169,9 +158,11 @@ public class MavenProject { return changes; } - private static void doSetResolvedAttributes(State state, MavenProjectReaderResult readerResult, boolean reset) { - org.apache.maven.project.MavenProject nativeMavenProject = readerResult.nativeMavenProject; - Model model = nativeMavenProject.getModel(); + private static void doSetResolvedAttributes(State state, + MavenProjectReaderResult readerResult, + MavenGeneralSettings settings, + boolean reset) { + MavenModel model = readerResult.mavenModel; Set newUnresolvedArtifacts = new THashSet(); LinkedHashSet newRepositories = new LinkedHashSet(); @@ -190,15 +181,11 @@ public class MavenProject { } newUnresolvedArtifacts.addAll(readerResult.unresolvedArtifactIds); - newRepositories.addAll(convertRepositories(model.getRepositories())); - - Map nativeToConvertedMap = - new THashMap(new TObjectIdentityHashingStrategy()); - newDependencyTree.addAll(convertDependencyNodes(null, readerResult.dependencyTree, nativeToConvertedMap, state.myLocalRepository)); - newDependencies.addAll(convertArtifacts(nativeMavenProject.getArtifacts(), nativeToConvertedMap, state.myLocalRepository)); - - newPlugins.addAll(collectPlugins(readerResult.settings, model)); - newExtensions.addAll(convertArtifacts(nativeMavenProject.getExtensionArtifacts(), nativeToConvertedMap, state.myLocalRepository)); + newRepositories.addAll(model.getRemoteRepositories()); + newDependencyTree.addAll(model.getDependencyTree()); + newDependencies.addAll(model.getDependencies()); + newPlugins.addAll(model.getPlugins()); + newExtensions.addAll(model.getExtensions()); state.myUnresolvedArtifactIds = newUnresolvedArtifacts; state.myRemoteRepositories = new ArrayList(newRepositories); @@ -206,6 +193,8 @@ public class MavenProject { state.myDependencyTree = new ArrayList(newDependencyTree); state.myPlugins = new ArrayList(newPlugins); state.myExtensions = new ArrayList(newExtensions); + + // todo remove non-default managed plugins } private MavenProjectChanges setFolders(MavenProjectReaderResult readerResult) { @@ -215,123 +204,17 @@ public class MavenProject { } private static void doSetFolders(State newState, MavenProjectReaderResult readerResult) { - org.apache.maven.project.MavenProject nativeMavenProject = readerResult.nativeMavenProject; + MavenModel model = readerResult.mavenModel; + newState.mySources = model.getBuild().getSources(); + newState.myTestSources = model.getBuild().getTestSources(); - newState.mySources = new ArrayList(nativeMavenProject.getCompileSourceRoots()); - newState.myTestSources = new ArrayList(nativeMavenProject.getTestCompileSourceRoots()); - - newState.myResources = convertResources(nativeMavenProject.getResources()); - newState.myTestResources = convertResources(nativeMavenProject.getTestResources()); + newState.myResources = model.getBuild().getResources(); + newState.myTestResources = model.getBuild().getTestResources(); } - private static List convertResources(List resources) { - if (resources == null) return new ArrayList(); - - List result = new ArrayList(resources.size()); - for (Resource each : resources) { - result.add(new MavenResource(each)); - } - return result; - } - - private static List convertRepositories(List repositories) { - if (repositories == null) return new ArrayList(); - - List result = new ArrayList(repositories.size()); - for (Repository each : repositories) { - result.add(new MavenRemoteRepository(each)); - } - return result; - } - - private static List convertArtifacts(Collection artifacts, - Map nativeToConvertedMap, - File localRepository) { - if (artifacts == null) return new ArrayList(); - - List result = new ArrayList(artifacts.size()); - for (Artifact each : artifacts) { - result.add(convertArtifact(each, nativeToConvertedMap, localRepository)); - } - return result; - } - - private static List convertDependencyNodes(MavenArtifactNode parent, - Collection nodes, - Map nativeToConvertedMap, - File localRepository) { - List result = new ArrayList(nodes.size()); - for (DependencyNode each : nodes) { - Artifact a = each.getArtifact(); - MavenArtifact ma = convertArtifact(a, nativeToConvertedMap, localRepository); - - MavenArtifactState state = MavenArtifactState.ADDED; - switch (each.getState()) { - case DependencyNode.INCLUDED: - break; - case DependencyNode.OMITTED_FOR_CONFLICT: - state = MavenArtifactState.CONFLICT; - break; - case DependencyNode.OMITTED_FOR_DUPLICATE: - state = MavenArtifactState.DUPLICATE; - break; - case DependencyNode.OMITTED_FOR_CYCLE: - state = MavenArtifactState.CYCLE; - break; - default: - MavenLog.LOG.error("unknown dependency node state: " + each.getState()); - } - MavenArtifact relatedMA = each.getRelatedArtifact() == null ? null - : convertArtifact(each.getRelatedArtifact(), nativeToConvertedMap, localRepository); - MavenArtifactNode newNode = new MavenArtifactNode(parent, ma, state, relatedMA, each.getOriginalScope(), - each.getPremanagedVersion(), each.getPremanagedScope()); - newNode.setDependencies(convertDependencyNodes(newNode, each.getChildren(), nativeToConvertedMap, localRepository)); - result.add(newNode); - } - return result; - } - - private static MavenArtifact convertArtifact(Artifact artifact, Map nativeToConvertedMap, File localRepository) { - MavenArtifact ma = nativeToConvertedMap.get(artifact); - if (ma == null) { - ma = new MavenArtifact(artifact, localRepository); - nativeToConvertedMap.put(artifact, ma); - } - return ma; - } - - private static List collectPlugins(MavenGeneralSettings settings, Model mavenModel) { - List result = new ArrayList(); - Set pluginKeys = new THashSet(); - Build build = mavenModel.getBuild(); - doCollectPlugins(settings, build, false, result, pluginKeys); - if (build != null) doCollectPlugins(settings, build.getPluginManagement(), true, result, pluginKeys); - return result; - } - - private static void doCollectPlugins(MavenGeneralSettings settings, - PluginContainer container, - boolean management, - List result, - Set pluginKeys) { - if (container == null) return; - - List plugins = container.getPlugins(); - if (plugins == null) return; - - for (Plugin each : plugins) { - String key = each.getGroupId() + ":" + each.getArtifactId(); - if (management && (!isDefaultPlugin(settings, each) || pluginKeys.contains(key))) continue; - result.add(new MavenPlugin(each, management)); - pluginKeys.add(key); - } - } - - private static boolean isDefaultPlugin(MavenGeneralSettings settings, Plugin plugin) { - return settings.isDefaultPlugin(plugin.getGroupId(), plugin.getArtifactId()); - } - - private static Map collectModulePathsAndNames(Model mavenModel, String baseDir, Collection activeProfiles) { + private static Map collectModulePathsAndNames(MavenModel mavenModel, + String baseDir, + Collection activeProfiles) { String basePath = baseDir + "/"; Map result = new LinkedHashMap(); for (Map.Entry each : collectModulesRelativePathsAndNames(mavenModel, activeProfiles).entrySet()) { @@ -340,17 +223,17 @@ public class MavenProject { return result; } - private static Map collectModulesRelativePathsAndNames(Model mavenModel, Collection activeProfiles) { + private static Map collectModulesRelativePathsAndNames(MavenModel mavenModel, Collection activeProfiles) { LinkedHashMap result = new LinkedHashMap(); addModulesToList(mavenModel.getModules(), result); - for (Profile profile : activeProfiles) { + for (MavenProfile profile : activeProfiles) { addModulesToList(profile.getModules(), result); } return result; } - private static void addModulesToList(List moduleNames, LinkedHashMap result) { - for (String name : (List)moduleNames) { + private static void addModulesToList(List moduleNames, LinkedHashMap result) { + for (String name : moduleNames) { if (name.trim().length() == 0) continue; String originalName = name; @@ -364,18 +247,12 @@ public class MavenProject { } } - private static Collection collectActivateProfiles(org.apache.maven.project.MavenProject nativeMavenProject) { - Collection activatedProfiles = nativeMavenProject.getActiveProfiles(); - return activatedProfiles == null ? Collections.emptySet() : activatedProfiles; - } - - private static Collection collectProfilesIds(Collection profiles) { + private static Collection collectProfilesIds(Collection profiles) { if (profiles == null) return Collections.emptyList(); Set result = new THashSet(profiles.size()); - for (Profile each : profiles) { - String id = each.getId(); - if (id != null) result.add(id); + for (MavenProfile each : profiles) { + result.add(each.getId()); } return result; } @@ -427,8 +304,8 @@ public class MavenProject { return state.myName; } - public Model getMavenModel() { - return myState.myStrippedMavenModel; + public Map getModelMap() { + return myState.myModelMap; } public MavenId getMavenId() { @@ -491,34 +368,34 @@ public class MavenProject { Collection profiles, MavenProjectReader reader, MavenProjectReaderProjectLocator locator) { - return set(reader.readProject(generalSettings, myFile, profiles, locator), true, false, true); + return set(reader.readProject(generalSettings, myFile, profiles, locator), generalSettings, true, false, true); } - public Pair resolve(MavenGeneralSettings generalSettings, - MavenEmbedderWrapper embedder, - MavenProjectReader reader, - MavenProjectReaderProjectLocator locator) + public Pair resolve(MavenGeneralSettings generalSettings, + MavenEmbedderWrapper embedder, + MavenProjectReader reader, + MavenProjectReaderProjectLocator locator) throws MavenProcessCanceledException { MavenProjectReaderResult result = reader.resolveProject(generalSettings, embedder, getFile(), getActiveProfilesIds(), locator); - MavenProjectChanges changes = set(result, false, result.readingProblems.isEmpty(), false); + MavenProjectChanges changes = set(result, generalSettings, false, result.readingProblems.isEmpty(), false); - for (MavenImporter eachImporter : getSuitableImporters()) { - eachImporter.resolve(this, result.nativeMavenProject, embedder); + if (result.nativeMavenProject != null) { + for (MavenImporter eachImporter : getSuitableImporters()) { + eachImporter.resolve(this, result.nativeMavenProject, embedder); + } } return Pair.create(changes, result.nativeMavenProject); } public Pair resolveFolders(MavenEmbedderWrapper embedder, - MavenGeneralSettings generalSettings, MavenImportingSettings importingSettings, MavenProjectReader reader, MavenConsole console) throws MavenProcessCanceledException { MavenProjectReaderResult result = reader.generateSources(embedder, - generalSettings, importingSettings, getFile(), getActiveProfilesIds(), @@ -597,7 +474,7 @@ public class MavenProject { } private static MavenProjectProblem createDependencyProblem(VirtualFile file, String description) { - return new MavenProjectProblem(file, description, MavenProjectProblem.ProblemType.DEPENDENCY); + return new MavenProjectProblem(file.getPath(), description, MavenProjectProblem.ProblemType.DEPENDENCY); } private static boolean isParentResolved(State state) { @@ -892,12 +769,13 @@ public class MavenProject { List myDependencies; List myDependencyTree; + List myRemoteRepositories; + Map myModulesPathsAndNames; Collection myProfilesIds; - Model myStrippedMavenModel; - List myRemoteRepositories; + Map myModelMap; Collection myActiveProfilesIds; Collection myReadingProblems; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectProblem.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectProblem.java deleted file mode 100644 index 1c6636d9530b..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectProblem.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.project; - -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; - -import java.io.Serializable; - -public class MavenProjectProblem implements Serializable { - public enum ProblemType { - SYNTAX, STRUCTURE, DEPENDENCY, PARENT, SETTINGS_OR_PROFILES; - } - - private String myUrl; - private String myDescription; - private ProblemType myType; - - protected MavenProjectProblem() { - } - - public MavenProjectProblem(VirtualFile file, String description, ProblemType type) { - myUrl = file.getUrl(); - myDescription = description; - myType = type; - } - - public String getUrl() { - return myUrl; - } - - public String getDescription() { - return myDescription; - } - - public ProblemType getType() { - return myType; - } - - public VirtualFile findFile() { - return VirtualFileManager.getInstance().findFileByUrl(myUrl); - } - - @Override - public String toString() { - return myType + ":" + myDescription + ":" + myUrl; - } - - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MavenProjectProblem that = (MavenProjectProblem)o; - - if (!myDescription.equals(that.myDescription)) return false; - if (myType != that.myType) return false; - if (!myUrl.equals(that.myUrl)) return false; - - return true; - } - - public int hashCode() { - int result = myUrl.hashCode(); - result = 31 * result + myDescription.hashCode(); - result = 31 * result + myType.hashCode(); - return result; - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java index b9c5c1d5dcf6..928855b590e4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java @@ -21,22 +21,14 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.apache.maven.model.*; -import org.apache.maven.profiles.activation.*; -import org.apache.maven.project.InvalidProjectModelException; -import org.apache.maven.project.JBMavenProjectHelper; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuildingException; -import org.apache.maven.project.inheritance.DefaultModelInheritanceAssembler; -import org.apache.maven.project.injection.DefaultProfileInjector; -import org.apache.maven.project.validation.ModelValidationResult; -import org.apache.maven.shared.dependency.tree.DependencyNode; -import org.codehaus.plexus.context.ContextException; -import org.codehaus.plexus.context.DefaultContext; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.embedder.*; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.MavenWrapperExecutionResult; +import org.jetbrains.idea.maven.facade.ProfileApplicationResult; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; @@ -56,46 +48,35 @@ public class MavenProjectReader { private static final String PROFILE_FROM_SETTINGS_XML = "settings.xml"; private final Map myRawModelsCache = new THashMap(); - private Pair, Collection> mySettingsProfilesWithProblemsCache; + private Pair, Collection> mySettingsProfilesWithProblemsCache; public MavenProjectReaderResult readProject(MavenGeneralSettings generalSettings, VirtualFile file, Collection explicitProfiles, MavenProjectReaderProjectLocator locator) { - Pair> readResult = + Pair> readResult = doReadProjectModel(generalSettings, file, explicitProfiles, new THashSet(), locator); File basedir = getBaseDir(file); - Model model = expandProperties(readResult.first.model, basedir); - alignModel(model, basedir); + MavenModel model = MavenFacadeManager.getInstance().interpolateAndAlignModel(readResult.first.model, basedir); - Collection activeProfiles = readResult.second; - - MavenProject mavenProject = new MavenProject(model); - mavenProject.setFile(new File(file.getPath())); - mavenProject.setActiveProfiles(new ArrayList(activeProfiles)); - JBMavenProjectHelper.setSourceRoots(mavenProject, - Collections.singletonList(model.getBuild().getSourceDirectory()), - Collections.singletonList(model.getBuild().getTestSourceDirectory()), - Collections.singletonList(model.getBuild().getScriptSourceDirectory())); - - return new MavenProjectReaderResult(generalSettings, - mavenProject, - Collections.emptyList(), + return new MavenProjectReaderResult(model, + Collections.emptyMap(), + readResult.second, + null, readResult.first.problems, - Collections.emptySet(), - generalSettings.getEffectiveLocalRepository()); + new THashSet()); } private File getBaseDir(VirtualFile file) { return new File(file.getParent().getPath()); } - private Pair> doReadProjectModel(MavenGeneralSettings generalSettings, - VirtualFile file, - Collection explicitProfiles, - Set recursionGuard, - MavenProjectReaderProjectLocator locator) { + private Pair> doReadProjectModel(MavenGeneralSettings generalSettings, + VirtualFile file, + Collection explicitProfiles, + Set recursionGuard, + MavenProjectReaderProjectLocator locator) { RawModelReadResult cachedModel = myRawModelsCache.get(file); if (cachedModel == null) { cachedModel = doReadProjectModel(file, false); @@ -103,24 +84,25 @@ public class MavenProjectReader { } // todo modifying cached model and problems here?????? - Model model = cachedModel.model; - Collection alwaysOnProfiles = cachedModel.alwaysOnProfiles; + MavenModel model = cachedModel.model; + Set alwaysOnProfiles = cachedModel.alwaysOnProfiles; Collection problems = cachedModel.problems; - repairModelHeader(model); - resolveInheritance(generalSettings, model, file, explicitProfiles, recursionGuard, locator, problems); + model = resolveInheritance(generalSettings, model, file, explicitProfiles, recursionGuard, locator, problems); addSettingsProfiles(generalSettings, model, alwaysOnProfiles, problems); - Collection activatedProfiles = applyProfiles(model, getBaseDir(file), explicitProfiles, alwaysOnProfiles); + ProfileApplicationResult applied = applyProfiles(model, getBaseDir(file), explicitProfiles, alwaysOnProfiles); + model = applied.getModel(); repairModelBody(model); - return Pair.create(cachedModel, activatedProfiles); + return new Pair>(new RawModelReadResult(model, problems, alwaysOnProfiles), + applied.getActivatedProfiles()); } private RawModelReadResult doReadProjectModel(VirtualFile file, boolean headerOnly) { - Model result = new Model(); - LinkedHashSet problems = createProblemsList(); + MavenModel result = new MavenModel(); + Collection problems = MavenProjectProblem.createProblemsList(); Set alwaysOnProfiles = new THashSet(); Element xmlProject = readXml(file, problems, MavenProjectProblem.ProblemType.SYNTAX); @@ -128,43 +110,35 @@ public class MavenProjectReader { return new RawModelReadResult(result, problems, alwaysOnProfiles); } - result.setModelVersion(MavenJDOMUtil.findChildValueByPath(xmlProject, "modelVersion")); - result.setGroupId(MavenJDOMUtil.findChildValueByPath(xmlProject, "groupId")); - result.setArtifactId(MavenJDOMUtil.findChildValueByPath(xmlProject, "artifactId")); - result.setVersion(MavenJDOMUtil.findChildValueByPath(xmlProject, "version")); + MavenParent parent = new MavenParent(new MavenId(UNKNOWN, UNKNOWN, UNKNOWN), "../pom.xml"); + if (MavenJDOMUtil.hasChildByPath(xmlProject, "parent")) { + parent = new MavenParent(new MavenId(MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.groupId", UNKNOWN), + MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.artifactId", UNKNOWN), + MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.version", UNKNOWN)), + MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.relativePath", "../pom.xml")); + result.setParent(parent); + } + + result.setMavenId(new MavenId(MavenJDOMUtil.findChildValueByPath(xmlProject, "groupId", parent.getMavenId().getGroupId()), + MavenJDOMUtil.findChildValueByPath(xmlProject, "artifactId", UNKNOWN), + MavenJDOMUtil.findChildValueByPath(xmlProject, "version", parent.getMavenId().getVersion()))); if (headerOnly) return new RawModelReadResult(result, problems, alwaysOnProfiles); - result.setPackaging(MavenJDOMUtil.findChildValueByPath(xmlProject, "packaging")); + result.setPackaging(MavenJDOMUtil.findChildValueByPath(xmlProject, "packaging", "jar")); result.setName(MavenJDOMUtil.findChildValueByPath(xmlProject, "name")); - if (MavenJDOMUtil.hasChildByPath(xmlProject, "parent")) { - Parent parent = new Parent(); - - String groupId = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.groupId"); - String artifactId = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.artifactId"); - String version = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.version"); - - parent.setGroupId(groupId); - parent.setArtifactId(artifactId); - parent.setVersion(version); - parent.setRelativePath(MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.relativePath")); - - result.setParent(parent); - } - result.setBuild(new Build()); - readModelAndBuild(result, result.getBuild(), xmlProject); + readModelBody(result, result.getBuild(), xmlProject); result.setProfiles(collectProfiles(file, xmlProject, problems, alwaysOnProfiles)); return new RawModelReadResult(result, problems, alwaysOnProfiles); } - private void readModelAndBuild(ModelBase mavenModelBase, BuildBase mavenBuildBase, Element xmlModel) { + private void readModelBody(MavenModelBase mavenModelBase, MavenBuildBase mavenBuildBase, Element xmlModel) { mavenModelBase.setModules(MavenJDOMUtil.findChildrenValuesByPath(xmlModel, "modules", "module")); collectProperties(MavenJDOMUtil.findChildByPath(xmlModel, "properties"), mavenModelBase); Element xmlBuild = MavenJDOMUtil.findChildByPath(xmlModel, "build"); - if (xmlBuild == null) return; mavenBuildBase.setFinalName(MavenJDOMUtil.findChildValueByPath(xmlBuild, "finalName")); mavenBuildBase.setDefaultGoal(MavenJDOMUtil.findChildValueByPath(xmlBuild, "defaultGoal")); @@ -172,36 +146,74 @@ public class MavenProjectReader { mavenBuildBase.setResources(collectResources(MavenJDOMUtil.findChildrenByPath(xmlBuild, "resources", "resource"))); mavenBuildBase.setTestResources(collectResources(MavenJDOMUtil.findChildrenByPath(xmlBuild, "testResources", "testResource"))); - if (mavenBuildBase instanceof Build) { - Build mavenBuild = (Build)mavenBuildBase; + if (mavenBuildBase instanceof MavenBuild) { + MavenBuild mavenBuild = (MavenBuild)mavenBuildBase; + + String source = MavenJDOMUtil.findChildValueByPath(xmlBuild, "sourceDirectory"); + if (!isEmptyOrSpaces(source)) mavenBuild.addSource(source); + String testSource = MavenJDOMUtil.findChildValueByPath(xmlBuild, "testSourceDirectory"); + if (!isEmptyOrSpaces(testSource)) mavenBuild.addTestSource(testSource); - mavenBuild.setSourceDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "sourceDirectory")); - mavenBuild.setTestSourceDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "testSourceDirectory")); - mavenBuild.setScriptSourceDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "scriptSourceDirectory")); mavenBuild.setOutputDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "outputDirectory")); mavenBuild.setTestOutputDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "testOutputDirectory")); } } - private List collectResources(List xmlResources) { - List result = new ArrayList(); + private List collectResources(List xmlResources) { + List result = new ArrayList(); for (Element each : xmlResources) { - Resource r = new Resource(); - r.setDirectory(MavenJDOMUtil.findChildValueByPath(each, "directory")); - r.setFiltering("true".equals(MavenJDOMUtil.findChildValueByPath(each, "filtering"))); - r.setTargetPath(MavenJDOMUtil.findChildValueByPath(each, "targetPath")); - r.setIncludes(MavenJDOMUtil.findChildrenValuesByPath(each, "includes", "include")); - r.setExcludes(MavenJDOMUtil.findChildrenValuesByPath(each, "excludes", "exclude")); - result.add(r); + result.add(new MavenResource(MavenJDOMUtil.findChildValueByPath(each, "directory"), + "true".equals(MavenJDOMUtil.findChildValueByPath(each, "filtering")), + MavenJDOMUtil.findChildValueByPath(each, "targetPath"), + MavenJDOMUtil.findChildrenValuesByPath(each, "includes", "include"), + MavenJDOMUtil.findChildrenValuesByPath(each, "excludes", "exclude"))); } return result; } - private List collectProfiles(VirtualFile projectFile, - Element xmlProject, - Collection problems, - Collection alwaysOnProfiles) { - List result = new ArrayList(); + private void repairModelBody(MavenModel model) { + MavenBuild build = model.getBuild(); + + if (isEmptyOrSpaces(build.getFinalName())) { + build.setFinalName("${project.artifactId}-${project.version}"); + } + + if (build.getSources().isEmpty()) build.addSource("src/main/java"); + if (build.getTestSources().isEmpty()) build.addTestSource("src/test/java"); + + build.setResources(repairResources(build.getResources(), "src/main/resources")); + build.setTestResources(repairResources(build.getTestResources(), "src/test/resources")); + + build.setDirectory(isEmptyOrSpaces(build.getDirectory()) ? "target" : build.getDirectory()); + build.setOutputDirectory(isEmptyOrSpaces(build.getOutputDirectory()) + ? "${project.build.directory}/classes" : build.getOutputDirectory()); + build.setTestOutputDirectory(isEmptyOrSpaces(build.getTestOutputDirectory()) + ? "${project.build.directory}/test-classes" : build.getTestOutputDirectory()); + } + + private List repairResources(List resources, String defaultDir) { + List result = new ArrayList(); + if (resources.isEmpty()) { + result.add(createResource(defaultDir)); + return result; + } + + for (MavenResource each : resources) { + if (isEmptyOrSpaces(each.getDirectory())) continue; + result.add(each); + } + return result; + } + + private MavenResource createResource(String directory) { + return new MavenResource(directory, false, null, Collections.emptyList(), Collections.emptyList()); + } + + private List collectProfiles(VirtualFile projectFile, + Element xmlProject, + Collection problems, + Collection alwaysOnProfiles) { + List result = new ArrayList(); collectProfiles(MavenJDOMUtil.findChildrenByPath(xmlProject, "profiles", "profile"), result, PROFILE_FROM_POM); VirtualFile profilesFile = MavenUtil.findProfilesXmlFile(projectFile); @@ -219,13 +231,13 @@ public class MavenProjectReader { } private void addSettingsProfiles(MavenGeneralSettings generalSettings, - Model model, + MavenModel model, Collection alwaysOnProfiles, Collection problems) { if (mySettingsProfilesWithProblemsCache == null) { - List settingsProfiles = new ArrayList(); - Collection settingsProblems = createProblemsList(); + List settingsProfiles = new ArrayList(); + Collection settingsProblems = MavenProjectProblem.createProblemsList(); for (VirtualFile each : generalSettings.getEffectiveSettingsFiles()) { collectProfilesFromSettingsXmlOrProfilesXml(each, @@ -239,8 +251,8 @@ public class MavenProjectReader { mySettingsProfilesWithProblemsCache = Pair.create(settingsProfiles, settingsProblems); } - List modelProfiles = model.getProfiles(); - for (Profile each : mySettingsProfilesWithProblemsCache.first) { + List modelProfiles = model.getProfiles(); + for (MavenProfile each : mySettingsProfilesWithProblemsCache.first) { addProfileIfDoesNotExist(each, modelProfiles); } problems.addAll(mySettingsProfilesWithProblemsCache.second); @@ -250,7 +262,7 @@ public class MavenProjectReader { String rootElementName, boolean wrapRootIfNecessary, String profilesSource, - List result, + List result, Collection alwaysOnProfiles, Collection problems) { Element rootElement = readXml(profilesFile, problems, MavenProjectProblem.ProblemType.SETTINGS_OR_PROFILES); @@ -268,66 +280,60 @@ public class MavenProjectReader { alwaysOnProfiles.addAll(MavenJDOMUtil.findChildrenValuesByPath(rootElement, "activeProfiles", "activeProfile")); } - private void collectProfiles(List xmlProfiles, List result, String source) { + private void collectProfiles(List xmlProfiles, List result, String source) { for (Element each : xmlProfiles) { String id = MavenJDOMUtil.findChildValueByPath(each, "id"); if (isEmptyOrSpaces(id)) continue; - Profile profile = new Profile(); - profile.setId(id); - profile.setSource(source); + MavenProfile profile = new MavenProfile(id, source); if (!addProfileIfDoesNotExist(profile, result)) continue; Element xmlActivation = MavenJDOMUtil.findChildByPath(each, "activation"); if (xmlActivation != null) { - Activation activation = new Activation(); + MavenProfileActivation activation = new MavenProfileActivation(); activation.setActiveByDefault("true".equals(MavenJDOMUtil.findChildValueByPath(xmlActivation, "activeByDefault"))); Element xmlOS = MavenJDOMUtil.findChildByPath(xmlActivation, "os"); if (xmlOS != null) { - ActivationOS activationOS = new ActivationOS(); - activationOS.setName(MavenJDOMUtil.findChildValueByPath(xmlOS, "name")); - activationOS.setFamily(MavenJDOMUtil.findChildValueByPath(xmlOS, "family")); - activationOS.setArch(MavenJDOMUtil.findChildValueByPath(xmlOS, "arch")); - activationOS.setVersion(MavenJDOMUtil.findChildValueByPath(xmlOS, "version")); - activation.setOs(activationOS); + activation.setOs(new MavenProfileActivationOS( + MavenJDOMUtil.findChildValueByPath(xmlOS, "name"), + MavenJDOMUtil.findChildValueByPath(xmlOS, "family"), + MavenJDOMUtil.findChildValueByPath(xmlOS, "arch"), + MavenJDOMUtil.findChildValueByPath(xmlOS, "version"))); } activation.setJdk(MavenJDOMUtil.findChildValueByPath(xmlActivation, "jdk")); Element xmlProperty = MavenJDOMUtil.findChildByPath(xmlActivation, "property"); if (xmlProperty != null) { - ActivationProperty activationProperty = new ActivationProperty(); - activationProperty.setName(MavenJDOMUtil.findChildValueByPath(xmlProperty, "name")); - activationProperty.setValue(MavenJDOMUtil.findChildValueByPath(xmlProperty, "value")); - activation.setProperty(activationProperty); + activation.setProperty(new MavenProfileActivationProperty( + MavenJDOMUtil.findChildValueByPath(xmlProperty, "name"), + MavenJDOMUtil.findChildValueByPath(xmlProperty, "value"))); } Element xmlFile = MavenJDOMUtil.findChildByPath(xmlActivation, "file"); if (xmlFile != null) { - ActivationFile activationFile = new ActivationFile(); - activationFile.setExists(MavenJDOMUtil.findChildValueByPath(xmlFile, "exists")); - activationFile.setMissing(MavenJDOMUtil.findChildValueByPath(xmlFile, "missing")); - activation.setFile(activationFile); + activation.setFile(new MavenProfileActivationFile( + MavenJDOMUtil.findChildValueByPath(xmlFile, "exists"), + MavenJDOMUtil.findChildValueByPath(xmlFile, "missing"))); } profile.setActivation(activation); } - profile.setBuild(new BuildBase()); - readModelAndBuild(profile, profile.getBuild(), each); + readModelBody(profile, profile.getBuild(), each); } } - private boolean addProfileIfDoesNotExist(Profile profile, List result) { - for (Profile each : result) { + private boolean addProfileIfDoesNotExist(MavenProfile profile, List result) { + for (MavenProfile each : result) { if (Comparing.equal(each.getId(), profile.getId())) return false; } result.add(profile); return true; } - private void collectProperties(Element xmlProperties, ModelBase mavenModelBase) { + private void collectProperties(Element xmlProperties, MavenModelBase mavenModelBase) { if (xmlProperties == null) return; Properties props = mavenModelBase.getProperties(); @@ -341,181 +347,37 @@ public class MavenProjectReader { } } - private List applyProfiles(Model model, File basedir, Collection explicitProfiles, Collection alwaysOnProfiles) { - List activatedPom = new ArrayList(); - List activatedExternal = new ArrayList(); - List activeByDefault = new ArrayList(); - - List rawProfiles = model.getProfiles(); - List expandedProfilesCache = null; - - for (int i = 0; i < rawProfiles.size(); i++) { - Profile eachRawProfile = rawProfiles.get(i); - - boolean shouldAdd = explicitProfiles.contains(eachRawProfile.getId()) || alwaysOnProfiles.contains(eachRawProfile.getId()); - - Activation activation = eachRawProfile.getActivation(); - if (activation != null) { - if (activation.isActiveByDefault()) { - activeByDefault.add(eachRawProfile); - } - - // expand only if necessary - if (expandedProfilesCache == null) expandedProfilesCache = expandProperties(model, basedir).getProfiles(); - Profile eachExpandedProfile = expandedProfilesCache.get(i); - - for (ProfileActivator eachActivator : getProfileActivators()) { - try { - if (eachActivator.canDetermineActivation(eachExpandedProfile) && eachActivator.isActive(eachExpandedProfile)) { - shouldAdd = true; - break; - } - } - catch (ProfileActivationException e) { - MavenLog.LOG.warn(e); - } - } - } - - if (shouldAdd) { - if (PROFILE_FROM_POM.equals(eachRawProfile.getSource())) { - activatedPom.add(eachRawProfile); - } - else { - activatedExternal.add(eachRawProfile); - } - } - } - - List activatedProfiles = new ArrayList(activatedPom.isEmpty() ? activeByDefault : activatedPom); - activatedProfiles.addAll(activatedExternal); - - for (Profile each : activatedProfiles) { - new DefaultProfileInjector().inject(each, model); - } - - return activatedProfiles; + private ProfileApplicationResult applyProfiles(MavenModel model, + File basedir, + Collection explicitProfiles, + Collection alwaysOnProfiles) { + return MavenFacadeManager.getInstance().applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); } - private ProfileActivator[] getProfileActivators() { - SystemPropertyProfileActivator sysPropertyActivator = new SystemPropertyProfileActivator(); - DefaultContext context = new DefaultContext(); - context.put("SystemProperties", MavenEmbedderWrapper.collectSystemProperties()); - try { - sysPropertyActivator.contextualize(context); - } - catch (ContextException e) { - MavenLog.LOG.error(e); - return new ProfileActivator[0]; - } - - return new ProfileActivator[]{new FileProfileActivator(), sysPropertyActivator, new JdkPrefixProfileActivator(), - new OperatingSystemProfileActivator()}; - } - - private void repairModelHeader(Model model) { - if (isEmptyOrSpaces(model.getModelVersion())) model.setModelVersion("4.0.0"); - - Parent parent = model.getParent(); - if (parent != null) { - if (isEmptyOrSpaces(parent.getGroupId())) parent.setGroupId(UNKNOWN); - if (isEmptyOrSpaces(parent.getArtifactId())) parent.setArtifactId(UNKNOWN); - if (isEmptyOrSpaces(parent.getVersion())) parent.setVersion(UNKNOWN); - if (isEmptyOrSpaces(parent.getRelativePath())) parent.setRelativePath("../pom.xml"); - } - - if (isEmptyOrSpaces(model.getGroupId())) { - if (parent != null) { - model.setGroupId(parent.getGroupId()); - } - else { - model.setGroupId(UNKNOWN); - } - } - if (isEmptyOrSpaces(model.getArtifactId())) model.setArtifactId(UNKNOWN); - if (isEmptyOrSpaces(model.getVersion())) { - if (parent != null) { - model.setVersion(parent.getVersion()); - } - else { - model.setVersion(UNKNOWN); - } - } - - if (isEmptyOrSpaces(model.getPackaging())) model.setPackaging("jar"); - } - - private void repairModelBody(Model model) { - if (model.getBuild() == null) { - model.setBuild(new Build()); - } - Build build = model.getBuild(); - - if (isEmptyOrSpaces(build.getFinalName())) { - build.setFinalName("${project.artifactId}-${project.version}"); - } - - build.setSourceDirectory(isEmptyOrSpaces(build.getSourceDirectory()) ? "src/main/java" : build.getSourceDirectory()); - build.setTestSourceDirectory(isEmptyOrSpaces(build.getTestSourceDirectory()) ? "src/test/java" : build.getTestSourceDirectory()); - build - .setScriptSourceDirectory(isEmptyOrSpaces(build.getScriptSourceDirectory()) ? "src/main/scripts" : build.getScriptSourceDirectory()); - - build.setResources(repairResources(build.getResources(), "src/main/resources")); - build.setTestResources(repairResources(build.getTestResources(), "src/test/resources")); - - build.setDirectory(isEmptyOrSpaces(build.getDirectory()) ? "target" : build.getDirectory()); - build - .setOutputDirectory(isEmptyOrSpaces(build.getOutputDirectory()) ? "${project.build.directory}/classes" : build.getOutputDirectory()); - build.setTestOutputDirectory( - isEmptyOrSpaces(build.getTestOutputDirectory()) ? "${project.build.directory}/test-classes" : build.getTestOutputDirectory()); - } - - private List repairResources(List resources, String defaultDir) { - List result = new ArrayList(); - if (resources.isEmpty()) { - result.add(createResource(defaultDir)); - return result; - } - - for (Resource each : resources) { - if (isEmptyOrSpaces(each.getDirectory())) continue; - each.setDirectory(each.getDirectory()); - result.add(each); - } - return result; - } - - private Resource createResource(String directory) { - Resource result = new Resource(); - result.setDirectory(directory); - return result; - } - - private void resolveInheritance(final MavenGeneralSettings generalSettings, - final Model model, - final VirtualFile file, - final Collection explicitProfiles, - final Set recursionGuard, - final MavenProjectReaderProjectLocator locator, - Collection problems) { + private MavenModel resolveInheritance(final MavenGeneralSettings generalSettings, + MavenModel model, + final VirtualFile file, + final Collection explicitProfiles, + final Set recursionGuard, + final MavenProjectReaderProjectLocator locator, + Collection problems) { if (recursionGuard.contains(file)) { - problems.add(createProblem(file, ProjectBundle.message("maven.project.problem.recursiveInheritance"), - MavenProjectProblem.ProblemType.PARENT)); - return; + problems.add(MavenProjectProblem.createProblem(file.getPath(), ProjectBundle.message("maven.project.problem.recursiveInheritance"), + MavenProjectProblem.ProblemType.PARENT)); + return model; } recursionGuard.add(file); try { - Parent parent = model.getParent(); final MavenParentDesc[] parentDesc = new MavenParentDesc[1]; + MavenParent parent = model.getParent(); if (parent != null) { - MavenId parentId = new MavenId(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); - if (parentId.equals(model.getGroupId(), model.getArtifactId(), model.getVersion())) { - problems.add(createProblem(file, ProjectBundle.message("maven.project.problem.selfInheritance"), - MavenProjectProblem.ProblemType.PARENT)); - return; + if (model.getMavenId().equals(parent.getMavenId())) { + problems.add(MavenProjectProblem.createProblem(file.getPath(), ProjectBundle.message("maven.project.problem.selfInheritance"), + MavenProjectProblem.ProblemType.PARENT)); + return model; } - parentDesc[0] = new MavenParentDesc(parentId, parent.getRelativePath()); + parentDesc[0] = new MavenParentDesc(parent.getMavenId(), parent.getRelativePath()); } Pair parentModelWithProblems = @@ -528,9 +390,9 @@ public class MavenProjectReader { @Override @Nullable protected Pair processRelativeParent(VirtualFile parentFile) { - Model parentModel = doReadProjectModel(parentFile, true).model; + MavenModel parentModel = doReadProjectModel(parentFile, true).model; MavenId parentId = parentDesc[0].getParentId(); - if (!parentId.equals(new MavenId(parentModel))) return null; + if (!parentId.equals(parentModel.getMavenId())) return null; return super.processRelativeParent(parentFile); } @@ -547,165 +409,89 @@ public class MavenProjectReader { } }.process(generalSettings, file, parentDesc[0]); - if (parentModelWithProblems == null) return; // no parent or parent not found; + if (parentModelWithProblems == null) return model; // no parent or parent not found; - Model parentModel = parentModelWithProblems.second.model; + MavenModel parentModel = parentModelWithProblems.second.model; if (!parentModelWithProblems.second.problems.isEmpty()) { - problems.add(createProblem(parentModelWithProblems.first, - ProjectBundle.message("maven.project.problem.parentHasProblems", new MavenId(parentModel)), - MavenProjectProblem.ProblemType.PARENT)); + problems.add(MavenProjectProblem.createProblem(parentModelWithProblems.first.getPath(), + ProjectBundle.message("maven.project.problem.parentHasProblems", + parentModel.getMavenId()), + MavenProjectProblem.ProblemType.PARENT)); } - new DefaultModelInheritanceAssembler().assembleModelInheritance(model, parentModel); - - List profiles = model.getProfiles(); - for (Profile each : parentModel.getProfiles()) { + model = MavenFacadeManager.getInstance().assembleInheritance(model, parentModel); + List profiles = model.getProfiles(); + for (MavenProfile each : parentModel.getProfiles()) { addProfileIfDoesNotExist(each, profiles); } + return model; } finally { recursionGuard.remove(file); } } - private Model expandProperties(Model model, File basedir) { - return MavenEmbedderWrapper.interpolate(model, basedir); - } - - private void alignModel(Model model, File basedir) { - MavenEmbedderWrapper.alignModel(model, basedir); - } - - private MavenProjectProblem createStructureProblem(VirtualFile file, String description) { - return createProblem(file, description, MavenProjectProblem.ProblemType.STRUCTURE); - } - - private MavenProjectProblem createSyntaxProblem(VirtualFile file, MavenProjectProblem.ProblemType type) { - return createProblem(file, ProjectBundle.message("maven.project.problem.syntaxError", file.getName()), type); - } - - private MavenProjectProblem createProblem(VirtualFile file, String description, MavenProjectProblem.ProblemType type) { - return new MavenProjectProblem(file, description, type); - } - - private LinkedHashSet createProblemsList() { - return createProblemsList(Collections.emptySet()); - } - - private LinkedHashSet createProblemsList(Collection copyThis) { - return new LinkedHashSet(copyThis); - } - public MavenProjectReaderResult resolveProject(MavenGeneralSettings generalSettings, MavenEmbedderWrapper embedder, VirtualFile file, Collection explicitProfiles, MavenProjectReaderProjectLocator locator) throws MavenProcessCanceledException { - MavenProject mavenProject = null; - Collection problems = createProblemsList(); - Set unresolvedArtifactsIds = new THashSet(); - Collection dependencyTree = Collections.emptyList(); - try { - MavenWrapperResolutionResult result = doResolveProject(embedder, file, explicitProfiles, problems); - mavenProject = result.getMavenProject(); - unresolvedArtifactsIds = result.getUnresolvedArtifactIds(); - dependencyTree = result.getOriginalDependencyTree(); + MavenWrapperExecutionResult result = embedder.resolveProject(file, explicitProfiles); + if (result.projectData == null) { + MavenProjectReaderResult temp = readProject(generalSettings, file, explicitProfiles, locator); + temp.readingProblems.addAll(result.problems); + temp.unresolvedArtifactIds.addAll(result.unresolvedArtifacts); + return temp; + } + + return new MavenProjectReaderResult(result.projectData.mavenModel, + result.projectData.mavenModelMap, + result.projectData.activatedProfiles, + result.projectData.nativeMavenProject, + result.problems, + result.unresolvedArtifacts); } catch (MavenProcessCanceledException e) { throw e; } catch (Throwable e) { - String message = e.getMessage(); - - if (e instanceof RuntimeException && e.getCause() != null) { - message = e.getCause().getMessage(); - } - - if (message != null) { - problems.add(createStructureProblem(file, message)); - } MavenLog.LOG.info(e); MavenLog.printInTests(e); // print exception since we need to know if something wrong with our logic - } - if (mavenProject == null) { - if (problems.isEmpty()) { - problems.add(createSyntaxProblem(file, MavenProjectProblem.ProblemType.SYNTAX)); - } - mavenProject = readProject(generalSettings, file, explicitProfiles, locator).nativeMavenProject; - } - - return new MavenProjectReaderResult(generalSettings, mavenProject, dependencyTree, problems, unresolvedArtifactsIds, embedder.getLocalRepositoryFile()); - } - - private MavenWrapperResolutionResult doResolveProject(MavenEmbedderWrapper embedder, - VirtualFile file, - Collection profiles, - Collection problems) throws MavenProcessCanceledException { - MavenWrapperResolutionResult result = embedder.resolveProject(file, profiles); - validate(file, result, problems); - return result; - } - - private boolean validate(VirtualFile file, MavenWrapperExecutionResult r, Collection problems) { - for (Exception each : r.getExceptions()) { - MavenLog.LOG.info(each); - - if (each instanceof InvalidProjectModelException) { - ModelValidationResult modelValidationResult = ((InvalidProjectModelException)each).getValidationResult(); - if (modelValidationResult != null) { - for (Object eachValidationProblem : modelValidationResult.getMessages()) { - problems.add(createStructureProblem(file, (String)eachValidationProblem)); - } - } - else { - problems.add(createStructureProblem(file, each.getCause().getMessage())); - } - } - else if (each instanceof ProjectBuildingException) { - String causeMessage = each.getCause() != null ? each.getCause().getMessage() : each.getMessage(); - problems.add(createStructureProblem(file, causeMessage)); + MavenProjectReaderResult result = readProject(generalSettings, file, explicitProfiles, locator); + String message = e.getMessage(); + if (message != null) { + result.readingProblems.add(MavenProjectProblem.createStructureProblem(file.getPath(), message)); } else { - problems.add(createStructureProblem(file, each.getMessage())); + result.readingProblems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), MavenProjectProblem.ProblemType.SYNTAX)); } + return result; } - - return problems.isEmpty(); } public MavenProjectReaderResult generateSources(MavenEmbedderWrapper embedder, - MavenGeneralSettings generalSettings, MavenImportingSettings importingSettings, VirtualFile file, Collection profiles, MavenConsole console) throws MavenProcessCanceledException { try { - MavenWrapperExecutionResult result = embedder.execute(file, profiles, Arrays.asList(importingSettings.getUpdateFoldersOnImportPhase())); + List goals = Arrays.asList(importingSettings.getUpdateFoldersOnImportPhase()); + Collection problems = MavenProjectProblem.createProblemsList(); + Set unresolvedArtifacts = new THashSet(); + MavenWrapperExecutionResult result = embedder.execute(file, profiles, goals); + if (result.projectData == null) return null; - if (result.hasExceptions()) { - MavenConsoleHelper.printExecutionExceptions(console, result); - } - - Collection problems = createProblemsList(); - if (!validate(file, result, problems)) return null; - - MavenProject project = result.getMavenProject(); - if (project == null) return null; - - return new MavenProjectReaderResult(generalSettings, - project, - Collections.emptyList(), - problems, - result.getUnresolvedArtifactIds(), - embedder.getLocalRepositoryFile()); - } - catch (MavenProcessCanceledException e) { - throw e; + return new MavenProjectReaderResult(result.projectData.mavenModel, + result.projectData.mavenModelMap, + result.projectData.activatedProfiles, + result.projectData.nativeMavenProject, + result.problems, + result.unresolvedArtifacts); } catch (Throwable e) { - MavenConsoleHelper.printException(console, e); + console.printException(e); MavenLog.LOG.warn(e); return null; } @@ -717,21 +503,21 @@ public class MavenProjectReader { return MavenJDOMUtil.read(file, new MavenJDOMUtil.ErrorHandler() { public void onReadError(IOException e) { MavenLog.LOG.warn("Cannot read the pom file: " + e); - problems.add(createProblem(file, e.getMessage(), type)); + problems.add(MavenProjectProblem.createProblem(file.getPath(), e.getMessage(), type)); } public void onSyntaxError() { - problems.add(createSyntaxProblem(file, type)); + problems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), type)); } }); } private static class RawModelReadResult { - public Model model; + public MavenModel model; public Collection problems; public Set alwaysOnProfiles; - private RawModelReadResult(Model model, Collection problems, Set alwaysOnProfiles) { + private RawModelReadResult(MavenModel model, Collection problems, Set alwaysOnProfiles) { this.model = model; this.problems = problems; this.alwaysOnProfiles = alwaysOnProfiles; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderProjectLocator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderProjectLocator.java index 08927dfbcbeb..3d88e3445d8d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderProjectLocator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderProjectLocator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -16,7 +16,7 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; public interface MavenProjectReaderProjectLocator { VirtualFile findProjectFile(MavenId coordinates); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderResult.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderResult.java index aae7c5bc70be..c9af6eaf11b8 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderResult.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReaderResult.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2010 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. @@ -15,32 +15,33 @@ */ package org.jetbrains.idea.maven.project; -import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.dependency.tree.DependencyNode; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; +import org.jetbrains.idea.maven.model.*; -import java.io.File; import java.util.Collection; +import java.util.Map; import java.util.Set; public class MavenProjectReaderResult { - final public MavenGeneralSettings settings; - final public MavenProject nativeMavenProject; - final public Collection dependencyTree; - final public Collection readingProblems; - final public Set unresolvedArtifactIds; - final public File localRepository; + public final MavenModel mavenModel; + public final Map nativeModelMap; + public final Collection activatedProfiles; + @Nullable public final NativeMavenProjectHolder nativeMavenProject; + public final Collection readingProblems; + public final Set unresolvedArtifactIds; - public MavenProjectReaderResult(MavenGeneralSettings settings, - MavenProject nativeMavenProject, - Collection dependencyTree, + public MavenProjectReaderResult(MavenModel mavenModel, + Map nativeModelMap, + Collection activatedProfiles, + @Nullable NativeMavenProjectHolder nativeMavenProject, Collection readingProblems, - Set unresolvedArtifactIds, - File localRepository) { - this.settings = settings; + Set unresolvedArtifactIds) { + this.mavenModel = mavenModel; + this.nativeModelMap = nativeModelMap; + this.activatedProfiles = activatedProfiles; this.nativeMavenProject = nativeMavenProject; - this.dependencyTree = dependencyTree; this.readingProblems = readingProblems; this.unresolvedArtifactIds = unresolvedArtifactIds; - this.localRepository = localRepository; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 592b40514ed6..043196f086ee 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -49,10 +49,12 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.execution.SoutMavenConsole; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenFoldersImporter; import org.jetbrains.idea.maven.importing.MavenModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenProjectImporter; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.*; import java.io.File; @@ -237,7 +239,7 @@ public class MavenProjectsManager extends SimpleProjectComponent } private void initWorkers() { - myEmbeddersManager = new MavenEmbeddersManager(getGeneralSettings()); + myEmbeddersManager = new MavenEmbeddersManager(myProject); myReadingProcessor = new MavenProjectsProcessor(myProject, ProjectBundle.message("maven.reading"), false, myEmbeddersManager); myResolvingProcessor = new MavenProjectsProcessor(myProject, ProjectBundle.message("maven.resolving"), true, myEmbeddersManager); @@ -330,9 +332,9 @@ public class MavenProjectsManager extends SimpleProjectComponent @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + @Nullable NativeMavenProjectHolder nativeMavenProject, Object message) { - if (shouldScheduleProject(projectWithChanges)) { + if (nativeMavenProject != null && shouldScheduleProject(projectWithChanges)) { if (projectWithChanges.first.hasUnresolvedPlugins()) { schedulePluginsResolving(projectWithChanges.first, nativeMavenProject); } @@ -392,16 +394,13 @@ public class MavenProjectsManager extends SimpleProjectComponent myArtifactsDownloadingProcessor.stop(); myPostProcessor.stop(); - myEmbeddersManager.release(); - if (isUnitTestMode()) { FileUtil.delete(getProjectsTreesDir()); } } } - @TestOnly - public MavenEmbeddersManager getEmbeddersManagerInTests() { + public MavenEmbeddersManager getEmbeddersManager() { return myEmbeddersManager; } @@ -478,7 +477,7 @@ public class MavenProjectsManager extends SimpleProjectComponent return myProjectsTree.getAvailableProfiles(); } - public Collection> getProfilesWithStates() { + public Collection> getProfilesWithStates() { if (!isInitialized()) return Collections.emptyList(); return myProjectsTree.getProfilesWithStates(); } @@ -679,7 +678,7 @@ public class MavenProjectsManager extends SimpleProjectComponent MavenProject each = it.next(); Object message = it.hasNext() ? null : FORCE_IMPORT_MESSAGE; myFoldersResolvingProcessor.scheduleTask( - new MavenProjectsProcessorFoldersResolvingTask(each, getGeneralSettings(), getImportingSettings(), myProjectsTree, message)); + new MavenProjectsProcessorFoldersResolvingTask(each, getImportingSettings(), myProjectsTree, message)); } } }); @@ -689,7 +688,7 @@ public class MavenProjectsManager extends SimpleProjectComponent scheduleFoldersResolving(getProjects()); } - private void schedulePluginsResolving(final MavenProject project, final org.apache.maven.project.MavenProject nativeMavenProject) { + private void schedulePluginsResolving(final MavenProject project, final NativeMavenProjectHolder nativeMavenProject) { runWhenFullyOpen(new Runnable() { public void run() { myPluginsResolvingProcessor diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java index e7124afe2cb8..9ef1ca9b7de6 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManagerWatcher.java @@ -36,7 +36,6 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.events.*; -import com.intellij.openapi.vfs.newvfs.impl.NullVirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; @@ -47,7 +46,7 @@ import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.update.Update; import gnu.trove.THashSet; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.utils.MavenMergingUpdateQueue; import org.jetbrains.idea.maven.utils.MavenUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessor.java index 2b0e4e505010..7d807fa7c2eb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessor.java @@ -19,7 +19,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.util.concurrency.Semaphore; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.execution.SoutMavenConsole; import org.jetbrains.idea.maven.utils.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java index 53460c30b4a1..d03b3763de5b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorArtifactsDownloadingTask.java @@ -20,7 +20,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ex.ProjectRootManagerEx; import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.EmptyRunnable; -import org.jetbrains.idea.maven.embedder.MavenConsole; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; import org.jetbrains.idea.maven.utils.MavenUtil; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorEmptyTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorEmptyTask.java index b3217db42598..5361ad0e6234 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorEmptyTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorEmptyTask.java @@ -15,7 +15,6 @@ */ package org.jetbrains.idea.maven.project; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import com.intellij.openapi.project.Project; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorFoldersResolvingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorFoldersResolvingTask.java index 6700f041d23e..784709d26815 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorFoldersResolvingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorFoldersResolvingTask.java @@ -16,28 +16,24 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.project.Project; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; public class MavenProjectsProcessorFoldersResolvingTask extends MavenProjectsProcessorBasicTask { - private final MavenGeneralSettings myGeneralSettings; private final MavenImportingSettings myImportingSettings; private final Object myMessage; public MavenProjectsProcessorFoldersResolvingTask(MavenProject project, - MavenGeneralSettings generalSettings, MavenImportingSettings importingSettings, MavenProjectsTree tree, Object message) { super(project, tree); - myGeneralSettings = generalSettings; myImportingSettings = importingSettings; myMessage = message; } public void perform(Project project, MavenEmbeddersManager embeddersManager, MavenConsole console, MavenProgressIndicator indicator) throws MavenProcessCanceledException { - myTree.resolveFolders(myMavenProject, myGeneralSettings, myImportingSettings, embeddersManager, console, indicator, myMessage); + myTree.resolveFolders(myMavenProject, myImportingSettings, embeddersManager, console, indicator, myMessage); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorPluginsResolvingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorPluginsResolvingTask.java index e62349522b6f..32d79f792ee3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorPluginsResolvingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorPluginsResolvingTask.java @@ -16,15 +16,15 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.project.Project; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.utils.MavenProgressIndicator; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; +import org.jetbrains.idea.maven.utils.MavenProgressIndicator; public class MavenProjectsProcessorPluginsResolvingTask extends MavenProjectsProcessorBasicTask { - private final org.apache.maven.project.MavenProject myNativeMavenProject; + private final NativeMavenProjectHolder myNativeMavenProject; public MavenProjectsProcessorPluginsResolvingTask(MavenProject project, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, MavenProjectsTree tree) { super(project, tree); myNativeMavenProject = nativeMavenProject; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorReadingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorReadingTask.java index 01b229f9501b..d896351bc87c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorReadingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorReadingTask.java @@ -17,7 +17,6 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java index de1e98c1ef5a..08a45a7ce1ff 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java @@ -16,7 +16,6 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.project.Project; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorTask.java index 7fbe3b0592cf..65f43c85beae 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorTask.java @@ -16,7 +16,6 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.project.Project; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java index 5cc178611a5d..8bfb6b6ea0c3 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java @@ -18,6 +18,7 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -29,11 +30,11 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.apache.maven.artifact.Artifact; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.*; import java.io.*; @@ -64,7 +65,7 @@ public class MavenProjectsTree { private final Map myTimestamps = new THashMap(); private final Map myVirtualFileToProjectMapping = new THashMap(); private final Map myMavenIdToProjectMapping = new THashMap(); - private final Map myMavenIdToFileMapping = new THashMap(); + private final Map myMavenIdToFileMapping = new THashMap(); private final Map> myAggregatorToModuleMapping = new THashMap>(); private final Map myModuleToAggregatorMapping = new THashMap(); @@ -138,7 +139,7 @@ public class MavenProjectsTree { tree.myTimestamps.put(project, timestamp); tree.myVirtualFileToProjectMapping.put(project.getFile(), project); tree.myMavenIdToProjectMapping.put(project.getMavenId(), project); - tree.myMavenIdToFileMapping.put(project.getMavenId(), project.getFile()); + tree.myMavenIdToFileMapping.put(project.getMavenId(), new File(project.getFile().getPath())); tree.myAggregatorToModuleMapping.put(project, modules); for (MavenProject eachModule : modules) { tree.myModuleToAggregatorMapping.put(eachModule, project); @@ -387,8 +388,8 @@ public class MavenProjectsTree { return Pair.create(available, active); } - public Collection> getProfilesWithStates() { - Collection> result = new ArrayListSet>(); + public Collection> getProfilesWithStates() { + Collection> result = new ArrayListSet>(); Pair, Collection> profiles = getAvailableAndActiveProfiles(true, true); Collection available = profiles.first; @@ -396,11 +397,11 @@ public class MavenProjectsTree { Collection explicitProfiles = getExplicitProfiles(); for (String each : available) { - MavenProfileState state = MavenProfileState.NONE; + MavenProfileKind state = MavenProfileKind.NONE; if (explicitProfiles.contains(each)) { - state = MavenProfileState.EXPLICIT; + state = MavenProfileKind.EXPLICIT; } - else if (active.contains(each)) state = MavenProfileState.IMPLICIT; + else if (active.contains(each)) state = MavenProfileKind.IMPLICIT; result.add(Pair.create(each, state)); } return result; @@ -541,7 +542,7 @@ public class MavenProjectsTree { try { myVirtualFileToProjectMapping.put(mavenProject.getFile(), mavenProject); myMavenIdToProjectMapping.put(mavenProject.getMavenId(), mavenProject); - myMavenIdToFileMapping.put(mavenProject.getMavenId(), mavenProject.getFile()); + myMavenIdToFileMapping.put(mavenProject.getMavenId(), new File(mavenProject.getFile().getPath())); } finally { writeUnlock(); @@ -891,14 +892,10 @@ public class MavenProjectsTree { return findProject(artifact.getMavenId()); } - public MavenProject findProject(Artifact artifact) { - return findProject(new MavenId(artifact)); - } - - private Map getProjectIdToFileMapping() { + private Map getProjectIdToFileMapping() { readLock(); try { - return new THashMap(myMavenIdToFileMapping); + return new THashMap(myMavenIdToFileMapping); } finally { readUnlock(); @@ -990,17 +987,17 @@ public class MavenProjectsTree { MavenConsole console, MavenProgressIndicator process, Object message) throws MavenProcessCanceledException { - MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); embedder.customizeForResolve(getProjectIdToFileMapping(), console, process); try { process.checkCanceled(); process.setText(ProjectBundle.message("maven.resolving.pom", mavenProject.getDisplayName())); process.setText2(""); - Pair resolveResult = mavenProject.resolve(generalSettings, - embedder, - new MavenProjectReader(), - myProjectLocator); + Pair resolveResult = mavenProject.resolve(generalSettings, + embedder, + new MavenProjectReader(), + myProjectLocator); fireProjectResolved(Pair.create(mavenProject, resolveResult.first), resolveResult.second, message); } @@ -1010,11 +1007,11 @@ public class MavenProjectsTree { } public void resolvePlugins(MavenProject mavenProject, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, MavenEmbeddersManager embeddersManager, MavenConsole console, MavenProgressIndicator process) throws MavenProcessCanceledException { - MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_PLUGINS_RESOLVE); + MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_PLUGINS_RESOLVE); embedder.customizeForResolve(console, process); embedder.clearCachesFor(mavenProject.getMavenId()); @@ -1022,7 +1019,7 @@ public class MavenProjectsTree { for (MavenPlugin each : mavenProject.getDeclaredPlugins()) { process.checkCanceled(); process.setText(ProjectBundle.message("maven.downloading.pom.plugins", mavenProject.getDisplayName())); - embedder.resolvePlugin(each, nativeMavenProject, false); + embedder.resolvePlugin(each, mavenProject.getRemoteRepositories(), nativeMavenProject, false); } mavenProject.resetCache(); firePluginsResolved(mavenProject); @@ -1033,7 +1030,6 @@ public class MavenProjectsTree { } public void resolveFolders(final MavenProject mavenProject, - final MavenGeneralSettings generalSettings, final MavenImportingSettings importingSettings, final MavenEmbeddersManager embeddersManager, final MavenConsole console, @@ -1041,7 +1037,7 @@ public class MavenProjectsTree { final Object message) throws MavenProcessCanceledException { executeWithEmbedder(mavenProject, embeddersManager, - MavenEmbeddersManager.EmbedderKind.FOR_FOLDERS_RESOLVE, + MavenEmbeddersManager.FOR_FOLDERS_RESOLVE, console, process, new EmbedderTask() { @@ -1051,7 +1047,6 @@ public class MavenProjectsTree { process.setText2(""); Pair resolveResult = mavenProject.resolveFolders(embedder, - generalSettings, importingSettings, new MavenProjectReader(), console); @@ -1073,7 +1068,7 @@ public class MavenProjectsTree { MavenConsole console, MavenProgressIndicator process) throws MavenProcessCanceledException { - MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DOWNLOAD); + MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_DOWNLOAD); embedder.customizeForResolve(console, process); try { @@ -1095,12 +1090,13 @@ public class MavenProjectsTree { MavenEmbeddersManager embeddersManager, MavenConsole console, MavenProgressIndicator process) throws MavenProcessCanceledException { - MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DOWNLOAD); + MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_DOWNLOAD); embedder.customizeForResolve(console, process); try { - MavenArtifact result = embedder.resolve(id, MavenConstants.TYPE_JAR, null, mavenProject.getRemoteRepositories()); - result.setScope(Artifact.SCOPE_COMPILE); + MavenArtifact result = embedder.resolve(new MavenArtifactInfo(id, MavenConstants.TYPE_JAR, null), + mavenProject.getRemoteRepositories()); + result.setScope(MavenConstants.SCOPE_COMPILE); return result; } finally { @@ -1110,7 +1106,7 @@ public class MavenProjectsTree { public void executeWithEmbedder(MavenProject mavenProject, MavenEmbeddersManager embeddersManager, - MavenEmbeddersManager.EmbedderKind embedderKind, + Key embedderKind, MavenConsole console, MavenProgressIndicator process, EmbedderTask task) throws MavenProcessCanceledException { @@ -1183,7 +1179,7 @@ public class MavenProjectsTree { } private void fireProjectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { for (Listener each : myListeners) { each.projectResolved(projectWithChanges, nativeMavenProject, message); @@ -1360,7 +1356,7 @@ public class MavenProjectsTree { void projectsUpdated(List> updated, List deleted, Object message); void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + @Nullable NativeMavenProjectHolder nativeMavenProject, Object message); void pluginsResolved(MavenProject project); @@ -1381,7 +1377,7 @@ public class MavenProjectsTree { } public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + @Nullable NativeMavenProjectHolder nativeMavenProject, Object message) { } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenRemoteRepository.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenRemoteRepository.java deleted file mode 100644 index 1c530bbfcf34..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenRemoteRepository.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000-2009 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 org.jetbrains.idea.maven.project; - -import org.apache.maven.model.Repository; -import org.apache.maven.model.RepositoryPolicy; - -import java.io.Serializable; - -public class MavenRemoteRepository implements Serializable { - private String myId; - private String myName; - private String myUrl; - private String myLayout; - private Policy myReleasesPolicy; - private Policy mySnapshotsPolicy; - - protected MavenRemoteRepository() { - } - - public MavenRemoteRepository(Repository repository) { - myId = repository.getId(); - myName = repository.getName(); - myUrl = repository.getUrl(); - myLayout = repository.getLayout(); - - if (repository.getReleases()!= null) myReleasesPolicy = new Policy(repository.getReleases()); - if (repository.getSnapshots() != null) mySnapshotsPolicy = new Policy(repository.getSnapshots()); - } - - public String getId() { - return myId; - } - - public String getName() { - return myName; - } - - public String getUrl() { - return myUrl; - } - - public String getLayout() { - return myLayout; - } - - public Policy getReleasesPolicy() { - return myReleasesPolicy; - } - - public Policy getSnapshotsPolicy() { - return mySnapshotsPolicy; - } - - public Repository toRepository() { - Repository result = new Repository(); - result.setId(myId); - result.setName(myName); - result.setUrl(myUrl); - result.setLayout(myLayout); - - if (myReleasesPolicy != null) result.setReleases(myReleasesPolicy.toRepositoryPolicy()); - if (mySnapshotsPolicy != null) result.setSnapshots(mySnapshotsPolicy.toRepositoryPolicy()); - - return result; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - MavenRemoteRepository that = (MavenRemoteRepository)o; - - if (myId != null ? !myId.equals(that.myId) : that.myId != null) return false; - - return true; - } - - @Override - public int hashCode() { - return myId != null ? myId.hashCode() : 0; - } - - public static class Policy implements Serializable { - private boolean myEnabled; - private String myUpdatePolicy; - private String myChecksumPolicy; - - protected Policy() { - } - - public Policy(RepositoryPolicy policy) { - myEnabled = policy.isEnabled(); - myUpdatePolicy = policy.getUpdatePolicy(); - myChecksumPolicy = policy.getChecksumPolicy(); - } - - public boolean isEnabled() { - return myEnabled; - } - - public String getUpdatePolicy() { - return myUpdatePolicy; - } - - public String getChecksumPolicy() { - return myChecksumPolicy; - } - - public RepositoryPolicy toRepositoryPolicy() { - RepositoryPolicy result =new RepositoryPolicy(); - result.setEnabled(myEnabled); - result.setUpdatePolicy(myUpdatePolicy); - result.setChecksumPolicy(myChecksumPolicy); - return result; - } - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/DownloadSelectedSourcesAndDocsAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/DownloadSelectedSourcesAndDocsAction.java index 33fb94ef3d27..696dd13120be 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/DownloadSelectedSourcesAndDocsAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/DownloadSelectedSourcesAndDocsAction.java @@ -16,12 +16,11 @@ package org.jetbrains.idea.maven.project.actions; import com.intellij.openapi.actionSystem.AnActionEvent; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenDataKeys; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenKeymapExtension.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenKeymapExtension.java index 015d402bab32..8dd291d5e59b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenKeymapExtension.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenKeymapExtension.java @@ -23,10 +23,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; import org.jetbrains.idea.maven.execution.MavenRunConfigurationType; import org.jetbrains.idea.maven.execution.MavenRunnerParameters; -import org.jetbrains.idea.maven.project.MavenPlugin; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenPlugin; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; @@ -142,7 +143,7 @@ public class MavenKeymapExtension implements KeymapExtension { private static List collectGoals(MavenProject project) { LinkedHashSet result = new LinkedHashSet(); // may contains similar plugins or somethig - result.addAll(MavenEmbedderWrapper.PHASES); + result.addAll(MavenConstants.PHASES); for (MavenPlugin each : project.getDeclaredPlugins()) { collectGoals(project.getLocalRepository(), each, result); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java index e670fe2ff671..4a0d284b1f23 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java @@ -23,8 +23,8 @@ import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.keymap.ex.KeymapManagerEx; import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.update.MergingUpdateQueue; @@ -32,9 +32,12 @@ import com.intellij.util.ui.update.Update; import gnu.trove.THashMap; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.execution.MavenRunner; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.project.MavenProject; +import org.jetbrains.idea.maven.project.MavenProjectChanges; +import org.jetbrains.idea.maven.project.MavenProjectsManager; +import org.jetbrains.idea.maven.project.MavenProjectsTree; import org.jetbrains.idea.maven.utils.MavenMergingUpdateQueue; import org.jetbrains.idea.maven.utils.MavenUtil; import org.jetbrains.idea.maven.utils.SimpleProjectComponent; @@ -195,7 +198,7 @@ public class MavenShortcutsManager extends SimpleProjectComponent { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { scheduleKeymapUpdate(Collections.singletonList(projectWithChanges.first), true); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/FileFinder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/FileFinder.java index 0e968753e55e..da81dba739fe 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/FileFinder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/FileFinder.java @@ -20,7 +20,7 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import java.util.List; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenArtifactUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenArtifactUtil.java index 5a269c709a6a..fdac7e4a6313 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenArtifactUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenArtifactUtil.java @@ -21,7 +21,7 @@ import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.indices.IndicesBundle; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import java.io.File; import java.io.IOException; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenAttachSourcesProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenAttachSourcesProvider.java index 49467a4918ba..ab0ecace6d5f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenAttachSourcesProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenAttachSourcesProvider.java @@ -28,6 +28,8 @@ import com.intellij.openapi.util.AsyncResult; import com.intellij.psi.PsiFile; import gnu.trove.THashSet; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.*; import javax.swing.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDataKeys.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDataKeys.java index ee25e4f33ecc..70ea789a65aa 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDataKeys.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDataKeys.java @@ -16,7 +16,7 @@ package org.jetbrains.idea.maven.utils; import com.intellij.openapi.actionSystem.DataKey; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; import javax.swing.*; import java.util.Collection; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java index 9fea46867b53..134029336e6e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenEnvironmentRegistrar.java @@ -22,7 +22,7 @@ import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.fileTypes.FileTypeManager; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.embedder.MavenEmbedderUtilEx; +import org.jetbrains.idea.maven.model.MavenConstants; import java.io.File; @@ -46,7 +46,7 @@ public class MavenEnvironmentRegistrar implements ApplicationComponent { } private void registerPathVariable() { - File repository = MavenEmbedderUtilEx.resolveLocalRepository(null, null, null); + File repository = MavenUtil.resolveLocalRepository(null, null, null); PathMacros macros = PathMacros.getInstance(); for (String each : macros.getAllMacroNames()) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenPluginInfo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenPluginInfo.java index 662f836c7c7b..e829725506d7 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenPluginInfo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenPluginInfo.java @@ -16,9 +16,9 @@ package org.jetbrains.idea.maven.utils; import org.jdom.Element; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; -import static org.jetbrains.idea.maven.project.MavenId.append; +import static org.jetbrains.idea.maven.model.MavenId.append; import java.util.Collection; import java.util.LinkedHashMap; @@ -35,7 +35,7 @@ public class MavenPluginInfo { Element plugin = MavenJDOMUtil.read(text, null); myGroupId = MavenJDOMUtil.findChildValueByPath(plugin, "groupId", MavenId.UNKNOWN_VALUE); - myArtifactId = MavenJDOMUtil.findChildValueByPath(plugin, "artifactId",MavenId.UNKNOWN_VALUE); + myArtifactId = MavenJDOMUtil.findChildValueByPath(plugin, "artifactId", MavenId.UNKNOWN_VALUE); myVersion = MavenJDOMUtil.findChildValueByPath(plugin, "version", MavenId.UNKNOWN_VALUE); myGoalPrefix = MavenJDOMUtil.findChildValueByPath(plugin, "goalPrefix", "unknown"); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java index f319b0cf4f8d..f10ae32a24fd 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenRehighlighter.java @@ -21,12 +21,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiManager; import com.intellij.psi.impl.PsiModificationTrackerImpl; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectChanges; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.project.MavenProjectsTree; -import org.jetbrains.idea.maven.utils.MavenUtil; -import org.jetbrains.idea.maven.utils.SimpleProjectComponent; import java.util.List; @@ -51,7 +50,7 @@ public class MavenRehighlighter extends SimpleProjectComponent { } public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { rehighlight(myProject); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java index 41db66be556a..0fb0d4f53d39 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java @@ -30,7 +30,9 @@ import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.*; -import java.util.*; +import java.util.Collection; +import java.util.Comparator; +import java.util.TreeSet; public class MavenUIUtil { public static void executeAction(final String actionId, final InputEvent e) { @@ -38,7 +40,8 @@ public class MavenUIUtil { final AnAction action = actionManager.getAction(actionId); if (action != null) { final Presentation presentation = new Presentation(); - final AnActionEvent event = new AnActionEvent(e, DataManager.getInstance().getDataContext(e.getComponent()), "", presentation, actionManager, 0); + final AnActionEvent event = + new AnActionEvent(e, DataManager.getInstance().getDataContext(e.getComponent()), "", presentation, actionManager, 0); action.update(event); if (presentation.isEnabled()) { action.actionPerformed(event); @@ -46,13 +49,13 @@ public class MavenUIUtil { } } - public static void setElements(ElementsChooser chooser, Collection all, Collection selected, Comparator comparator){ + public static void setElements(ElementsChooser chooser, Collection all, Collection selected, Comparator comparator) { java.util.List selection = chooser.getSelectedElements(); chooser.clear(); Collection sorted = new TreeSet(comparator); sorted.addAll(all); for (E element : sorted) { - chooser.addElement( element, selected.contains(element)); + chooser.addElement(element, selected.contains(element)); } chooser.selectElements(selection); } @@ -86,7 +89,7 @@ public class MavenUIUtil { panel.setForeground(foreground); CheckBoxState state = handler.getState(userObject); - checkbox.setSelected(state != CheckBoxState.UNCHECKED); + checkbox.setSelected(state != CheckBoxState.UNCHECKED); checkbox.setEnabled(state != CheckBoxState.PARTIAL); checkbox.setBackground(UIUtil.getTreeTextBackground()); checkbox.setForeground(foreground); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java index 478a4d484da3..4a09a8aaa039 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java @@ -39,24 +39,23 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.JarFileSystem; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; -import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; -import org.apache.commons.beanutils.BeanUtils; -import org.apache.maven.model.Model; -import org.codehaus.plexus.util.xml.Xpp3Dom; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.facade.MavenFacadeUtil; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import java.io.File; import java.io.IOException; -import java.io.Serializable; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.*; import java.util.concurrent.ExecutionException; @@ -67,6 +66,17 @@ import java.util.regex.PatternSyntaxException; public class MavenUtil { public static final String MAVEN_NOTIFICATION_GROUP = "Maven"; + public static final String SETTINGS_XML = "settings.xml"; + public static final String DOT_M2_DIR = ".m2"; + public static final String PROP_USER_HOME = "user.home"; + public static final String ENV_M2_HOME = "M2_HOME"; + public static final String M2_DIR = "m2"; + public static final String BIN_DIR = "bin"; + public static final String CONF_DIR = "conf"; + public static final String M2_CONF_FILE = "m2.conf"; + public static final String REPOSITORY_DIR = "repository"; + public static final String LIB_DIR = "lib"; + public static final String SUPER_POM_PATH = "org/apache/maven/project/" + MavenConstants.SUPER_POM_XML; public static void invokeLater(Project p, Runnable r) { invokeLater(p, ModalityState.defaultModalityState(), r); @@ -342,56 +352,6 @@ public class MavenUtil { return true; } - public static T cloneObject(T object) { - try { - return (T)BeanUtils.cloneBean(object); - } - catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - catch (InstantiationException e) { - throw new RuntimeException(e); - } - catch (InvocationTargetException e) { - throw new RuntimeException(e); - } - catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - public static void stripDown(Object object) { - try { - for (Field each : ReflectionUtil.collectFields(object.getClass())) { - Class type = each.getType(); - each.setAccessible(true); - Object value = each.get(object); - if (shouldStrip(value)) { - each.set(object, null); - } - else { - if (value != null) { - Package pack = type.getPackage(); - if (pack != null && Model.class.getPackage().getName().equals(pack.getName())) { - stripDown(value); - } - } - } - } - } - catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - public static boolean shouldStrip(Object value) { - if (value == null) return false; - return value.getClass().isArray() - || value instanceof Collection - || value instanceof Map - || value instanceof Xpp3Dom; - } - public static void run(Project project, String title, final MavenTask task) throws MavenProcessCanceledException { final Exception[] canceledEx = new Exception[1]; @@ -469,6 +429,160 @@ public class MavenUtil { } } + @Nullable + public static File resolveMavenHomeDirectory(@Nullable String overrideMavenHome) { + if (!isEmptyOrSpaces(overrideMavenHome)) { + return new File(overrideMavenHome); + } + + String m2home = System.getenv(ENV_M2_HOME); + if (!isEmptyOrSpaces(m2home)) { + final File homeFromEnv = new File(m2home); + if (isValidMavenHome(homeFromEnv)) { + return homeFromEnv; + } + } + + String userHome = System.getProperty(PROP_USER_HOME); + if (!isEmptyOrSpaces(userHome)) { + final File underUserHome = new File(userHome, M2_DIR); + if (isValidMavenHome(underUserHome)) { + return underUserHome; + } + } + + return null; + } + + public static boolean isEmptyOrSpaces(@Nullable String str) { + return str == null || str.length() == 0 || str.trim().length() == 0; + } + + public static boolean isValidMavenHome(File home) { + return getMavenConfFile(home).exists(); + } + + public static File getMavenConfFile(File mavenHome) { + return new File(new File(mavenHome, BIN_DIR), M2_CONF_FILE); + } + + @Nullable + public static File resolveGlobalSettingsFile(@Nullable String overriddenMavenHome) { + File directory = resolveMavenHomeDirectory(overriddenMavenHome); + if (directory == null) return null; + + return new File(new File(directory, CONF_DIR), SETTINGS_XML); + } + + @NotNull + public static File resolveUserSettingsFile(@Nullable String overriddenUserSettingsFile) { + if (!isEmptyOrSpaces(overriddenUserSettingsFile)) return new File(overriddenUserSettingsFile); + return new File(resolveM2Dir(), SETTINGS_XML); + } + + @NotNull + public static File resolveM2Dir() { + return new File(System.getProperty(PROP_USER_HOME), DOT_M2_DIR); + } + + @NotNull + public static File resolveLocalRepository(@Nullable String overridenLocalRepository, + @Nullable String overridenMavenHome, + @Nullable String overriddenUserSettingsFile) { + File result = null; + if (!isEmptyOrSpaces(overridenLocalRepository)) result = new File(overridenLocalRepository); + if (result == null) { + result = doResolveLocalRepository(resolveUserSettingsFile(overriddenUserSettingsFile), + resolveGlobalSettingsFile(overridenMavenHome)); + } + try { + return result.getCanonicalFile(); + } + catch (IOException e) { + return result; + } + } + + @NotNull + public static File doResolveLocalRepository(@Nullable File userSettingsFile, @Nullable File globalSettingsFile) { + if (userSettingsFile != null) { + final String fromUserSettings = getRepositoryFromSettings(userSettingsFile); + if (!StringUtil.isEmpty(fromUserSettings)) { + return new File(fromUserSettings); + } + } + + if (globalSettingsFile != null) { + final String fromGlobalSettings = getRepositoryFromSettings(globalSettingsFile); + if (!StringUtil.isEmpty(fromGlobalSettings)) { + return new File(fromGlobalSettings); + } + } + + return new File(resolveM2Dir(), REPOSITORY_DIR); + } + + @Nullable + public static String getRepositoryFromSettings(final File file) { + try { + byte[] bytes = FileUtil.loadFileBytes(file); + return expandProperties(MavenJDOMUtil.findChildValueByPath(MavenJDOMUtil.read(bytes, null), "localRepository", null)); + } + catch (IOException e) { + return null; + } + } + + public static String expandProperties(String text) { + if (StringUtil.isEmptyOrSpaces(text)) return text; + Properties props = MavenFacadeUtil.collectSystemProperties(); + for (Map.Entry each : props.entrySet()) { + text = text.replace("${" + each.getKey() + "}", (CharSequence)each.getValue()); + } + return text; + } + + @NotNull + public static VirtualFile resolveSuperPomFile(@Nullable File mavenHome) { + VirtualFile result = doResolveSuperPomFile(mavenHome); + if (result == null) { + URL resource = MavenFacadeUtil.class.getResource("/" + SUPER_POM_PATH); + return VfsUtil.findFileByURL(resource); + } + return result; + } + + @Nullable + public static VirtualFile doResolveSuperPomFile(@Nullable File mavenHome) { + File lib = resolveMavenLib(mavenHome); + if (lib == null) return null; + + VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(lib); + if (file == null) return null; + + VirtualFile root = JarFileSystem.getInstance().getJarRootForLocalFile(file); + if (root == null) return null; + + return root.findFileByRelativePath(SUPER_POM_PATH); + } + + @Nullable + public static File resolveMavenLib(@Nullable File mavenHome) { + if (mavenHome == null) return null; + + File libs = new File(mavenHome, LIB_DIR); + File[] files = libs.listFiles(); + if (files != null) { + Pattern pattern = Pattern.compile("maven-\\d+\\.\\d+\\.\\d+-uber\\.jar"); + for (File each : files) { + if (pattern.matcher(each.getName()).matches()) { + return each; + } + } + } + return null; + } + public interface MavenTaskHandler { void waitFor(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java index 91820747dfcb..5760713137b4 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java @@ -41,9 +41,8 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.AsyncProcessIcon; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.facade.nexus.ArtifactType; -import org.jetbrains.idea.maven.facade.nexus.RepositoryType; -import org.jetbrains.idea.maven.facade.remote.MavenFacade; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -63,8 +62,8 @@ public class RepositoryAttachDialog extends DialogWrapper { private final Project myProject; private final boolean myManaged; private final AsyncProcessIcon myProgressIcon; - private final THashMap myCoordinates = new THashMap(); - private final Map myRepositories = new TreeMap(); + private final THashMap myCoordinates = new THashMap(); + private final Map myRepositories = new TreeMap(); private final ArrayList myShownItems = new ArrayList(); private final JComboBox myCombobox = new JComboBox(new CollectionComboBoxModel(myShownItems, null)); @@ -171,15 +170,16 @@ public class RepositoryAttachDialog extends DialogWrapper { if (myProgressIcon.isVisible()) return false; myProgressIcon.setVisible(true); myProgressIcon.resume(); - RepositoryAttachHandler.searchArtifacts(myProject, text, new PairProcessor, Boolean>() { - public boolean process(Collection artifactTypes, Boolean tooMany) { + RepositoryAttachHandler.searchArtifacts(myProject, text, new PairProcessor, Boolean>() { + public boolean process(Collection artifacts, Boolean tooMany) { if (myProgressIcon.isDisposed()) return true; myProgressIcon.suspend(); myProgressIcon.setVisible(false); final int prevSize = myCoordinates.size(); - for (ArtifactType artifactType : artifactTypes) { - myCoordinates.put(artifactType.getGroupId() + ":" + artifactType.getArtifactId() + ":" + artifactType.getVersion(), artifactType); + for (MavenArtifactInfo each : artifacts) { + myCoordinates.put(each.getGroupId() + ":" + each.getArtifactId() + ":" + each.getVersion(), each); } + myRepositoryUrl.setModel(new CollectionComboBoxModel(new ArrayList(myRepositories.keySet()), myRepositoryUrl.getEditor().getItem())); if (Boolean.TRUE.equals(tooMany)) { final Point point = new Point(myCombobox.getWidth() / 2, 0); @@ -190,13 +190,11 @@ public class RepositoryAttachDialog extends DialogWrapper { updateComboboxSelection(prevSize != myCoordinates.size()); return true; } - }, new Processor>() { - public boolean process(Collection repositoryTypes) { - for (RepositoryType repositoryType : repositoryTypes) { - if (!myRepositories.containsKey(repositoryType.getContentResourceURI())) { - myRepositories.put( - repositoryType.getContentResourceURI(), - new MavenFacade.Repository(repositoryType.getId(), repositoryType.getContentResourceURI(), "default")); + }, new Processor>() { + public boolean process(Collection repos) { + for (MavenRepositoryInfo each : repos) { + if (!myRepositories.containsKey(each.getUrl())) { + myRepositories.put(each.getUrl(), each); } } return true; @@ -274,7 +272,7 @@ public class RepositoryAttachDialog extends DialogWrapper { final LabeledComponent repository = new LabeledComponent(); repository.getLabel().setText("Repository URL to Download From:"); myRepositories.put(DEFAULT_REPOSITORY, null); - for (MavenFacade.Repository repo : RepositoryAttachHandler.getDefaultRepositories()) { + for (MavenRepositoryInfo repo : RepositoryAttachHandler.getDefaultRepositories()) { myRepositories.put(repo.getUrl(), repo); } myRepositoryUrl = new JComboBox(new CollectionComboBoxModel(new ArrayList(myRepositories.keySet()), DEFAULT_REPOSITORY)); @@ -324,19 +322,29 @@ public class RepositoryAttachDialog extends DialogWrapper { } @NotNull - public List getRepositories() { + public List getRepositories() { final String selectedRepository = (String)myRepositoryUrl.getEditor().getItem(); if (StringUtil.isNotEmpty(selectedRepository) && !DEFAULT_REPOSITORY.equals(selectedRepository) && !myRepositories.containsKey(selectedRepository)) { - return Collections.singletonList(new MavenFacade.Repository("custom", selectedRepository, "default")); + return Collections.singletonList(new MavenRepositoryInfo("custom", null, selectedRepository)); } else { - final ArtifactType artifact = myCoordinates.get(getCoordinateText()); - final MavenFacade.Repository repository = - artifact != null && artifact.getResourceUri() != null ? myRepositories.get(artifact.getResourceUri()) : null; + final MavenArtifactInfo artifact = myCoordinates.get(getCoordinateText()); + final MavenRepositoryInfo repository = + artifact != null ? findRepositoryFor(artifact) : null; return repository != null? Collections.singletonList(repository) : ContainerUtil.findAll(myRepositories.values(), Condition.NOT_NULL); } } + private MavenRepositoryInfo findRepositoryFor(MavenArtifactInfo artifact) { + String soughtFor = artifact.getRepositoryId(); + if (soughtFor == null) return null; + + for (MavenRepositoryInfo each : myRepositories.values()) { + if (each.getId().equals(soughtFor)) return each; + } + return null; + } + private boolean isValidCoordinateSelected() { final String text = getCoordinateText(); if (myCombobox.getModel().getSelectedItem() == null) return false; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java index fd8d0c66bacb..4d4fd0a55239 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java @@ -21,7 +21,6 @@ import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.PerformInBackgroundOption; import com.intellij.openapi.progress.ProgressIndicator; @@ -37,29 +36,27 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.NullableComputable; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.util.PairProcessor; import com.intellij.util.Processor; +import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.converters.repositories.MavenRepositoriesProvider; -import org.jetbrains.idea.maven.facade.nexus.ArtifactType; -import org.jetbrains.idea.maven.facade.nexus.RepositoryType; -import org.jetbrains.idea.maven.facade.remote.MavenFacade; -import org.jetbrains.idea.maven.facade.remote.MavenFacadeManager; -import org.jetbrains.idea.maven.facade.remote.RemoteTransferListener; -import org.jetbrains.idea.maven.facade.remote.impl.RemoteTransferListenerImpl; -import org.jetbrains.idea.maven.project.MavenGeneralSettings; +import org.jetbrains.idea.maven.execution.SoutMavenConsole; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; +import org.jetbrains.idea.maven.model.MavenRemoteRepository; +import org.jetbrains.idea.maven.model.MavenRepositoryInfo; +import org.jetbrains.idea.maven.project.MavenEmbeddersManager; import org.jetbrains.idea.maven.project.MavenProjectsManager; import javax.swing.*; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; -import java.net.URL; -import java.rmi.server.UnicastRemoteObject; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; /** * @author Gregory.Shrago @@ -88,31 +85,31 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { final ActionCallback callback = new ActionCallback(); final String copyTo = dialog.getDirectoryPath(); final String coord = dialog.getCoordinateText(); - resolveLibrary(project, Collections.singleton(coord), dialog.getRepositories(), false, new Processor>>() { - public boolean process(final Map> stringListMap) { - final List result = stringListMap.get(coord); + resolveLibrary(project, coord, dialog.getRepositories(), false, new Processor>() { + public boolean process(final List artifacts) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final Library.ModifiableModel modifiableModel = modelProvider.compute(); - if (modifiableModel == null || result == null) { + if (modifiableModel == null) { callback.setRejected(); } else { - replaceLibraryData(project, modifiableModel, result, copyTo); + replaceLibraryData(project, modifiableModel, artifacts, copyTo); callback.setDone(); } } }); - final boolean nothingRetrieved = result == null || result.isEmpty(); + final boolean nothingRetrieved = artifacts.isEmpty(); final StringBuilder sb = new StringBuilder(); - if (nothingRetrieved) sb.append("No files were downloaded for ").append(coord); + if (nothingRetrieved) { + sb.append("No files were downloaded for ").append(coord); + } else { sb.append("The following files were downloaded:
"); sb.append("
    "); - for (ArtifactType artifactType : result) { + for (MavenArtifact each : artifacts) { sb.append("
  1. "); - final String file = artifactType.getResourceUri(); - sb.append(file.substring(file.lastIndexOf('/') + 1)); + sb.append(each.getFile().getName()); sb.append("
  2. "); } sb.append("
"); @@ -123,7 +120,8 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } else { Notifications.Bus.notify(new Notification("Repository", sb.toString(), title, - nothingRetrieved? NotificationType.WARNING : NotificationType.INFORMATION), NotificationDisplayType.STICKY_BALLOON, project); + nothingRetrieved ? NotificationType.WARNING : NotificationType.INFORMATION), + NotificationDisplayType.STICKY_BALLOON, project); } return true; } @@ -140,11 +138,11 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { public ActionCallback refreshLibrary(final Project project, final Library.ModifiableModel library) { final ActionCallback result = new ActionCallback(); final String coord = getMavenCoordinate(library.getName()); - resolveLibrary(project, Collections.singleton(coord), getDefaultRepositories(), true, new Processor>>() { - public boolean process(final Map> artifactTypes) { + resolveLibrary(project, coord, getDefaultRepositories(), true, new Processor>() { + public boolean process(final List artifacts) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { - replaceLibraryData(project, library, artifactTypes.get(coord), null); + replaceLibraryData(project, library, artifacts, null); result.setDone(); } }); @@ -156,9 +154,9 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { private static void replaceLibraryData(Project project, Library.ModifiableModel library, - Collection artifactTypes, + Collection artifacts, String copyTo) { - final String repoUrl = VfsUtil.pathToUrl(MavenProjectsManager.getInstance(project).getGeneralSettings().getEffectiveLocalRepository().getPath()); + final String repoUrl = getLocalRepositoryUrl(project); for (OrderRootType type : OrderRootType.getAllTypes()) { for (String url : library.getUrls(type)) { if (url.startsWith(repoUrl)) { @@ -166,20 +164,18 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } } } - for (ArtifactType type : artifactTypes) { + for (MavenArtifact each : artifacts) { try { - final String url = VfsUtil.convertFromUrl(new URL(type.getResourceUri())); - final String targetUrl; + File repoFile = each.getFile(); + File toFile = repoFile; if (copyTo != null) { - final File repoFile = new File(FileUtil.toSystemDependentName(VfsUtil.urlToPath(url))); - final File toFile = new File(copyTo, repoFile.getName()); + toFile = new File(copyTo, repoFile.getName()); if (repoFile.exists()) { FileUtil.copy(repoFile, toFile); } - targetUrl = VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(toFile.getPath())); } - else targetUrl = url; - library.addRoot(targetUrl, OrderRootType.CLASSES); + String url = VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(toFile.getPath())); + library.addRoot(url, OrderRootType.CLASSES); } catch (MalformedURLException e) { LOG.warn(e); @@ -190,44 +186,42 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } } - public static void searchArtifacts(final Project project, String coord, final PairProcessor, Boolean> resultProcessor, final Processor> repoProcessor) { + private static String getLocalRepositoryUrl(Project project) { + File file = MavenProjectsManager.getInstance(project).getGeneralSettings().getEffectiveLocalRepository(); + return VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(file.getPath())); + } + + public static void searchArtifacts(final Project project, String coord, + final PairProcessor, Boolean> resultProcessor, + final Processor> repoProcessor) { if (coord == null) return; - final ArtifactType template = createTemplate(coord); + final MavenArtifactInfo template = createTemplate(coord, null); ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) { public void run(@NotNull ProgressIndicator indicator) { - final MavenFacadeManager mavenManager = ServiceManager.getService(project, MavenFacadeManager.class); - final Ref> result = Ref.create(Collections.emptyList()); - final Ref> result2 = Ref.create(Collections.emptyList()); + final Ref> result = Ref.create(Collections.emptyList()); + final Ref> result2 = Ref.create(Collections.emptyList()); final Ref tooManyRef = Ref.create(Boolean.FALSE); try { - final MavenFacade mavenFacade = mavenManager.getMavenFacade(project); + MavenFacadeManager facade = MavenFacadeManager.getInstance(); + final String[] nexusUrls = getDefaultNexusUrls(); - final List resultList = new ArrayList(); - final List result2List = new ArrayList(); + final List resultList = new ArrayList(); + final List result2List = new ArrayList(); for (String nexusUrl : nexusUrls) { - final List artifacts; + final List artifacts; try { - artifacts = mavenFacade.findArtifacts(template, nexusUrl); + artifacts = facade.findArtifacts(template, nexusUrl); } catch (Exception ex) { - LOG.warn("Accessing Nexus at: "+nexusUrl, ex); + LOG.warn("Accessing Nexus at: " + nexusUrl, ex); continue; } if (artifacts == null) { tooManyRef.set(Boolean.TRUE); } else if (!artifacts.isEmpty()) { - final List repositories = mavenFacade.getRepositories(nexusUrl); - final HashMap map = new HashMap(); - for (RepositoryType repository : repositories) { - map.put(repository.getId(), repository); - } - result2List.addAll(repositories); - for (ArtifactType artifact : artifacts) { - final RepositoryType repoType = map.get(artifact.getRepoId()); - artifact.setResourceUri(repoType == null? null: repoType.getContentResourceURI()); - } + result2List.addAll(facade.getRepositories(nexusUrl)); resultList.addAll(artifacts); } } @@ -249,20 +243,19 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { }); } - public static void searchRepositories(final Project project, final Processor> resultProcessor) { + public static void searchRepositories(final Project project, final Processor> resultProcessor) { ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) { public void run(@NotNull ProgressIndicator indicator) { - final MavenFacadeManager mavenManager = ServiceManager.getService(project, MavenFacadeManager.class); - final Ref> result = Ref.create(Collections.emptyList()); + final Ref> result = Ref.create(Collections.emptyList()); try { final String[] nexusUrls = getDefaultNexusUrls(); - final MavenFacade mavenFacade = mavenManager.getMavenFacade(project); - final ArrayList repoList = new ArrayList(); + final MavenFacadeManager manager = MavenFacadeManager.getInstance(); + final ArrayList repoList = new ArrayList(); for (String nexusUrl : nexusUrls) { - final List repositories; + final List repositories; try { - repositories = mavenFacade.getRepositories(nexusUrl); + repositories = manager.getRepositories(nexusUrl); } catch (Exception ex) { LOG.warn("Accessing Nexus at: " + nexusUrl, ex); @@ -286,38 +279,18 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { }); } - private static String[] getDefaultNexusUrls() { - return new String[] { - "http://oss.sonatype.org/service/local/", - "http://repository.sonatype.org/service/local/", - //"http://maven.labs.intellij.net:8081/nexus/service/local/" - }; - } - - public static List getDefaultRepositories() { - final List list = new ArrayList(); - final Set visited = new HashSet(); - final MavenRepositoriesProvider provider = MavenRepositoriesProvider.getInstance(); - for (String id : provider.getRepositoryIds()) { - final String url = provider.getRepositoryUrl(id); - if (!visited.add(url)) continue; - list.add(new MavenFacade.Repository(id, url, StringUtil.notNullize(provider.getRepositoryLayout(id), "default"))); - } - return list; - } - - private static ArtifactType createTemplate(String coord) { - final ArtifactType template = new ArtifactType(); + private static MavenArtifactInfo createTemplate(String coord, String packaging) { final String[] parts = coord.split(":"); if (parts.length == 1 && parts[0].length() > 0 && Character.isUpperCase(parts[0].charAt(0))) { - template.setContextId(parts[0]); + return new MavenArtifactInfo(null, null, null, packaging, null, parts[0], null); } else { - template.setGroupId(parts.length > 0 ? parts[0] : null); - template.setArtifactId(parts.length > 1 ? parts[1] : null); - template.setVersion(parts.length > 2 ? parts[2] : null); + return new MavenArtifactInfo(parts.length > 0 ? parts[0] : null, + parts.length > 1 ? parts[1] : null, + parts.length > 2 ? parts[2] : null, + null, + null); } - return template; } private static void handleError(String message, Exception e) { @@ -325,61 +298,51 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } public static void resolveLibrary(final Project project, - Collection libNames, - final Collection repositories, boolean modal, - final Processor>> resultProcessor) { - if (libNames.isEmpty()) return; - final ArrayList parameters = new ArrayList(); - for (String s : libNames) { - final ArtifactType template = createTemplate(s); - template.setPackaging("jar"); - parameters.add(template); + final String libName, + Collection repositories, + boolean modal, + final Processor> resultProcessor) { + Task task; + if (modal) { + task = new Task.Modal(project, "Maven", false) { + public void run(@NotNull ProgressIndicator indicator) { + doResolveInner(project, Collections.singletonList(createTemplate(libName, "jar")), resultProcessor, indicator); + } + }; } - ProgressManager.getInstance().run(modal ? new Task.Modal(project, "Maven", false) { + else { + task = new Task.Backgroundable(project, "Maven", false, PerformInBackgroundOption.DEAF) { + public void run(@NotNull ProgressIndicator indicator) { + doResolveInner(project, Collections.singletonList(createTemplate(libName, "jar")), resultProcessor, indicator); + } - public void run(@NotNull ProgressIndicator indicator) { - doResolveInner(project, parameters, repositories, resultProcessor, indicator); - } - } : new Task.Backgroundable(project, "Maven", false, PerformInBackgroundOption.DEAF) { - - public void run(@NotNull ProgressIndicator indicator) { - doResolveInner(project, parameters, repositories, resultProcessor, indicator); - } + @Override + public boolean shouldStartInBackground() { + return false; + } + }; + } - @Override - public boolean shouldStartInBackground() { - return false; - } - }); + ProgressManager.getInstance().run(task); } private static void doResolveInner(Project project, - final ArrayList artifacts, - Collection repositories, - final Processor>> resultProcessor, + List artifacts, + final Processor> resultProcessor, ProgressIndicator indicator) { - final Ref>> result = Ref.create(Collections.>emptyMap()); - final MavenFacadeManager mavenManager = ServiceManager.getService(project, MavenFacadeManager.class); + final Ref> result = new Ref>(); + + MavenEmbeddersManager manager = MavenProjectsManager.getInstance(project).getEmbeddersManager(); + MavenEmbedderWrapper embedder = manager.getEmbedder(MavenEmbeddersManager.FOR_DOWNLOAD); try { - final MavenFacade mavenFacade = mavenManager.getMavenFacade(project); - final MavenFacade.MavenFacadeSettings settings = createMavenFacadeSettings(project); - settings.getRemoteRepositories().addAll(repositories); - mavenFacade.setMavenSettings(settings); - final RemoteTransferListener transferListener = fromProgressIndicator(indicator); - UnicastRemoteObject.exportObject(transferListener, 0); - mavenFacade.setTransferListener(transferListener); - try { - result.set(mavenFacade.resolveDependencies(artifacts)); - } - finally { - UnicastRemoteObject.unexportObject(transferListener, true); - mavenFacade.setTransferListener(null); - } + embedder.customizeForResolve(new SoutMavenConsole(), new MavenProgressIndicator(indicator)); + result.set(embedder.resolveTransitively(artifacts, convertRepositories(getDefaultRepositories()))); } - catch (Exception e) { - handleError("Error resolving: " + artifacts, e); + catch (MavenProcessCanceledException e) { + return; } finally { + manager.release(embedder); ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { resultProcessor.process(result.get()); @@ -388,6 +351,34 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } } + private static List convertRepositories(List infos) { + List result = new ArrayList(infos.size()); + for (MavenRepositoryInfo each : infos) { + result.add(new MavenRemoteRepository(each.getId(), each.getName(), each.getUrl(), null, null, null)); + } + return result; + } + + private static String[] getDefaultNexusUrls() { + return new String[]{ + "http://oss.sonatype.org/service/local/", + "http://repository.sonatype.org/service/local/", + //"http://maven.labs.intellij.net:8081/nexus/service/local/" + }; + } + + public static List getDefaultRepositories() { + List result = new SmartList(); + final MavenRepositoriesProvider provider = MavenRepositoriesProvider.getInstance(); + for (String id : provider.getRepositoryIds()) { + final String url = provider.getRepositoryUrl(id); + if (url != null) { + result.add(new MavenRepositoryInfo(id, provider.getRepositoryName(id), url)); + } + } + return result; + } + //public static void registerLibraryWatcher(final Project project) { // final Alarm alarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, project); // final Runnable syncRunnable = new Runnable() { @@ -458,7 +449,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { // syncRunnable.run(); //} - private void refreshLibraries(final Project project, final Map> map) { + private void refreshLibraries(final Project project, final Map> map) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { for (Library library : map.keySet()) { @@ -470,102 +461,95 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { }); } - private static MavenFacade.MavenFacadeSettings createMavenFacadeSettings(Project project) { - final MavenFacade.MavenFacadeSettings settings = new MavenFacade.MavenFacadeSettings(); - final MavenGeneralSettings generalSettings = MavenProjectsManager.getInstance(project).getGeneralSettings(); - settings.setLocalRepository(new MavenFacade.Repository("local", VfsUtil.pathToUrl(generalSettings.getEffectiveLocalRepository().getPath()), "default")); - return settings; - } - - public static RemoteTransferListener fromProgressIndicator(final ProgressIndicator indicator) { - return new RemoteTransferListenerImpl() { - - final Map myDownloads = new ConcurrentHashMap(); - @Override - public void transferInitiated(TransferEvent transferEvent) { - final String message = transferEvent.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading"; - final String url = transferEvent.getRepositoryUrl(); - indicator.setText(message + ": " + url + "/" + transferEvent.getResource().getResourceName()); - } - - @Override - public void transferStarted(TransferEvent transferEvent) { - // nothing - } - - @Override - public void transferProgress(TransferEvent transferEvent, int length) { - final Resource resource = transferEvent.getResource(); - final long curComplete; - if (!myDownloads.containsKey(resource)) { - curComplete = length; - } - else { - final long complete = myDownloads.get(resource).longValue(); - curComplete = complete + length; - } - myDownloads.put(resource, new Long(curComplete)); - - long curTotal = 0; - long curProgress = 0; - boolean unknown = false; - for (Resource res : myDownloads.keySet()) { - final long total = res.getResourceContentLength(); - final long complete = myDownloads.get(res).longValue(); - if (total == -1) unknown = true; - else curTotal += total; - curProgress += complete; - } - - final StringBuilder sb = new StringBuilder(); - if (curTotal >= 1024) { - sb.append((curProgress / 1024) + "/" + (curTotal == -1 ? "?" : (curTotal / 1024) + "K")); - } - else { - sb.append(curProgress + "/" + (curTotal == -1 ? "?" : curTotal + "b")); - } - if (unknown) { - indicator.setIndeterminate(true); - } - else { - indicator.setIndeterminate(false); - indicator.setFraction((double)curProgress / curTotal); - } - indicator.setText(sb.toString()); - indicator.setText2(transferEvent.getResource().getResourceName()); - } - - @Override - public void transferCompleted(TransferEvent transferEvent) { - transferProgress(transferEvent, 0); - if (true) return; - final StringBuilder sb = new StringBuilder(); - final long contentLength = transferEvent.getResource().getResourceContentLength(); - if (contentLength != -1) { - String type = - (transferEvent.getRequestType() == TransferEvent.RequestType.PUT ? "uploaded" : "downloaded"); - sb.append(contentLength >= 1024 ? (contentLength / 1024) + "K" : contentLength + "b"); - String name = transferEvent.getResource().getResourceName(); - name = name.substring(name.lastIndexOf('/') + 1, name.length()); - sb.append(" "); - sb.append(type); - sb.append(" ("); - sb.append(name); - sb.append(")"); - } - indicator.setText(sb.toString()); - //myDownloads.remove(transferEvent.getResource()); - } - - @Override - public void transferError(TransferEvent transferEvent) { - indicator.setText2(transferEvent.getException().getMessage()); - } - - @Override - public void debug(String s) { - indicator.setText2(s); - } - }; - } + //public static RemoteTransferListener fromProgressIndicator(final ProgressIndicator indicator) { + // return new RemoteTransferListenerImpl() { + // + // final Map myDownloads = new ConcurrentHashMap(); + // @Override + // public void transferInitiated(TransferEvent transferEvent) { + // final String message = transferEvent.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading"; + // final String url = transferEvent.getRepositoryUrl(); + // indicator.setText(message + ": " + url + "/" + transferEvent.getResource().getResourceName()); + // } + // + // @Override + // public void transferStarted(TransferEvent transferEvent) { + // // nothing + // } + // + // @Override + // public void transferProgress(TransferEvent transferEvent, int length) { + // final Resource resource = transferEvent.getResource(); + // final long curComplete; + // if (!myDownloads.containsKey(resource)) { + // curComplete = length; + // } + // else { + // final long complete = myDownloads.get(resource).longValue(); + // curComplete = complete + length; + // } + // myDownloads.put(resource, new Long(curComplete)); + // + // long curTotal = 0; + // long curProgress = 0; + // boolean unknown = false; + // for (Resource res : myDownloads.keySet()) { + // final long total = res.getResourceContentLength(); + // final long complete = myDownloads.get(res).longValue(); + // if (total == -1) unknown = true; + // else curTotal += total; + // curProgress += complete; + // } + // + // final StringBuilder sb = new StringBuilder(); + // if (curTotal >= 1024) { + // sb.append((curProgress / 1024) + "/" + (curTotal == -1 ? "?" : (curTotal / 1024) + "K")); + // } + // else { + // sb.append(curProgress + "/" + (curTotal == -1 ? "?" : curTotal + "b")); + // } + // if (unknown) { + // indicator.setIndeterminate(true); + // } + // else { + // indicator.setIndeterminate(false); + // indicator.setFraction((double)curProgress / curTotal); + // } + // indicator.setText(sb.toString()); + // indicator.setText2(transferEvent.getResource().getResourceName()); + // } + // + // @Override + // public void transferCompleted(TransferEvent transferEvent) { + // transferProgress(transferEvent, 0); + // if (true) return; + // final StringBuilder sb = new StringBuilder(); + // final long contentLength = transferEvent.getResource().getResourceContentLength(); + // if (contentLength != -1) { + // String type = + // (transferEvent.getRequestType() == TransferEvent.RequestType.PUT ? "uploaded" : "downloaded"); + // sb.append(contentLength >= 1024 ? (contentLength / 1024) + "K" : contentLength + "b"); + // String name = transferEvent.getResource().getResourceName(); + // name = name.substring(name.lastIndexOf('/') + 1, name.length()); + // sb.append(" "); + // sb.append(type); + // sb.append(" ("); + // sb.append(name); + // sb.append(")"); + // } + // indicator.setText(sb.toString()); + // //myDownloads.remove(transferEvent.getResource()); + // } + // + // @Override + // public void transferError(TransferEvent transferEvent) { + // indicator.setText2(transferEvent.getException().getMessage()); + // } + // + // @Override + // public void debug(String s) { + // indicator.setText2(s); + // } + // }; + //} } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java index 1e41626f63a0..7a9557ff4d65 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java @@ -24,7 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.utils.MavenUtil; import java.util.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenAddArchetypeDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenAddArchetypeDialog.java index 671eb6d3493c..128c4f078846 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenAddArchetypeDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenAddArchetypeDialog.java @@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.wizards; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.DocumentAdapter; -import org.jetbrains.idea.maven.indices.ArchetypeInfo; +import org.jetbrains.idea.maven.model.MavenArchetype; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -80,8 +80,8 @@ public class MavenAddArchetypeDialog extends DialogWrapper { getRootPane().revalidate(); } - public ArchetypeInfo getArchetype() { - return new ArchetypeInfo(myGroupIdField.getText(), + public MavenArchetype getArchetype() { + return new MavenArchetype(myGroupIdField.getText(), myArtifactIdField.getText(), myVersionField.getText(), myRepositoryField.getText(), diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java index 8425493a4826..c02460547a75 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenFrameworkSupportProvider.java @@ -27,9 +27,9 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.utils.MavenIcons; import javax.swing.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java index 7e360866bf68..14c53b6175ef 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilder.java @@ -31,8 +31,8 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.idea.maven.indices.ArchetypeInfo; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.utils.MavenUtil; @@ -54,7 +54,7 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil private boolean myInheritVersion; private MavenId myProjectId; - private ArchetypeInfo myArchetype; + private MavenArchetype myArchetype; public void setupRootModel(ModifiableRootModel rootModel) throws ConfigurationException { final Project project = rootModel.getProject(); @@ -173,11 +173,11 @@ public class MavenModuleBuilder extends ModuleBuilder implements SourcePathsBuil return myProjectId; } - public void setArchetype(ArchetypeInfo archetype) { + public void setArchetype(MavenArchetype archetype) { myArchetype = archetype; } - public ArchetypeInfo getArchetype() { + public MavenArchetype getArchetype() { return myArchetype; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java index 0d49b15e446a..4493fb80522b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderHelper.java @@ -34,11 +34,11 @@ import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.execution.MavenRunner; import org.jetbrains.idea.maven.execution.MavenRunnerParameters; import org.jetbrains.idea.maven.execution.MavenRunnerSettings; -import org.jetbrains.idea.maven.indices.ArchetypeInfo; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenConstants; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.utils.MavenConstants; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenUtil; @@ -56,7 +56,7 @@ public class MavenModuleBuilderHelper { private final boolean myInheritGroupId; private final boolean myInheritVersion; - private final ArchetypeInfo myArchetype; + private final MavenArchetype myArchetype; private final String myCommandName; @@ -65,7 +65,7 @@ public class MavenModuleBuilderHelper { MavenProject parentProject, boolean inheritGroupId, boolean inheritVersion, - ArchetypeInfo archetype, + MavenArchetype archetype, String commaneName) { myProjectId = projectId; myAggregatorProject = aggregatorProject; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java index c0c4f1c5eceb..7ea7c3e6546d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenModuleWizardStep.java @@ -18,7 +18,6 @@ package org.jetbrains.idea.maven.wizards; import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.projectWizard.ModuleWizardStep; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.text.StringUtil; @@ -30,13 +29,12 @@ import com.intellij.util.ui.AsyncProcessIcon; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.indices.ArchetypeInfo; +import org.jetbrains.idea.maven.model.MavenArchetype; import org.jetbrains.idea.maven.indices.MavenIndicesManager; import org.jetbrains.idea.maven.navigator.SelectMavenProjectDialog; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.project.MavenId; -import org.jetbrains.idea.maven.utils.MavenUtil; +import org.jetbrains.idea.maven.model.MavenId; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; @@ -156,7 +154,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { new TreeSpeedSearch(myArchetypesTree, new Convertor() { public String convert(TreePath path) { - ArchetypeInfo info = getArchetypeInfoFromPathComponent(path.getLastPathComponent()); + MavenArchetype info = getArchetypeInfoFromPathComponent(path.getLastPathComponent()); return info.groupId + ":" + info.artifactId + ":" + info.version; } }).setComparator(new SpeedSearchBase.SpeedSearchComparator(false) { @@ -194,7 +192,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { dialog.show(); if (!dialog.isOK()) return; - ArchetypeInfo archetype = dialog.getArchetype(); + MavenArchetype archetype = dialog.getArchetype(); MavenIndicesManager.getInstance().addArchetype(archetype); updateArchetypesList(archetype); } @@ -222,7 +220,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { myBuilder.setArchetype(null); } else { - myBuilder.setArchetype(new ArchetypeInfo(archGroupId, archArtifactId, archVersion, null, null)); + myBuilder.setArchetype(new MavenArchetype(archGroupId, archArtifactId, archVersion, null, null)); } } @@ -230,7 +228,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { saveValue(INHERIT_GROUP_ID_KEY, myInheritGroupIdCheckBox.isSelected()); saveValue(INHERIT_VERSION_KEY, myInheritVersionCheckBox.isSelected()); - ArchetypeInfo arch = getSelectedArchetype(); + MavenArchetype arch = getSelectedArchetype(); saveValue(ARCHETYPE_GROUP_ID_KEY, arch == null ? null : arch.groupId); saveValue(ARCHETYPE_ARTIFACT_ID_KEY, arch == null ? null : arch.artifactId); saveValue(ARCHETYPE_VERSION_KEY, arch == null ? null : arch.version); @@ -273,7 +271,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { myInheritGroupIdCheckBox.setSelected(myBuilder.isInheritGroupId()); myInheritVersionCheckBox.setSelected(myBuilder.isInheritVersion()); - ArchetypeInfo selectedArch = getSelectedArchetype(); + MavenArchetype selectedArch = getSelectedArchetype(); if (selectedArch == null) { selectedArch = myBuilder.getArchetype(); } @@ -283,7 +281,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { updateComponents(); } - private void updateArchetypesList(final ArchetypeInfo selected) { + private void updateArchetypesList(final MavenArchetype selected) { myLoadingCancelled.set(true); myLoadingCancelled = new AtomicBoolean(); final AtomicBoolean currentStatus = myLoadingCancelled; @@ -298,7 +296,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { catch (InterruptedException e) { throw new RuntimeException(e); } - final Set archetypes = MavenIndicesManager.getInstance().getArchetypes(); + final Set archetypes = MavenIndicesManager.getInstance().getArchetypes(); SwingUtilities.invokeLater(new Runnable() { public void run() { @@ -325,7 +323,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { } private void updateArchetypeDescription() { - ArchetypeInfo sel = getSelectedArchetype(); + MavenArchetype sel = getSelectedArchetype(); String desc = sel == null ? null : sel.description; if (StringUtil.isEmptyOrSpaces(desc)) { myArchetypeDescriptionScrollPane.setVisible(false); @@ -336,7 +334,7 @@ public class MavenModuleWizardStep extends ModuleWizardStep { myMainPanel.revalidate(); } - private TreePath findNodePath(ArchetypeInfo object, TreeModel model, Object parent) { + private TreePath findNodePath(MavenArchetype object, TreeModel model, Object parent) { for (int i = 0; i < model.getChildCount(parent); i++) { DefaultMutableTreeNode each = (DefaultMutableTreeNode)model.getChild(parent, i); if (each.getUserObject().equals(object)) return new TreePath(each.getPath()); @@ -347,11 +345,11 @@ public class MavenModuleWizardStep extends ModuleWizardStep { return null; } - private TreeNode groupAndSortArchetypes(Set archetypes) { - List list = new ArrayList(archetypes); + private TreeNode groupAndSortArchetypes(Set archetypes) { + List list = new ArrayList(archetypes); - Collections.sort(list, new Comparator() { - public int compare(ArchetypeInfo o1, ArchetypeInfo o2) { + Collections.sort(list, new Comparator() { + public int compare(MavenArchetype o1, MavenArchetype o2) { String key1 = o1.groupId + ":" + o1.artifactId; String key2 = o2.groupId + ":" + o2.artifactId; @@ -362,23 +360,23 @@ public class MavenModuleWizardStep extends ModuleWizardStep { } }); - Map> map = new TreeMap>(); + Map> map = new TreeMap>(); - for (ArchetypeInfo each : list) { + for (MavenArchetype each : list) { String key = each.groupId + ":" + each.artifactId; - List versions = map.get(key); + List versions = map.get(key); if (versions == null) { - versions = new ArrayList(); + versions = new ArrayList(); map.put(key, versions); } versions.add(each); } DefaultMutableTreeNode result = new DefaultMutableTreeNode("root", true); - for (List each : map.values()) { - ArchetypeInfo eachArchetype = each.get(0); + for (List each : map.values()) { + MavenArchetype eachArchetype = each.get(0); DefaultMutableTreeNode node = new DefaultMutableTreeNode(eachArchetype, true); - for (ArchetypeInfo eachVersion : each) { + for (MavenArchetype eachVersion : each) { DefaultMutableTreeNode versionNode = new DefaultMutableTreeNode(eachVersion, false); node.add(versionNode); } @@ -455,13 +453,13 @@ public class MavenModuleWizardStep extends ModuleWizardStep { myBuilder.setArchetype(getSelectedArchetype()); } - private ArchetypeInfo getSelectedArchetype() { + private MavenArchetype getSelectedArchetype() { if (!myUseArchetypeCheckBox.isSelected() || myArchetypesTree.isSelectionEmpty()) return null; return getArchetypeInfoFromPathComponent(myArchetypesTree.getLastSelectedPathComponent()); } - private ArchetypeInfo getArchetypeInfoFromPathComponent(Object sel) { - return (ArchetypeInfo)((DefaultMutableTreeNode)sel).getUserObject(); + private MavenArchetype getArchetypeInfoFromPathComponent(Object sel) { + return (MavenArchetype)((DefaultMutableTreeNode)sel).getUserObject(); } @Override @@ -478,9 +476,9 @@ public class MavenModuleWizardStep extends ModuleWizardStep { int row, boolean hasFocus) { Object userObject = ((DefaultMutableTreeNode)value).getUserObject(); - if (!(userObject instanceof ArchetypeInfo)) return; + if (!(userObject instanceof MavenArchetype)) return; - ArchetypeInfo info = (ArchetypeInfo)userObject; + MavenArchetype info = (MavenArchetype)userObject; if (leaf) { append(info.artifactId, SimpleTextAttributes.GRAY_ATTRIBUTES); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java index 981e2f1b1e8c..4bf5503461f5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java @@ -31,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenUIModifiableModelsProvider; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.*; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectOpenProcessor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectOpenProcessor.java index 1d0032c1a862..bff0d17a768b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectOpenProcessor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectOpenProcessor.java @@ -25,7 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectImport.ProjectOpenProcessorBase; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenProject; -import org.jetbrains.idea.maven.utils.MavenConstants; +import org.jetbrains.idea.maven.model.MavenConstants; import java.util.ArrayList; import java.util.Arrays; diff --git a/plugins/maven/src/main/resources/IndicesBundle.properties b/plugins/maven/src/main/resources/IndicesBundle.properties index b239f68af9b7..a0e6b9e678b4 100644 --- a/plugins/maven/src/main/resources/IndicesBundle.properties +++ b/plugins/maven/src/main/resources/IndicesBundle.properties @@ -6,6 +6,5 @@ maven.index.updated.never=Never maven.index.updated.error=Error maven.indices.updating=Updating Maven Repository Indices... maven.indices.updating.index=Updating [{0}] {1} -maven.indices.updating.processing=Processing indices... repository.plugin.corrupt={0} not a Maven 2 plugin file repository.plugin.title=Opening Maven plugin file \ No newline at end of file diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 7709f41d6afa..13f14ad673c2 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -11,7 +11,7 @@ com.intellij.properties - org.intellij.groovy + org.intellij.groovy @@ -20,6 +20,9 @@ + + @@ -73,9 +76,6 @@ - - @@ -399,10 +399,10 @@ + use-shortcut-of="IntroduceVariable"/> + class="org.jetbrains.idea.maven.dom.refactorings.extract.ExtractDependenciesAction"> diff --git a/plugins/maven/src/main/resources/ProjectBundle.properties b/plugins/maven/src/main/resources/ProjectBundle.properties index b1eb46f0898e..3a5fda1e6ab7 100644 --- a/plugins/maven/src/main/resources/ProjectBundle.properties +++ b/plugins/maven/src/main/resources/ProjectBundle.properties @@ -16,8 +16,6 @@ maven.downloading=Downloading Maven sources and documentation... maven.downloading.sources=Downloading Maven sources... maven.downloading.docs=Downloading Maven documentation... maven.downloading.finished=Finished downloading -maven.transfer.progress={0}/{1}K [{2}] {3} -maven.transfer.start=Checking [{0}] {1} maven.action.download.sources=Download Sources maven.action.download.sources.busy.text=Download sources... @@ -69,7 +67,6 @@ maven.ignore.edit=Edit Ignored Files... maven.profile.activate=Activate maven.profile.deactivate=Deactivate -maven.project.problem.syntaxError=''{0}'' has syntax errors maven.project.problem.recursiveInheritance=Recursive inheritance found maven.project.problem.selfInheritance=Self-inheritance found maven.project.problem.parentHasProblems=Parent ''{0}'' has problems diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenCustomRepositoryHelper.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenCustomRepositoryHelper.java similarity index 98% rename from plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenCustomRepositoryHelper.java rename to plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenCustomRepositoryHelper.java index 0c432d998727..191bbb1539fc 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenCustomRepositoryHelper.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenCustomRepositoryHelper.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.indices; +package org.jetbrains.idea.maven; import com.intellij.openapi.application.PluginPathManager; import com.intellij.openapi.util.io.FileUtil; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java index fda2567350e4..4d3b982135f4 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java @@ -38,6 +38,7 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.util.PathUtil; +import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.execution.*; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java index 838e9ca5f258..6b05726cdc30 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java @@ -33,7 +33,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; -import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; @@ -202,7 +201,7 @@ public abstract class MavenTestCase extends UsefulTestCase { } protected void setRepositoryPath(String path) { - getMavenGeneralSettings().setLocalRepository(path); + getMavenGeneralSettings().setOverridenLocalRepository(path); } protected String getProjectPath() { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/NullMavenConsole.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/NullMavenConsole.java index 1975b8da15b5..2bd3950452e8 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/NullMavenConsole.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/NullMavenConsole.java @@ -15,9 +15,9 @@ */ package org.jetbrains.idea.maven; -import org.jetbrains.idea.maven.embedder.MavenConsole; -import org.jetbrains.idea.maven.embedder.MavenExecutionOptions; import com.intellij.execution.process.ProcessHandler; +import org.jetbrains.idea.maven.execution.MavenExecutionOptions; +import org.jetbrains.idea.maven.project.MavenConsole; public class NullMavenConsole extends MavenConsole { public NullMavenConsole() { @@ -38,6 +38,6 @@ public class NullMavenConsole extends MavenConsole { public void attachToProcess(ProcessHandler processHandler) { } - protected void doPrint(String text, OutputType type) { + protected void doPrint(String text, MavenConsole.OutputType type) { } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AddingDependencyTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AddingDependencyTest.java index 9ca0a037b7cc..8e6a55766770 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AddingDependencyTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/AddingDependencyTest.java @@ -16,10 +16,10 @@ package org.jetbrains.idea.maven.importing; import com.intellij.util.io.ReadOnlyAttributeUtil; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; -import org.jetbrains.idea.maven.project.MavenArtifact; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenId; import java.io.File; import java.util.List; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java index f2bdd1982bf0..6eeba7af237d 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/ArtifactsDownloadingTest.java @@ -17,11 +17,11 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; -import org.jetbrains.idea.maven.project.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenArtifact; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenArtifactDownloader; -import org.jetbrains.idea.maven.project.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import java.io.File; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java index 0fa9553d59e7..3f94e53655f2 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesImportingTest.java @@ -23,8 +23,8 @@ import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.project.MavenProject; import java.io.File; @@ -1352,7 +1352,7 @@ public class DependenciesImportingTest extends MavenImportingTestCase { "jar://" + getRepositoryPath() + "/junit/junit/4.0/junit-4.0-javadoc.jar!/"); setRepositoryPath(new File(myDir, "__repo").getPath()); - myProjectsManager.getEmbeddersManagerInTests().reset(); // to recognize repository change + myProjectsManager.getEmbeddersManager().reset(); // to recognize repository change scheduleResolveAll(); resolveDependenciesAndImport(); @@ -1384,7 +1384,7 @@ public class DependenciesImportingTest extends MavenImportingTestCase { "jar://" + getRepositoryPath() + "/org/testng/testng/5.8/testng-5.8-javadoc.jar!/"); setRepositoryPath(new File(myDir, "__repo").getPath()); - myProjectsManager.getEmbeddersManagerInTests().reset(); // to recognize repository change + myProjectsManager.getEmbeddersManager().reset(); // to recognize repository change scheduleResolveAll(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesManagementTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesManagementTest.java index dd7d576b11e6..c886494cc88c 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesManagementTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/DependenciesManagementTest.java @@ -122,7 +122,7 @@ public class DependenciesManagementTest extends MavenImportingTestCase { // reset embedders and try to resolve project from scratch in specific order - imported one goes first // to make maven cache it. we have to ensure that dependent project will be resolved correctly after that - myProjectsManager.getEmbeddersManagerInTests().releaseForcefullyInTests(); + myProjectsManager.getEmbeddersManager().releaseForcefullyInTests(); myProjectsManager.scheduleResolveInTests(Arrays.asList(myProjectsManager.findProject(bom), myProjectsManager.findProject(project))); myProjectsManager.waitForResolvingCompletion(); @@ -181,7 +181,7 @@ public class DependenciesManagementTest extends MavenImportingTestCase { assertModuleLibDeps("project", "Maven: junit:junit:4.0"); - myProjectsManager.getEmbeddersManagerInTests().reset(); + myProjectsManager.getEmbeddersManager().reset(); myProjectsManager.scheduleResolveInTests(Arrays.asList(myProjectsManager.findProject(parent), myProjectsManager.findProject(project))); myProjectsManager.waitForResolvingCompletion(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java index e2e8c0fe4ae4..dc553b513a9b 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java @@ -19,9 +19,7 @@ import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; -import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.utils.Path; import java.io.File; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/InvalidProjectImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/InvalidProjectImportingTest.java index 5189db5dd78c..d35a13b1f4a8 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/InvalidProjectImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/InvalidProjectImportingTest.java @@ -15,10 +15,10 @@ */ package org.jetbrains.idea.maven.importing; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.project.MavenProject; -import org.jetbrains.idea.maven.project.MavenProjectProblem; +import org.jetbrains.idea.maven.model.MavenProjectProblem; import java.util.ArrayList; import java.util.List; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java index 6f18da54b66e..a81fb83caeb4 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java @@ -21,10 +21,9 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; -import org.jetbrains.idea.maven.indices.MavenCustomRepositoryHelper; -import org.jetbrains.idea.maven.project.MavenProjectProblem; +import org.jetbrains.idea.maven.model.MavenProjectProblem; import java.io.File; import java.util.List; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesManagerTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesManagerTest.java index 8c111a958d0b..ad4c0e9a93e2 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesManagerTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesManagerTest.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.util.Pair; +import org.jetbrains.idea.maven.model.MavenArchetype; import java.io.File; import java.util.ArrayList; @@ -98,7 +99,7 @@ public class MavenIndicesManagerTest extends MavenIndicesTestCase { } public void testAddingArchetypes() throws Exception { - myIndicesFixture.getIndicesManager().addArchetype(new ArchetypeInfo("myGroup", + myIndicesFixture.getIndicesManager().addArchetype(new MavenArchetype("myGroup", "myArtifact", "666", null, @@ -113,9 +114,9 @@ public class MavenIndicesManagerTest extends MavenIndicesTestCase { } private void assertArchetypeExists(String archetypeId) { - Set achetypes = myIndicesFixture.getIndicesManager().getArchetypes(); + Set achetypes = myIndicesFixture.getIndicesManager().getArchetypes(); List actualNames = new ArrayList(); - for (ArchetypeInfo each : achetypes) { + for (MavenArchetype each : achetypes) { actualNames.add(each.groupId + ":" + each.artifactId + ":" + each.version); } assertTrue(actualNames.toString(), actualNames.contains(archetypeId)); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesStressTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesStressTest.java index b51c2eaa5af6..3386520b7bef 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesStressTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesStressTest.java @@ -17,7 +17,10 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProcessCanceledException; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.MavenIndexerWrapper; +import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import java.io.File; import java.util.Random; @@ -33,10 +36,10 @@ public abstract class MavenIndicesStressTest extends MavenIndicesTestCase implem helper.copy("local2", "local1"); //setRepositoryPath(fixture.getTestDataPath("local1")); - final MavenEmbedderWrapper embedder = MavenEmbedderWrapper.create(getMavenGeneralSettings()); + final MavenIndexerWrapper indexer = MavenFacadeManager.getInstance().createIndexer(); File indicesDir = new File(myDir, "indices"); - final MavenIndices indices = new MavenIndices(embedder, indicesDir, this); + final MavenIndices indices = new MavenIndices(indexer, indicesDir, this); final MavenIndex index = indices.add("id", getRepositoryPath(), MavenIndex.Kind.LOCAL); final AtomicBoolean isFinished = new AtomicBoolean(false); @@ -46,10 +49,10 @@ public abstract class MavenIndicesStressTest extends MavenIndicesTestCase implem try { for (int i = 0; i < 3; i++) { System.out.println("INDEXING #" + i); - indices.updateOrRepair(index, embedder, true, new EmptyProgressIndicator()); + indices.updateOrRepair(index, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); } } - catch (ProcessCanceledException e) { + catch (MavenProcessCanceledException e) { throw new RuntimeException(e); } finally { @@ -93,18 +96,18 @@ public abstract class MavenIndicesStressTest extends MavenIndicesTestCase implem helper.copy("local2", "local1"); setRepositoryPath(helper.getTestDataPath("local1")); - MavenEmbedderWrapper embedder = MavenEmbedderWrapper.create(getMavenGeneralSettings()); + final MavenIndexerWrapper indexer = MavenFacadeManager.getInstance().createIndexer(); File indicesDir = new File(myDir, "indices"); - MavenIndices indices = new MavenIndices(embedder, indicesDir, this); + MavenIndices indices = new MavenIndices(indexer, indicesDir, this); MavenIndex index = indices.add("id", getRepositoryPath(), MavenIndex.Kind.LOCAL); //index.addArtifact(new MavenId("group1", "artifact1", "1")); fail(); indices.close(); - MavenIndices indices1 = new MavenIndices(embedder, indicesDir, this); - MavenIndices indices2 = new MavenIndices(embedder, indicesDir, this); + MavenIndices indices1 = new MavenIndices(indexer, indicesDir, this); + MavenIndices indices2 = new MavenIndices(indexer, indicesDir, this); AtomicInteger finishedCount = new AtomicInteger(0); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTest.java index 2ef5eaee4ee1..5b95798475fa 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTest.java @@ -19,10 +19,12 @@ import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.util.io.FileUtil; import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; -import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.WildcardQuery; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; -import org.sonatype.nexus.index.ArtifactInfo; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; +import org.jetbrains.idea.maven.facade.MavenFacadeIndexer; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; +import org.jetbrains.idea.maven.facade.MavenIndexerWrapper; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; import java.io.File; import java.io.FileWriter; @@ -33,7 +35,7 @@ import java.util.List; public class MavenIndicesTest extends MavenIndicesTestCase { private MavenCustomRepositoryHelper myRepositoryHelper; private MavenIndices myIndices; - private MavenEmbedderWrapper myEmbedder; + private MavenIndexerWrapper myIndexer; private File myIndicesDir; private boolean isBroken; @@ -55,9 +57,9 @@ public class MavenIndicesTest extends MavenIndicesTestCase { } private void initIndices(String relativeDir) { - myEmbedder = MavenEmbedderWrapper.create(getMavenGeneralSettings()); + myIndexer = MavenFacadeManager.getInstance().createIndexer(); myIndicesDir = new File(myDir, relativeDir); - myIndices = new MavenIndices(myEmbedder, myIndicesDir, new MavenIndex.IndexListener() { + myIndices = new MavenIndices(myIndexer, myIndicesDir, new MavenIndex.IndexListener() { public void indexIsBroken(MavenIndex index) { isBroken = true; } @@ -66,12 +68,12 @@ public class MavenIndicesTest extends MavenIndicesTestCase { private void shutdownIndices() throws Exception { myIndices.close(); - myEmbedder.release(); + myIndexer.release(); } public void testCreatingAndUpdatingLocal() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "junit"); } @@ -79,8 +81,8 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testCreatingSeveral() throws Exception { MavenIndex i1 = myIndices.add("id1", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); MavenIndex i2 = myIndices.add("id2", myRepositoryHelper.getTestDataPath("local2"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i1, myEmbedder, true, new EmptyProgressIndicator()); - myIndices.updateOrRepair(i2, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i1, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + myIndices.updateOrRepair(i2, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i1.getGroupIds(), "junit"); assertUnorderedElementsAreEqual(i2.getGroupIds(), "jmock"); @@ -90,8 +92,8 @@ public class MavenIndicesTest extends MavenIndicesTestCase { MavenIndex i1 = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); MavenIndex i2 = myIndices.add("id", myRepositoryHelper.getTestDataPath("local2"), MavenIndex.Kind.LOCAL); assertNotSame(i1, i2); - myIndices.updateOrRepair(i1, myEmbedder, true, new EmptyProgressIndicator()); - myIndices.updateOrRepair(i2, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i1, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + myIndices.updateOrRepair(i2, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i1.getGroupIds(), "junit"); assertUnorderedElementsAreEqual(i2.getGroupIds(), "jmock"); @@ -101,9 +103,9 @@ public class MavenIndicesTest extends MavenIndicesTestCase { MavenIndex i1 = myIndices.add("id1", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); MavenIndex i2 = myIndices.add("id2", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); assertNotSame(i1, i2); - myIndices.updateOrRepair(i1, myEmbedder, true, new EmptyProgressIndicator()); - myIndices.updateOrRepair(i2, myEmbedder, true, new EmptyProgressIndicator()); - + myIndices.updateOrRepair(i1, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + myIndices.updateOrRepair(i2, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + assertUnorderedElementsAreEqual(i1.getGroupIds(), "junit"); assertUnorderedElementsAreEqual(i2.getGroupIds(), "junit"); } @@ -116,13 +118,13 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testUpdatingLocalClearsPreviousIndex() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "junit"); myRepositoryHelper.delete("local1"); myRepositoryHelper.copy("local2", "local1"); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "jmock"); } @@ -138,17 +140,17 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testAddingRemote() throws Exception { MavenIndex i = myIndices.add("id", "file:///" + myRepositoryHelper.getTestDataPath("remote"), MavenIndex.Kind.REMOTE); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "junit"); } public void testUpdatingRemote() throws Exception { MavenIndex i = myIndices.add("id", "file:///" + myRepositoryHelper.getTestDataPath("remote"), MavenIndex.Kind.REMOTE); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); //shouldn't throw 'The existing index is for repository [remote] and not for repository [xxx]' - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "junit"); } @@ -173,19 +175,19 @@ public class MavenIndicesTest extends MavenIndicesTestCase { } public void testAddingCorrectlyToIndexer() throws Exception { - assertEquals(0, myIndices.getIndexer().getIndexingContexts().size()); + assertEquals(0, myIndexer.getIndexCount()); MavenIndex i1 = myIndices.add("local", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - assertEquals(1, myIndices.getIndexer().getIndexingContexts().size()); + assertEquals(1, myIndexer.getIndexCount()); MavenIndex i2 = myIndices.add("local", myRepositoryHelper.getTestDataPath("local2"), MavenIndex.Kind.LOCAL); - assertEquals(2, myIndices.getIndexer().getIndexingContexts().size()); + assertEquals(2, myIndexer.getIndexCount()); - myIndices.updateOrRepair(i1, myEmbedder, true, new EmptyProgressIndicator()); - assertEquals(2, myIndices.getIndexer().getIndexingContexts().size()); + myIndices.updateOrRepair(i1, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + assertEquals(2, myIndexer.getIndexCount()); - myIndices.updateOrRepair(i2, myEmbedder, true, new EmptyProgressIndicator()); - assertEquals(2, myIndices.getIndexer().getIndexingContexts().size()); + myIndices.updateOrRepair(i2, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + assertEquals(2, myIndexer.getIndexCount()); } public void testClearingIndexDirOnLoadError() throws Exception { @@ -220,8 +222,8 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testLoadingIndexIfCachesAreBroken() throws Exception { MavenIndex i1 = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); MavenIndex i2 = myIndices.add("id", myRepositoryHelper.getTestDataPath("local2"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i1, myEmbedder, true, new EmptyProgressIndicator()); - myIndices.updateOrRepair(i2, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i1, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); + myIndices.updateOrRepair(i2, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i1.getGroupIds(), "junit"); assertUnorderedElementsAreEqual(i2.getGroupIds(), "jmock"); @@ -235,7 +237,7 @@ public class MavenIndicesTest extends MavenIndicesTestCase { assertTrue(myIndices.getIndices().get(0).getGroupIds().isEmpty()); assertUnorderedElementsAreEqual(myIndices.getIndices().get(1).getGroupIds(), "jmock"); - myIndices.updateOrRepair(myIndices.getIndices().get(0), myEmbedder, false, new EmptyProgressIndicator()); + myIndices.updateOrRepair(myIndices.getIndices().get(0), false, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(myIndices.getIndices().get(0).getGroupIds(), "junit"); } @@ -255,18 +257,18 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testAddingIndexWithExistingDirectoryDoesNotThrowException() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); shutdownIndices(); initIndices(); i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); } public void testSavingFailureMessage() throws Exception { MavenIndex i = myIndices.add("id", "xxx", MavenIndex.Kind.REMOTE); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); String message = i.getFailureMessage(); assertNotNull(message); @@ -279,7 +281,7 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testRepairingIndicesOnReadError() throws Exception { MavenIndex index = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(index, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(index, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); shutdownIndices(); damageFile(index, "groupIds.dat", false); @@ -292,13 +294,13 @@ public class MavenIndicesTest extends MavenIndicesTestCase { assertTrue(index.getGroupIds().isEmpty()); - myIndices.updateOrRepair(myIndices.getIndices().get(0), myEmbedder, false, new EmptyProgressIndicator()); + myIndices.updateOrRepair(myIndices.getIndices().get(0), false, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(index.getGroupIds(), "junit"); } public void testRepairingIndicesOnReadWhileAddingArtifact() throws Exception { MavenIndex index = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(index, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(index, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); shutdownIndices(); damageFile(index, "artifactIds-map.dat", false); @@ -311,7 +313,7 @@ public class MavenIndicesTest extends MavenIndicesTestCase { assertTrue(index.getGroupIds().isEmpty()); - myIndices.updateOrRepair(myIndices.getIndices().get(0), myEmbedder, false, new EmptyProgressIndicator()); + myIndices.updateOrRepair(myIndices.getIndices().get(0), false, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(index.getGroupIds(), "junit"); } @@ -337,7 +339,7 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testGettingArtifactInfos() throws Exception { myRepositoryHelper.copy("local2", "local1"); MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertUnorderedElementsAreEqual(i.getGroupIds(), "junit", "jmock"); @@ -357,9 +359,8 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testGettingArtifactInfosAfterReload() throws Exception { myIndices.updateOrRepair(myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL), - myEmbedder, true, - new EmptyProgressIndicator()); + getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); shutdownIndices(); initIndices(); @@ -370,7 +371,7 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testHasArtifactInfo() throws Exception { myRepositoryHelper.copy("local2", "local1"); MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); assertTrue(i.hasGroupId("junit")); assertTrue(i.hasGroupId("jmock")); @@ -387,45 +388,42 @@ public class MavenIndicesTest extends MavenIndicesTestCase { public void testSearching() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); - assertSearchResults(i, new TermQuery(new Term(ArtifactInfo.GROUP_ID, "junit")), + assertSearchResults(i, new WildcardQuery(new Term(MavenFacadeIndexer.SEARCH_TERM_COORDINATES, "*junit*")), "junit:junit:3.8.1", "junit:junit:3.8.2", "junit:junit:4.0"); } public void testSearchingAfterArtifactAddition() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); i.addArtifact(new File(myRepositoryHelper.getTestDataPath("local2/jmock/jmock/1.0.0/jmock-1.0.0.jar"))); - assertSearchResults(i, new TermQuery(new Term(ArtifactInfo.GROUP_ID, "jmock")), - "jmock:jmock:1.0.0"); + assertSearchResults(i, new WildcardQuery(new Term(MavenFacadeIndexer.SEARCH_TERM_COORDINATES, "*jmock*")), "jmock:jmock:1.0.0"); } private void assertSearchResults(MavenIndex i, Query query, String... expectedArtifacts) { List actualArtifacts = new ArrayList(); - for (ArtifactInfo each : i.search(query, 100)) { - actualArtifacts.add(each.groupId + ":" + each.artifactId + ":" + each.version); + for (MavenArtifactInfo each : i.search(query, 100)) { + actualArtifacts.add(each.getGroupId() + ":" + each.getArtifactId() + ":" + each.getVersion()); } assertUnorderedElementsAreEqual(actualArtifacts, expectedArtifacts); } public void testSearchingForClasses() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); - assertSearchResults(i, new WildcardQuery(new Term(ArtifactInfo.NAMES, "*runwith*")), - "junit:junit:4.0"); + assertSearchResults(i, new WildcardQuery(new Term(MavenFacadeIndexer.SEARCH_TERM_CLASS_NAMES, "*runwith*")), "junit:junit:4.0"); } public void testSearchingForClassesAfterArtifactAddition() throws Exception { MavenIndex i = myIndices.add("id", myRepositoryHelper.getTestDataPath("local1"), MavenIndex.Kind.LOCAL); - myIndices.updateOrRepair(i, myEmbedder, true, new EmptyProgressIndicator()); + myIndices.updateOrRepair(i, true, getMavenGeneralSettings(), EMPTY_MAVEN_PROCESS); i.addArtifact(new File(myRepositoryHelper.getTestDataPath("local2/jmock/jmock/1.0.0/jmock-1.0.0.jar"))); - assertSearchResults(i, new WildcardQuery(new Term(ArtifactInfo.NAMES, "*mock*")), - "jmock:jmock:1.0.0"); + assertSearchResults(i, new WildcardQuery(new Term(MavenFacadeIndexer.SEARCH_TERM_CLASS_NAMES, "*mock*")), "jmock:jmock:1.0.0"); } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTestFixture.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTestFixture.java index bb99d5dcfcbd..32acbc98daa2 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTestFixture.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenIndicesTestFixture.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.project.Project; import com.intellij.util.ArrayUtil; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.project.MavenProjectsManager; import java.io.File; @@ -49,7 +50,7 @@ public class MavenIndicesTestFixture { addToRepository(each); } - MavenProjectsManager.getInstance(myProject).getGeneralSettings().setLocalRepository(myRepositoryHelper.getTestDataPath(myLocalRepoDir)); + MavenProjectsManager.getInstance(myProject).getGeneralSettings().setOverridenLocalRepository(myRepositoryHelper.getTestDataPath(myLocalRepoDir)); getIndicesManager().setTestIndexDir(new File(myDir, "MavenIndices")); myIndicesManager = MavenProjectIndicesManager.getInstance(myProject); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenPluginInfoReaderTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenPluginInfoReaderTest.java index 8dfc5ed8f59f..f397347e4e64 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenPluginInfoReaderTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenPluginInfoReaderTest.java @@ -15,8 +15,9 @@ */ package org.jetbrains.idea.maven.indices; +import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenTestCase; -import org.jetbrains.idea.maven.project.MavenId; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.utils.MavenPluginInfo; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenSearcherTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenSearcherTest.java index 2aef5165cab6..8ee0e5599192 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenSearcherTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/indices/MavenSearcherTest.java @@ -15,7 +15,7 @@ */ package org.jetbrains.idea.maven.indices; -import org.sonatype.nexus.index.ArtifactInfo; +import org.jetbrains.idea.maven.model.MavenArtifactInfo; import java.util.ArrayList; import java.util.List; @@ -114,9 +114,9 @@ public class MavenSearcherTest extends MavenIndicesTestCase { List actualArtifacts = new ArrayList(); for (MavenClassSearchResult eachResult : new MavenClassSearcher().search(myProject, pattern, 100)) { String s = eachResult.className + "(" + eachResult.packageName + ")"; - for (ArtifactInfo eachVersion : eachResult.versions) { + for (MavenArtifactInfo eachVersion : eachResult.versions) { if (s.length() > 0) s += " "; - s += eachVersion.groupId + ":" + eachVersion.artifactId + ":" + eachVersion.version; + s += eachVersion.getGroupId() + ":" + eachVersion.getArtifactId()+ ":" + eachVersion.getVersion(); } actualArtifacts.add(s); } @@ -127,9 +127,9 @@ public class MavenSearcherTest extends MavenIndicesTestCase { List actual = new ArrayList(); for (MavenArtifactSearchResult eachResult : new MavenArtifactSearcher().search(myProject, pattern, 100)) { String s = ""; - for (ArtifactInfo eachVersion : eachResult.versions) { + for (MavenArtifactInfo eachVersion : eachResult.versions) { if (s.length() > 0) s += " "; - s += eachVersion.groupId + ":" + eachVersion.artifactId + ":" + eachVersion.version; + s += eachVersion.getGroupId() + ":" + eachVersion.getArtifactId()+ ":" + eachVersion.getVersion(); } actual.add(s); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenEmbeddersManagerTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenEmbeddersManagerTest.java index a7b2bc63c3cf..fa95be7dc646 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenEmbeddersManagerTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenEmbeddersManagerTest.java @@ -16,7 +16,7 @@ package org.jetbrains.idea.maven.project; import org.jetbrains.idea.maven.MavenTestCase; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenEmbedderWrapper; public class MavenEmbeddersManagerTest extends MavenTestCase { private MavenEmbeddersManager myManager; @@ -24,7 +24,7 @@ public class MavenEmbeddersManagerTest extends MavenTestCase { @Override protected void setUp() throws Exception { super.setUp(); - myManager = new MavenEmbeddersManager(getMavenGeneralSettings()); + myManager = new MavenEmbeddersManager(myProject); } @Override @@ -34,52 +34,52 @@ public class MavenEmbeddersManagerTest extends MavenTestCase { } public void testBasics() throws Exception { - MavenEmbedderWrapper one = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_FOLDERS_RESOLVE); - MavenEmbedderWrapper two = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one = myManager.getEmbedder(MavenEmbeddersManager.FOR_FOLDERS_RESOLVE); + MavenEmbedderWrapper two = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); assertNotSame(one, two); } public void testForSameId() throws Exception { - MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); - MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); assertNotSame(one1, one2); myManager.release(one1); - MavenEmbedderWrapper one3 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one3 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); assertSame(one1, one3); } public void testCachingOnlyOne() throws Exception { - MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); - MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); assertNotSame(one1, one2); myManager.release(one1); myManager.release(one2); - MavenEmbedderWrapper one11 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); - MavenEmbedderWrapper one22 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one11 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one22 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); assertSame(one1, one11); assertNotSame(one2, one22); } public void testResettingAllCachedAndInUse() throws Exception { - MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); - MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_FOLDERS_RESOLVE); + MavenEmbedderWrapper one1 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one2 = myManager.getEmbedder(MavenEmbeddersManager.FOR_FOLDERS_RESOLVE); myManager.release(one1); myManager.reset(); myManager.release(one2); - MavenEmbedderWrapper one11 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_DEPENDENCIES_RESOLVE); - MavenEmbedderWrapper one22 = myManager.getEmbedder(MavenEmbeddersManager.EmbedderKind.FOR_FOLDERS_RESOLVE); + MavenEmbedderWrapper one11 = myManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); + MavenEmbedderWrapper one22 = myManager.getEmbedder(MavenEmbeddersManager.FOR_FOLDERS_RESOLVE); assertNotSame(one1, one11); assertNotSame(one2, one22); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java index efd4e6bf6b91..1bb850520a86 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java @@ -21,12 +21,9 @@ import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import org.apache.maven.model.Build; -import org.apache.maven.model.Parent; -import org.apache.maven.model.Profile; -import org.apache.maven.model.Resource; import org.jetbrains.idea.maven.MavenTestCase; -import org.jetbrains.idea.maven.embedder.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.facade.MavenFacadeUtil; +import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.utils.MavenUtil; import java.io.File; @@ -41,10 +38,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "project" + "1"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); - - assertEquals(new File(myProjectPom.getPath()), p.getFile()); - assertEquals(new File(myProjectRoot.getPath()), p.getBasedir()); + MavenId p = readProject(myProjectPom).getMavenId(); assertEquals("test", p.getGroupId()); assertEquals("project", p.getArtifactId()); @@ -67,10 +61,7 @@ public class MavenProjectReaderTest extends MavenTestCase { MavenProjectReaderResult result = readProject(myProjectPom, new NullProjectLocator()); assertProblems(result, "'pom.xml' has syntax errors"); - org.apache.maven.project.MavenProject p = result.nativeMavenProject; - - assertEquals(new File(myProjectPom.getPath()), p.getFile()); - assertEquals(new File(myProjectRoot.getPath()), p.getBasedir()); + MavenId p = result.mavenModel.getMavenId(); assertEquals("test", p.getGroupId()); assertEquals("project", p.getArtifactId()); @@ -88,7 +79,7 @@ public class MavenProjectReaderTest extends MavenTestCase { MavenProjectReaderResult result = readProject(myProjectPom, new NullProjectLocator()); assertProblems(result, "'pom.xml' has syntax errors"); - org.apache.maven.project.MavenProject p = result.nativeMavenProject; + MavenModel p = result.mavenModel; assertEquals("a0x0a", p.getName()); } @@ -158,14 +149,11 @@ public class MavenProjectReaderTest extends MavenTestCase { MavenProjectReaderResult readResult = readProject(myProjectPom, new NullProjectLocator()); assertProblems(readResult, "'pom.xml' has syntax errors"); - org.apache.maven.project.MavenProject p = readResult.nativeMavenProject; + MavenModel p = readResult.mavenModel; - assertEquals(new File(myProjectPom.getPath()), p.getFile()); - assertEquals(new File(myProjectRoot.getPath()), p.getBasedir()); - - assertEquals("test", p.getGroupId()); - assertEquals("project", p.getArtifactId()); - assertEquals("Unknown", p.getVersion()); + assertEquals("test", p.getMavenId().getGroupId()); + assertEquals("project", p.getMavenId().getArtifactId()); + assertEquals("Unknown", p.getMavenId().getVersion()); assertEquals("foo", p.getName()); } @@ -179,38 +167,35 @@ public class MavenProjectReaderTest extends MavenTestCase { MavenProjectReaderResult readResult = readProject(myProjectPom, new NullProjectLocator()); assertProblems(readResult, "'pom.xml' has syntax errors"); - org.apache.maven.project.MavenProject p = readResult.nativeMavenProject; + MavenModel p = readResult.mavenModel; - assertEquals(new File(myProjectPom.getPath()), p.getFile()); - assertEquals(new File(myProjectRoot.getPath()), p.getBasedir()); - - assertEquals("test", p.getGroupId()); - assertEquals("project", p.getArtifactId()); - assertEquals("1", p.getVersion()); + assertEquals("test", p.getMavenId().getGroupId()); + assertEquals("project", p.getMavenId().getArtifactId()); + assertEquals("1", p.getMavenId().getVersion()); assertEquals("foo", p.getName()); } public void testEmpty() throws Exception { createProjectPom(""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); - assertEquals("Unknown", p.getGroupId()); - assertEquals("Unknown", p.getArtifactId()); - assertEquals("Unknown", p.getVersion()); + assertEquals("Unknown", p.getMavenId().getGroupId()); + assertEquals("Unknown", p.getMavenId().getArtifactId()); + assertEquals("Unknown", p.getMavenId().getVersion()); } public void testSpacesInTest() throws Exception { createProjectPom("foo bar"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("foo bar", p.getName()); } public void testTextInContainerTag() throws Exception { createProjectPom("foo name bar"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("name", p.getName()); } @@ -222,30 +207,27 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(file); + MavenModel p = readProject(file); - assertEquals("4.0.0", p.getModelVersion()); assertEquals("jar", p.getPackaging()); - assertNull(p.getModel().getName()); + assertNull(p.getName()); assertNull(p.getParent()); - assertNull(p.getParentArtifact()); - Build build = p.getBuild(); - assertNotNull(build); - assertEquals("project-1", build.getFinalName()); - assertEquals(null, build.getDefaultGoal()); - assertPathEquals(pathFromBasedir("src/main/java"), build.getSourceDirectory()); - assertPathEquals(pathFromBasedir("src/test/java"), build.getTestSourceDirectory()); - assertPathEquals(pathFromBasedir("src/main/scripts"), build.getScriptSourceDirectory()); - assertEquals(1, build.getResources().size()); - assertResource((Resource)build.getResources().get(0), pathFromBasedir("src/main/resources"), + assertEquals("project-1", p.getBuild().getFinalName()); + assertEquals(null, p.getBuild().getDefaultGoal()); + assertSize(1, p.getBuild().getSources()); + assertPathEquals(pathFromBasedir("src/main/java"), p.getBuild().getSources().get(0)); + assertSize(1, p.getBuild().getTestSources()); + assertPathEquals(pathFromBasedir("src/test/java"), p.getBuild().getTestSources().get(0)); + assertEquals(1, p.getBuild().getResources().size()); + assertResource(p.getBuild().getResources().get(0), pathFromBasedir("src/main/resources"), false, null, Collections.EMPTY_LIST, Collections.EMPTY_LIST); - assertEquals(1, build.getTestResources().size()); - assertResource((Resource)build.getTestResources().get(0), pathFromBasedir("src/test/resources"), + assertEquals(1, p.getBuild().getTestResources().size()); + assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("src/test/resources"), false, null, Collections.EMPTY_LIST, Collections.EMPTY_LIST); - assertPathEquals(pathFromBasedir("target"), build.getDirectory()); - assertPathEquals(pathFromBasedir("target/classes"), build.getOutputDirectory()); - assertPathEquals(pathFromBasedir("target/test-classes"), build.getTestOutputDirectory()); + assertPathEquals(pathFromBasedir("target"), p.getBuild().getDirectory()); + assertPathEquals(pathFromBasedir("target/classes"), p.getBuild().getOutputDirectory()); + assertPathEquals(pathFromBasedir("target/test-classes"), p.getBuild().getTestOutputDirectory()); } public void testDefaultsForParent() throws Exception { @@ -257,9 +239,9 @@ public class MavenProjectReaderTest extends MavenTestCase { " dummy" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); - assertParent(p, "Unknown", "Unknown", "Unknown", "../pom.xml"); + assertParent(p, "Unknown", "Unknown", "Unknown"); } public void testTakingCoordinatesFromParent() throws Exception { @@ -269,11 +251,11 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenId id = readProject(myProjectPom).getMavenId(); - assertEquals("test", p.getGroupId()); - assertEquals("Unknown", p.getArtifactId()); - assertEquals("1", p.getVersion()); + assertEquals("test", id.getGroupId()); + assertEquals("Unknown", id.getArtifactId()); + assertEquals("1", id.getVersion()); } public void testCustomSettings() throws Exception { @@ -320,30 +302,28 @@ public class MavenProjectReaderTest extends MavenTestCase { " " + ""); - org.apache.maven.project.MavenProject p = readProject(file); + MavenModel p = readProject(file); - assertEquals("1.2.3", p.getModelVersion()); assertEquals("pom", p.getPackaging()); assertEquals("foo", p.getName()); - assertParent(p, "testParent", "projectParent", "2", "../parent/pom.xml"); + assertParent(p, "testParent", "projectParent", "2"); - Build build = p.getBuild(); - assertNotNull(build); - assertEquals("xxx", build.getFinalName()); - assertEquals("someGoal", build.getDefaultGoal()); - assertPathEquals(pathFromBasedir("mySrc"), build.getSourceDirectory()); - assertPathEquals(pathFromBasedir("myTestSrc"), build.getTestSourceDirectory()); - assertPathEquals(pathFromBasedir("myScriptSrc"), build.getScriptSourceDirectory()); - assertEquals(1, build.getResources().size()); - assertResource((Resource)build.getResources().get(0), pathFromBasedir("myRes"), + assertEquals("xxx", p.getBuild().getFinalName()); + assertEquals("someGoal", p.getBuild().getDefaultGoal()); + assertSize(1, p.getBuild().getSources()); + assertPathEquals(pathFromBasedir("mySrc"), p.getBuild().getSources().get(0)); + assertSize(1, p.getBuild().getTestSources()); + assertPathEquals(pathFromBasedir("myTestSrc"), p.getBuild().getTestSources().get(0)); + assertEquals(1, p.getBuild().getResources().size()); + assertResource(p.getBuild().getResources().get(0), pathFromBasedir("myRes"), true, "dir", Collections.singletonList("**.properties"), Collections.singletonList("**.xml")); - assertEquals(1, build.getTestResources().size()); - assertResource((Resource)build.getTestResources().get(0), pathFromBasedir("myTestRes"), + assertEquals(1, p.getBuild().getTestResources().size()); + assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("myTestRes"), false, null, Collections.singletonList("**.properties"), Collections.EMPTY_LIST); - assertPathEquals(pathFromBasedir("myOutput"), build.getDirectory()); - assertPathEquals(pathFromBasedir("myClasses"), build.getOutputDirectory()); - assertPathEquals(pathFromBasedir("myTestClasses"), build.getTestOutputDirectory()); + assertPathEquals(pathFromBasedir("myOutput"), p.getBuild().getDirectory()); + assertPathEquals(pathFromBasedir("myClasses"), p.getBuild().getOutputDirectory()); + assertPathEquals(pathFromBasedir("myTestClasses"), p.getBuild().getTestOutputDirectory()); } public void testOutputPathsAreBasedOnTargetPath() throws Exception { @@ -354,13 +334,11 @@ public class MavenProjectReaderTest extends MavenTestCase { " my-target" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); - Build build = p.getBuild(); - assertNotNull(build); - assertPathEquals(pathFromBasedir("my-target"), build.getDirectory()); - assertPathEquals(pathFromBasedir("my-target/classes"), build.getOutputDirectory()); - assertPathEquals(pathFromBasedir("my-target/test-classes"), build.getTestOutputDirectory()); + assertPathEquals(pathFromBasedir("my-target"), p.getBuild().getDirectory()); + assertPathEquals(pathFromBasedir("my-target/classes"), p.getBuild().getOutputDirectory()); + assertPathEquals(pathFromBasedir("my-target/test-classes"), p.getBuild().getTestOutputDirectory()); } public void testDoesNotIncludeResourcesWithoutDirectory() throws Exception { @@ -377,11 +355,10 @@ public class MavenProjectReaderTest extends MavenTestCase { " " + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); - Build build = p.getBuild(); - assertEquals(0, build.getResources().size()); - assertEquals(0, build.getTestResources().size()); + assertEquals(0, p.getBuild().getResources().size()); + assertEquals(0, p.getBuild().getTestResources().size()); } public void testPathsWithProperties() throws Exception { @@ -407,21 +384,21 @@ public class MavenProjectReaderTest extends MavenTestCase { " ${foo}/myTestClasses" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); - Build build = p.getBuild(); - assertPathEquals(pathFromBasedir("subDir/mySrc"), build.getSourceDirectory()); - assertPathEquals(pathFromBasedir("subDir/myTestSrc"), build.getTestSourceDirectory()); - assertPathEquals(pathFromBasedir("subDir/myScriptSrc"), build.getScriptSourceDirectory()); - assertEquals(1, build.getResources().size()); - assertResource((Resource)build.getResources().get(0), pathFromBasedir("subDir/myRes"), + assertSize(1, p.getBuild().getSources()); + assertPathEquals(pathFromBasedir("subDir/mySrc"), p.getBuild().getSources().get(0)); + assertSize(1, p.getBuild().getTestSources()); + assertPathEquals(pathFromBasedir("subDir/myTestSrc"), p.getBuild().getTestSources().get(0)); + assertEquals(1, p.getBuild().getResources().size()); + assertResource(p.getBuild().getResources().get(0), pathFromBasedir("subDir/myRes"), false, null, Collections.EMPTY_LIST, Collections.EMPTY_LIST); - assertEquals(1, build.getTestResources().size()); - assertResource((Resource)build.getTestResources().get(0), pathFromBasedir("subDir/myTestRes"), + assertEquals(1, p.getBuild().getTestResources().size()); + assertResource(p.getBuild().getTestResources().get(0), pathFromBasedir("subDir/myTestRes"), false, null, Collections.EMPTY_LIST, Collections.EMPTY_LIST); - assertPathEquals(pathFromBasedir("subDir/myOutput"), build.getDirectory()); - assertPathEquals(pathFromBasedir("subDir/myClasses"), build.getOutputDirectory()); - assertPathEquals(pathFromBasedir("subDir/myTestClasses"), build.getTestOutputDirectory()); + assertPathEquals(pathFromBasedir("subDir/myOutput"), p.getBuild().getDirectory()); + assertPathEquals(pathFromBasedir("subDir/myClasses"), p.getBuild().getOutputDirectory()); + assertPathEquals(pathFromBasedir("subDir/myTestClasses"), p.getBuild().getTestOutputDirectory()); } public void testExpandingProperties() throws Exception { @@ -432,7 +409,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "${prop1}" + "${prop2}"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("value2", p.getPackaging()); @@ -446,7 +423,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "${prop1}" + "${prop2}"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("value12", p.getPackaging()); @@ -460,7 +437,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "${prop1}" + "${prop2}"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("${prop1}", p.getName()); assertEquals("${prop2}", p.getPackaging()); @@ -532,7 +509,7 @@ public class MavenProjectReaderTest extends MavenTestCase { createProjectPom("${java.home}" + "${env." + getEnvVar() + "}"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals(System.getProperty("java.home"), p.getName()); assertEquals(System.getenv(getEnvVar()), p.getPackaging()); } @@ -559,7 +536,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "
" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("value1", p.getName()); assertEquals("${prop2}", p.getPackaging()); } @@ -586,7 +563,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "
" + ""); - org.apache.maven.project.MavenProject p = readProject(myProjectPom, "two"); + MavenModel p = readProject(myProjectPom, "two"); assertEquals("${prop1}", p.getName()); assertEquals("value2", p.getPackaging()); } @@ -608,7 +585,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertEquals("value", p.getName()); } @@ -629,7 +606,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertEquals("${prop}", p.getName()); } @@ -651,7 +628,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertEquals("value", p.getName()); } @@ -683,7 +660,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(subModule); + MavenModel p = readProject(subModule); assertEquals("value", p.getName()); } @@ -706,7 +683,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertEquals("value", p.getName()); } @@ -729,7 +706,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertEquals("value", p.getName()); } @@ -755,7 +732,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(myProjectPom); + MavenModel p = readProject(myProjectPom); assertEquals("value", p.getName()); } @@ -777,11 +754,11 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "${prop}"); - org.apache.maven.project.MavenProject p = readProject(module, new MavenProjectReaderProjectLocator() { + MavenModel p = readProject(module, new MavenProjectReaderProjectLocator() { public VirtualFile findProjectFile(MavenId coordinates) { return new MavenId("test", "parent", "1").equals(coordinates) ? parent : null; } - }).nativeMavenProject; + }).mavenModel; assertEquals("value", p.getName()); } @@ -803,8 +780,8 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + "module"); - org.apache.maven.project.MavenProject p = readProject(module); - assertEquals("test:module:1", p.getGroupId() + ":" + p.getArtifactId() + ":" + p.getVersion()); + MavenId id = readProject(module).getMavenId(); + assertEquals("test:module:1", id.getGroupId() + ":" + id.getArtifactId() + ":" + id.getVersion()); } public void testInheritingSettingsFromParentAndAlignCorrectly() throws Exception { @@ -822,7 +799,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertPathEquals(pathFromBasedir(module.getParent(), "custom"), p.getBuild().getDirectory()); } @@ -845,7 +822,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(module); + MavenModel p = readProject(module); assertPathEquals(pathFromBasedir(module.getParent(), "subDir/custom"), p.getBuild().getDirectory()); } @@ -873,7 +850,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(module, "one"); + MavenModel p = readProject(module, "one"); assertPathEquals(pathFromBasedir(module.getParent(), "subDir/custom"), p.getBuild().getDirectory()); } @@ -886,7 +863,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " " + "
"); - org.apache.maven.project.MavenProject mavenProject = readProject(myProjectPom); + MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); @@ -902,7 +879,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " " + "
"); - org.apache.maven.project.MavenProject mavenProject = readProject(myProjectPom); + MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); @@ -920,7 +897,7 @@ public class MavenProjectReaderTest extends MavenTestCase { "
" + ""); - org.apache.maven.project.MavenProject mavenProject = readProject(myProjectPom); + MavenModel mavenProject = readProject(myProjectPom); assertEquals("${prop}", mavenProject.getName()); mavenProject = readProject(myProjectPom, "one"); @@ -943,7 +920,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(module, "one"); + MavenModel p = readProject(module, "one"); assertEquals("module-2", p.getBuild().getFinalName()); } @@ -967,7 +944,7 @@ public class MavenProjectReaderTest extends MavenTestCase { " 1" + ""); - org.apache.maven.project.MavenProject p = readProject(module, "one"); + MavenModel p = readProject(module, "one"); assertEquals("xxx", p.getBuild().getFinalName()); } @@ -1000,9 +977,9 @@ public class MavenProjectReaderTest extends MavenTestCase { "
" + ""); - org.apache.maven.project.MavenProject p = readProject(module); - assertOrderedElementsAreEqual(ContainerUtil.map(p.getModel().getProfiles(), new Function() { - public Object fun(Profile profile) { + MavenModel p = readProject(module); + assertOrderedElementsAreEqual(ContainerUtil.map(p.getProfiles(), new Function() { + public Object fun(MavenProfile profile) { return profile.getId(); } }), "profileFromChild", "profileFromParent"); @@ -1016,13 +993,13 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + " " + " profile" + - " parent" + + " parent" + " " + ""); VirtualFile parentProfiles = createProfilesXml("" + " profile" + - " parentProfiles" + + " parentProfiles" + ""); VirtualFile module = createModulePom("module", @@ -1039,27 +1016,27 @@ public class MavenProjectReaderTest extends MavenTestCase { "" + " " + " profile" + - " pom" + + " pom" + " " + ""); updateSettingsXml("" + " " + " profile" + - " settings" + + " settings" + " " + ""); VirtualFile profiles = createProfilesXml("module", "" + " profile" + - " profiles" + + " profiles" + ""); - org.apache.maven.project.MavenProject p = readProject(module); - assertEquals(1, p.getModel().getProfiles().size()); - assertEquals("pom", p.getModel().getProfiles().get(0).getProperties().getProperty("prop")); - assertEquals("pom", p.getModel().getProfiles().get(0).getSource()); + MavenModel p = readProject(module); + assertEquals(1, p.getProfiles().size()); + assertEquals("pom", p.getProfiles().get(0).getModules().get(0)); + assertEquals("pom", p.getProfiles().get(0).getSource()); createModulePom("module", "test" + @@ -1073,32 +1050,32 @@ public class MavenProjectReaderTest extends MavenTestCase { ""); p = readProject(module); - assertEquals(1, p.getModel().getProfiles().size()); - assertEquals("profiles", p.getModel().getProfiles().get(0).getProperties().getProperty("prop")); - assertEquals("profiles.xml", p.getModel().getProfiles().get(0).getSource()); + assertEquals(1, p.getProfiles().size()); + assertEquals("profiles", p.getProfiles().get(0).getModules().get(0)); + assertEquals("profiles.xml", p.getProfiles().get(0).getSource()); profiles.delete(this); p = readProject(module); - assertEquals(1, p.getModel().getProfiles().size()); - assertEquals("parent", p.getModel().getProfiles().get(0).getProperties().getProperty("prop")); - assertEquals("pom", p.getModel().getProfiles().get(0).getSource()); + assertEquals(1, p.getProfiles().size()); + assertEquals("parent", p.getProfiles().get(0).getModules().get(0)); + assertEquals("pom", p.getProfiles().get(0).getSource()); createProjectPom("test" + "parent" + "1"); p = readProject(module); - assertEquals(1, p.getModel().getProfiles().size()); - assertEquals("parentProfiles", p.getModel().getProfiles().get(0).getProperties().getProperty("prop")); - assertEquals("profiles.xml", p.getModel().getProfiles().get(0).getSource()); + assertEquals(1, p.getProfiles().size()); + assertEquals("parentProfiles", p.getProfiles().get(0).getModules().get(0)); + assertEquals("profiles.xml", p.getProfiles().get(0).getSource()); parentProfiles.delete(null); p = readProject(module); - assertEquals(1, p.getModel().getProfiles().size()); - assertEquals("settings", p.getModel().getProfiles().get(0).getProperties().getProperty("prop")); - assertEquals("settings.xml", p.getModel().getProfiles().get(0).getSource()); + assertEquals(1, p.getProfiles().size()); + assertEquals("settings", p.getProfiles().get(0).getModules().get(0)); + assertEquals("settings.xml", p.getProfiles().get(0).getSource()); } public void testActivatingProfilesByOS() throws Exception { @@ -1156,7 +1133,7 @@ public class MavenProjectReaderTest extends MavenTestCase { public void testActivatingProfilesByProperty() throws Exception { System.setProperty("maven.test.property", "foo"); - MavenEmbedderWrapper.resetSystemPropertiesCacheInTests(); + MavenFacadeUtil.resetSystemPropertiesCache(); createProjectPom("" + " " + @@ -1411,10 +1388,10 @@ public class MavenProjectReaderTest extends MavenTestCase { assertActiveProfiles("default", "profiles"); } - private org.apache.maven.project.MavenProject readProject(VirtualFile file, String... profiles) { + private MavenModel readProject(VirtualFile file, String... profiles) { MavenProjectReaderResult readResult = readProject(file, new NullProjectLocator(), profiles); assertProblems(readResult); - return readResult.nativeMavenProject; + return readResult.mavenModel; } private MavenProjectReaderResult readProject(VirtualFile file, @@ -1427,27 +1404,24 @@ public class MavenProjectReaderTest extends MavenTestCase { return result; } - private void assertParent(org.apache.maven.project.MavenProject p, + private void assertParent(MavenModel p, String groupId, String artifactId, - String version, - String relativePath) { - Parent parent = p.getModel().getParent(); - assertNotNull(parent); + String version) { + MavenId parent = p.getParent().getMavenId(); assertEquals(groupId, parent.getGroupId()); assertEquals(artifactId, parent.getArtifactId()); assertEquals(version, parent.getVersion()); - assertEquals(relativePath, parent.getRelativePath()); } - private void assertResource(Resource resource, + private void assertResource(MavenResource resource, String dir, boolean filtered, String targetPath, List includes, List excludes) { assertPathEquals(dir, resource.getDirectory()); - assertEquals(filtered, resource.isFiltering()); + assertEquals(filtered, resource.isFiltered()); assertPathEquals(targetPath, resource.getTargetPath()); assertOrderedElementsAreEqual(resource.getIncludes(), includes); assertOrderedElementsAreEqual(resource.getExcludes(), excludes); @@ -1466,9 +1440,10 @@ public class MavenProjectReaderTest extends MavenTestCase { } private void assertActiveProfiles(List explicitProfiles, String... expected) { - org.apache.maven.project.MavenProject p = readProject(myProjectPom, explicitProfiles.toArray(new String[explicitProfiles.size()])); - assertUnorderedElementsAreEqual(ContainerUtil.map((List)p.getActiveProfiles(), new Function() { - public String fun(Profile profile) { + MavenProjectReaderResult result = + readProject(myProjectPom, new NullProjectLocator(), explicitProfiles.toArray(new String[explicitProfiles.size()])); + assertUnorderedElementsAreEqual(ContainerUtil.map(result.activatedProfiles, new Function() { + public String fun(MavenProfile profile) { return profile.getId(); } }), expected); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectTest.java index 700ee3a1a070..a393b9b226df 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectTest.java @@ -18,11 +18,15 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; -import org.jdom.Element; import org.jetbrains.idea.maven.MavenImportingTestCase; +import org.jetbrains.idea.maven.model.MavenArtifactNode; +import org.jetbrains.idea.maven.model.MavenPlugin; +import org.jetbrains.idea.maven.model.MavenRemoteRepository; import org.jetbrains.idea.maven.utils.MavenJDOMUtil; +import java.io.File; import java.util.List; +import java.util.Map; public class MavenProjectTest extends MavenImportingTestCase { public void testCollectingPlugins() throws Exception { @@ -51,7 +55,7 @@ public class MavenProjectTest extends MavenImportingTestCase { assertDeclaredPlugins(p("group1", "id1"), p("group1", "id2"), p("group2", "id1")); } - + public void testPluginsContainDefaultPlugins() throws Exception { importProject("test" + "project" + @@ -616,11 +620,12 @@ public class MavenProjectTest extends MavenImportingTestCase { assertEquals("central", result.get(2).getId()); } - public void testStrippingDownMavenModel() throws Exception { + public void testMavenModelMap() throws Exception { importProject("test" + "project" + "1" + "" + + " foo" + " " + " " + " group1" + @@ -630,8 +635,15 @@ public class MavenProjectTest extends MavenImportingTestCase { " " + ""); - assertTrue(getMavenProject().getMavenModel().getBuild().getPlugins().isEmpty()); - assertTrue(getMavenProject().getMavenModel().getBuild().getPluginsAsMap().isEmpty()); + MavenProject p = getMavenProject(); + Map map = p.getModelMap(); + + assertEquals("test", map.get("groupId")); + assertTrue(map.get("build"), map.get("build").startsWith("org.apache.maven.model.Build@")); + assertEquals("foo", map.get("build.finalName")); + assertEquals(new File(p.getDirectory(), "target").toString(), map.get("build.directory")); + assertEquals(null, map.get("build.plugins")); + assertEquals(null, map.get("build.pluginMap")); } public void testDependenciesTree() throws Exception { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsManagerTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsManagerTest.java index 4d759370bde5..2e7b7544fc6d 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsManagerTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsManagerTest.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.idea.maven.MavenImportingTestCase; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import java.io.File; @@ -816,7 +817,7 @@ public class MavenProjectsManagerTest extends MavenImportingTestCase { myProjectsManager.addProjectsTreeListener(new MavenProjectsTree.ListenerAdapter() { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, Object message) { + NativeMavenProjectHolder nativeMavenProject, Object message) { called[0] = true; } }); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsTreeReadingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsTreeReadingTest.java index 48f9ae4e156a..2f06395edd15 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsTreeReadingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectsTreeReadingTest.java @@ -20,9 +20,11 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; +import org.jetbrains.idea.maven.facade.NativeMavenProjectHolder; import org.jetbrains.idea.maven.utils.MavenUtil; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -582,14 +584,14 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { myTree.addListener(listener); MavenProject project = myTree.findProject(myProjectPom); - MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(getMavenGeneralSettings()); - final org.apache.maven.project.MavenProject[] nativeProject = new org.apache.maven.project.MavenProject[1]; + MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(myProject); + final List nativeProject = new ArrayList(); try { myTree.addListener(new MavenProjectsTree.ListenerAdapter() { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, Object message) { - nativeProject[0] = nativeMavenProject; + NativeMavenProjectHolder nativeMavenProject, Object message) { + nativeProject.add(nativeMavenProject); } }); myTree.resolve(project, @@ -604,8 +606,9 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { } assertEquals("resolved: project ", listener.log); - assertNotNull(nativeProject[0]); assertTrue(project.hasReadingProblems()); + assertSize(1, nativeProject); + assertNull(nativeProject.get(0)); } public void testDoNotUpdateChildAfterParentWasResolved() throws Exception { @@ -631,13 +634,13 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { MavenProject parentProject = myTree.findProject(myProjectPom); - MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(getMavenGeneralSettings()); + MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(myProject); try { - final org.apache.maven.project.MavenProject[] nativeProject = new org.apache.maven.project.MavenProject[1]; + final NativeMavenProjectHolder[] nativeProject = new NativeMavenProjectHolder[1]; myTree.addListener(new MavenProjectsTree.ListenerAdapter() { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { nativeProject[0] = nativeMavenProject; } @@ -649,8 +652,7 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { EMPTY_MAVEN_PROCESS, null); myTree.resolvePlugins(parentProject, nativeProject[0], embeddersManager, NULL_MAVEN_CONSOLE, EMPTY_MAVEN_PROCESS); - myTree.resolveFolders(parentProject, getMavenGeneralSettings(), getMavenImporterSettings(), embeddersManager, NULL_MAVEN_CONSOLE, - EMPTY_MAVEN_PROCESS, null); + myTree.resolveFolders(parentProject, getMavenImporterSettings(), embeddersManager, NULL_MAVEN_CONSOLE, EMPTY_MAVEN_PROCESS, null); } finally { embeddersManager.release(); @@ -1821,7 +1823,7 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { MavenProject parentProject = myTree.findProject(myProjectPom); - MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(getMavenGeneralSettings()); + MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(myProject); try { myTree.resolve(parentProject, getMavenGeneralSettings(), embeddersManager, NULL_MAVEN_CONSOLE, EMPTY_MAVEN_PROCESS, null); } @@ -1894,7 +1896,7 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { updateAll(myProjectPom); - MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(getMavenGeneralSettings()); + MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(myProject); try { myTree.resolve(myTree.getRootProjects().get(0), getMavenGeneralSettings(), @@ -2019,7 +2021,7 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { assertPathEquals(pathFromBasedir("my-target/classes"), project.getOutputDirectory()); assertPathEquals(pathFromBasedir("my-target/test-classes"), project.getTestOutputDirectory()); - MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(getMavenGeneralSettings()); + MavenEmbeddersManager embeddersManager = new MavenEmbeddersManager(myProject); try { myTree.resolve(project, getMavenGeneralSettings(), embeddersManager, NULL_MAVEN_CONSOLE, EMPTY_MAVEN_PROCESS, null); } @@ -2056,7 +2058,7 @@ public class MavenProjectsTreeReadingTest extends MavenProjectsTreeTestCase { @Override public void projectResolved(Pair projectWithChanges, - org.apache.maven.project.MavenProject nativeMavenProject, + NativeMavenProjectHolder nativeMavenProject, Object message) { log += "resolved: " + projectWithChanges.first.getMavenId().getArtifactId() + " "; } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderTest.java index 0bc3bf083d10..f2cde0eb915d 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenModuleBuilderTest.java @@ -23,12 +23,11 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.idea.maven.MavenImportingTestCase; +import org.jetbrains.idea.maven.model.MavenArchetype; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProjectsManager; -import org.jetbrains.idea.maven.indices.ArchetypeInfo; import org.jetbrains.idea.maven.project.MavenProject; -import org.jetbrains.idea.maven.project.MavenId; -import java.io.File; import java.util.List; public class MavenModuleBuilderTest extends MavenImportingTestCase { @@ -77,7 +76,7 @@ public class MavenModuleBuilderTest extends MavenImportingTestCase { public void testCreatingFromArchetype() throws Exception { if (!hasMavenInstallation()) return; - setArchetype(new ArchetypeInfo("org.apache.maven.archetypes", "maven-archetype-quickstart", "1.0", null, null)); + setArchetype(new MavenArchetype("org.apache.maven.archetypes", "maven-archetype-quickstart", "1.0", null, null)); MavenId id = new MavenId("org.foo", "module", "1.0"); createNewModule(id); @@ -220,7 +219,7 @@ public class MavenModuleBuilderTest extends MavenImportingTestCase { setModuleNameAndRoot("module", getProjectPath() + "/module"); setParentProject(myProjectPom); setInheritedOptions(true, true); - setArchetype(new ArchetypeInfo("org.apache.maven.archetypes", "maven-archetype-quickstart", "1.0", null, null)); + setArchetype(new MavenArchetype("org.apache.maven.archetypes", "maven-archetype-quickstart", "1.0", null, null)); createNewModule(new MavenId("org.foo", "module", "1.0")); assertEquals(" Date: Tue, 1 Jun 2010 11:10:50 +0400 Subject: [PATCH 11/58] Maven: Add Library from Repository fixes --- build/scripts/layouts.gant | 10 ++- .../facade/MavenFacadeIndexerException.java | 2 +- .../idea/maven/facade/MavenFacadeUtil.java | 5 -- .../idea/maven/facade/RemoteObject.java | 35 ++++---- .../idea/maven/facade/MavenFacadeImpl.java | 58 +++++++++---- .../embedder/MavenFacadeEmbedderImpl.java | 84 +++++++++++-------- .../embedder/MavenFacadeIndexerImpl.java | 35 ++++---- .../facade/embedder/MavenModelConverter.java | 4 +- .../idea/maven/facade/nexus/ArtifactType.java | 11 --- .../idea/maven/facade/MavenFacadeManager.java | 19 ++--- .../maven/indices/MavenIndicesManager.java | 14 +--- .../maven/utils/RepositoryAttachDialog.java | 27 ++---- .../maven/utils/RepositoryAttachHandler.java | 45 ++++++---- .../src/main/resources/META-INF/plugin.xml | 18 ++-- .../maven/project/MavenProjectReaderTest.java | 11 +-- 15 files changed, 191 insertions(+), 187 deletions(-) diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index 0ef5893a72fc..cd56346c2752 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -174,10 +174,14 @@ def layoutFull(String home, String targetDirectory) { layoutPlugin("maven") { - jar("maven-facade.jar") { - module("maven-facade") + jar("maven-facade-api.jar") { + module("maven-facade-api") } - fileset(dir: "$home/plugins/maven/lib") + jar("maven-facade-impl.jar") { + module("maven-facade-impl") + } + fileset(dir: "$home/plugins/maven/facade-impl/lib") + fileset(dir: "$home/plugins/maven/facade-api/lib") } diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java index 92ed5ad26499..a0cd581f5cee 100644 --- a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeIndexerException.java @@ -20,7 +20,7 @@ public class MavenFacadeIndexerException extends Exception { super(message); } - public MavenFacadeIndexerException(Exception cause) { + public MavenFacadeIndexerException(Throwable cause) { super(null, cause); } } diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java index 164bbe44aaa3..77964fbfb34d 100644 --- a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/MavenFacadeUtil.java @@ -24,7 +24,6 @@ public class MavenFacadeUtil { private static volatile Properties mySystemPropertiesCache; public static Properties collectSystemProperties() { - if (mySystemPropertiesCache == null) { Properties result = new Properties(); result.putAll(getSystemProperties()); @@ -39,10 +38,6 @@ public class MavenFacadeUtil { return mySystemPropertiesCache; } - public static void resetSystemPropertiesCache() { - mySystemPropertiesCache = null; - } - @SuppressWarnings({"unchecked"}) private static Properties getSystemProperties() { Properties result = (Properties)System.getProperties().clone(); diff --git a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java index 9b9531ea6c72..753532d18cfa 100644 --- a/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java +++ b/plugins/maven/facade-api/src/org/jetbrains/idea/maven/facade/RemoteObject.java @@ -53,31 +53,26 @@ public abstract class RemoteObject implements Remote, Unreferenced { } } - protected static void handleException(Exception e) { - Throwable cause = e; - while (cause.getCause() != null) { - cause = cause.getCause(); - } - cause = wrapException(cause); - throw cause instanceof RuntimeException ? (RuntimeException)cause : new RuntimeException(cause); - } - public static Throwable wrapException(Throwable ex) { - if (!ex.getClass().getName().startsWith("java")) { - final Throwable replaceWith = new RuntimeException(ex.toString()); - replaceWith.setStackTrace(ex.getStackTrace()); - ex = replaceWith; + boolean foreignException = false; + Throwable each = ex; + while(each != null) { + String name = each.getClass().getName(); + if (!name.startsWith("java") && !name.startsWith(RemoteObject.class.getPackage().getName())) { + foreignException = true; + break; + } + each = each.getCause(); + } + + if (foreignException) { + Throwable wrapper = new Throwable(ex.toString()); + wrapper.setStackTrace(ex.getStackTrace()); + ex = wrapper; } return ex; } - public Object wrapIfNeeded(Object o) throws RemoteException { - if (o == null) return o; - if (o.getClass().getClassLoader() == null || - o.getClass().getName().startsWith("com.intellij")) return o; - return o.toString(); - } - public void unreferenced() { if (myParent != null) { myParent.myChildren.remove(this); diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java index 457628449ae7..a490b3cafbf2 100644 --- a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/MavenFacadeImpl.java @@ -38,34 +38,64 @@ import java.util.List; public class MavenFacadeImpl extends RemoteObject implements MavenFacade { public void setLogger(MavenFacadeLogger logger) throws RemoteException { - MavenFacadeLoggerManager.setLogger(logger); + try { + MavenFacadeLoggerManager.setLogger(logger); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public MavenFacadeEmbedder createEmbedder(MavenFacadeSettings settings) throws RemoteException { - MavenFacadeEmbedderImpl result = MavenFacadeEmbedderImpl.create(settings); - UnicastRemoteObject.exportObject(result, 0); - return result; + try { + MavenFacadeEmbedderImpl result = MavenFacadeEmbedderImpl.create(settings); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + catch (RemoteException e) { + throw new RuntimeException(wrapException(e)); + } } public MavenFacadeIndexer createIndexer() throws RemoteException { - MavenFacadeIndexerImpl result = new MavenFacadeIndexerImpl(); - UnicastRemoteObject.exportObject(result, 0); - return result; + try { + MavenFacadeIndexerImpl result = new MavenFacadeIndexerImpl(); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + catch (RemoteException e) { + throw new RuntimeException(wrapException(e)); + } } public MavenModel interpolateAndAlignModel(MavenModel model, File basedir) { - return MavenFacadeEmbedderImpl.interpolateAndAlignModel(model, basedir); + try { + return MavenFacadeEmbedderImpl.interpolateAndAlignModel(model, basedir); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public MavenModel assembleInheritance(MavenModel model, MavenModel parentModel) { - return MavenFacadeEmbedderImpl.assembleInheritance(model, parentModel); + try { + return MavenFacadeEmbedderImpl.assembleInheritance(model, parentModel); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public ProfileApplicationResult applyProfiles(MavenModel model, File basedir, Collection explicitProfiles, Collection alwaysOnProfiles) { - return MavenFacadeEmbedderImpl.applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); + try { + return MavenFacadeEmbedderImpl.applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public List getRepositories(String nexusUrl) throws RemoteException { @@ -79,8 +109,7 @@ public class MavenFacadeImpl extends RemoteObject implements MavenFacade { return result; } catch (Exception e) { - handleException(e); - throw new AssertionError(); + throw new RuntimeException(wrapException(e)); } } @@ -105,9 +134,8 @@ public class MavenFacadeImpl extends RemoteObject implements MavenFacade { } return result; } - catch (Exception ex) { - handleException(ex); - throw new AssertionError(); + catch (Exception e) { + throw new RuntimeException(wrapException(e)); } } } diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java index c900a0a13d12..c4de158707c5 100644 --- a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeEmbedderImpl.java @@ -16,7 +16,6 @@ package org.jetbrains.idea.maven.facade.embedder; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.util.Function; import gnu.trove.THashMap; @@ -75,10 +74,12 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import static org.jetbrains.idea.maven.facade.RemoteObject.wrapException; + public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacadeEmbedder { private final MavenEmbedder myImpl; private final MavenFacadeConsoleWrapper myConsoleWrapper; - private volatile MavenFacadeProgressIndicator myCurrentIndicator; + private volatile MavenFacadeProgressIndicatorWrapper myCurrentIndicatorWrapper; public static MavenFacadeEmbedderImpl create(MavenFacadeSettings facadeSettings) { MavenEmbedderSettings settings = new MavenEmbedderSettings(); @@ -184,15 +185,14 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade } @NotNull - public List resolveTransitively( - @NotNull final List artifacts, - @NotNull final List remoteRepositories) { - - Set toResolve = new LinkedHashSet(); - for (MavenArtifactInfo each : artifacts) { - toResolve.add(createArtifact(each)); - } + public List resolveTransitively(@NotNull final List artifacts, + @NotNull final List remoteRepositories) { try { + Set toResolve = new LinkedHashSet(); + for (MavenArtifactInfo each : artifacts) { + toResolve.add(createArtifact(each)); + } + return MavenModelConverter.convertArtifacts(myImpl.resolveTransitively(toResolve, convertRepositories(remoteRepositories)), new THashMap(), getLocalRepositoryFile()); } @@ -202,6 +202,10 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade catch (ArtifactNotFoundException e) { MavenFacadeLoggerManager.getLogger().info(e); } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + + } return Collections.emptyList(); } @@ -469,7 +473,6 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade private interface Executor { T execute() throws Exception; - } private T doExecute(final Executor executor) throws MavenFacadeProcessCanceledException { @@ -491,23 +494,17 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade } }); - MavenFacadeProgressIndicator indicator = myCurrentIndicator; + MavenFacadeProgressIndicatorWrapper indicator = myCurrentIndicatorWrapper; while (true) { - boolean canceled = false; - try { - canceled = indicator.isCanceled(); - } - catch (RemoteException e) { - throw new RuntimeException(e); - } - if (canceled) throw new MavenFacadeProcessCanceledException(); + if (indicator.isCanceled()) throw new MavenFacadeProcessCanceledException(); + try { future.get(50, TimeUnit.MILLISECONDS); } catch (TimeoutException ignore) { } catch (ExecutionException e) { - throw new RuntimeException(e.getCause()); + throw new RuntimeException(wrapException(e.getCause())); } catch (InterruptedException e) { throw new MavenFacadeProcessCanceledException(); @@ -526,8 +523,7 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade private RuntimeException getRethrowable(Throwable throwable) { if (throwable instanceof InvocationTargetException) throwable = throwable.getCause(); - if (throwable instanceof RuntimeException) return (RuntimeException)throwable; - return new RuntimeException(throwable); + return new RuntimeException(wrapException(throwable)); } private static void setupContainer(PlexusContainer c) { @@ -556,16 +552,21 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade boolean strict, MavenFacadeConsole logger, MavenFacadeProgressIndicator process) { - ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).customize(); - ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).customize(); - ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).customize(projectIdToFileMap, strict); - ((CustomWagonManager)getComponent(WagonManager.class)).customize(strict); + try { + ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).customize(); + ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).customize(); + ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).customize(projectIdToFileMap, strict); + ((CustomWagonManager)getComponent(WagonManager.class)).customize(strict); - setConsoleAndLogger(logger, process); + setConsoleAndLogger(logger, process); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } private void setConsoleAndLogger(MavenFacadeConsole logger, MavenFacadeProgressIndicator process) { - myCurrentIndicator = process; + myCurrentIndicatorWrapper = new MavenFacadeProgressIndicatorWrapper(process); myConsoleWrapper.setWrappee(logger); WagonManager wagon = getComponent(WagonManager.class); @@ -573,16 +574,26 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade } public void reset() { - setConsoleAndLogger(null, null); + try { + setConsoleAndLogger(null, null); - ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).reset(); - ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).reset(); - ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).reset(); - ((CustomWagonManager)getComponent(WagonManager.class)).reset(); + ((CustomArtifactFactory)getComponent(ProjectArtifactFactory.class)).reset(); + ((CustomArtifactFactory)getComponent(ArtifactFactory.class)).reset(); + ((CustomArtifactResolver)getComponent(ArtifactResolver.class)).reset(); + ((CustomWagonManager)getComponent(WagonManager.class)).reset(); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public void release() { - myImpl.release(); + try { + myImpl.release(); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } public void clearCaches() { @@ -621,6 +632,9 @@ public class MavenFacadeEmbedderImpl extends RemoteObject implements MavenFacade catch (IllegalAccessException e) { MavenFacadeLoggerManager.getLogger().info(e); } + catch(Exception e) { + throw new RuntimeException(wrapException(e)); + } } } diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java index a67c97653f1a..4fb55e106bf8 100644 --- a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenFacadeIndexerImpl.java @@ -80,11 +80,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI myIndices.put(id, context); return id; } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); - } - catch (UnsupportedExistingLuceneIndexException e) { - throw new MavenFacadeIndexerException(e.getMessage()); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -92,8 +89,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI try { myIndexer.removeIndexingContext(getIndex(id), false); } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -163,8 +160,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI catch (MavenFacadeProgressIndicatorWrapper.RuntimeCanceledException e) { throw new MavenFacadeProcessCanceledException(); } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -189,8 +186,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI } return result; } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -205,8 +202,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI org.sonatype.nexus.index.ArtifactInfo a = artifactContext.getArtifactInfo(); return new MavenId(a.groupId, a.artifactId, a.version); } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -238,8 +235,8 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI } return result; } - catch (IOException e) { - throw new MavenFacadeIndexerException(e); + catch (Exception e) { + throw new MavenFacadeIndexerException(wrapException(e)); } } @@ -265,10 +262,14 @@ public class MavenFacadeIndexerImpl extends RemoteObject implements MavenFacadeI } public void release() { - myEmbedder.release(); + try { + myEmbedder.release(); + } + catch (Exception e) { + throw new RuntimeException(wrapException(e)); + } } - private static class MyScanningListener implements ArtifactScanningListener { private final MavenFacadeProgressIndicatorWrapper p; diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java index 65557c7a7101..709df7b09d10 100644 --- a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/embedder/MavenModelConverter.java @@ -488,7 +488,7 @@ public class MavenModelConverter { result.setId(r.getId()); result.setName(r.getName()); result.setUrl(r.getUrl()); - result.setLayout(r.getLayout()); + result.setLayout(r.getLayout() == null ? "default" : r.getLayout()); if (r.getReleasesPolicy() != null) result.setReleases(toNativePolicy(r.getReleasesPolicy())); if (r.getSnapshotsPolicy() != null) result.setSnapshots(toNativePolicy(r.getSnapshotsPolicy())); @@ -514,7 +514,7 @@ public class MavenModelConverter { t.getVersion(), t.getPackaging(), t.getClassifier(), - t.getClassNames(), + null, t.getRepoId()); } diff --git a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java index ca9fc8a040c7..545cc617fb2f 100644 --- a/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java +++ b/plugins/maven/facade-impl/src/org/jetbrains/idea/maven/facade/nexus/ArtifactType.java @@ -90,8 +90,6 @@ public class ArtifactType implements Serializable { @XmlElement(required = true) protected String artifactLink; - protected String classNames; - public ArtifactType() { } @@ -322,15 +320,6 @@ public class ArtifactType implements Serializable { this.artifactLink = value; } - @Nullable - public String getClassNames() { - return classNames; - } - - public void setClassNames(@Nullable String classNames) { - this.classNames = classNames; - } - @Override public String toString() { return groupId + ":" + artifactId + ":" + version; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java index 9a7cab28c6d9..e16d96c71154 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java @@ -29,10 +29,8 @@ import com.intellij.execution.process.ProcessTerminatedListener; import com.intellij.execution.rmi.RemoteProcessSupport; import com.intellij.execution.runners.ProgramRunner; import com.intellij.ide.DataManager; -import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; @@ -40,9 +38,8 @@ import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.JdkUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SimpleJavaSdkType; -import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.CommonClassNames; import com.intellij.util.PathUtil; import com.intellij.util.PathsList; import com.intellij.util.SystemProperties; @@ -96,8 +93,8 @@ public class MavenFacadeManager { } }; - Disposer.register(ApplicationManager.getApplication(), new Disposable() { - public void dispose() { + ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { + public void run() { mySupport.stopAll(); if (myLogger != null) { @@ -149,7 +146,7 @@ public class MavenFacadeManager { addPluginLibraries(params.getClassPath()); params.setMainClass(MAIN_CLASS); - params.getVMParametersList().add("-Xmx512m -agentlib:yjpagent=disablej2ee"); + params.getVMParametersList().addParametersString("-d32 -Xmx512m"); return params; } @@ -176,7 +173,6 @@ public class MavenFacadeManager { ProcessTerminatedListener.attach(processHandler); return processHandler; } - }; } @@ -192,7 +188,7 @@ public class MavenFacadeManager { libDir = new File(luceneLib.getParentFile().getParentFile().getParentFile(), "facade-impl/lib"); } else { - libDir = pluginFileOrDir; + libDir = pluginFileOrDir.getParentFile(); } MavenLog.LOG.assertTrue(libDir.exists() && libDir.isDirectory(), "Maven Facade libraries dir not found: " + libDir); @@ -204,11 +200,6 @@ public class MavenFacadeManager { } } - public static String getJarPath(@NotNull final Class context, @NotNull final String mainClassName) { - final String s = PathManager.getResourceRoot(context, "/" + mainClassName.replace('.', '/') + CommonClassNames.CLASS_FILE_EXTENSION); - return new File(s).getAbsoluteFile().getAbsolutePath(); - } - public MavenEmbedderWrapper createEmbedder(Project project) { MavenFacade facade = getFacade(); MavenGeneralSettings settings = MavenProjectsManager.getInstance(project).getGeneralSettings(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java index 272ae3852f30..df4ff90b3d8d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndicesManager.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.progress.BackgroundTaskQueue; import com.intellij.openapi.progress.ProcessCanceledException; @@ -47,7 +48,7 @@ import java.io.File; import java.io.IOException; import java.util.*; -public class MavenIndicesManager implements ApplicationComponent { +public class MavenIndicesManager { private static final String ELEMENT_ARCHETYPES = "archetypes"; private static final String ELEMENT_ARCHETYPE = "archetype"; private static final String ELEMENT_GROUP_ID = "groupId"; @@ -75,15 +76,7 @@ public class MavenIndicesManager implements ApplicationComponent { private volatile List myUserArchetypes = new ArrayList(); public static MavenIndicesManager getInstance() { - return ApplicationManager.getApplication().getComponent(MavenIndicesManager.class); - } - - @NotNull - public String getComponentName() { - return getClass().getSimpleName(); - } - - public void initComponent() { + return ServiceManager.getService(MavenIndicesManager.class); } @TestOnly @@ -99,7 +92,6 @@ public class MavenIndicesManager implements ApplicationComponent { private synchronized void ensureInitialized() { if (myIndices != null) return; - // todo remove defaultProject myIndexer = MavenFacadeManager.getInstance().createIndexer(); myIndices = new MavenIndices(myIndexer, getIndicesDir(), new MavenIndex.IndexListener() { public void indexIsBroken(MavenIndex index) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java index 5760713137b4..4362c507b2db 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachDialog.java @@ -25,6 +25,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -62,7 +63,8 @@ public class RepositoryAttachDialog extends DialogWrapper { private final Project myProject; private final boolean myManaged; private final AsyncProcessIcon myProgressIcon; - private final THashMap myCoordinates = new THashMap(); + private final THashMap> myCoordinates + = new THashMap>(); private final Map myRepositories = new TreeMap(); private final ArrayList myShownItems = new ArrayList(); private final JComboBox myCombobox = new JComboBox(new CollectionComboBoxModel(myShownItems, null)); @@ -170,14 +172,14 @@ public class RepositoryAttachDialog extends DialogWrapper { if (myProgressIcon.isVisible()) return false; myProgressIcon.setVisible(true); myProgressIcon.resume(); - RepositoryAttachHandler.searchArtifacts(myProject, text, new PairProcessor, Boolean>() { - public boolean process(Collection artifacts, Boolean tooMany) { + RepositoryAttachHandler.searchArtifacts(myProject, text, new PairProcessor>, Boolean>() { + public boolean process(Collection> artifacts, Boolean tooMany) { if (myProgressIcon.isDisposed()) return true; myProgressIcon.suspend(); myProgressIcon.setVisible(false); final int prevSize = myCoordinates.size(); - for (MavenArtifactInfo each : artifacts) { - myCoordinates.put(each.getGroupId() + ":" + each.getArtifactId() + ":" + each.getVersion(), each); + for (Pair each : artifacts) { + myCoordinates.put(each.first.getGroupId() + ":" + each.first.getArtifactId() + ":" + each.first.getVersion(), each); } myRepositoryUrl.setModel(new CollectionComboBoxModel(new ArrayList(myRepositories.keySet()), myRepositoryUrl.getEditor().getItem())); @@ -328,23 +330,12 @@ public class RepositoryAttachDialog extends DialogWrapper { return Collections.singletonList(new MavenRepositoryInfo("custom", null, selectedRepository)); } else { - final MavenArtifactInfo artifact = myCoordinates.get(getCoordinateText()); - final MavenRepositoryInfo repository = - artifact != null ? findRepositoryFor(artifact) : null; + final Pair artifactAndRepo = myCoordinates.get(getCoordinateText()); + final MavenRepositoryInfo repository = artifactAndRepo.second; return repository != null? Collections.singletonList(repository) : ContainerUtil.findAll(myRepositories.values(), Condition.NOT_NULL); } } - private MavenRepositoryInfo findRepositoryFor(MavenArtifactInfo artifact) { - String soughtFor = artifact.getRepositoryId(); - if (soughtFor == null) return null; - - for (MavenRepositoryInfo each : myRepositories.values()) { - if (each.getId().equals(soughtFor)) return each; - } - return null; - } - private boolean isValidCoordinateSelected() { final String text = getCoordinateText(); if (myCombobox.getModel().getSelectedItem() == null) return false; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java index 4d4fd0a55239..20d95c1d4a0e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java @@ -32,14 +32,13 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryTableAttachHandler; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.util.NullableComputable; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.util.PairProcessor; import com.intellij.util.Processor; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.converters.repositories.MavenRepositoriesProvider; import org.jetbrains.idea.maven.execution.SoutMavenConsole; @@ -192,21 +191,23 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } public static void searchArtifacts(final Project project, String coord, - final PairProcessor, Boolean> resultProcessor, + final PairProcessor>, Boolean> resultProcessor, final Processor> repoProcessor) { if (coord == null) return; final MavenArtifactInfo template = createTemplate(coord, null); ProgressManager.getInstance().run(new Task.Backgroundable(project, "Maven", false) { public void run(@NotNull ProgressIndicator indicator) { - final Ref> result = Ref.create(Collections.emptyList()); + final Ref>> result + = Ref.create(Collections.>emptyList()); final Ref> result2 = Ref.create(Collections.emptyList()); final Ref tooManyRef = Ref.create(Boolean.FALSE); try { MavenFacadeManager facade = MavenFacadeManager.getInstance(); final String[] nexusUrls = getDefaultNexusUrls(); - final List resultList = new ArrayList(); + final List> resultList + = new ArrayList>(); final List result2List = new ArrayList(); for (String nexusUrl : nexusUrls) { final List artifacts; @@ -221,8 +222,15 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { tooManyRef.set(Boolean.TRUE); } else if (!artifacts.isEmpty()) { - result2List.addAll(facade.getRepositories(nexusUrl)); - resultList.addAll(artifacts); + final List repositories = facade.getRepositories(nexusUrl); + final HashMap map = new HashMap(); + for (MavenRepositoryInfo repository : repositories) { + map.put(repository.getId(), repository); + } + result2List.addAll(repositories); + for (MavenArtifactInfo artifact : artifacts) { + resultList.add(Pair.create(artifact, map.get(artifact.getRepositoryId()))); + } } } result.set(resultList); @@ -288,7 +296,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { return new MavenArtifactInfo(parts.length > 0 ? parts[0] : null, parts.length > 1 ? parts[1] : null, parts.length > 2 ? parts[2] : null, - null, + packaging, null); } } @@ -299,21 +307,21 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { public static void resolveLibrary(final Project project, final String libName, - Collection repositories, + final Collection repositories, boolean modal, final Processor> resultProcessor) { Task task; if (modal) { task = new Task.Modal(project, "Maven", false) { public void run(@NotNull ProgressIndicator indicator) { - doResolveInner(project, Collections.singletonList(createTemplate(libName, "jar")), resultProcessor, indicator); + doResolveInner(project, createTemplate(libName, "jar"), repositories, resultProcessor, indicator); } }; } else { task = new Task.Backgroundable(project, "Maven", false, PerformInBackgroundOption.DEAF) { public void run(@NotNull ProgressIndicator indicator) { - doResolveInner(project, Collections.singletonList(createTemplate(libName, "jar")), resultProcessor, indicator); + doResolveInner(project, createTemplate(libName, "jar"), repositories, resultProcessor, indicator); } @Override @@ -327,7 +335,8 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } private static void doResolveInner(Project project, - List artifacts, + MavenArtifactInfo artifact, + Collection repositories, final Processor> resultProcessor, ProgressIndicator indicator) { final Ref> result = new Ref>(); @@ -336,7 +345,13 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { MavenEmbedderWrapper embedder = manager.getEmbedder(MavenEmbeddersManager.FOR_DOWNLOAD); try { embedder.customizeForResolve(new SoutMavenConsole(), new MavenProgressIndicator(indicator)); - result.set(embedder.resolveTransitively(artifacts, convertRepositories(getDefaultRepositories()))); + List resolved = embedder.resolveTransitively(Collections.singletonList(artifact), + convertRepositories(repositories)); + result.set(ContainerUtil.findAll(resolved, new Condition() { + public boolean value(MavenArtifact mavenArtifact) { + return mavenArtifact.isResolved(); + } + })); } catch (MavenProcessCanceledException e) { return; @@ -351,7 +366,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { } } - private static List convertRepositories(List infos) { + private static List convertRepositories(Collection infos) { List result = new ArrayList(infos.size()); for (MavenRepositoryInfo each : infos) { result.add(new MavenRemoteRepository(each.getId(), each.getName(), each.getUrl(), null, null, null)); diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 13f14ad673c2..e5ee12fc523f 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -20,8 +20,8 @@ - + + @@ -73,14 +73,9 @@ - - - - - + + + @@ -103,9 +98,6 @@ - - org.jetbrains.idea.maven.indices.MavenIndicesManager - org.jetbrains.idea.maven.utils.MavenEnvironmentRegistrar diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java index 1bb850520a86..639a61f6926e 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java @@ -1132,16 +1132,13 @@ public class MavenProjectReaderTest extends MavenTestCase { } public void testActivatingProfilesByProperty() throws Exception { - System.setProperty("maven.test.property", "foo"); - MavenFacadeUtil.resetSystemPropertiesCache(); - createProjectPom("" + " " + " one" + " " + " " + - " maven.test.property" + - " foo" + + " os.name" + + " " + System.getProperty("os.name") + "" + " " + " " + " " + @@ -1149,8 +1146,8 @@ public class MavenProjectReaderTest extends MavenTestCase { " two" + " " + " " + - " maven.test.property" + - " bar" + + " os.name" + + " xxx" + " " + " " + " " + From be35b620f90d8e582828dce3c250e16caf59ceb6 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 1 Jun 2010 09:30:54 +0100 Subject: [PATCH 12/58] fix tests broken by package classes caching --- .../src/com/intellij/psi/impl/file/PsiPackageImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java b/java/java-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java index bd7885956600..94422d944b9c 100644 --- a/java/java-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java @@ -497,7 +497,8 @@ public class PsiPackageImpl extends PsiElementBase implements PsiPackage, Querya NameHint nameHint = processor.getHint(NameHint.KEY); if (nameHint != null) { final String shortName = nameHint.getName(state); - if (containsClassNamed(shortName) && processClassesByName(processor, state, place, scope, shortName)) return false; + if ((migration != null || containsClassNamed(shortName)) + && processClassesByName(processor, state, place, scope, shortName)) return false; } else if (prefixMatcher != null && migration == null) { for (String className : getClassNamesCache()) { From 768db6edeb53ac5940e1f5aaba76df575e546507 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 31 May 2010 18:22:16 +0400 Subject: [PATCH 13/58] running tests on module's classpath: SMTest --- .../testframework/sm/FileUrlProvider.java | 21 ++++++----- .../testframework/sm/FileUrlLocationTest.java | 37 ++++--------------- .../sm/SMLightFixtureTestCase.java | 6 +++ .../sm/runner/BaseSMTRunnerTestCase.java | 5 +++ 4 files changed, 29 insertions(+), 40 deletions(-) diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java index f559ede447d5..33764f466176 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java @@ -104,24 +104,25 @@ public class FileUrlProvider implements TestLocationProvider { final int lineCount = doc.getLineCount(); final int lineStartOffset; + final int endOffset; if (lineNum <= lineCount) { lineStartOffset = doc.getLineStartOffset(lineNum - 1); + endOffset = doc.getLineEndOffset(lineNum - 1); } else { // unknown line lineStartOffset = 0; + endOffset = doc.getTextLength(); } - PsiElement elementAtLine = psiFile.findElementAt(lineStartOffset); - if (elementAtLine != null) { - // skip whitespaces - while (elementAtLine instanceof PsiWhiteSpace) { - elementAtLine = elementAtLine.getNextSibling(); - } + int offset = lineStartOffset; + PsiElement elementAtLine = null; + while (offset <= endOffset) { + elementAtLine = psiFile.findElementAt(offset); + if (!(elementAtLine instanceof PsiWhiteSpace)) break; + int length = elementAtLine.getTextLength(); + offset += length > 1 ? length - 1 : 1; } - final PsiElement leafPsiElementAtLine = elementAtLine == null - ? null - : psiFile.findElementAt(elementAtLine.getTextOffset()); - return PsiLocation.fromPsiElement(project, leafPsiElementAtLine != null ? leafPsiElementAtLine : psiFile); + return PsiLocation.fromPsiElement(project, elementAtLine != null ? elementAtLine : psiFile); } } diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/FileUrlLocationTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/FileUrlLocationTest.java index 7a45329efef9..dc9b834fcea3 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/FileUrlLocationTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/FileUrlLocationTest.java @@ -29,39 +29,16 @@ public class FileUrlLocationTest extends SMLightFixtureTestCase { } public void testSpecNavigation() throws Throwable { - createAndAddFile("my_example_spec.rb", + createAndAddFile("my_example_spec.xml", "\n" + - "require \"spec\"\n" + - "\n" + - "describe \"Blabla\" do\n" + - "\n" + - " # Called before each example.\n" + - " before(:each) do\n" + - " # Do nothing\n" + - " end\n" + - "\n" + - " # Called after each example.\n" + - " after(:each) do\n" + - " # Do nothing\n" + - " end\n" + - "\n" + - " it \"should fail\" do\n" + - "\n" + - " #should pass\n" + - " true.should == false\n" + - " end\n" + - "\n" + - " it \"should pass\" do\n" + - "\n" + - " #should pass\n" + - " true.should == true\n" + - " end\n" + - "end"); + "\n" + + " \n" + + "\n" + + "\n"); final String path = myFixture.getFile().getVirtualFile().getPath(); - doTest(17, "describe", path, 4); - doTest(189, "it", path, 16); - doTest(261, "it", path, 22); + doTest(1, "<", path, 2); + doTest(16, "<", path, 3); } private void doTest(final int expectedOffset, final String expectedStartsWith, diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/SMLightFixtureTestCase.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/SMLightFixtureTestCase.java index 2cda3fa48c0f..660550647287 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/SMLightFixtureTestCase.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/SMLightFixtureTestCase.java @@ -23,6 +23,7 @@ import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.psi.PsiFile; import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.CodeInsightTestFixture; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; @@ -37,6 +38,11 @@ import java.io.IOException; * @author Roman.Chernyatchik */ public abstract class SMLightFixtureTestCase extends UsefulTestCase { + + protected SMLightFixtureTestCase() { + PlatformTestCase.initPlatformLangPrefix(); + } + protected static final LightProjectDescriptor ourDescriptor = new LightProjectDescriptor() { public ModuleType getModuleType() { return ModuleType.EMPTY; diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/BaseSMTRunnerTestCase.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/BaseSMTRunnerTestCase.java index e6552e9b9f61..607e32a8a2de 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/BaseSMTRunnerTestCase.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/BaseSMTRunnerTestCase.java @@ -18,6 +18,7 @@ package com.intellij.execution.testframework.sm.runner; import com.intellij.execution.configurations.RuntimeConfiguration; import com.intellij.execution.testframework.TestConsoleProperties; import com.intellij.testFramework.LightPlatformTestCase; +import com.intellij.testFramework.PlatformTestCase; /** * @author Roman Chernyatchik @@ -26,6 +27,10 @@ public abstract class BaseSMTRunnerTestCase extends LightPlatformTestCase { protected SMTestProxy mySuite; protected SMTestProxy mySimpleTest; + protected BaseSMTRunnerTestCase() { + PlatformTestCase.initPlatformLangPrefix(); + } + @Override protected void setUp() throws Exception { super.setUp(); From ba9e9bfb1c37f1b47cad9d8b625b378aa2fed37b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 31 May 2010 18:00:30 +0400 Subject: [PATCH 14/58] diagnostics --- .../com/intellij/ide/fileTemplates/FileTemplateUtil.java | 9 +++++---- .../util/properties/EncodingAwareProperties.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateUtil.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateUtil.java index 2bfc43b57dc4..9f763221b164 100644 --- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/FileTemplateUtil.java @@ -213,7 +213,7 @@ public class FileTemplateUtil{ }; Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, emptyLogSystem); Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "file,class"); - //todo[myakovlev] implement my oun Loader, with ability to load templates from classpath + //todo[myakovlev] implement my own Loader, with ability to load templates from classpath Velocity.setProperty("file.resource.loader.class", MyFileResourceLoader.class.getName()); Velocity.setProperty("class.resource.loader.class", MyClasspathResourceLoader.class.getName()); Velocity.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, modifiedPatternsPath.getAbsolutePath()); @@ -321,7 +321,7 @@ public class FileTemplateUtil{ File modifiedPatternsPath = new File(PathManager.getConfigPath()); modifiedPatternsPath = new File(modifiedPatternsPath, INCLUDES_PATH); - try{ + try { Field pathsField = FileResourceLoader.class.getDeclaredField("paths"); pathsField.setAccessible(true); Collection paths = (Collection)pathsField.get(this); @@ -333,12 +333,13 @@ public class FileTemplateUtil{ paths.add(testsDir.getAbsolutePath()); } } - catch (Exception e){ + catch (Exception e) { + LOG.error(e); throw new RuntimeException(e); } } } - + public static boolean canCreateFromTemplate (PsiDirectory[] dirs, FileTemplate template) { FileType fileType = FileTypeManagerEx.getInstanceEx().getFileTypeByExtension(template.getExtension()); if (fileType.equals(FileTypes.UNKNOWN)) return false; diff --git a/platform/util/src/com/intellij/util/properties/EncodingAwareProperties.java b/platform/util/src/com/intellij/util/properties/EncodingAwareProperties.java index ab2457748cbe..064833aee51a 100644 --- a/platform/util/src/com/intellij/util/properties/EncodingAwareProperties.java +++ b/platform/util/src/com/intellij/util/properties/EncodingAwareProperties.java @@ -33,7 +33,7 @@ public class EncodingAwareProperties extends java.util.Properties{ propText = StringUtil.convertLineSeparators(propText); StringTokenizer stringTokenizer = new StringTokenizer(propText, "\n"); while (stringTokenizer.hasMoreElements()){ - String line = (String)stringTokenizer.nextElement(); + String line = stringTokenizer.nextElement(); int i = line.indexOf('='); String propName = i == -1 ? line : line.substring(0,i); String propValue = i == -1 ? "" : line.substring(i+1); From bb0854d2ccc6812832cd18820c19f5ea991bd33b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 31 May 2010 18:31:04 +0400 Subject: [PATCH 15/58] cleanup --- .../problems/WolfTheProblemSolverImpl.java | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/problems/WolfTheProblemSolverImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/problems/WolfTheProblemSolverImpl.java index 4318a65a2cb6..69624d0e7bb4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/problems/WolfTheProblemSolverImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/problems/WolfTheProblemSolverImpl.java @@ -73,25 +73,6 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver { } }; - private final VirtualFileListener myVirtualFileListener = new VirtualFileAdapter() { - public void fileDeleted(final VirtualFileEvent event) { - onDeleted(event.getFile()); - } - - public void fileMoved(final VirtualFileMoveEvent event) { - onDeleted(event.getFile()); - } - - private void onDeleted(final VirtualFile file) { - if (file.isDirectory()) { - clearInvalidFiles(); - } - else { - doRemove(file); - } - } - }; - private void doRemove(VirtualFile problemFile) { ProblemFileInfo old; synchronized (myProblems) { @@ -106,8 +87,6 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver { } } - private final PsiTreeChangeListener myChangeListener; - private static class ProblemFileInfo { private final Collection problems = new THashSet(); private boolean hasSyntaxErrors; @@ -118,10 +97,7 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver { final ProblemFileInfo that = (ProblemFileInfo)o; - if (hasSyntaxErrors != that.hasSyntaxErrors) return false; - if (!problems.equals(that.problems)) return false; - - return true; + return hasSyntaxErrors == that.hasSyntaxErrors && problems.equals(that.problems); } public int hashCode() { @@ -133,7 +109,7 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver { public WolfTheProblemSolverImpl(Project project, PsiManager psiManager, VirtualFileManager virtualFileManager) { myProject = project; - myChangeListener = new PsiTreeChangeAdapter() { + PsiTreeChangeListener changeListener = new PsiTreeChangeAdapter() { public void childAdded(PsiTreeChangeEvent event) { childrenChanged(event); } @@ -158,8 +134,26 @@ public class WolfTheProblemSolverImpl extends WolfTheProblemSolver { clearSyntaxErrorFlag(event); } }; - psiManager.addPsiTreeChangeListener(myChangeListener); - virtualFileManager.addVirtualFileListener(myVirtualFileListener, myProject); + psiManager.addPsiTreeChangeListener(changeListener); + VirtualFileListener virtualFileListener = new VirtualFileAdapter() { + public void fileDeleted(final VirtualFileEvent event) { + onDeleted(event.getFile()); + } + + public void fileMoved(final VirtualFileMoveEvent event) { + onDeleted(event.getFile()); + } + + private void onDeleted(final VirtualFile file) { + if (file.isDirectory()) { + clearInvalidFiles(); + } + else { + doRemove(file); + } + } + }; + virtualFileManager.addVirtualFileListener(virtualFileListener, myProject); FileStatusManager fileStatusManager = FileStatusManager.getInstance(myProject); if (fileStatusManager != null) { //tests? fileStatusManager.addFileStatusListener(new FileStatusListener() { From 75d46088033d7113a59d2a53639dd0b9595ce23e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 31 May 2010 18:33:56 +0400 Subject: [PATCH 16/58] useless work eliminated --- .../daemon/impl/analysis/HighlightVisitorImpl.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index a5f75d1b6229..02c587c440d0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -109,20 +109,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh LOG.assertTrue(element.isValid()); } element.accept(this); - - if (myRefCountHolder != null) { - instantiateInjections(element); - } } - private void instantiateInjections(final PsiElement element) { - InjectedLanguageUtil.enumerate(element, myFile, new PsiLanguageInjectionHost.InjectedPsiVisitor() { - public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { - // no op - } - }, false); - } - private void registerReferencesFromInjectedFragments(final PsiElement element) { InjectedLanguageUtil.enumerate(element, myFile, new PsiLanguageInjectionHost.InjectedPsiVisitor() { public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { From 0f093b0487cb0495d91065f2a4ecf4eddd690b2e Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:09:56 +0400 Subject: [PATCH 17/58] NPE --- .../com/intellij/psi/impl/source/PsiClassReferenceType.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java index be09f49c2670..0022b749bf5d 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java @@ -138,7 +138,9 @@ public class PsiClassReferenceType extends PsiClassType { return factory.createType(aClass, rawSubstitutor, getLanguageLevel(), getAnnotations()); } String qualifiedName = myReference.getQualifiedName(); - LightClassReference reference = new LightClassReference(myReference.getManager(), myReference.getReferenceName(), qualifiedName, myReference.getResolveScope()); + String name = myReference.getReferenceName(); + if (name==null) name=""; + LightClassReference reference = new LightClassReference(myReference.getManager(), name, qualifiedName, myReference.getResolveScope()); return new PsiClassReferenceType(reference, null,getAnnotations()); } From fa1569b01299804b564c7fa67f13b09d12cb9635 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:11:22 +0400 Subject: [PATCH 18/58] cleanup --- .../daemon/impl/CollectHighlightsUtil.java | 110 +++++++++--------- 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CollectHighlightsUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CollectHighlightsUtil.java index 6afc04842402..59f11b128a57 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CollectHighlightsUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CollectHighlightsUtil.java @@ -26,10 +26,13 @@ import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; +import com.intellij.psi.PsiCodeFragment; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; -import gnu.trove.TIntArrayList; +import com.intellij.util.containers.Stack; +import gnu.trove.TIntStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,7 +40,7 @@ import java.util.ArrayList; import java.util.List; public class CollectHighlightsUtil { - private static final ExtensionPointName> EP_NAME = ExtensionPointName.create("com.intellij.elementsToHighlightFilter"); + public static final ExtensionPointName> EP_NAME = ExtensionPointName.create("com.intellij.elementsToHighlightFilter"); private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil"); @@ -76,65 +79,58 @@ public class CollectHighlightsUtil { final int currentOffset = commonParent.getTextRange().getStartOffset(); final Condition[] filters = Extensions.getExtensions(EP_NAME); - final PsiElementVisitor visitor = new PsiElementVisitor() { - int offset = currentOffset; - - final TIntArrayList starts = new TIntArrayList(STARTING_TREE_HEIGHT); - final List elements = new ArrayList(STARTING_TREE_HEIGHT); - final List children = new ArrayList(STARTING_TREE_HEIGHT); - - @Override public void visitElement(PsiElement element) { - children.add(PsiUtilBase.NULL_PSI_ELEMENT); - - while (true) { - ProgressManager.checkCanceled(); - - PsiElement child = children.remove(children.size() - 1); + int offset = currentOffset; - for (Condition filter : filters) { - if (!filter.value(element)) { - assert child == PsiUtilBase.NULL_PSI_ELEMENT; - child = null; // do not want to process children - break; - } - } + final TIntStack starts = new TIntStack(STARTING_TREE_HEIGHT); + final Stack elements = new Stack(STARTING_TREE_HEIGHT); + final Stack children = new Stack(STARTING_TREE_HEIGHT); + PsiElement element = commonParent; - boolean startChildrenVisiting = false; + PsiElement child = PsiUtilBase.NULL_PSI_ELEMENT; + while (true) { + ProgressManager.checkCanceled(); - if (child == PsiUtilBase.NULL_PSI_ELEMENT) { - startChildrenVisiting = true; - child = element.getFirstChild(); - } - - if (child == null) { - if (startChildrenVisiting) { - // leaf element - offset += element.getTextLength(); - } - - if (elements.size() == 0) break; - int start = starts.remove(starts.size() - 1); - if (startOffset <= start && offset <= endOffset) result.add(element); - - element = elements.remove(elements.size() - 1); - } - else { - // composite element - if (offset <= endOffset) { - starts.add(offset); - children.add(child.getNextSibling()); - children.add(PsiUtilBase.NULL_PSI_ELEMENT); - elements.add(element); - element = child; - } else { - break; - } - } + for (Condition filter : filters) { + if (!filter.value(element)) { + assert child == PsiUtilBase.NULL_PSI_ELEMENT; + child = null; // do not want to process children + break; } } - }; - commonParent.accept(visitor); - + + boolean startChildrenVisiting; + if (child == PsiUtilBase.NULL_PSI_ELEMENT) { + startChildrenVisiting = true; + child = element.getFirstChild(); + } + else { + startChildrenVisiting = false; + } + + if (child == null) { + if (startChildrenVisiting) { + // leaf element + offset += element.getTextLength(); + } + + if (elements.isEmpty()) break; + int start = starts.pop(); + if (startOffset <= start && offset <= endOffset) result.add(element); + + element = elements.pop(); + child = children.pop(); + } + else { + // composite element + if (offset > endOffset) break; + children.push(child.getNextSibling()); + starts.push(offset); + elements.push(element); + element = child; + child = PsiUtilBase.NULL_PSI_ELEMENT; + } + } + return result; } From 720c574df7fdd75fe1c90c73c855823c853cb728 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:14:20 +0400 Subject: [PATCH 19/58] NPE --- .../intellij/ide/projectView/impl/GroupByTypeComparator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/GroupByTypeComparator.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/GroupByTypeComparator.java index 605c41bc52d5..f28ba06f9ea2 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/GroupByTypeComparator.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/GroupByTypeComparator.java @@ -97,7 +97,8 @@ public class GroupByTypeComparator implements Comparator { } } } - + if (descriptor1 == null) return -1; + if (descriptor2 == null) return 1; return AlphaComparator.INSTANCE.compare(descriptor1, descriptor2); } From db6202c39af355d5330db65d6c7fa27414399359 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:29:06 +0400 Subject: [PATCH 20/58] cleanup --- .../com/intellij/psi/util/PropertyUtil.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/java/openapi/src/com/intellij/psi/util/PropertyUtil.java b/java/openapi/src/com/intellij/psi/util/PropertyUtil.java index 615dce0ebb35..ec4cb396e9a4 100644 --- a/java/openapi/src/com/intellij/psi/util/PropertyUtil.java +++ b/java/openapi/src/com/intellij/psi/util/PropertyUtil.java @@ -54,16 +54,17 @@ public class PropertyUtil { String methodName = method.getName(); PsiType returnType = method.getReturnType(); - if (methodName.startsWith("get") && methodName.length() > "get".length()) { + int methodNameLength = methodName.length(); + if (methodName.startsWith("get") && methodNameLength > "get".length()) { if (Character.isLowerCase(methodName.charAt("get".length())) - && (methodName.length() == "get".length() + 1 || Character.isLowerCase(methodName.charAt("get".length() + 1)))) { + && (methodNameLength == "get".length() + 1 || Character.isLowerCase(methodName.charAt("get".length() + 1)))) { return false; } if (returnType != null && PsiType.VOID.equals(returnType)) return false; } - else if (methodName.startsWith("is") && methodName.length() > "is".length()) { + else if (methodName.startsWith("is") && methodNameLength > "is".length()) { if (Character.isLowerCase(methodName.charAt("is".length())) - && (methodName.length() == "is".length() + 1 || Character.isLowerCase(methodName.charAt("is".length() + 1)))) { + && (methodNameLength == "is".length() + 1 || Character.isLowerCase(methodName.charAt("is".length() + 1)))) { return false; } return isBoolean(returnType); @@ -209,7 +210,8 @@ public class PropertyUtil { return null; } - @Nullable public static PsiMethod findPropertyGetterWithType(String propertyName, boolean isStatic, PsiType type, Iterator methods) { + @Nullable + public static PsiMethod findPropertyGetterWithType(String propertyName, boolean isStatic, PsiType type, Iterator methods) { while (methods.hasNext()) { PsiMethod method = methods.next(); if (method.hasModifierProperty(PsiModifier.STATIC) != isStatic) continue; @@ -252,7 +254,8 @@ public class PropertyUtil { return null; } - @Nullable public static PsiMethod findPropertySetterWithType(String propertyName, boolean isStatic, PsiType type, Iterator methods) { + @Nullable + public static PsiMethod findPropertySetterWithType(String propertyName, boolean isStatic, PsiType type, Iterator methods) { while (methods.hasNext()) { PsiMethod method = methods.next(); if (method.hasModifierProperty(PsiModifier.STATIC) != isStatic) continue; @@ -500,7 +503,8 @@ public class PropertyUtil { /** * "xxx", "void setMyProperty(String pp)" -> "setXxx" */ - @Nullable public static String suggestPropertyAccessor(String name, PsiMethod accessorTemplate) { + @Nullable + public static String suggestPropertyAccessor(String name, PsiMethod accessorTemplate) { if (isSimplePropertyGetter(accessorTemplate)) { PsiType type = accessorTemplate.getReturnType(); return suggestGetterName(name, type, accessorTemplate.getName()); From f1fba9c5433be5fe354f47ef30c7160f1789c9d9 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:33:38 +0400 Subject: [PATCH 21/58] NPE --- .../src/com/intellij/psi/impl/PsiDocumentManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java index b2151518a7b1..accd3020209a 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java @@ -170,7 +170,7 @@ public class PsiDocumentManagerImpl extends PsiDocumentManager implements Projec if (!file.getViewProvider().isEventSystemEnabled()) return null; document = FileDocumentManager.getInstance().getDocument(file.getViewProvider().getVirtualFile()); - if (!file.getViewProvider().isPhysical()) { + if (document != null && !file.getViewProvider().isPhysical()) { cachePsi(document, file); } From e4f87ccaaa0b70d87ad3307a6b7326de061606ca Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:47:04 +0400 Subject: [PATCH 22/58] EA-19847 --- .../openapi/actionSystem/Presentation.java | 16 +++++++++------- .../intellij/openapi/util/text/StringUtil.java | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/Presentation.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/Presentation.java index 715a325a8c4c..54535d714467 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/Presentation.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/Presentation.java @@ -18,6 +18,7 @@ package com.intellij.openapi.actionSystem; import com.intellij.util.ui.UIUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.beans.PropertyChangeListener; @@ -174,13 +175,14 @@ public final class Presentation implements Cloneable { setText(presentation.getTextWithMnemonic()); } - public static String restoreTextWithMnemonic(final String text, final int mnemonic) { - if (text != null) { - for (int i = 0; i < text.length(); i++) { - if (Character.toUpperCase(text.charAt(i)) == mnemonic) { - return text.replaceFirst(String.valueOf(text.charAt(i)), "_" + text.charAt(i)); - } - } + public static String restoreTextWithMnemonic(@Nullable String text, final int mnemonic) { + if (text == null) { + return null; + } + for (int i = 0; i < text.length(); i++) { + if (Character.toUpperCase(text.charAt(i)) == mnemonic) { + return text.substring(0, i) + "_" + text.substring(i); + } } return text; } diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index ed99449c231a..19faf3c99e3f 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -1172,7 +1172,7 @@ public class StringUtil { } @NotNull public static String replaceSubstring(@NotNull String string, @NotNull TextRange range, @NotNull String replacement) { - return string.substring(0, range.getStartOffset()) + replacement + string.substring(range.getEndOffset()); + return range.replace(string, replacement); } public static boolean startsWith(@NotNull CharSequence text, @NotNull CharSequence prefix) { From 09d7a4d1693a766c7925bf4c727a9ff5ec5e865f Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 1 Jun 2010 10:49:28 +0400 Subject: [PATCH 23/58] EA-19798 --- .../daemon/impl/quickfix/RemoveUnusedVariableFix.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableFix.java index 6d12e5e69805..cf9505c1b85c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveUnusedVariableFix.java @@ -39,8 +39,6 @@ import java.util.*; public class RemoveUnusedVariableFix implements IntentionAction { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableFix"); private final PsiVariable myVariable; - @NonNls private static final String JAVA_LANG_PCKG = "java.lang"; - @NonNls private static final String JAVA_IO_PCKG = "java.io"; public RemoveUnusedVariableFix(PsiVariable variable) { myVariable = variable; @@ -356,10 +354,10 @@ public class RemoveUnusedVariableFix implements IntentionAction { PsiFile file = aClass.getContainingFile(); PsiDirectory directory = file.getContainingDirectory(); PsiPackage classPackage = JavaDirectoryService.getInstance().getPackage(directory); - String packageName = classPackage.getQualifiedName(); + String packageName = classPackage == null ? null : classPackage.getQualifiedName(); // all Throwable descendants from java.lang are side effects free - if (JAVA_LANG_PCKG.equals(packageName) || JAVA_IO_PCKG.equals(packageName)) { + if ("java.lang".equals(packageName) || "java.io".equals(packageName)) { PsiClass throwableClass = JavaPsiFacade.getInstance(aClass.getProject()).findClass("java.lang.Throwable", aClass.getResolveScope()); if (throwableClass != null && InheritanceUtil.isInheritorOrSelf(aClass, throwableClass, true)) { return true; From 01610e66f00677d91817b6a66db6f27da1c56d49 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 1 Jun 2010 13:37:55 +0400 Subject: [PATCH 24/58] TreeUi doesnt paint selection while busy and adjusting selected paths --- .../util/treeView/AbstractTreeBuilder.java | 5 ++ .../ide/util/treeView/AbstractTreeUi.java | 20 ++++++++ .../com/intellij/ui/treeStructure/Tree.java | 48 +++++++++++++++++-- .../util/src/com/intellij/util/ui/UIUtil.java | 26 +++++++--- 4 files changed, 87 insertions(+), 12 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java index 1190f882346a..55d3cb0827c4 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeBuilder.java @@ -492,4 +492,9 @@ public class AbstractTreeBuilder implements Disposable { return app != null && app.isUnitTestMode(); } + public static boolean isToPaintSelection(JTree tree) { + AbstractTreeBuilder builder = getBuilderFor(tree); + return builder == null ? true : builder.getUi().isToPaintSelection(); + } + } diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 8d6d33e9c7f5..8f872a3dd310 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -172,6 +172,8 @@ public class AbstractTreeUi { private Map myCancelledBuild = new WeakHashMap(); + private boolean mySelectionIsAdjusted; + protected void init(AbstractTreeBuilder builder, JTree tree, DefaultTreeModel treeModel, @@ -1825,6 +1827,17 @@ public class AbstractTreeUi { if (myInitialized.isDone()) { myBusyObject.onReady(); } + + TreePath[] selection = getTree().getSelectionPaths(); + Rectangle visible = getTree().getVisibleRect(); + if (selection != null) { + for (TreePath each : selection) { + Rectangle bounds = getTree().getPathBounds(each); + if (bounds != null && (visible.contains(bounds) || visible.intersects(bounds))) { + getTree().repaint(bounds); + } + } + } } } @@ -2153,6 +2166,10 @@ public class AbstractTreeUi { return myCancelRequest.get() || myResettingToReadyNow.get(); } + public boolean isToPaintSelection() { + return isReady() || !mySelectionIsAdjusted; + } + static class ElementNode extends DefaultMutableTreeNode { Set myElements = new HashSet(); @@ -2766,6 +2783,8 @@ public class AbstractTreeUi { } if (toSelect != null) { + mySelectionIsAdjusted = isAdjustedSelection; + myTree.addSelectionPath(toSelect); if (isAdjustedSelection && myUpdaterState != null) { @@ -3948,6 +3967,7 @@ public class AbstractTreeUi { if (!isInnerChange()) { clearUpdaterState(); myAutoExpandRoots.clear(); + mySelectionIsAdjusted = false; } } diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java index 3989ac967ec8..744a92eb4ead 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/Tree.java @@ -29,6 +29,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; import javax.swing.plaf.TreeUI; import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.text.Position; @@ -48,6 +49,7 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q private Rectangle myLastVisibleRec; private Dimension myHoldSize; + private MySelectionModel mySelectionModel = new MySelectionModel(); public Tree() { initTree_(); @@ -80,6 +82,8 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q } setCellRenderer(new NodeRenderer()); + + setSelectionModel(mySelectionModel); } @Override @@ -161,15 +165,25 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q @Override public void paint(Graphics g) { - super.paint(g); - + Rectangle clip = g.getClipBounds(); final Rectangle visible = getVisibleRect(); - if (!visible.equals(myLastVisibleRec)) { - updateBusyIconLocation(); + if (!AbstractTreeBuilder.isToPaintSelection(this)) { + mySelectionModel.holdSelection(); } - myLastVisibleRec = visible; + try { + super.paint(g); + + if (!visible.equals(myLastVisibleRec)) { + updateBusyIconLocation(); + } + + myLastVisibleRec = visible; + } + finally { + mySelectionModel.unholdSelection(); + } } public void setPaintBusy(boolean paintBusy) { @@ -453,6 +467,30 @@ public class Tree extends JTree implements ComponentWithEmptyText, Autoscroll, Q return treeNode != null ? new TreePath(treeNode.getPath()) : new TreePath(node); } + private static class MySelectionModel extends DefaultTreeSelectionModel { + + private TreePath[] myHeldSelection; + + @Override + protected void fireValueChanged(TreeSelectionEvent e) { + if (myHeldSelection == null) { + super.fireValueChanged(e); + } + } + + public void holdSelection() { + myHeldSelection = getSelectionPaths(); + clearSelection(); + } + + public void unholdSelection() { + if (myHeldSelection != null) { + setSelectionPaths(myHeldSelection); + myHeldSelection = null; + } + } + } + private class MyMouseListener extends MouseAdapter { public void mousePressed(MouseEvent mouseevent) { if (!SwingUtilities.isLeftMouseButton(mouseevent) && diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index e7403bfde54e..65d33a10054f 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -1213,7 +1213,9 @@ public class UIUtil { final int containerWidth = tree.getParent() instanceof JViewport ? tree.getParent().getWidth() : tree.getWidth(); final int xOffset = tree.getParent() instanceof JViewport ? ((JViewport)tree.getParent()).getViewPosition().x : 0; - if (path != null && tree.isPathSelected(path)) { + boolean selected = false; + if (path != null) { + selected = tree.isPathSelected(path); Graphics2D rowGraphics = (Graphics2D)g.create(); if (clipBounds.height >= bounds.height) { // fill the row only if clip bounds intersects actual node bounds @@ -1226,14 +1228,24 @@ public class UIUtil { final Object sourceList = tree.getClientProperty(SOURCE_LIST_CLIENT_PROPERTY); if (sourceList != null && ((Boolean)sourceList)) { - if (tree.hasFocus()) { - LIST_FOCUSED_SELECTION_BACKGROUND_PAINTER.paintBorder(tree, rowGraphics, xOffset, bounds.y, containerWidth, bounds.height); - } - else { - LIST_SELECTION_BACKGROUND_PAINTER.paintBorder(tree, rowGraphics, xOffset, bounds.y, containerWidth, bounds.height); + if (selected) { + if (tree.hasFocus()) { + LIST_FOCUSED_SELECTION_BACKGROUND_PAINTER.paintBorder(tree, rowGraphics, xOffset, bounds.y, containerWidth, bounds.height); + } + else { + LIST_SELECTION_BACKGROUND_PAINTER.paintBorder(tree, rowGraphics, xOffset, bounds.y, containerWidth, bounds.height); + } + } else { + rowGraphics.setColor(tree.getBackground()); + rowGraphics.fillRect(xOffset, bounds.y, containerWidth, bounds.height); } } else { - rowGraphics.setColor(tree.hasFocus() ? getTreeSelectionBackground() : UNFOCUSED_SELECTION_COLOR); + Color bg = tree.hasFocus() ? getTreeSelectionBackground() : UNFOCUSED_SELECTION_COLOR; + if (!selected) { + bg = tree.getBackground(); + } + + rowGraphics.setColor(bg); rowGraphics.fillRect(xOffset, bounds.y, containerWidth, bounds.height - 1); } From 653e42934ac795652482e0f501f75413b7b7c23d Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Tue, 1 Jun 2010 13:46:39 +0400 Subject: [PATCH 25/58] maven modules added to the community project --- .idea/modules.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.idea/modules.xml b/.idea/modules.xml index e177cad44135..617580da14c0 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -59,6 +59,8 @@ + + From bd80cd8b201469ebf9bcda2d5dbf67ac7b75dd0a Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 1 Jun 2010 13:46:19 +0400 Subject: [PATCH 26/58] Maven: deadlock fix + cleanup --- .../execution/rmi/RemoteProcessSupport.java | 2 +- plugins/maven/maven-plugin.iml | 78 --- plugins/maven/maven-plugin.ipr | 445 ------------------ .../MavenParentRelativePathConverter.java | 1 - .../maven/facade/MavenEmbedderWrapper.java | 7 +- .../idea/maven/facade/MavenFacadeManager.java | 11 +- .../idea/maven/project/MavenProject.java | 2 - .../maven/utils/RepositoryAttachHandler.java | 1 + 8 files changed, 7 insertions(+), 540 deletions(-) delete mode 100644 plugins/maven/maven-plugin.iml delete mode 100644 plugins/maven/maven-plugin.ipr diff --git a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java index 6ae69943c34a..bac4210beea1 100644 --- a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java +++ b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java @@ -90,7 +90,7 @@ public abstract class RemoteProcessSupport { runnable.run(); } else { - ApplicationManager.getApplication().invokeLater(runnable); + ApplicationManager.getApplication().executeOnPooledThread(runnable); } if (ref.isNull()) { try { diff --git a/plugins/maven/maven-plugin.iml b/plugins/maven/maven-plugin.iml deleted file mode 100644 index 3e0fe892aeb3..000000000000 --- a/plugins/maven/maven-plugin.iml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/maven/maven-plugin.ipr b/plugins/maven/maven-plugin.ipr deleted file mode 100644 index d2c4eae9a682..000000000000 --- a/plugins/maven/maven-plugin.ipr +++ /dev/null @@ -1,445 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java index 99e83a9809d4..5401ea9a1104 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenParentRelativePathConverter.java @@ -46,7 +46,6 @@ public class MavenParentRelativePathConverter extends ResolvingConverter projectIdToFileMap, MavenConsole console, MavenProgressIndicator indicator) { try { - resetConsole(MavenFacadeManager.wrapandExport(console)); + resetConsole(MavenFacadeManager.wrapAndExport(console)); resetIndicator(MavenFacadeManager.wrapAndExport(indicator)); myWrappee.customizeForResolve(projectIdToFileMap, myConsole, myIndicator); @@ -69,7 +68,7 @@ public class MavenEmbedderWrapper { MavenConsole console, MavenProgressIndicator indicator) { try { - resetConsole(MavenFacadeManager.wrapandExport(console)); + resetConsole(MavenFacadeManager.wrapAndExport(console)); resetIndicator(MavenFacadeManager.wrapAndExport(indicator)); myWrappee.customizeForStrictResolve(projectIdToFileMap, myConsole, myIndicator); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java index e16d96c71154..05efd4ebba47 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java @@ -119,7 +119,6 @@ public class MavenFacadeManager { myFacade.setLogger(myLogger); } catch (Exception e) { - // todo throw new RuntimeException(e); } } @@ -146,6 +145,7 @@ public class MavenFacadeManager { addPluginLibraries(params.getClassPath()); params.setMainClass(MAIN_CLASS); + // todo pass sensible parameters, MAVEN_OPTS? params.getVMParametersList().addParametersString("-d32 -Xmx512m"); return params; } @@ -207,7 +207,6 @@ public class MavenFacadeManager { return new MavenEmbedderWrapper(facade.createEmbedder(convertSettings(settings))); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -217,7 +216,6 @@ public class MavenFacadeManager { return new MavenIndexerWrapper(getFacade().createIndexer()); } catch (RemoteException e) { - //todo throw new RuntimeException(e); } } @@ -227,7 +225,6 @@ public class MavenFacadeManager { return getFacade().getRepositories(nexusUrl); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -237,7 +234,6 @@ public class MavenFacadeManager { return getFacade().findArtifacts(template, nexusUrl); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -247,7 +243,6 @@ public class MavenFacadeManager { return getFacade().interpolateAndAlignModel(model, basedir); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -257,7 +252,6 @@ public class MavenFacadeManager { return getFacade().assembleInheritance(model, parentModel); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -270,7 +264,6 @@ public class MavenFacadeManager { return getFacade().applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles); } catch (RemoteException e) { - // todo throw new RuntimeException(e); } } @@ -288,7 +281,7 @@ public class MavenFacadeManager { return result; } - public static MavenFacadeConsole wrapandExport(final MavenConsole console) { + public static MavenFacadeConsole wrapAndExport(final MavenConsole console) { try { RemoteMavenFacadeConsole result = new RemoteMavenFacadeConsole(console); UnicastRemoteObject.exportObject(result, 0); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index e418cf3d073c..92a679924f80 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -193,8 +193,6 @@ public class MavenProject { state.myDependencyTree = new ArrayList(newDependencyTree); state.myPlugins = new ArrayList(newPlugins); state.myExtensions = new ArrayList(newExtensions); - - // todo remove non-default managed plugins } private MavenProjectChanges setFolders(MavenProjectReaderResult readerResult) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java index 20d95c1d4a0e..8b1dd138cff9 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/RepositoryAttachHandler.java @@ -476,6 +476,7 @@ public class RepositoryAttachHandler implements LibraryTableAttachHandler { }); } + // todo //public static RemoteTransferListener fromProgressIndicator(final ProgressIndicator indicator) { // return new RemoteTransferListenerImpl() { // From d958a329966574c7119f1ca93d787f07576e02ab Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 1 Jun 2010 13:34:53 +0400 Subject: [PATCH 27/58] running tests on module's classpath: svn --- .../testSource/org/jetbrains/idea/svn/SvnTestCase.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnTestCase.java b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnTestCase.java index 16acb4db96ab..fb12e414c72f 100644 --- a/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnTestCase.java +++ b/plugins/svn4idea/testSource/org/jetbrains/idea/svn/SvnTestCase.java @@ -19,6 +19,7 @@ import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.changes.pending.MockChangeListManagerGate; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.AbstractVcsTestCase; +import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; import com.intellij.testFramework.fixtures.TempDirTestFixture; import com.intellij.testFramework.vcs.MockChangelistBuilder; @@ -40,6 +41,10 @@ public abstract class SvnTestCase extends AbstractVcsTestCase { private ChangeListManagerGate myGate; protected AtomicSectionsAware myRefreshCopiesStub; + protected SvnTestCase() { + PlatformTestCase.initPlatformLangPrefix(); + } + @Before public void setUp() throws Exception { final IdeaTestFixtureFactory fixtureFactory = IdeaTestFixtureFactory.getFixtureFactory(); From 77bf589751060aa81413db092e079944b2acf287 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 1 Jun 2010 14:05:47 +0400 Subject: [PATCH 28/58] [Mercurial] one more merge of previous changes. --- .../org/zmlx/hg4idea/HgVcsMessages.properties | 7 +- .../org/zmlx/hg4idea/HgIdeConfigurable.java | 13 +-- .../zmlx/hg4idea/HgProjectConfigurable.java | 10 +- .../hg4idea/ui/HgConfigurationIdePanel.form | 2 +- .../hg4idea/ui/HgConfigurationIdePanel.java | 62 +----------- .../hg4idea/ui/HgSetExecutableDialog.form | 18 +--- .../hg4idea/ui/HgSetExecutableDialog.java | 95 ++++--------------- 7 files changed, 45 insertions(+), 162 deletions(-) diff --git a/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties b/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties index dd0c21cc4651..acd0c6cce8f3 100644 --- a/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties +++ b/plugins/hg4idea/resources/org/zmlx/hg4idea/HgVcsMessages.properties @@ -1,5 +1,5 @@ group.hg4idea.global.menu.text=Mercurial -group.hg4idea.global.submenu.text=Mercurial +group.hg4idea.global.submenu.text=Mercurial Actions group.hg4idea.file.menu.text=Mercurial action.hg4idea.tag.text=Tag Repository action.hg4idea.tag.description=Create a tag for current revision @@ -21,6 +21,11 @@ hg4idea.error=Error hg4idea.revert=Revert hg4idea.commit=Commit +hg4idea.init.destination.directory.description=Select directory where the new Mercurial repository will be created. +hg4idea.init.destination.directory.title=Select directory for hg init +hg4idea.init.error.already.under.hg=The selected directory {0} is already under hg. +hg4idea.init.error.title=hg init Error + hg4idea.clone.title=Clone Mercurial Repostiroy hg4idea.clone.button.clone=Clone hg4idea.clone.button.test=&Test Repository diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgIdeConfigurable.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgIdeConfigurable.java index 861d0301ff36..07cc5989f4ee 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgIdeConfigurable.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgIdeConfigurable.java @@ -19,7 +19,7 @@ import org.zmlx.hg4idea.ui.*; import javax.swing.*; -public class HgIdeConfigurable implements ApplicationComponent, Configurable { +public class HgIdeConfigurable implements SearchableConfigurable { private final HgConfigurationIdePanel panel; @@ -60,14 +60,11 @@ public class HgIdeConfigurable implements ApplicationComponent, Configurable { public void disposeUIResources() { } - @NotNull - public String getComponentName() { - return getClass().getName(); + public String getId() { + return "Mercurial"; } - public void initComponent() { - } - - public void disposeComponent() { + public Runnable enableSearch(String option) { + return null; } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgProjectConfigurable.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgProjectConfigurable.java index 5ccba0456b07..18197c9b130e 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgProjectConfigurable.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgProjectConfigurable.java @@ -18,7 +18,7 @@ import org.zmlx.hg4idea.ui.*; import javax.swing.*; -public class HgProjectConfigurable implements Configurable { +public class HgProjectConfigurable implements SearchableConfigurable { private final HgConfigurationProjectPanel hgConfigurationProjectPanel; @@ -58,4 +58,12 @@ public class HgProjectConfigurable implements Configurable { public void disposeUIResources() { } + public String getId() { + return "Mercurial.Project"; + } + + public Runnable enableSearch(String option) { + return null; + } + } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.form b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.form index 79ffd1b867bb..4dcb91491827 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.form +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.form @@ -34,7 +34,7 @@ - + diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.java b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.java index cbad294a253f..3125be974af6 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgConfigurationIdePanel.java @@ -12,16 +12,13 @@ // limitations under the License. package org.zmlx.hg4idea.ui; -import com.intellij.openapi.fileChooser.*; import com.intellij.openapi.options.*; import com.intellij.openapi.ui.*; -import com.intellij.uiDesigner.core.*; import org.apache.commons.lang.*; import org.zmlx.hg4idea.*; import org.zmlx.hg4idea.command.*; import javax.swing.*; -import java.awt.*; import java.awt.event.*; public class HgConfigurationIdePanel { @@ -36,14 +33,6 @@ public class HgConfigurationIdePanel { this.globalSettings = globalSettings; loadSettings(); - String title = HgVcsMessages.message("hg4idea.configuration.title"); - String description = HgVcsMessages.message("hg4idea.configuration.description"); - - pathSelector.addBrowseFolderListener( - title, description, null, - new FileChooserDescriptor(true, false, false, false, false, false) - ); - final ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { pathSelector.setEnabled(selectRadioButton.isSelected()); @@ -100,54 +89,7 @@ public class HgConfigurationIdePanel { } } - { -// GUI initializer generated by IntelliJ IDEA GUI Designer -// >>> IMPORTANT!! <<< -// DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer - * >>> IMPORTANT!! <<< - * DO NOT edit this method OR call it in your code! - * - * @noinspection ALL - */ - private void $$$setupUI$$$() { - basePanel = new JPanel(); - basePanel.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1)); - final JPanel panel1 = new JPanel(); - panel1.setLayout(new GridLayoutManager(2, 2, new Insets(0, 0, 0, 0), -1, -1)); - basePanel.add(panel1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - panel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Path to hg executable")); - autoRadioButton = new JRadioButton(); - autoRadioButton.setSelected(true); - autoRadioButton.setText("Autodetect hg in PATH"); - autoRadioButton.setMnemonic('A'); - autoRadioButton.setDisplayedMnemonicIndex(0); - panel1.add(autoRadioButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - selectRadioButton = new JRadioButton(); - selectRadioButton.setEnabled(true); - selectRadioButton.setText("Specify executable path"); - selectRadioButton.setMnemonic('S'); - selectRadioButton.setDisplayedMnemonicIndex(0); - panel1.add(selectRadioButton, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - pathSelector = new TextFieldWithBrowseButton(); - pathSelector.setEnabled(false); - panel1.add(pathSelector, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, new Dimension(100, -1), null, null, 0, false)); - final Spacer spacer1 = new Spacer(); - basePanel.add(spacer1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - ButtonGroup buttonGroup; - buttonGroup = new ButtonGroup(); - buttonGroup.add(autoRadioButton); - buttonGroup.add(selectRadioButton); - } - - /** - * @noinspection ALL - */ - public JComponent $$$getRootComponent$$$() { - return basePanel; + private void createUIComponents() { + pathSelector = new HgSetExecutablePathPanel(); } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.form b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.form index 2a0505454315..21934fd9a881 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.form +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.form @@ -1,6 +1,6 @@ - + @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@ - + @@ -24,19 +24,9 @@ - - - - - - - - - - - + diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.java b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.java index 6b9530eb03c5..915ed8000f75 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgSetExecutableDialog.java @@ -12,20 +12,18 @@ // limitations under the License. package org.zmlx.hg4idea.ui; -import com.intellij.openapi.project.*; -import com.intellij.openapi.ui.*; -import com.intellij.uiDesigner.core.*; -import org.zmlx.hg4idea.*; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import org.zmlx.hg4idea.HgVcsMessages; import javax.swing.*; -import java.awt.*; -import java.util.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; public class HgSetExecutableDialog extends DialogWrapper { - private JPanel centerPanel; - private TextFieldWithBrowseButton hgExecutablePath; - private JLabel infoLabel; - private JLabel errorLabel; + private JPanel myCenterPanel; + private HgSetExecutablePathPanel myHgExecutablePath; + private JLabel myInfoLabel; public HgSetExecutableDialog(Project project) { super(project, false); @@ -34,81 +32,24 @@ public class HgSetExecutableDialog extends DialogWrapper { @Override protected JComponent createCenterPanel() { - return centerPanel; + return myCenterPanel; } public void setBadHgPath(String hgPath) { - hgExecutablePath.setText(hgPath); - errorLabel.setText(HgVcsMessages.message("hg4idea.error.invalidExecutable", hgPath)); + myHgExecutablePath.setText(hgPath); + setErrorText(HgVcsMessages.message("hg4idea.configuration.executable.error", hgPath)); } public String getNewHgPath() { - return hgExecutablePath.getText(); + return myHgExecutablePath.getText(); } - - { -// GUI initializer generated by IntelliJ IDEA GUI Designer -// >>> IMPORTANT!! <<< -// DO NOT EDIT OR ADD ANY CODE HERE! - $$$setupUI$$$(); - } - - /** - * Method generated by IntelliJ IDEA GUI Designer - * >>> IMPORTANT!! <<< - * DO NOT edit this method OR call it in your code! - * - * @noinspection ALL - */ - private void $$$setupUI$$$() { - centerPanel = new JPanel(); - centerPanel.setLayout(new GridLayoutManager(4, 1, new Insets(0, 0, 0, 0), -1, -1)); - hgExecutablePath = new TextFieldWithBrowseButton(); - centerPanel.add(hgExecutablePath, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(400, -1), null, 0, false)); - infoLabel = new JLabel(); - infoLabel.setText("Full path to hg executable or 'hg' if PATH has it:"); - centerPanel.add(infoLabel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - errorLabel = new JLabel(); - errorLabel.setFont(new Font(errorLabel.getFont().getName(), Font.ITALIC, errorLabel.getFont().getSize())); - errorLabel.setForeground(Color.red); - this.$$$loadLabelText$$$(errorLabel, ResourceBundle.getBundle("org/zmlx/hg4idea/HgVcsMessages").getString("hg4idea.error.invalidExecutable")); - centerPanel.add(errorLabel, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final Spacer spacer1 = new Spacer(); - centerPanel.add(spacer1, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - } - - /** - * @noinspection ALL - */ - private void $$$loadLabelText$$$(JLabel component, String text) { - StringBuffer result = new StringBuffer(); - boolean haveMnemonic = false; - char mnemonic = '\0'; - int mnemonicIndex = -1; - for (int i = 0; i < text.length(); i++) { - if (text.charAt(i) == '&') { - i++; - if (i == text.length()) break; - if (!haveMnemonic && text.charAt(i) != '&') { - haveMnemonic = true; - mnemonic = text.charAt(i); - mnemonicIndex = result.length(); - } + private void createUIComponents() { + myHgExecutablePath = new HgSetExecutablePathPanel(); + myHgExecutablePath.addOKListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + setErrorText(""); } - result.append(text.charAt(i)); - } - component.setText(result.toString()); - if (haveMnemonic) { - component.setDisplayedMnemonic(mnemonic); - component.setDisplayedMnemonicIndex(mnemonicIndex); - } - } - - /** - * @noinspection ALL - */ - public JComponent $$$getRootComponent$$$() { - return centerPanel; + }); } } From bd1722dd3729c46378f1f72d49cd07069de8d9d3 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 1 Jun 2010 15:30:09 +0400 Subject: [PATCH 29/58] Maven: npe & deadlock fix --- .../execution/rmi/RemoteProcessSupport.java | 2 +- .../idea/maven/facade/MavenFacadeManager.java | 16 ++++++++++------ .../idea/maven/project/MavenEnvironmentForm.java | 4 ---- .../jetbrains/idea/maven/utils/MavenUtil.java | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java index bac4210beea1..3583d5e1a7c5 100644 --- a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java +++ b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java @@ -86,7 +86,7 @@ public abstract class RemoteProcessSupport { startProcess(target, configuration, key); } }; - if (ApplicationManager.getApplication().isDispatchThread()) { + if (ApplicationManager.getApplication().isWriteAccessAllowed()) { runnable.run(); } else { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java index 05efd4ebba47..cbd3664a1046 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/facade/MavenFacadeManager.java @@ -38,10 +38,12 @@ import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.JdkUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SimpleJavaSdkType; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.PathUtil; import com.intellij.util.PathsList; +import com.intellij.util.SmartList; import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; @@ -142,7 +144,7 @@ public class MavenFacadeManager { ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(Element.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(Query.class), classPath); params.getClassPath().addAll(classPath); - addPluginLibraries(params.getClassPath()); + params.getClassPath().addAllFiles(collectClassPathAndLIbsFolder().first); params.setMainClass(MAIN_CLASS); // todo pass sensible parameters, MAVEN_OPTS? @@ -176,14 +178,15 @@ public class MavenFacadeManager { }; } - private void addPluginLibraries(PathsList classPath) { - File pluginFileOrDir = new File(PathUtil.getJarPathForClass(this.getClass())); + public static Pair, File> collectClassPathAndLIbsFolder() { + File pluginFileOrDir = new File(PathUtil.getJarPathForClass(MavenFacadeManager.class)); File libDir; + List classpath = new SmartList(); if (pluginFileOrDir.isDirectory()) { - classPath.add(new File(pluginFileOrDir.getParent(), "maven-facade-api")); - classPath.add(new File(pluginFileOrDir.getParent(), "maven-facade-impl")); + classpath.add(new File(pluginFileOrDir.getParent(), "maven-facade-api")); + classpath.add(new File(pluginFileOrDir.getParent(), "maven-facade-impl")); File luceneLib = new File(PathUtil.getJarPathForClass(Query.class)); libDir = new File(luceneLib.getParentFile().getParentFile().getParentFile(), "facade-impl/lib"); } @@ -195,9 +198,10 @@ public class MavenFacadeManager { File[] files = libDir.listFiles(); for (File jar : files) { if (jar.isFile() && jar.getName().endsWith(".jar") && !jar.equals(pluginFileOrDir)) { - classPath.add(jar.getPath()); + classpath.add(jar); } } + return Pair.create(classpath, libDir); } public MavenEmbedderWrapper createEmbedder(Project project) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java index 7faa4c0da883..187501715362 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenEnvironmentForm.java @@ -32,7 +32,6 @@ import java.io.File; public class MavenEnvironmentForm { private JPanel panel; private LabeledComponent mavenHomeComponent; - private LabeledComponent localRepositoryComponent; private LabeledComponent mavenSettingsFileComponent; private JCheckBox mavenHomeOverrideCheckBox; private JCheckBox mavenSettingsFileOverrideCheckBox; @@ -79,9 +78,6 @@ public class MavenEnvironmentForm { new FileChooserDescriptor(false, true, false, false, false, false)); mavenSettingsFileComponent.getComponent().addBrowseFolderListener(ProjectBundle.message("maven.select.maven.settings.file"), "", null, new FileChooserDescriptor(true, false, false, false, false, false)); - localRepositoryComponent.getComponent().addBrowseFolderListener(ProjectBundle.message("maven.select.local.repository"), "", null, - new FileChooserDescriptor(false, true, false, false, false, false)); - return panel; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java index 4a09a8aaa039..3884988fa2e1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java @@ -49,6 +49,7 @@ import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.facade.MavenFacadeManager; import org.jetbrains.idea.maven.facade.MavenFacadeUtil; import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.model.MavenId; @@ -546,8 +547,7 @@ public class MavenUtil { public static VirtualFile resolveSuperPomFile(@Nullable File mavenHome) { VirtualFile result = doResolveSuperPomFile(mavenHome); if (result == null) { - URL resource = MavenFacadeUtil.class.getResource("/" + SUPER_POM_PATH); - return VfsUtil.findFileByURL(resource); + doResolveSuperPomFile(MavenFacadeManager.collectClassPathAndLIbsFolder().second); } return result; } From 7c7a65897fa806b7938f7e4bdb66589146486133 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 1 Jun 2010 16:29:29 +0400 Subject: [PATCH 30/58] Maven: deadlock fix --- .../intellij/execution/rmi/RemoteProcessSupport.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java index 3583d5e1a7c5..bd514d0da822 100644 --- a/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java +++ b/platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java @@ -81,17 +81,7 @@ public abstract class RemoteProcessSupport { final Ref ref = Ref.create(null); final Pair key = Pair.create(target, configuration); if (!getExistingInfo(ref, key)) { - final Runnable runnable = new Runnable() { - public void run() { - startProcess(target, configuration, key); - } - }; - if (ApplicationManager.getApplication().isWriteAccessAllowed()) { - runnable.run(); - } - else { - ApplicationManager.getApplication().executeOnPooledThread(runnable); - } + startProcess(target, configuration, key); if (ref.isNull()) { try { synchronized (ref) { From d8fe1ee442a30aa056abf91a0ae8bb667a5e4fbe Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Tue, 1 Jun 2010 17:31:29 +0400 Subject: [PATCH 31/58] better declaration processing --- .../PatternEditorContextMembersProvider.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java index b78c9061bd0e..02faaed56cb8 100644 --- a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java +++ b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java @@ -26,6 +26,8 @@ import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersProcessor; +import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; +import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint; /** * @author Gregory.Shrago @@ -38,13 +40,18 @@ public class PatternEditorContextMembersProvider implements NonCodeMembersProces final PsiFile file = place.getContainingFile().getOriginalFile(); final BaseInjection injection = file.getUserData(BaseInjection.INJECTION_KEY); if (injection == null) return true; - return ((UserDataHolderEx)file).putUserDataIfAbsent(INJECTION_PARSED_CONTEXT, new AtomicNotNullLazyValue() { - @NotNull - @Override - protected PsiFile compute() { - return parseInjectionContext(injection, file.getProject()); - } - }).getValue().processDeclarations(processor, ResolveState.initial(), null, place); + final PsiFile contextFile = + ((UserDataHolderEx)file).putUserDataIfAbsent(INJECTION_PARSED_CONTEXT, new AtomicNotNullLazyValue() { + @NotNull + @Override + protected PsiFile compute() { + return parseInjectionContext(injection, file.getProject()); + } + }).getValue(); + for (PsiElement cur = contextFile.getFirstChild(); cur != null; cur = cur.getNextSibling()) { + if (cur instanceof PsiNamedElement && !ResolveUtil.processElement(processor, (PsiNamedElement)cur)) return false; + } + return true; } private static PsiFile parseInjectionContext(@NotNull BaseInjection injection, Project project) { From 16b3cc93bc93b112b09b7b552141e814ab3195d2 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 1 Jun 2010 18:04:01 +0400 Subject: [PATCH 32/58] Maven: npe fix --- .../src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java index 3884988fa2e1..72e899b77e9a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java @@ -547,7 +547,7 @@ public class MavenUtil { public static VirtualFile resolveSuperPomFile(@Nullable File mavenHome) { VirtualFile result = doResolveSuperPomFile(mavenHome); if (result == null) { - doResolveSuperPomFile(MavenFacadeManager.collectClassPathAndLIbsFolder().second); + result = doResolveSuperPomFile(MavenFacadeManager.collectClassPathAndLIbsFolder().second); } return result; } From 7fcd710b850d0773b3eb595250a2cefc942d2998 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 1 Jun 2010 18:07:41 +0400 Subject: [PATCH 33/58] [Mercurial] lazy initialization of the PROMPT_HOOKS_PLUGIN constant. --- plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java | 2 ++ .../src/org/zmlx/hg4idea/command/HgCommandService.java | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java index 994c8b2c9e1a..97f4a89627e8 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgUtil.java @@ -18,6 +18,7 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vfs.*; import com.intellij.vcsUtil.*; +import org.jetbrains.annotations.Nullable; import java.io.*; @@ -127,6 +128,7 @@ public abstract class HgUtil { * @return The temporary copy the specified python file, with all the necessary hooks installed * to make sure it is completely removed at shutdown */ + @Nullable public static File getTemporaryPythonFile(String base) { try { final File file = copyResourceToTempFile(base, ".py"); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java index e4531f67fda7..f12e83b55470 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java @@ -29,7 +29,7 @@ import java.util.List; public final class HgCommandService { - private static final File PROMPT_HOOKS_PLUGIN = HgUtil.getTemporaryPythonFile("prompthooks"); + private static File PROMPT_HOOKS_PLUGIN; static final Logger LOG = Logger.getInstance(HgCommandService.class.getName()); @@ -43,6 +43,9 @@ public final class HgCommandService { public HgCommandService(Project project, HgGlobalSettings settings) { this.project = project; this.settings = settings; + if (PROMPT_HOOKS_PLUGIN == null) { + PROMPT_HOOKS_PLUGIN = HgUtil.getTemporaryPythonFile("prompthooks"); + } } public static HgCommandService getInstance(Project project) { From 3119aa8cdab1a3f780a63c02e0a66a2e56e4fc5a Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Tue, 1 Jun 2010 18:50:34 +0400 Subject: [PATCH 34/58] fix assertion (EA-20597) --- .../zencoding/XmlZenCodingInterpreter.java | 27 ++++++++++++------- .../zencoding/XmlZenCodingTemplate.java | 11 +++++--- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java index 21274dd639f9..5ad53eec3a94 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.template.zencoding; import com.intellij.codeInsight.template.CustomTemplateCallback; import com.intellij.codeInsight.template.impl.TemplateImpl; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.Pair; @@ -306,21 +307,19 @@ class XmlZenCodingInterpreter { private static void invokeTemplate(TemplateToken token, final CustomTemplateCallback callback, - int numberInIteration, + final int numberInIteration, String filter) { if (token instanceof XmlTemplateToken && token.getTemplate() != null) { XmlTemplateToken xmlTemplateToken = (XmlTemplateToken)token; - List> attr2value = new ArrayList>(xmlTemplateToken.getAttribute2Value()); + final List> attr2value = new ArrayList>(xmlTemplateToken.getAttribute2Value()); TemplateImpl modifiedTemplate = token.getTemplate().copy(); - XmlTag tag = xmlTemplateToken.getTag(); + final XmlTag tag = xmlTemplateToken.getTag(); if (tag != null) { - for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { - Pair pair = iterator.next(); - if (tag.getAttribute(pair.first) != null) { - tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration)); - iterator.remove(); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + setAttributeValues(tag, attr2value, numberInIteration); } - } + }); String s = filterXml(tag, callback, filter); assert s != null; if (HtmlUtil.isHtmlBlockTagL(tag.getName())) { @@ -350,6 +349,16 @@ class XmlZenCodingInterpreter { } } + private static void setAttributeValues(XmlTag tag, List> attr2value, int numberInIteration) { + for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { + Pair pair = iterator.next(); + if (tag.getAttribute(pair.first) != null) { + tag.setAttribute(pair.first, ZenCodingUtil.getValue(pair, numberInIteration)); + iterator.remove(); + } + } + } + @Nullable private static String filterXml(XmlTag tag, CustomTemplateCallback callback, String filterSuffix) { PsiElement context = callback.getContext(); diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java index 080397ba94f5..27bff77fc33b 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.template.CustomTemplateCallback; import com.intellij.codeInsight.template.TemplateInvokationListener; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.lang.xml.XMLLanguage; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; @@ -191,7 +192,7 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate { if (template == null && !isXML11ValidQName(prefix)) { return null; } - XmlTemplateToken token = parseSelectors(key); + final XmlTemplateToken token = parseSelectors(key); if (token == null) { return null; } @@ -203,13 +204,17 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate { } assert prefix.equals(token.getKey()); token.setTemplate(template); - XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, true); + final XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, true); if (token.getAttribute2Value().size() > 0 && tag == null) { return null; } if (tag != null) { if (!XmlZenCodingInterpreter.containsAttrsVar(template) && token.getAttribute2Value().size() > 0) { - addMissingAttributes(tag, token.getAttribute2Value()); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + addMissingAttributes(tag, token.getAttribute2Value()); + } + }); } token.setTag(tag); } From 72522ed6cd3ee90e601e2913fadcfd91333ebadb Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Tue, 1 Jun 2010 19:12:32 +0400 Subject: [PATCH 35/58] WI-1470 autocomplete error in css --- .../psi/filters/FilterPositionUtil.java | 11 ++++- .../psi/filters/position/AfterElement.java | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java diff --git a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java index 5799c9f946b5..459ec283eb59 100644 --- a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java @@ -30,10 +30,17 @@ public class FilterPositionUtil { @Nullable public static PsiElement searchNonSpaceNonCommentBack(PsiElement element) { + return searchNonSpaceNonCommentBack(element, false); + } + + @Nullable + public static PsiElement searchNonSpaceNonCommentBack(PsiElement element, final boolean strict) { if(element == null || element.getNode() == null) return null; ASTNode leftNeibour = TreeUtil.prevLeaf(element.getNode()); - while (leftNeibour != null && (leftNeibour.getElementType() == TokenType.WHITE_SPACE || leftNeibour.getPsi() instanceof PsiComment)){ - leftNeibour = TreeUtil.prevLeaf(leftNeibour); + if (!strict) { + while (leftNeibour != null && (leftNeibour.getElementType() == TokenType.WHITE_SPACE || leftNeibour.getPsi() instanceof PsiComment)){ + leftNeibour = TreeUtil.prevLeaf(leftNeibour); + } } return leftNeibour != null ? leftNeibour.getPsi() : null; diff --git a/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java b/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java new file mode 100644 index 000000000000..233bb683fb79 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2010 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.psi.filters.position; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.filters.ElementFilter; +import com.intellij.psi.filters.FilterPositionUtil; + +/** + * User: spLeaner + */ +public class AfterElement extends PositionElementFilter { + public AfterElement(){} + + public AfterElement(ElementFilter filter){ + setFilter(filter); + } + + public boolean isAcceptable(Object element, PsiElement context){ + if (!(element instanceof PsiElement)) return false; + final PsiElement previous = FilterPositionUtil.searchNonSpaceNonCommentBack((PsiElement) element, true); + if(previous != null){ + return getFilter().isAcceptable(previous, context); + } + return false; + } + + public String toString(){ + return "after(" +getFilter()+")"; + } +} From da8c752870483a6a3f5cfd62a290659602e44d0a Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 1 Jun 2010 19:39:13 +0400 Subject: [PATCH 36/58] Normalize symlinks in fsnotifier --- native/fsNotifier/linux/fsnotifier | Bin 23638 -> 22529 bytes native/fsNotifier/linux/fsnotifier64 | Bin 26146 -> 28917 bytes native/fsNotifier/linux/inotify.c | 4 +++- native/fsNotifier/linux/make.sh | 3 +++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/native/fsNotifier/linux/fsnotifier b/native/fsNotifier/linux/fsnotifier index 3d84ba68c1c23eb8f61adcb4d846f1f2d9f1d699..9290ab239af577c4d72f723b0bf171205b55ecf0 100755 GIT binary patch delta 7822 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 o+!}24|7TjcXvrgmh0{v!Dw?EnA( delta 8737 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 diff --git a/native/fsNotifier/linux/fsnotifier64 b/native/fsNotifier/linux/fsnotifier64 index 1c959e2ddfb8b2fa26bc195709dfd10f947b0216..3a573dd7a1830018ce482924f11e4d681962e654 100755 GIT binary patch literal 28917 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 literal 26146 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 diff --git a/native/fsNotifier/linux/inotify.c b/native/fsNotifier/linux/inotify.c index b3306e5c64ed..411a6def1733 100644 --- a/native/fsNotifier/linux/inotify.c +++ b/native/fsNotifier/linux/inotify.c @@ -284,7 +284,9 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores) { int watch(const char* root, array* ignores) { - return walk_tree(root, NULL, ignores); + char buf[PATH_MAX]; + const char* normalized = realpath(root, buf); + return walk_tree((normalized != NULL ? normalized : root), NULL, ignores); } diff --git a/native/fsNotifier/linux/make.sh b/native/fsNotifier/linux/make.sh index e2741da2778d..f2ec112fc406 100755 --- a/native/fsNotifier/linux/make.sh +++ b/native/fsNotifier/linux/make.sh @@ -1,2 +1,5 @@ +#!/bin/sh +echo "compiling 32-bit version" gcc -O2 -m32 -Wall -std=c99 -D_BSD_SOURCE -D_XOPEN_SOURCE=500 -o fsnotifier main.c inotify.c util.c +echo "compiling 64-bit version" gcc -O2 -m64 -Wall -std=c99 -D_BSD_SOURCE -D_XOPEN_SOURCE=500 -o fsnotifier64 main.c inotify.c util.c From c12cbe3f5438dd623ddf0e41a753292323d0d694 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 1 Jun 2010 19:40:50 +0400 Subject: [PATCH 37/58] C/C++ syntax highlighting: true and false in same group --- platform/platform-resources/src/FileTypeManager.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources/src/FileTypeManager.xml b/platform/platform-resources/src/FileTypeManager.xml index 5911348c1044..007518cdb91f 100644 --- a/platform/platform-resources/src/FileTypeManager.xml +++ b/platform/platform-resources/src/FileTypeManager.xml @@ -231,6 +231,7 @@ + @@ -258,7 +259,6 @@ - From 0ee831bb631c17d99a645b66b37c1d4507a2a049 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 1 Jun 2010 23:03:07 +0400 Subject: [PATCH 38/58] Test SVN binary updated --- plugins/svn4idea/testData/svn/bin/svn | Bin 3931756 -> 5589665 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/svn4idea/testData/svn/bin/svn b/plugins/svn4idea/testData/svn/bin/svn index cb405a4a7326ff080170eeb5c46b63dbad67f829..1c3cce2d7080a456fb035aa60bb56f08b0c27247 100755 GIT binary patch literal 5589665 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 z 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