001package org.apache.maven.bridge;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.io.File;
023import java.util.ArrayList;
024import java.util.Collection;
025import java.util.Collections;
026import java.util.HashMap;
027import java.util.LinkedHashMap;
028import java.util.List;
029import java.util.Map;
030
031import org.apache.maven.RepositoryUtils;
032import org.apache.maven.artifact.Artifact;
033import org.apache.maven.artifact.DefaultArtifact;
034import org.apache.maven.artifact.InvalidRepositoryException;
035import org.apache.maven.artifact.handler.ArtifactHandler;
036import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
037import org.apache.maven.artifact.repository.ArtifactRepository;
038import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
039import org.apache.maven.artifact.repository.Authentication;
040import org.apache.maven.artifact.repository.MavenArtifactRepository;
041import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
042import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout2;
043import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
044import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
045import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
046import org.apache.maven.artifact.versioning.VersionRange;
047import org.apache.maven.model.Dependency;
048import org.apache.maven.model.Exclusion;
049import org.apache.maven.model.Plugin;
050import org.apache.maven.repository.Proxy;
051import org.apache.maven.settings.Mirror;
052import org.apache.maven.settings.Server;
053import org.apache.maven.settings.building.SettingsProblem;
054import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
055import org.apache.maven.settings.crypto.SettingsDecrypter;
056import org.apache.maven.settings.crypto.SettingsDecryptionRequest;
057import org.apache.maven.settings.crypto.SettingsDecryptionResult;
058import org.codehaus.plexus.PlexusContainer;
059import org.codehaus.plexus.component.annotations.Component;
060import org.codehaus.plexus.component.annotations.Requirement;
061import org.codehaus.plexus.logging.Logger;
062import org.codehaus.plexus.util.StringUtils;
063import org.eclipse.aether.RepositorySystemSession;
064import org.eclipse.aether.impl.ArtifactResolver;
065import org.eclipse.aether.repository.AuthenticationContext;
066import org.eclipse.aether.repository.AuthenticationSelector;
067import org.eclipse.aether.repository.ProxySelector;
068import org.eclipse.aether.repository.RemoteRepository;
069
070/**
071 * @author Jason van Zyl
072 */
073@Component( role = MavenRepositorySystem.class, hint = "default" )
074public class MavenRepositorySystem
075{
076
077    @Requirement
078    private Logger logger;
079
080    @Requirement
081    private ArtifactHandlerManager artifactHandlerManager;
082    
083    @Requirement
084    private ArtifactResolver artifactResolver;
085
086    @Requirement( role = ArtifactRepositoryLayout.class )
087    private Map<String, ArtifactRepositoryLayout> layouts;
088
089    @Requirement
090    private PlexusContainer plexus;
091
092    @Requirement
093    private SettingsDecrypter settingsDecrypter;
094    
095    // DefaultProjectBuilder
096    public Artifact createArtifact( String groupId, String artifactId, String version, String scope, String type )
097    {
098        return XcreateArtifact( groupId, artifactId, version, scope, type );
099    }
100
101    // DefaultProjectBuilder
102    public Artifact createProjectArtifact( String groupId, String artifactId, String metaVersionId )
103    {
104        return XcreateProjectArtifact( groupId, artifactId, metaVersionId );
105    }
106
107    // DefaultProjectBuilder
108    public Artifact createDependencyArtifact( Dependency d )
109    {
110        VersionRange versionRange;
111        try
112        {
113            versionRange = VersionRange.createFromVersionSpec( d.getVersion() );
114        }
115        catch ( InvalidVersionSpecificationException e )
116        {
117            return null;
118        }
119
120        Artifact artifact =
121            XcreateDependencyArtifact( d.getGroupId(), d.getArtifactId(), versionRange, d.getType(),
122                                                      d.getClassifier(), d.getScope(), d.isOptional() );
123
124        if ( Artifact.SCOPE_SYSTEM.equals( d.getScope() ) && d.getSystemPath() != null )
125        {
126            artifact.setFile( new File( d.getSystemPath() ) );
127        }
128
129        if ( !d.getExclusions().isEmpty() )
130        {
131            List<String> exclusions = new ArrayList<String>();
132
133            for ( Exclusion exclusion : d.getExclusions() )
134            {
135                exclusions.add( exclusion.getGroupId() + ':' + exclusion.getArtifactId() );
136            }
137
138            artifact.setDependencyFilter( new ExcludesArtifactFilter( exclusions ) );
139        }
140
141        return artifact;
142    }
143
144    // DefaultProjectBuilder
145    public Artifact createExtensionArtifact( String groupId, String artifactId, String version )
146    {
147        VersionRange versionRange;
148        try
149        {
150            versionRange = VersionRange.createFromVersionSpec( version );
151        }
152        catch ( InvalidVersionSpecificationException e )
153        {
154            return null;
155        }
156
157        return XcreateExtensionArtifact( groupId, artifactId, versionRange );
158    }
159
160    // DefaultProjectBuilder
161    public Artifact createParentArtifact( String groupId, String artifactId, String version )
162    {
163        return XcreateParentArtifact( groupId, artifactId, version );
164    }
165
166    // DefaultProjectBuilder
167    public Artifact createPluginArtifact( Plugin plugin )
168    {
169        VersionRange versionRange;
170        try
171        {
172            String version = plugin.getVersion();
173            if ( StringUtils.isEmpty( version ) )
174            {
175                version = "RELEASE";
176            }
177            versionRange = VersionRange.createFromVersionSpec( version );
178        }
179        catch ( InvalidVersionSpecificationException e )
180        {
181            return null;
182        }
183
184        return XcreatePluginArtifact( plugin.getGroupId(), plugin.getArtifactId(), versionRange );
185    }
186
187    public List<ArtifactRepository> getEffectiveRepositories( List<ArtifactRepository> repositories )
188    {
189        if ( repositories == null )
190        {
191            return null;
192        }
193
194        Map<String, List<ArtifactRepository>> reposByKey = new LinkedHashMap<String, List<ArtifactRepository>>();
195
196        for ( ArtifactRepository repository : repositories )
197        {
198            String key = repository.getId();
199
200            List<ArtifactRepository> aliasedRepos = reposByKey.get( key );
201
202            if ( aliasedRepos == null )
203            {
204                aliasedRepos = new ArrayList<ArtifactRepository>();
205                reposByKey.put( key, aliasedRepos );
206            }
207
208            aliasedRepos.add( repository );
209        }
210
211        List<ArtifactRepository> effectiveRepositories = new ArrayList<ArtifactRepository>();
212
213        for ( List<ArtifactRepository> aliasedRepos : reposByKey.values() )
214        {
215            List<ArtifactRepository> mirroredRepos = new ArrayList<ArtifactRepository>();
216
217            List<ArtifactRepositoryPolicy> releasePolicies =
218                new ArrayList<ArtifactRepositoryPolicy>( aliasedRepos.size() );
219
220            for ( ArtifactRepository aliasedRepo : aliasedRepos )
221            {
222                releasePolicies.add( aliasedRepo.getReleases() );
223                mirroredRepos.addAll( aliasedRepo.getMirroredRepositories() );
224            }
225
226            ArtifactRepositoryPolicy releasePolicy = getEffectivePolicy( releasePolicies );
227
228            List<ArtifactRepositoryPolicy> snapshotPolicies =
229                new ArrayList<ArtifactRepositoryPolicy>( aliasedRepos.size() );
230
231            for ( ArtifactRepository aliasedRepo : aliasedRepos )
232            {
233                snapshotPolicies.add( aliasedRepo.getSnapshots() );
234            }
235
236            ArtifactRepositoryPolicy snapshotPolicy = getEffectivePolicy( snapshotPolicies );
237
238            ArtifactRepository aliasedRepo = aliasedRepos.get( 0 );
239
240            ArtifactRepository effectiveRepository =
241                createArtifactRepository( aliasedRepo.getId(), aliasedRepo.getUrl(), aliasedRepo.getLayout(),
242                                          snapshotPolicy, releasePolicy );
243
244            effectiveRepository.setAuthentication( aliasedRepo.getAuthentication() );
245
246            effectiveRepository.setProxy( aliasedRepo.getProxy() );
247
248            effectiveRepository.setMirroredRepositories( mirroredRepos );
249
250            effectiveRepositories.add( effectiveRepository );
251        }
252
253        return effectiveRepositories;
254    }
255
256    private ArtifactRepositoryPolicy getEffectivePolicy( Collection<ArtifactRepositoryPolicy> policies )
257    {
258        ArtifactRepositoryPolicy effectivePolicy = null;
259
260        for ( ArtifactRepositoryPolicy policy : policies )
261        {
262            if ( effectivePolicy == null )
263            {
264                effectivePolicy = new ArtifactRepositoryPolicy( policy );
265            }
266            else
267            {
268                effectivePolicy.merge( policy );
269            }
270        }
271
272        return effectivePolicy;
273    }
274
275    public Mirror getMirror( ArtifactRepository repository, List<Mirror> mirrors )
276    {
277        return MirrorSelector.getMirror( repository, mirrors );
278    }
279
280    public void injectMirror( List<ArtifactRepository> repositories, List<Mirror> mirrors )
281    {
282        if ( repositories != null && mirrors != null )
283        {
284            for ( ArtifactRepository repository : repositories )
285            {
286                Mirror mirror = getMirror( repository, mirrors );
287                injectMirror( repository, mirror );
288            }
289        }
290    }
291
292    private Mirror getMirror( RepositorySystemSession session, ArtifactRepository repository )
293    {
294        if ( session != null )
295        {
296            org.eclipse.aether.repository.MirrorSelector selector = session.getMirrorSelector();
297            if ( selector != null )
298            {
299                RemoteRepository repo = selector.getMirror( RepositoryUtils.toRepo( repository ) );
300                if ( repo != null )
301                {
302                    Mirror mirror = new Mirror();
303                    mirror.setId( repo.getId() );
304                    mirror.setUrl( repo.getUrl() );
305                    mirror.setLayout( repo.getContentType() );
306                    return mirror;
307                }
308            }
309        }
310        return null;
311    }
312
313    public void injectMirror( RepositorySystemSession session, List<ArtifactRepository> repositories )
314    {
315        if ( repositories != null && session != null )
316        {
317            for ( ArtifactRepository repository : repositories )
318            {
319                Mirror mirror = getMirror( session, repository );
320                injectMirror( repository, mirror );
321            }
322        }
323    }
324
325    private void injectMirror( ArtifactRepository repository, Mirror mirror )
326    {
327        if ( mirror != null )
328        {
329            ArtifactRepository original =
330                createArtifactRepository( repository.getId(), repository.getUrl(), repository.getLayout(),
331                                          repository.getSnapshots(), repository.getReleases() );
332
333            repository.setMirroredRepositories( Collections.singletonList( original ) );
334
335            repository.setId( mirror.getId() );
336            repository.setUrl( mirror.getUrl() );
337
338            if ( StringUtils.isNotEmpty( mirror.getLayout() ) )
339            {
340                repository.setLayout( getLayout( mirror.getLayout() ) );
341            }
342        }
343    }
344
345    public void injectAuthentication( List<ArtifactRepository> repositories, List<Server> servers )
346    {
347        if ( repositories != null )
348        {
349            Map<String, Server> serversById = new HashMap<String, Server>();
350
351            if ( servers != null )
352            {
353                for ( Server server : servers )
354                {
355                    if ( !serversById.containsKey( server.getId() ) )
356                    {
357                        serversById.put( server.getId(), server );
358                    }
359                }
360            }
361
362            for ( ArtifactRepository repository : repositories )
363            {
364                Server server = serversById.get( repository.getId() );
365
366                if ( server != null )
367                {
368                    SettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest( server );
369                    SettingsDecryptionResult result = settingsDecrypter.decrypt( request );
370                    server = result.getServer();
371
372                    if ( logger.isDebugEnabled() )
373                    {
374                        for ( SettingsProblem problem : result.getProblems() )
375                        {
376                            logger.debug( problem.getMessage(), problem.getException() );
377                        }
378                    }
379
380                    Authentication authentication = new Authentication( server.getUsername(), server.getPassword() );
381                    authentication.setPrivateKey( server.getPrivateKey() );
382                    authentication.setPassphrase( server.getPassphrase() );
383
384                    repository.setAuthentication( authentication );
385                }
386                else
387                {
388                    repository.setAuthentication( null );
389                }
390            }
391        }
392    }
393
394    private Authentication getAuthentication( RepositorySystemSession session, ArtifactRepository repository )
395    {
396        if ( session != null )
397        {
398            AuthenticationSelector selector = session.getAuthenticationSelector();
399            if ( selector != null )
400            {
401                RemoteRepository repo = RepositoryUtils.toRepo( repository );
402                org.eclipse.aether.repository.Authentication auth = selector.getAuthentication( repo );
403                if ( auth != null )
404                {
405                    repo = new RemoteRepository.Builder( repo ).setAuthentication( auth ).build();
406                    AuthenticationContext authCtx = AuthenticationContext.forRepository( session, repo );
407                    Authentication result =
408                        new Authentication( authCtx.get( AuthenticationContext.USERNAME ),
409                                            authCtx.get( AuthenticationContext.PASSWORD ) );
410                    result.setPrivateKey( authCtx.get( AuthenticationContext.PRIVATE_KEY_PATH ) );
411                    result.setPassphrase( authCtx.get( AuthenticationContext.PRIVATE_KEY_PASSPHRASE ) );
412                    authCtx.close();
413                    return result;
414                }
415            }
416        }
417        return null;
418    }
419
420    public void injectAuthentication( RepositorySystemSession session, List<ArtifactRepository> repositories )
421    {
422        if ( repositories != null && session != null )
423        {
424            for ( ArtifactRepository repository : repositories )
425            {
426                repository.setAuthentication( getAuthentication( session, repository ) );
427            }
428        }
429    }
430
431    private Proxy getProxy( RepositorySystemSession session, ArtifactRepository repository )
432    {
433        if ( session != null )
434        {
435            ProxySelector selector = session.getProxySelector();
436            if ( selector != null )
437            {
438                RemoteRepository repo = RepositoryUtils.toRepo( repository );
439                org.eclipse.aether.repository.Proxy proxy = selector.getProxy( repo );
440                if ( proxy != null )
441                {
442                    Proxy p = new Proxy();
443                    p.setHost( proxy.getHost() );
444                    p.setProtocol( proxy.getType() );
445                    p.setPort( proxy.getPort() );
446                    if ( proxy.getAuthentication() != null )
447                    {
448                        repo = new RemoteRepository.Builder( repo ).setProxy( proxy ).build();
449                        AuthenticationContext authCtx = AuthenticationContext.forProxy( session, repo );
450                        p.setUserName( authCtx.get( AuthenticationContext.USERNAME ) );
451                        p.setPassword( authCtx.get( AuthenticationContext.PASSWORD ) );
452                        p.setNtlmDomain( authCtx.get( AuthenticationContext.NTLM_DOMAIN ) );
453                        p.setNtlmHost( authCtx.get( AuthenticationContext.NTLM_WORKSTATION ) );
454                        authCtx.close();
455                    }
456                    return p;
457                }
458            }
459        }
460        return null;
461    }
462
463    public void injectProxy( RepositorySystemSession session, List<ArtifactRepository> repositories )
464    {
465        if ( repositories != null && session != null )
466        {
467            for ( ArtifactRepository repository : repositories )
468            {
469                repository.setProxy( getProxy( session, repository ) );
470            }
471        }
472    }
473
474    private ArtifactRepositoryLayout getLayout( String id )
475    {
476        ArtifactRepositoryLayout layout = layouts.get( id );
477
478        return layout;
479    }
480
481
482    //
483    // Taken from LegacyRepositorySystem
484    //
485
486    public static org.apache.maven.model.Repository fromSettingsRepository( org.apache.maven.settings.Repository settingsRepository )
487    {
488        org.apache.maven.model.Repository modelRepository = new org.apache.maven.model.Repository();
489        modelRepository.setId( settingsRepository.getId() );
490        modelRepository.setLayout( settingsRepository.getLayout() );
491        modelRepository.setName( settingsRepository.getName() );
492        modelRepository.setUrl( settingsRepository.getUrl() );
493        modelRepository.setReleases( fromSettingsRepositoryPolicy( settingsRepository.getReleases() ) );
494        modelRepository.setSnapshots( fromSettingsRepositoryPolicy( settingsRepository.getSnapshots() ) );
495        return modelRepository;
496    }
497
498    public static org.apache.maven.model.RepositoryPolicy fromSettingsRepositoryPolicy( org.apache.maven.settings.RepositoryPolicy settingsRepositoryPolicy )
499    {
500        org.apache.maven.model.RepositoryPolicy modelRepositoryPolicy = new org.apache.maven.model.RepositoryPolicy();
501        if ( settingsRepositoryPolicy != null )
502        {
503            modelRepositoryPolicy.setEnabled( settingsRepositoryPolicy.isEnabled() );
504            modelRepositoryPolicy.setUpdatePolicy( settingsRepositoryPolicy.getUpdatePolicy() );
505            modelRepositoryPolicy.setChecksumPolicy( settingsRepositoryPolicy.getChecksumPolicy() );
506        }
507        return modelRepositoryPolicy;
508    }
509
510    public static ArtifactRepository buildArtifactRepository( org.apache.maven.settings.Repository repo )
511        throws InvalidRepositoryException
512    {
513        return buildArtifactRepository( fromSettingsRepository( repo ) );
514    }
515
516    public static ArtifactRepository buildArtifactRepository( org.apache.maven.model.Repository repo )
517        throws InvalidRepositoryException
518    {
519        if ( repo != null )
520        {
521            String id = repo.getId();
522
523            if ( StringUtils.isEmpty( id ) )
524            {
525                throw new InvalidRepositoryException( "Repository identifier missing", "" );
526            }
527
528            String url = repo.getUrl();
529
530            if ( StringUtils.isEmpty( url ) )
531            {
532                throw new InvalidRepositoryException( "URL missing for repository " + id, id );
533            }
534
535            ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy( repo.getSnapshots() );
536
537            ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy( repo.getReleases() );
538
539            ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
540
541            return createArtifactRepository( id, url, layout, snapshots, releases );
542        }
543        else
544        {
545            return null;
546        }
547    }
548
549    public static ArtifactRepositoryPolicy buildArtifactRepositoryPolicy( org.apache.maven.model.RepositoryPolicy policy )
550    {
551        boolean enabled = true;
552
553        String updatePolicy = null;
554
555        String checksumPolicy = null;
556
557        if ( policy != null )
558        {
559            enabled = policy.isEnabled();
560
561            if ( policy.getUpdatePolicy() != null )
562            {
563                updatePolicy = policy.getUpdatePolicy();
564            }
565            if ( policy.getChecksumPolicy() != null )
566            {
567                checksumPolicy = policy.getChecksumPolicy();
568            }
569        }
570
571        return new ArtifactRepositoryPolicy( enabled, updatePolicy, checksumPolicy );
572    }
573
574    public static ArtifactRepository createArtifactRepository( String id, String url,
575                                                        ArtifactRepositoryLayout repositoryLayout,
576                                                        ArtifactRepositoryPolicy snapshots,
577                                                        ArtifactRepositoryPolicy releases )
578    {
579        if ( snapshots == null )
580        {
581            snapshots = new ArtifactRepositoryPolicy();
582        }
583
584        if ( releases == null )
585        {
586            releases = new ArtifactRepositoryPolicy();
587        }
588
589        ArtifactRepository repository;
590        if ( repositoryLayout instanceof ArtifactRepositoryLayout2 )
591        {
592            repository =
593                ( (ArtifactRepositoryLayout2) repositoryLayout ).newMavenArtifactRepository( id, url, snapshots,
594                                                                                             releases );
595        }
596        else
597        {
598            repository = new MavenArtifactRepository( id, url, repositoryLayout, snapshots, releases );
599        }
600
601        return repository;
602    }
603    
604    // ArtifactFactory
605    private Artifact XcreateArtifact( String groupId, String artifactId, String version, String scope, String type )
606    {
607        return XcreateArtifact( groupId, artifactId, version, scope, type, null, null );
608    }
609
610    private Artifact XcreateDependencyArtifact( String groupId, String artifactId, VersionRange versionRange,
611                                              String type, String classifier, String scope, boolean optional )
612    {
613        return XcreateArtifact( groupId, artifactId, versionRange, type, classifier, scope, null, optional );
614    }
615
616    private Artifact XcreateProjectArtifact( String groupId, String artifactId, String version )
617    {
618        return XcreateProjectArtifact( groupId, artifactId, version, null );
619    }
620
621    private Artifact XcreateParentArtifact( String groupId, String artifactId, String version )
622    {
623        return XcreateProjectArtifact( groupId, artifactId, version );
624    }
625
626    private Artifact XcreatePluginArtifact( String groupId, String artifactId, VersionRange versionRange )
627    {
628        return XcreateArtifact( groupId, artifactId, versionRange, "maven-plugin", null, Artifact.SCOPE_RUNTIME, null );
629    }
630
631    private Artifact XcreateProjectArtifact( String groupId, String artifactId, String version, String scope )
632    {
633        return XcreateArtifact( groupId, artifactId, version, scope, "pom" );
634    }
635
636    private Artifact XcreateExtensionArtifact( String groupId, String artifactId, VersionRange versionRange )
637    {
638        return XcreateArtifact( groupId, artifactId, versionRange, "jar", null, Artifact.SCOPE_RUNTIME, null );
639    }
640
641    private Artifact XcreateArtifact( String groupId, String artifactId, String version, String scope, String type,
642                                     String classifier, String inheritedScope )
643    {
644        VersionRange versionRange = null;
645        if ( version != null )
646        {
647            versionRange = VersionRange.createFromVersion( version );
648        }
649        return XcreateArtifact( groupId, artifactId, versionRange, type, classifier, scope, inheritedScope );
650    }
651
652    private Artifact XcreateArtifact( String groupId, String artifactId, VersionRange versionRange, String type,
653                                     String classifier, String scope, String inheritedScope )
654    {
655        return XcreateArtifact( groupId, artifactId, versionRange, type, classifier, scope, inheritedScope, false );
656    }
657
658    private Artifact XcreateArtifact( String groupId, String artifactId, VersionRange versionRange, String type,
659                                     String classifier, String scope, String inheritedScope, boolean optional )
660    {
661        String desiredScope = Artifact.SCOPE_RUNTIME;
662
663        if ( inheritedScope == null )
664        {
665            desiredScope = scope;
666        }
667        else if ( Artifact.SCOPE_TEST.equals( scope ) || Artifact.SCOPE_PROVIDED.equals( scope ) )
668        {
669            return null;
670        }
671        else if ( Artifact.SCOPE_COMPILE.equals( scope ) && Artifact.SCOPE_COMPILE.equals( inheritedScope ) )
672        {
673            // added to retain compile artifactScope. Remove if you want compile inherited as runtime
674            desiredScope = Artifact.SCOPE_COMPILE;
675        }
676
677        if ( Artifact.SCOPE_TEST.equals( inheritedScope ) )
678        {
679            desiredScope = Artifact.SCOPE_TEST;
680        }
681
682        if ( Artifact.SCOPE_PROVIDED.equals( inheritedScope ) )
683        {
684            desiredScope = Artifact.SCOPE_PROVIDED;
685        }
686
687        if ( Artifact.SCOPE_SYSTEM.equals( scope ) )
688        {
689            // system scopes come through unchanged...
690            desiredScope = Artifact.SCOPE_SYSTEM;
691        }
692
693        ArtifactHandler handler = artifactHandlerManager.getArtifactHandler( type );
694
695        return new DefaultArtifact( groupId, artifactId, versionRange, desiredScope, type, classifier, handler,
696                                    optional );
697    }    
698}