]> source.dussan.org Git - archiva.git/blob
af79060b679c46190cad7b41c39a43e9a6d0db56
[archiva.git] /
1 package org.apache.maven.archiva.repository;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
23 import org.apache.maven.archiva.configuration.ConfigurationNames;
24 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
25 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
26 import org.codehaus.plexus.registry.Registry;
27 import org.codehaus.plexus.registry.RegistryListener;
28 import org.springframework.context.ApplicationContext;
29 import org.springframework.stereotype.Service;
30
31 import javax.annotation.PostConstruct;
32 import javax.inject.Inject;
33 import java.util.Map;
34 import java.util.concurrent.ConcurrentHashMap;
35
36 /**
37  * RepositoryContentRequest
38  *
39  * @version $Id$
40  */
41 @Service( "repositoryContentFactory#default" )
42 public class RepositoryContentFactory
43     implements RegistryListener
44 {
45     /**
46      *
47      */
48     @Inject
49     private ArchivaConfiguration archivaConfiguration;
50
51     @Inject
52     private ApplicationContext applicationContext;
53
54     private final Map<String, ManagedRepositoryContent> managedContentMap;
55
56     private final Map<String, RemoteRepositoryContent> remoteContentMap;
57
58
59     public RepositoryContentFactory()
60     {
61         managedContentMap = new ConcurrentHashMap<String, ManagedRepositoryContent>();
62         remoteContentMap = new ConcurrentHashMap<String, RemoteRepositoryContent>();
63     }
64
65     /**
66      * Get the ManagedRepositoryContent object for the repository Id specified.
67      *
68      * @param repoId the repository id to fetch.
69      * @return the ManagedRepositoryContent object associated with the repository id.
70      * @throws RepositoryNotFoundException if the repository id does not exist within the configuration.
71      * @throws RepositoryException         the repository content object cannot be loaded due to configuration issue.
72      */
73     public ManagedRepositoryContent getManagedRepositoryContent( String repoId )
74         throws RepositoryNotFoundException, RepositoryException
75     {
76         ManagedRepositoryContent repo = managedContentMap.get( repoId );
77
78         if ( repo != null )
79         {
80             return repo;
81         }
82
83         ManagedRepositoryConfiguration repoConfig =
84             archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId );
85         if ( repoConfig == null )
86         {
87             throw new RepositoryNotFoundException( "Unable to find managed repository configuration for id:" + repoId );
88         }
89
90         repo = applicationContext.getBean( "managedRepositoryContent#" + repoConfig.getLayout(),
91                                            ManagedRepositoryContent.class );
92         repo.setRepository( repoConfig );
93         managedContentMap.put( repoId, repo );
94
95         return repo;
96     }
97
98     public RemoteRepositoryContent getRemoteRepositoryContent( String repoId )
99         throws RepositoryNotFoundException, RepositoryException
100     {
101         RemoteRepositoryContent repo = remoteContentMap.get( repoId );
102
103         if ( repo != null )
104         {
105             return repo;
106         }
107
108         RemoteRepositoryConfiguration repoConfig =
109             archivaConfiguration.getConfiguration().findRemoteRepositoryById( repoId );
110         if ( repoConfig == null )
111         {
112             throw new RepositoryNotFoundException( "Unable to find remote repository configuration for id:" + repoId );
113         }
114
115         repo = applicationContext.getBean( "remoteRepositoryContent#" + repoConfig.getLayout(),
116                                            RemoteRepositoryContent.class );
117         repo.setRepository( repoConfig );
118         remoteContentMap.put( repoId, repo );
119
120         return repo;
121     }
122
123
124     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
125     {
126         if ( ConfigurationNames.isManagedRepositories( propertyName ) || ConfigurationNames.isRemoteRepositories(
127             propertyName ) )
128         {
129             initMaps();
130         }
131     }
132
133     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
134     {
135         /* do nothing */
136     }
137
138     @PostConstruct
139     public void initialize()
140     {
141         archivaConfiguration.addChangeListener( this );
142     }
143
144     private void initMaps()
145     {
146         // olamy we use concurent so no need of synchronize
147         //synchronized ( managedContentMap )
148         //{
149         managedContentMap.clear();
150         //}
151
152         //synchronized ( remoteContentMap )
153         //{
154         remoteContentMap.clear();
155         //}
156     }
157
158     public ArchivaConfiguration getArchivaConfiguration()
159     {
160         return archivaConfiguration;
161     }
162
163     public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration )
164     {
165         this.archivaConfiguration = archivaConfiguration;
166     }
167 }