aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java')
-rw-r--r--framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java416
1 files changed, 0 insertions, 416 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java b/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
deleted file mode 100644
index 69ee04a9..00000000
--- a/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
+++ /dev/null
@@ -1,416 +0,0 @@
-package org.apache.maven.classrealm;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- */
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.TreeMap;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.classrealm.ClassRealmRequest.RealmType;
-import org.apache.maven.extension.internal.CoreExportsProvider;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Plugin;
-import org.codehaus.plexus.MutablePlexusContainer;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.classworlds.ClassWorld;
-import org.codehaus.plexus.classworlds.realm.ClassRealm;
-import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
-import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.util.StringUtils;
-import org.eclipse.aether.artifact.Artifact;
-
-/**
- * Manages the class realms used by Maven. <strong>Warning:</strong> This is an internal utility class that is only
- * public for technical reasons, it is not part of the public API. In particular, this class can be changed or deleted
- * without prior notice.
- *
- * @author Benjamin Bentmann
- */
-@Named
-@Singleton
-public class DefaultClassRealmManager
- implements ClassRealmManager
-{
- public static final String API_REALMID = "maven.api";
-
- /**
- * During normal command line build, ClassWorld is loaded by jvm system classloader, which only includes
- * plexus-classworlds jar and possibly javaagent classes, see http://jira.codehaus.org/browse/MNG-4747.
- * <p>
- * Using ClassWorld to determine plugin/extensions realm parent classloaders gives m2e and integration test harness
- * flexibility to load multiple version of maven into dedicated classloaders without assuming state of jvm system
- * classloader.
- */
- private static final ClassLoader PARENT_CLASSLOADER = ClassWorld.class.getClassLoader();
-
- private final Logger logger;
-
- private final ClassWorld world;
-
- private final ClassRealm containerRealm;
-
- // this is a live injected collection
- private final List<ClassRealmManagerDelegate> delegates;
-
- private final ClassRealm mavenApiRealm;
-
- /**
- * Patterns of artifacts provided by maven core and exported via maven api realm. These artifacts are filtered from
- * plugin and build extensions realms to avoid presence of duplicate and possibly conflicting classes on classpath.
- */
- private final Set<String> providedArtifacts;
-
- @Inject
- public DefaultClassRealmManager( Logger logger, PlexusContainer container,
- List<ClassRealmManagerDelegate> delegates, CoreExportsProvider exports )
- {
- this.logger = logger;
- this.world = ( (MutablePlexusContainer) container ).getClassWorld();
- this.containerRealm = container.getContainerRealm();
- this.delegates = delegates;
-
- Map<String, ClassLoader> foreignImports = exports.get().getExportedPackages();
-
- this.mavenApiRealm =
- createRealm( API_REALMID, RealmType.Core, null /* parent */, null /* parentImports */,
- foreignImports, null /* artifacts */ );
-
- this.providedArtifacts = exports.get().getExportedArtifacts();
- }
-
- private ClassRealm newRealm( String id )
- {
- synchronized ( world )
- {
- String realmId = id;
-
- Random random = new Random();
-
- while ( true )
- {
- try
- {
- ClassRealm classRealm = world.newRealm( realmId, null );
-
- if ( logger.isDebugEnabled() )
- {
- logger.debug( "Created new class realm " + realmId );
- }
-
- return classRealm;
- }
- catch ( DuplicateRealmException e )
- {
- realmId = id + '-' + random.nextInt();
- }
- }
- }
- }
-
- public ClassRealm getMavenApiRealm()
- {
- return mavenApiRealm;
- }
-
- /**
- * Creates a new class realm with the specified parent and imports.
- *
- * @param baseRealmId The base id to use for the new realm, must not be {@code null}.
- * @param type The type of the class realm, must not be {@code null}.
- * @param parent The parent realm for the new realm, may be {@code null}.
- * @param parentImports The packages/types to import from the parent realm, may be {@code null}.
- * @param foreignImports The packages/types to import from foreign realms, may be {@code null}.
- * @param artifacts The artifacts to add to the realm, may be {@code null}. Unresolved artifacts (i.e. with a
- * missing file) will automatically be excluded from the realm.
- * @return The created class realm, never {@code null}.
- */
- private ClassRealm createRealm( String baseRealmId, RealmType type, ClassLoader parent, List<String> parentImports,
- Map<String, ClassLoader> foreignImports, List<Artifact> artifacts )
- {
- Set<String> artifactIds = new LinkedHashSet<String>();
-
- List<ClassRealmConstituent> constituents = new ArrayList<ClassRealmConstituent>();
-
- if ( artifacts != null )
- {
- for ( Artifact artifact : artifacts )
- {
- if ( !isProvidedArtifact( artifact ) )
- {
- artifactIds.add( getId( artifact ) );
- if ( artifact.getFile() != null )
- {
- constituents.add( new ArtifactClassRealmConstituent( artifact ) );
- }
- }
- }
- }
-
- if ( parentImports != null )
- {
- parentImports = new ArrayList<String>( parentImports );
- }
- else
- {
- parentImports = new ArrayList<String>();
- }
-
- if ( foreignImports != null )
- {
- foreignImports = new TreeMap<String, ClassLoader>( foreignImports );
- }
- else
- {
- foreignImports = new TreeMap<String, ClassLoader>();
- }
-
- ClassRealm classRealm = newRealm( baseRealmId );
-
- if ( parent != null )
- {
- classRealm.setParentClassLoader( parent );
- }
-
- callDelegates( classRealm, type, parent, parentImports, foreignImports, constituents );
-
- wireRealm( classRealm, parentImports, foreignImports );
-
- Set<String> includedIds = populateRealm( classRealm, constituents );
-
- if ( logger.isDebugEnabled() )
- {
- artifactIds.removeAll( includedIds );
-
- for ( String id : artifactIds )
- {
- logger.debug( " Excluded: " + id );
- }
- }
-
- return classRealm;
- }
-
- public ClassRealm getCoreRealm()
- {
- return containerRealm;
- }
-
- public ClassRealm createProjectRealm( Model model, List<Artifact> artifacts )
- {
- if ( model == null )
- {
- throw new IllegalArgumentException( "model missing" );
- }
-
- ClassLoader parent = getMavenApiRealm();
-
- return createRealm( getKey( model ), RealmType.Project, parent, null, null, artifacts );
- }
-
- private static String getKey( Model model )
- {
- return "project>" + model.getGroupId() + ":" + model.getArtifactId() + ":" + model.getVersion();
- }
-
- public ClassRealm createExtensionRealm( Plugin plugin, List<Artifact> artifacts )
- {
- if ( plugin == null )
- {
- throw new IllegalArgumentException( "extension plugin missing" );
- }
-
- ClassLoader parent = PARENT_CLASSLOADER;
-
- Map<String, ClassLoader> foreignImports =
- Collections.<String, ClassLoader>singletonMap( "", getMavenApiRealm() );
-
- return createRealm( getKey( plugin, true ), RealmType.Extension, parent, null, foreignImports, artifacts );
- }
-
- private boolean isProvidedArtifact( Artifact artifact )
- {
- return providedArtifacts.contains( artifact.getGroupId() + ":" + artifact.getArtifactId() );
- }
-
- public ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List<String> parentImports,
- Map<String, ClassLoader> foreignImports, List<Artifact> artifacts )
- {
- if ( plugin == null )
- {
- throw new IllegalArgumentException( "plugin missing" );
- }
-
- if ( parent == null )
- {
- parent = PARENT_CLASSLOADER;
- }
-
- return createRealm( getKey( plugin, false ), RealmType.Plugin, parent, parentImports, foreignImports,
- artifacts );
- }
-
- private static String getKey( Plugin plugin, boolean extension )
- {
- String version = ArtifactUtils.toSnapshotVersion( plugin.getVersion() );
- return ( extension ? "extension>" : "plugin>" ) + plugin.getGroupId() + ":" + plugin.getArtifactId() + ":"
- + version;
- }
-
- private static String getId( Artifact artifact )
- {
- return getId( artifact.getGroupId(), artifact.getArtifactId(), artifact.getExtension(),
- artifact.getClassifier(), artifact.getBaseVersion() );
- }
-
- private static String getId( ClassRealmConstituent constituent )
- {
- return getId( constituent.getGroupId(), constituent.getArtifactId(), constituent.getType(),
- constituent.getClassifier(), constituent.getVersion() );
- }
-
- private static String getId( String gid, String aid, String type, String cls, String ver )
- {
- return gid + ':' + aid + ':' + type + ( StringUtils.isNotEmpty( cls ) ? ':' + cls : "" ) + ':' + ver;
- }
-
- private void callDelegates( ClassRealm classRealm, RealmType type, ClassLoader parent, List<String> parentImports,
- Map<String, ClassLoader> foreignImports, List<ClassRealmConstituent> constituents )
- {
- List<ClassRealmManagerDelegate> delegates = new ArrayList<ClassRealmManagerDelegate>( this.delegates );
-
- if ( !delegates.isEmpty() )
- {
- ClassRealmRequest request =
- new DefaultClassRealmRequest( type, parent, parentImports, foreignImports, constituents );
-
- for ( ClassRealmManagerDelegate delegate : delegates )
- {
- try
- {
- delegate.setupRealm( classRealm, request );
- }
- catch ( Exception e )
- {
- logger.error( delegate.getClass().getName() + " failed to setup class realm " + classRealm + ": "
- + e.getMessage(), e );
- }
- }
- }
- }
-
- private Set<String> populateRealm( ClassRealm classRealm, List<ClassRealmConstituent> constituents )
- {
- Set<String> includedIds = new LinkedHashSet<String>();
-
- if ( logger.isDebugEnabled() )
- {
- logger.debug( "Populating class realm " + classRealm.getId() );
- }
-
- for ( ClassRealmConstituent constituent : constituents )
- {
- File file = constituent.getFile();
-
- String id = getId( constituent );
- includedIds.add( id );
-
- if ( logger.isDebugEnabled() )
- {
- logger.debug( " Included: " + id );
- }
-
- try
- {
- classRealm.addURL( file.toURI().toURL() );
- }
- catch ( MalformedURLException e )
- {
- // Not going to happen
- logger.error( e.getMessage(), e );
- }
- }
-
- return includedIds;
- }
-
- private void wireRealm( ClassRealm classRealm, List<String> parentImports, Map<String, ClassLoader> foreignImports )
- {
- if ( foreignImports != null && !foreignImports.isEmpty() )
- {
- if ( logger.isDebugEnabled() )
- {
- logger.debug( "Importing foreign packages into class realm " + classRealm.getId() );
- }
-
- for ( Map.Entry<String, ClassLoader> entry : foreignImports.entrySet() )
- {
- ClassLoader importedRealm = entry.getValue();
- String imp = entry.getKey();
-
- if ( logger.isDebugEnabled() )
- {
- logger.debug( " Imported: " + imp + " < " + getId( importedRealm ) );
- }
-
- classRealm.importFrom( importedRealm, imp );
- }
- }
-
- if ( parentImports != null && !parentImports.isEmpty() )
- {
- if ( logger.isDebugEnabled() )
- {
- logger.debug( "Importing parent packages into class realm " + classRealm.getId() );
- }
-
- for ( String imp : parentImports )
- {
- if ( logger.isDebugEnabled() )
- {
- logger.debug( " Imported: " + imp + " < " + getId( classRealm.getParentClassLoader() ) );
- }
-
- classRealm.importFromParent( imp );
- }
- }
- }
-
- private String getId( ClassLoader classLoader )
- {
- if ( classLoader instanceof ClassRealm )
- {
- return ( (ClassRealm) classLoader ).getId();
- }
- return String.valueOf( classLoader );
- }
-
-}