From c4377bd039acb4d96ca93356699a685f91479a27 Mon Sep 17 00:00:00 2001 From: Igor Fedorenko Date: Tue, 9 Apr 2013 23:00:58 -0400 Subject: 405090 fixed plugin artifact cache does not honour forceUpdate This seems to be a bug in maven core, where DefaultPluginArtifactsCache and/or DefaultProjectBuildingHelper do not respect session force dependency update flag. For now, made the fix m2e-specific but should probably fix in maven. Signed-off-by: Igor Fedorenko --- .../embedder/DefaultMavenComponentContributor.java | 3 ++ .../project/EclipsePluginArtifactsCache.java | 53 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/EclipsePluginArtifactsCache.java diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/DefaultMavenComponentContributor.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/DefaultMavenComponentContributor.java index 36a600f2..7eeaa05a 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/DefaultMavenComponentContributor.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/DefaultMavenComponentContributor.java @@ -12,6 +12,7 @@ package org.eclipse.m2e.core.internal.embedder; import org.apache.maven.classrealm.ClassRealmManagerDelegate; +import org.apache.maven.plugin.PluginArtifactsCache; import org.apache.maven.plugin.internal.PluginDependenciesResolver; import org.apache.maven.project.artifact.MavenMetadataCache; @@ -19,6 +20,7 @@ import org.sonatype.aether.RepositoryListener; import org.sonatype.plexus.build.incremental.BuildContext; import org.eclipse.m2e.core.internal.project.EclipseMavenMetadataCache; +import org.eclipse.m2e.core.internal.project.EclipsePluginArtifactsCache; import org.eclipse.m2e.core.internal.project.registry.EclipsePluginDependenciesResolver; @@ -26,6 +28,7 @@ public class DefaultMavenComponentContributor implements IMavenComponentContribu public void contribute(IMavenComponentBinder binder) { binder.bind(MavenMetadataCache.class, EclipseMavenMetadataCache.class, null); + binder.bind(PluginArtifactsCache.class, EclipsePluginArtifactsCache.class, null); binder.bind(PluginDependenciesResolver.class, EclipsePluginDependenciesResolver.class, null); binder.bind(BuildContext.class, EclipseBuildContext.class, null); binder.bind(ClassRealmManagerDelegate.class, EclipseClassRealmManagerDelegate.class, diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/EclipsePluginArtifactsCache.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/EclipsePluginArtifactsCache.java new file mode 100644 index 00000000..2612679e --- /dev/null +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/EclipsePluginArtifactsCache.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2013 Igor Fedorenko + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Igor Fedorenko - initial API and implementation + *******************************************************************************/ + +package org.eclipse.m2e.core.internal.project; + +import javax.inject.Singleton; + +import org.apache.maven.plugin.DefaultPluginArtifactsCache; +import org.apache.maven.plugin.PluginResolutionException; + +import org.sonatype.aether.RepositoryCache; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.repository.RepositoryPolicy; + +import org.eclipse.m2e.core.internal.embedder.MavenExecutionContext; + + +@Singleton +public class EclipsePluginArtifactsCache extends DefaultPluginArtifactsCache { + + public CacheRecord get(Key key) throws PluginResolutionException { + MavenExecutionContext context = MavenExecutionContext.getThreadContext(); + + if(context == null) { + return super.get(key); + } + + RepositorySystemSession session = context.getRepositorySession(); + RepositoryCache sessionCache = session.getCache(); + + if(!RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals(session.getUpdatePolicy()) + || sessionCache.get(session, key) != null) { + return super.get(key); + } + + // only force refresh once per repository session + cache.remove(key); + sessionCache.put(session, key, Boolean.TRUE); + return null; + } + + public EclipsePluginArtifactsCache() { + super(); + } +} -- cgit v1.2.3