]> source.dussan.org Git - archiva.git/blob
ded2c30df0b291e62b2936a8a8e73ed65b05581b
[archiva.git] /
1 package org.apache.maven.repository.indexing;\r
2 \r
3 /*\r
4  * Copyright 2005-2006 The Apache Software Foundation.\r
5  *\r
6  * Licensed under the Apache License, Version 2.0 (the "License");\r
7  * you may not use this file except in compliance with the License.\r
8  * You may obtain a copy of the License at\r
9  *\r
10  *      http://www.apache.org/licenses/LICENSE-2.0\r
11  *\r
12  * Unless required by applicable law or agreed to in writing, software\r
13  * distributed under the License is distributed on an "AS IS" BASIS,\r
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  * See the License for the specific language governing permissions and\r
16  * limitations under the License.\r
17  */\r
18 \r
19 import org.apache.lucene.document.Document;\r
20 import org.apache.lucene.document.Field;\r
21 import org.apache.maven.artifact.repository.ArtifactRepository;\r
22 import org.apache.maven.artifact.repository.metadata.Metadata;\r
23 import org.apache.maven.artifact.repository.metadata.Plugin;\r
24 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;\r
25 import org.apache.maven.artifact.repository.metadata.Versioning;\r
26 \r
27 import java.io.IOException;\r
28 import java.util.Iterator;\r
29 import java.util.List;\r
30 \r
31 /**\r
32  * This class indexes the metadata in the repository.\r
33  */\r
34 public class MetadataRepositoryIndex\r
35     extends AbstractRepositoryIndex\r
36 {\r
37     protected static final String GROUP_METADATA = "GROUP_METADATA";\r
38 \r
39     protected static final String ARTIFACT_METADATA = "ARTIFACT_METADATA";\r
40 \r
41     protected static final String SNAPSHOT_METADATA = "SNAPSHOT_METADATA";\r
42 \r
43     /**\r
44      * Class Constructor\r
45      *\r
46      * @param indexPath  the path to the index\r
47      * @param repository the repository where the metadata to be indexed is located\r
48      */\r
49     public MetadataRepositoryIndex( String indexPath, ArtifactRepository repository )\r
50     {\r
51         super( indexPath, repository );\r
52     }\r
53 \r
54     /**\r
55      * Index the paramater object\r
56      *\r
57      * @param obj\r
58      * @throws RepositoryIndexException\r
59      */\r
60     public void index( Object obj )\r
61         throws RepositoryIndexException\r
62     {\r
63         if ( obj instanceof RepositoryMetadata )\r
64         {\r
65             indexMetadata( (RepositoryMetadata) obj );\r
66         }\r
67         else\r
68         {\r
69             throw new RepositoryIndexException(\r
70                 "This instance of indexer cannot index instances of " + obj.getClass().getName() );\r
71         }\r
72     }\r
73 \r
74     /**\r
75      * Index the contents of the specified RepositoryMetadata paramter object\r
76      *\r
77      * @param repoMetadata the metadata object to be indexed\r
78      * @throws RepositoryIndexException\r
79      */\r
80     private void indexMetadata( RepositoryMetadata repoMetadata )\r
81         throws RepositoryIndexException\r
82     {\r
83         //get lastUpdated from Versioning (specified in Metadata object)\r
84         //get pluginPrefixes from Plugin (spcified in Metadata object) -----> concatenate/append???\r
85         //get the metadatapath: check where metadata is located, then concatenate the groupId,\r
86         // artifactId, version based on its location\r
87         Document doc = new Document();\r
88         doc.add( Field.Keyword( FLD_ID, (String) repoMetadata.getKey() ) );\r
89         String path = "";\r
90         Metadata metadata = repoMetadata.getMetadata();\r
91 \r
92         if ( repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory() )\r
93         {\r
94             path = repoMetadata.getGroupId() + "/";\r
95         }\r
96         else if ( !repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory() )\r
97         {\r
98             path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/";\r
99         }\r
100         else if ( !repoMetadata.storedInGroupDirectory() && repoMetadata.storedInArtifactVersionDirectory() )\r
101         {\r
102             path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/" +\r
103                 repoMetadata.getBaseVersion() + "/";\r
104         }\r
105 \r
106         if ( !"".equals( repoMetadata.getRemoteFilename() ) && repoMetadata.getRemoteFilename() != null )\r
107         {\r
108             path = path + repoMetadata.getRemoteFilename();\r
109         }\r
110         else\r
111         {\r
112             path = path + repoMetadata.getLocalFilename( repository );\r
113         }\r
114         doc.add( Field.Text( FLD_NAME, path ) );\r
115 \r
116         Versioning versioning = metadata.getVersioning();\r
117         if ( versioning != null )\r
118         {\r
119             doc.add( Field.Text( FLD_LASTUPDATE, versioning.getLastUpdated() ) );\r
120         }\r
121         else\r
122         {\r
123             doc.add( Field.Text( FLD_LASTUPDATE, "" ) );\r
124         }\r
125 \r
126         List plugins = metadata.getPlugins();\r
127         String pluginAppended = "";\r
128         for ( Iterator iter = plugins.iterator(); iter.hasNext(); )\r
129         {\r
130             Plugin plugin = (Plugin) iter.next();\r
131             if ( plugin.getPrefix() != null && !"".equals( plugin.getPrefix() ) )\r
132             {\r
133                 pluginAppended = plugin.getPrefix() + "\n";\r
134             }\r
135         }\r
136         doc.add( Field.Text( FLD_PLUGINPREFIX, pluginAppended ) );\r
137         doc.add( Field.Text( FLD_GROUPID, metadata.getGroupId() ) );\r
138 \r
139         if ( metadata.getArtifactId() != null && !"".equals( metadata.getArtifactId() ) )\r
140         {\r
141             doc.add( Field.Text( FLD_ARTIFACTID, metadata.getArtifactId() ) );\r
142         }\r
143         else\r
144         {\r
145             doc.add( Field.Text( FLD_ARTIFACTID, "" ) );\r
146         }\r
147 \r
148         if ( metadata.getVersion() != null && !"".equals( metadata.getVersion() ) )\r
149         {\r
150             doc.add( Field.Text( FLD_VERSION, metadata.getVersion() ) );\r
151         }\r
152         else\r
153         {\r
154             doc.add( Field.Text( FLD_VERSION, "" ) );\r
155         }\r
156         // TODO! do we need to add all these empty fields?\r
157         doc.add( Field.Text( FLD_DOCTYPE, METADATA ) );\r
158         doc.add( Field.Keyword( FLD_PACKAGING, "" ) );\r
159         doc.add( Field.Text( FLD_SHA1, "" ) );\r
160         doc.add( Field.Text( FLD_MD5, "" ) );\r
161         doc.add( Field.Text( FLD_CLASSES, "" ) );\r
162         doc.add( Field.Text( FLD_PACKAGES, "" ) );\r
163         doc.add( Field.Text( FLD_FILES, "" ) );\r
164         doc.add( Field.Keyword( FLD_LICENSE_URLS, "" ) );\r
165         doc.add( Field.Keyword( FLD_DEPENDENCIES, "" ) );\r
166         doc.add( Field.Keyword( FLD_PLUGINS_BUILD, "" ) );\r
167         doc.add( Field.Keyword( FLD_PLUGINS_REPORT, "" ) );\r
168         doc.add( Field.Keyword( FLD_PLUGINS_ALL, "" ) );\r
169 \r
170         try\r
171         {\r
172             deleteIfIndexed( repoMetadata );\r
173             if ( !isOpen() )\r
174             {\r
175                 open();\r
176             }\r
177             getIndexWriter().addDocument( doc );\r
178         }\r
179         catch ( IOException e )\r
180         {\r
181             throw new RepositoryIndexException( "Error opening index", e );\r
182         }\r
183     }\r
184 \r
185     /**\r
186      * @see org.apache.maven.repository.indexing.AbstractRepositoryIndex#deleteIfIndexed(Object)\r
187      */\r
188     public void deleteIfIndexed( Object object )\r
189         throws RepositoryIndexException, IOException\r
190     {\r
191         if ( object instanceof RepositoryMetadata )\r
192         {\r
193             RepositoryMetadata repoMetadata = (RepositoryMetadata) object;\r
194             if ( indexExists() )\r
195             {\r
196                 validateIndex( FIELDS );\r
197                 deleteDocument( FLD_ID, (String) repoMetadata.getKey() );\r
198             }\r
199         }\r
200         else\r
201         {\r
202             throw new RepositoryIndexException( "Object is not of type metadata." );\r
203         }\r
204     }\r
205 }\r