1 package org.apache.archiva.admin.repository.managed;
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
21 import org.apache.archiva.admin.model.AuditInformation;
22 import org.apache.archiva.admin.model.RepositoryAdminException;
23 import org.apache.archiva.admin.model.beans.ManagedRepository;
24 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
25 import org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
26 import org.apache.archiva.audit.AuditEvent;
27 import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
28 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
29 import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
30 import org.apache.archiva.configuration.Configuration;
31 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
32 import org.apache.archiva.configuration.ProxyConnectorConfiguration;
33 import org.apache.archiva.configuration.RepositoryGroupConfiguration;
34 import org.apache.archiva.metadata.repository.MetadataRepository;
35 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
36 import org.apache.archiva.metadata.repository.RepositorySession;
37 import org.apache.archiva.metadata.repository.RepositorySessionFactory;
38 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
39 import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler;
40 import org.apache.archiva.scheduler.repository.RepositoryTask;
41 import org.apache.archiva.security.common.ArchivaRoleConstants;
42 import org.apache.commons.io.FileUtils;
43 import org.apache.commons.lang.StringUtils;
44 import org.apache.commons.validator.GenericValidator;
45 import org.apache.maven.index.NexusIndexer;
46 import org.apache.maven.index.context.IndexCreator;
47 import org.apache.maven.index.context.IndexingContext;
48 import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
49 import org.codehaus.plexus.redback.role.RoleManager;
50 import org.codehaus.plexus.redback.role.RoleManagerException;
51 import org.codehaus.plexus.taskqueue.TaskQueueException;
52 import org.codehaus.redback.components.scheduler.CronExpressionValidator;
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
55 import org.springframework.stereotype.Service;
57 import javax.annotation.PostConstruct;
58 import javax.annotation.PreDestroy;
59 import javax.inject.Inject;
60 import javax.inject.Named;
62 import java.io.IOException;
63 import java.net.MalformedURLException;
64 import java.util.ArrayList;
65 import java.util.Arrays;
66 import java.util.Collections;
67 import java.util.HashMap;
68 import java.util.List;
72 * FIXME remove all generic Exception to have usefull ones
73 * FIXME review the staging mechanism to have a per user session one
75 * @author Olivier Lamy
77 @Service( "managedRepositoryAdmin#default" )
78 public class DefaultManagedRepositoryAdmin
79 extends AbstractRepositoryAdmin
80 implements ManagedRepositoryAdmin
83 public static final String REPOSITORY_LOCATION_VALID_EXPRESSION = "^[-a-zA-Z0-9._/~:?!&=\\\\]+$";
85 private Logger log = LoggerFactory.getLogger( getClass() );
87 public static final String STAGE_REPO_ID_END = "-stage";
91 @Named( value = "archivaTaskScheduler#repository" )
92 private RepositoryArchivaTaskScheduler repositoryTaskScheduler;
95 private RepositorySessionFactory repositorySessionFactory;
98 private RepositoryStatisticsManager repositoryStatisticsManager;
101 private PlexusSisuBridge plexusSisuBridge;
104 private MavenIndexerUtils mavenIndexerUtils;
107 protected RoleManager roleManager;
110 List<? extends IndexCreator> indexCreators;
112 NexusIndexer indexer;
115 public void initialize()
116 throws RepositoryAdminException
120 indexCreators = mavenIndexerUtils.getAllIndexCreators();
121 indexer = plexusSisuBridge.lookup( NexusIndexer.class );
123 catch ( PlexusSisuBridgeException e )
125 throw new RepositoryAdminException( e.getMessage(), e );
127 // initialize index context on start
128 for ( ManagedRepository managedRepository : getManagedRepositories() )
130 createIndexContext( managedRepository );
135 public void shutdown()
136 throws RepositoryAdminException
140 // close index on shutdown
141 for ( ManagedRepository managedRepository : getManagedRepositories() )
143 IndexingContext context = indexer.getIndexingContexts().get( managedRepository.getId() );
144 if ( context != null )
146 indexer.removeIndexingContext( context, false );
150 catch ( IOException e )
152 throw new RepositoryAdminException( e.getMessage(), e );
156 public List<ManagedRepository> getManagedRepositories()
157 throws RepositoryAdminException
159 List<ManagedRepositoryConfiguration> managedRepoConfigs =
160 getArchivaConfiguration().getConfiguration().getManagedRepositories();
162 if ( managedRepoConfigs == null )
164 return Collections.emptyList();
167 List<ManagedRepository> managedRepos = new ArrayList<ManagedRepository>( managedRepoConfigs.size() );
169 for ( ManagedRepositoryConfiguration repoConfig : managedRepoConfigs )
171 // TODO add staging repo information back too
172 ManagedRepository repo =
173 new ManagedRepository( repoConfig.getId(), repoConfig.getName(), repoConfig.getLocation(),
174 repoConfig.getLayout(), repoConfig.isSnapshots(), repoConfig.isReleases(),
175 repoConfig.isBlockRedeployments(), repoConfig.getRefreshCronExpression(),
176 repoConfig.getIndexDir(), repoConfig.isScanned(), repoConfig.getDaysOlder(),
177 repoConfig.getRetentionCount(), repoConfig.isDeleteReleasedSnapshots(), false );
179 managedRepos.add( repo );
185 public Map<String, ManagedRepository> getManagedRepositoriesAsMap()
186 throws RepositoryAdminException
188 List<ManagedRepository> managedRepositories = getManagedRepositories();
189 Map<String, ManagedRepository> repositoriesMap =
190 new HashMap<String, ManagedRepository>( managedRepositories.size() );
191 for ( ManagedRepository managedRepository : managedRepositories )
193 repositoriesMap.put( managedRepository.getId(), managedRepository );
195 return repositoriesMap;
198 public ManagedRepository getManagedRepository( String repositoryId )
199 throws RepositoryAdminException
201 List<ManagedRepository> repos = getManagedRepositories();
202 for ( ManagedRepository repo : repos )
204 if ( StringUtils.equals( repo.getId(), repositoryId ) )
212 public Boolean addManagedRepository( ManagedRepository managedRepository, boolean needStageRepo,
213 AuditInformation auditInformation )
214 throws RepositoryAdminException
217 getRepositoryCommonValidator().basicValidation( managedRepository, false );
218 triggerAuditEvent( managedRepository.getId(), null, AuditEvent.ADD_MANAGED_REPO, auditInformation );
220 addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),
221 managedRepository.getLocation(), managedRepository.isBlockRedeployments(),
222 managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,
223 managedRepository.getCronExpression(), managedRepository.getIndexDirectory(),
224 managedRepository.getDaysOlder(), managedRepository.getRetentionCount(),
225 managedRepository.isDeleteReleasedSnapshots(), auditInformation,
226 getArchivaConfiguration().getConfiguration() ) != null;
228 createIndexContext( managedRepository );
233 private ManagedRepositoryConfiguration addManagedRepository( String repoId, String layout, String name,
234 String location, boolean blockRedeployments,
235 boolean releasesIncluded, boolean snapshotsIncluded,
236 boolean stageRepoNeeded, String cronExpression,
237 String indexDir, int daysOlder, int retentionCount,
238 boolean deteleReleasedSnapshots,
239 AuditInformation auditInformation,
240 Configuration config )
241 throws RepositoryAdminException
244 // FIXME : olamy can be empty to avoid scheduled scan ?
245 if ( StringUtils.isNotBlank( cronExpression ) )
247 CronExpressionValidator validator = new CronExpressionValidator();
249 if ( !validator.validate( cronExpression ) )
251 throw new RepositoryAdminException( "Invalid cron expression." );
256 throw new RepositoryAdminException( "Cron expression cannot be empty." );
259 String repoLocation = getRepositoryCommonValidator().removeExpressions( location );
261 if ( !GenericValidator.matchRegexp( repoLocation, REPOSITORY_LOCATION_VALID_EXPRESSION ) )
263 throw new RepositoryAdminException(
264 "Invalid repository location. Directory must only contain alphanumeric characters, equals(=), question-marks(?), "
265 + "exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." );
268 ManagedRepositoryConfiguration repository = new ManagedRepositoryConfiguration();
270 repository.setId( repoId );
271 repository.setBlockRedeployments( blockRedeployments );
272 repository.setReleases( releasesIncluded );
273 repository.setSnapshots( snapshotsIncluded );
274 repository.setName( name );
275 repository.setLocation( repoLocation );
276 repository.setLayout( layout );
277 repository.setRefreshCronExpression( cronExpression );
278 repository.setIndexDir( indexDir );
279 repository.setDaysOlder( daysOlder );
280 repository.setRetentionCount( retentionCount );
281 repository.setDeleteReleasedSnapshots( deteleReleasedSnapshots );
282 repository.setIndexDir( indexDir );
286 addRepository( repository, config );
287 addRepositoryRoles( repository );
289 if ( stageRepoNeeded )
291 ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( repository );
292 addRepository( stagingRepository, config );
293 addRepositoryRoles( stagingRepository );
294 triggerAuditEvent( stagingRepository.getId(), null, AuditEvent.ADD_MANAGED_REPO, auditInformation );
297 catch ( RoleManagerException e )
299 throw new RepositoryAdminException( "failed to add repository roles " + e.getMessage(), e );
301 catch ( IOException e )
303 throw new RepositoryAdminException( "failed to add repository " + e.getMessage(), e );
306 saveConfiguration( config );
308 //MRM-1342 Repository statistics report doesn't appear to be working correctly
309 //scan repository when adding of repository is successful
312 scanRepository( repoId, true );
313 // olamy no need of scanning staged repo
315 if ( stageRepoNeeded )
317 ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( repository );
318 scanRepository( stagingRepository.getId(), true );
321 catch ( Exception e )
323 log.warn( new StringBuilder( "Unable to scan repository [" ).append( repoId ).append( "]: " ).append(
324 e.getMessage() ).toString(), e );
330 public Boolean deleteManagedRepository( String repositoryId, AuditInformation auditInformation,
331 boolean deleteContent )
332 throws RepositoryAdminException
334 Configuration config = getArchivaConfiguration().getConfiguration();
336 ManagedRepositoryConfiguration repository = config.findManagedRepositoryById( repositoryId );
338 if ( repository == null )
340 throw new RepositoryAdminException( "A repository with that id does not exist" );
343 triggerAuditEvent( repositoryId, null, AuditEvent.DELETE_MANAGED_REPO, auditInformation );
345 deleteManagedRepository( repository, deleteContent, config, false );
347 // stage repo exists ?
348 ManagedRepositoryConfiguration stagingRepository =
349 getArchivaConfiguration().getConfiguration().findManagedRepositoryById( repositoryId + STAGE_REPO_ID_END );
350 if ( stagingRepository != null )
352 // do not trigger event when deleting the staged one
353 deleteManagedRepository( stagingRepository, deleteContent, config, true );
358 saveConfiguration( config );
360 catch ( Exception e )
362 throw new RepositoryAdminException( "Error saving configuration for delete action" + e.getMessage() );
368 private Boolean deleteManagedRepository( ManagedRepositoryConfiguration repository, boolean deleteContent,
369 Configuration config, boolean stagedOne )
370 throws RepositoryAdminException
375 NexusIndexer nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );
377 IndexingContext context = nexusIndexer.getIndexingContexts().get( repository.getId() );
378 if ( context != null )
380 // delete content only if directory exists
381 nexusIndexer.removeIndexingContext( context,
382 deleteContent && context.getIndexDirectoryFile().exists() );
385 catch ( PlexusSisuBridgeException e )
387 throw new RepositoryAdminException( e.getMessage(), e );
389 catch ( IOException e )
391 throw new RepositoryAdminException( e.getMessage(), e );
395 RepositorySession repositorySession = getRepositorySessionFactory().createSession();
398 MetadataRepository metadataRepository = repositorySession.getRepository();
399 metadataRepository.removeRepository( repository.getId() );
400 log.debug( "call repositoryStatisticsManager.deleteStatistics" );
401 getRepositoryStatisticsManager().deleteStatistics( metadataRepository, repository.getId() );
402 repositorySession.save();
404 catch ( MetadataRepositoryException e )
406 throw new RepositoryAdminException( e.getMessage(), e );
410 repositorySession.close();
413 config.removeManagedRepository( repository );
417 // TODO could be async ? as directory can be huge
418 File dir = new File( repository.getLocation() );
419 if ( !FileUtils.deleteQuietly( dir ) )
421 throw new RepositoryAdminException( "Cannot delete repository " + dir );
425 // olamy: copy list for reading as a unit test in webapp fail with ConcurrentModificationException
426 List<ProxyConnectorConfiguration> proxyConnectors =
427 new ArrayList<ProxyConnectorConfiguration>( config.getProxyConnectors() );
428 for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
430 if ( StringUtils.equals( proxyConnector.getSourceRepoId(), repository.getId() ) )
432 config.removeProxyConnector( proxyConnector );
436 Map<String, List<String>> repoToGroupMap = config.getRepositoryToGroupMap();
437 if ( repoToGroupMap != null )
439 if ( repoToGroupMap.containsKey( repository.getId() ) )
441 List<String> repoGroups = repoToGroupMap.get( repository.getId() );
442 for ( String repoGroup : repoGroups )
444 // copy to prevent UnsupportedOperationException
445 RepositoryGroupConfiguration repositoryGroupConfiguration =
446 config.findRepositoryGroupById( repoGroup );
447 List<String> repos = new ArrayList<String>( repositoryGroupConfiguration.getRepositories() );
448 config.removeRepositoryGroup( repositoryGroupConfiguration );
449 repos.remove( repository.getId() );
450 repositoryGroupConfiguration.setRepositories( repos );
451 config.addRepositoryGroup( repositoryGroupConfiguration );
458 removeRepositoryRoles( repository );
460 catch ( RoleManagerException e )
462 throw new RepositoryAdminException(
463 "fail to remove repository roles for repository " + repository.getId() + " : " + e.getMessage(), e );
466 saveConfiguration( config );
472 public Boolean updateManagedRepository( ManagedRepository managedRepository, boolean needStageRepo,
473 AuditInformation auditInformation, boolean resetStats )
474 throws RepositoryAdminException
477 log.debug( "updateManagedConfiguration repo {} needStage {} resetStats {} ",
478 Arrays.asList( managedRepository, needStageRepo, resetStats ).toArray() );
480 // Ensure that the fields are valid.
482 getRepositoryCommonValidator().basicValidation( managedRepository, true );
484 Configuration configuration = getArchivaConfiguration().getConfiguration();
486 ManagedRepositoryConfiguration toremove = configuration.findManagedRepositoryById( managedRepository.getId() );
488 if ( toremove != null )
490 configuration.removeManagedRepository( toremove );
493 ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( toremove );
495 // TODO remove content from old if path has changed !!!!!
497 if ( stagingRepository != null )
499 configuration.removeManagedRepository( stagingRepository );
502 ManagedRepositoryConfiguration managedRepositoryConfiguration =
503 addManagedRepository( managedRepository.getId(), managedRepository.getLayout(), managedRepository.getName(),
504 managedRepository.getLocation(), managedRepository.isBlockRedeployments(),
505 managedRepository.isReleases(), managedRepository.isSnapshots(), needStageRepo,
506 managedRepository.getCronExpression(), managedRepository.getIndexDirectory(),
507 managedRepository.getDaysOlder(), managedRepository.getRetentionCount(),
508 managedRepository.isDeleteReleasedSnapshots(), auditInformation,
509 getArchivaConfiguration().getConfiguration() );
511 // Save the repository configuration.
512 RepositorySession repositorySession = getRepositorySessionFactory().createSession();
516 triggerAuditEvent( managedRepositoryConfiguration.getId(), null, AuditEvent.MODIFY_MANAGED_REPO,
519 saveConfiguration( this.getArchivaConfiguration().getConfiguration() );
522 log.debug( "call repositoryStatisticsManager.deleteStatistics" );
523 getRepositoryStatisticsManager().deleteStatistics( repositorySession.getRepository(),
524 managedRepositoryConfiguration.getId() );
525 repositorySession.save();
529 catch ( MetadataRepositoryException e )
531 throw new RepositoryAdminException( e.getMessage(), e );
535 repositorySession.close();
537 createIndexContext( managedRepository );
541 //--------------------------
543 //--------------------------
546 protected void addRepository( ManagedRepositoryConfiguration repository, Configuration configuration )
547 throws RepositoryAdminException, IOException
549 // Normalize the path
550 File file = new File( repository.getLocation() );
551 repository.setLocation( file.getCanonicalPath() );
552 if ( !file.exists() )
556 if ( !file.exists() || !file.isDirectory() )
558 throw new RepositoryAdminException(
559 "Unable to add repository - no write access, can not create the root directory: " + file );
562 configuration.addManagedRepository( repository );
566 public IndexingContext createIndexContext( ManagedRepository repository )
567 throws RepositoryAdminException
572 IndexingContext context = indexer.getIndexingContexts().get( repository.getId() );
574 if ( context != null )
576 log.debug( "skip adding repository with id {} as already exists", repository.getId() );
580 String indexDir = repository.getIndexDirectory();
581 File managedRepository = new File( repository.getLocation() );
583 File indexDirectory = null;
584 if ( indexDir != null && !"".equals( indexDir ) )
586 indexDirectory = new File( repository.getIndexDirectory() );
587 if ( !indexDirectory.isAbsolute() )
589 indexDirectory = new File( managedRepository, repository.getIndexDirectory() );
594 indexDirectory = new File( managedRepository, ".indexer" );
597 if ( !indexDirectory.exists() )
599 indexDirectory.mkdirs();
603 indexer.addIndexingContext( repository.getId(), repository.getId(), managedRepository, indexDirectory,
604 managedRepository.toURI().toURL().toExternalForm(),
605 indexDirectory.toURI().toURL().toString(), indexCreators );
607 context.setSearchable( repository.isScanned() );
610 catch ( MalformedURLException e )
612 throw new RepositoryAdminException( e.getMessage(), e );
614 catch ( IOException e )
616 throw new RepositoryAdminException( e.getMessage(), e );
618 catch ( UnsupportedExistingLuceneIndexException e )
620 throw new RepositoryAdminException( e.getMessage(), e );
624 private ManagedRepositoryConfiguration getStageRepoConfig( ManagedRepositoryConfiguration repository )
626 ManagedRepositoryConfiguration stagingRepository = new ManagedRepositoryConfiguration();
627 stagingRepository.setId( repository.getId() + STAGE_REPO_ID_END );
628 stagingRepository.setLayout( repository.getLayout() );
629 stagingRepository.setName( repository.getName() + STAGE_REPO_ID_END );
630 stagingRepository.setBlockRedeployments( repository.isBlockRedeployments() );
631 stagingRepository.setDaysOlder( repository.getDaysOlder() );
632 stagingRepository.setDeleteReleasedSnapshots( repository.isDeleteReleasedSnapshots() );
633 stagingRepository.setIndexDir( repository.getIndexDir() );
634 String path = repository.getLocation();
635 int lastIndex = path.lastIndexOf( '/' );
636 stagingRepository.setLocation( path.substring( 0, lastIndex ) + "/" + stagingRepository.getId() );
637 stagingRepository.setRefreshCronExpression( repository.getRefreshCronExpression() );
638 stagingRepository.setReleases( repository.isReleases() );
639 stagingRepository.setRetentionCount( repository.getRetentionCount() );
640 stagingRepository.setScanned( repository.isScanned() );
641 stagingRepository.setSnapshots( repository.isSnapshots() );
642 return stagingRepository;
645 public Boolean scanRepository( String repositoryId, boolean fullScan )
647 if ( getRepositoryTaskScheduler().isProcessingRepositoryTask( repositoryId ) )
649 log.info( "scanning of repository with id {} already scheduled", repositoryId );
651 RepositoryTask task = new RepositoryTask();
652 task.setRepositoryId( repositoryId );
653 task.setScanAll( fullScan );
656 getRepositoryTaskScheduler().queueTask( task );
658 catch ( TaskQueueException e )
660 log.error( "failed to schedule scanning of repo with id {}", repositoryId, e );
666 protected void addRepositoryRoles( ManagedRepositoryConfiguration newRepository )
667 throws RoleManagerException
669 String repoId = newRepository.getId();
671 // TODO: double check these are configured on start up
672 // TODO: belongs in the business logic
674 if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )
676 getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );
679 if ( !getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )
681 getRoleManager().createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );
685 protected void removeRepositoryRoles( ManagedRepositoryConfiguration existingRepository )
686 throws RoleManagerException
688 String repoId = existingRepository.getId();
690 if ( getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId ) )
692 getRoleManager().removeTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, repoId );
695 if ( getRoleManager().templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId ) )
697 getRoleManager().removeTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, repoId );
700 log.debug( "removed user roles associated with repository {}", repoId );
703 //--------------------------
705 //--------------------------
708 public RoleManager getRoleManager()
713 public void setRoleManager( RoleManager roleManager )
715 this.roleManager = roleManager;
718 public RepositoryStatisticsManager getRepositoryStatisticsManager()
720 return repositoryStatisticsManager;
723 public void setRepositoryStatisticsManager( RepositoryStatisticsManager repositoryStatisticsManager )
725 this.repositoryStatisticsManager = repositoryStatisticsManager;
728 public RepositorySessionFactory getRepositorySessionFactory()
730 return repositorySessionFactory;
733 public void setRepositorySessionFactory( RepositorySessionFactory repositorySessionFactory )
735 this.repositorySessionFactory = repositorySessionFactory;
739 public RepositoryArchivaTaskScheduler getRepositoryTaskScheduler()
741 return repositoryTaskScheduler;
744 public void setRepositoryTaskScheduler( RepositoryArchivaTaskScheduler repositoryTaskScheduler )
746 this.repositoryTaskScheduler = repositoryTaskScheduler;
749 public PlexusSisuBridge getPlexusSisuBridge()
751 return plexusSisuBridge;
754 public void setPlexusSisuBridge( PlexusSisuBridge plexusSisuBridge )
756 this.plexusSisuBridge = plexusSisuBridge;
759 public MavenIndexerUtils getMavenIndexerUtils()
761 return mavenIndexerUtils;
764 public void setMavenIndexerUtils( MavenIndexerUtils mavenIndexerUtils )
766 this.mavenIndexerUtils = mavenIndexerUtils;