From 35d4009ad21a7b04aaffc4113bf0ca9eb2f26311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Garillot?= Date: Wed, 17 Sep 2014 10:19:17 +0200 Subject: [PATCH 1/4] Prevent NPE in addDeployableAttribute --- .../org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java index d6bd05b..a7c2011 100644 --- a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java +++ b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java @@ -276,6 +276,7 @@ private static void addDeployableAttribute(IJavaProject javaProject, IClasspathA throws JavaModelException, CoreException { if (javaProject == null) return; ClasspathContainerInitializer scalaInitializer = JavaCore.getClasspathContainerInitializer(SCALA_CONTAINER_PATH); + if (scalaInitializer == null) return; IPath scalaContainerPath = Path.fromPortableString(SCALA_CONTAINER_PATH); Boolean updateAble = scalaInitializer.canUpdateClasspathContainer(scalaContainerPath, javaProject); final IClasspathContainer scalaLibrary = JavaCore.getClasspathContainer(scalaContainerPath, javaProject); From adca2b39a3d045955779ae118d47d794287e21f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Garillot?= Date: Wed, 24 Sep 2014 10:55:13 +0200 Subject: [PATCH 2/4] Put removal of scala library on classpath in an Eclipse job. --- .../scala/ScalaProjectConfigurator.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java index a7c2011..b589f03 100644 --- a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java +++ b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java @@ -24,7 +24,10 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.ClasspathContainerInitializer; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathContainer; @@ -33,7 +36,6 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.ClasspathAttribute; -import org.eclipse.jdt.internal.core.ClasspathEntry; import org.eclipse.m2e.core.project.IMavenProjectFacade; import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest; import org.eclipse.m2e.jdt.AbstractJavaProjectConfigurator; @@ -167,20 +169,27 @@ protected IPath getFullPath( IMavenProjectFacade facade, File file ) { return super.getFullPath(facade, file); } - private void removeScalaFromMavenContainer(IClasspathDescriptor classpath) { - classpath.removeEntry(new IClasspathDescriptor.EntryFilter() { - public boolean accept(IClasspathEntryDescriptor descriptor) { - boolean back = "org.scala-lang".equals(descriptor.getGroupId()); - //TODO, use content of Scala Library Container instead of hardcoded value - back = back && ( - "scala-library".equals(descriptor.getArtifactId()) + private void removeScalaFromMavenContainer(final IClasspathDescriptor classpath) { + Job classpathRemoval = new Job("removeScalaLibFromClassPath") { + @Override + protected IStatus run(IProgressMonitor monitor) { + classpath.removeEntry(new IClasspathDescriptor.EntryFilter() { + public boolean accept(IClasspathEntryDescriptor descriptor) { + boolean back = "org.scala-lang".equals(descriptor.getGroupId()); + //TODO, use content of Scala Library Container instead of hardcoded value + back = back && ("scala-library".equals(descriptor.getArtifactId()) //|| "scala-compiler".equals(descriptor.getArtifactId()) - || "scala-dbc".equals(descriptor.getArtifactId()) - || "scala-swing".equals(descriptor.getArtifactId()) - ); - return back; + || "scala-dbc".equals(descriptor.getArtifactId()) || "scala-swing".equals(descriptor.getArtifactId())); + return back; + } + }); + + return Status.OK_STATUS; } - }); + }; + + classpathRemoval.setPriority(Job.BUILD); + classpathRemoval.schedule(); } /** From cd359c4120d9c87edfebf5a2f42f1d6ff8b4d36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Garillot?= Date: Wed, 24 Sep 2014 11:20:18 +0200 Subject: [PATCH 3/4] Put classpath Ordering in an async job --- .../scala/ScalaProjectConfigurator.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java index b589f03..b7872fa 100644 --- a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java +++ b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java @@ -198,15 +198,28 @@ public boolean accept(IClasspathEntryDescriptor descriptor) { * Should already be done when adding nature * @see scala.tools.eclipse.Nature#configure() */ - private void sortContainerScalaJre(IProject project, IProgressMonitor monitor) throws CoreException { - IJavaProject javaProject = JavaCore.create(project); - IClasspathEntry[] classpathEntries = javaProject.getRawClasspath(); - - List entries = new ArrayList(classpathEntries.length); - Collections.addAll(entries, classpathEntries); + private void sortContainerScalaJre(final IProject project, IProgressMonitor monitor) throws CoreException { + Job classpathOrdering = new Job("orderScalaArtefactsonClaspath"){ + @Override + protected IStatus run(IProgressMonitor monitor) { + IJavaProject javaProject = JavaCore.create(project); + try { + IClasspathEntry[] classpathEntries = javaProject.getRawClasspath(); + + List entries = new ArrayList(classpathEntries.length); + Collections.addAll(entries, classpathEntries); + + Collections.sort(entries, comparator); + javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), monitor); + return Status.OK_STATUS; + } catch(JavaModelException e) { + return Status.CANCEL_STATUS; + } + } + }; - Collections.sort(entries, comparator); - javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), monitor); + classpathOrdering.setPriority(Job.BUILD); + classpathOrdering.schedule(); } private boolean isScalaProject(IProject project) { From a3cf2a34be3560a2ed62aa71361f2b47b646229e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Garillot?= Date: Wed, 24 Sep 2014 11:32:16 +0200 Subject: [PATCH 4/4] Only touch the classpath if it's not already sorted. --- .../eclipse/scala/ScalaProjectConfigurator.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java index b7872fa..e464200 100644 --- a/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java +++ b/org.maven.ide.eclipse.scala/src/org/maven/ide/eclipse/scala/ScalaProjectConfigurator.java @@ -206,11 +206,18 @@ protected IStatus run(IProgressMonitor monitor) { try { IClasspathEntry[] classpathEntries = javaProject.getRawClasspath(); - List entries = new ArrayList(classpathEntries.length); - Collections.addAll(entries, classpathEntries); + Boolean sorted = true; + for (int i = 0; i < classpathEntries.length - 1; i++) { + if (comparator.compare(classpathEntries[i], classpathEntries[i+1]) > 0){sorted = false; break;} + } + + if(!sorted) { + List entries = new ArrayList(classpathEntries.length); + Collections.addAll(entries, classpathEntries); - Collections.sort(entries, comparator); - javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), monitor); + Collections.sort(entries, comparator); + javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), monitor); + } return Status.OK_STATUS; } catch(JavaModelException e) { return Status.CANCEL_STATUS;