]> source.dussan.org Git - archiva.git/blob
9a3e4114cad3d6b3ba3a2610862f69a389682d52
[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      * @throws RepositoryIndexException\r
49      */\r
50     public MetadataRepositoryIndex( String indexPath, ArtifactRepository repository )\r
51         throws RepositoryIndexException\r
52     {\r
53         super( indexPath, repository );\r
54     }\r
55 \r
56     /**\r
57      * Index the paramater object\r
58      *\r
59      * @param obj\r
60      * @throws RepositoryIndexException\r
61      */\r
62     public void index( Object obj )\r
63         throws RepositoryIndexException\r
64     {\r
65         if ( obj instanceof RepositoryMetadata )\r
66         {\r
67             indexMetadata( (RepositoryMetadata) obj );\r
68         }\r
69         else\r
70         {\r
71             throw new RepositoryIndexException(\r
72                 "This instance of indexer cannot index instances of " + obj.getClass().getName() );\r
73         }\r
74     }\r
75 \r
76     /**\r
77      * Index the contents of the specified RepositoryMetadata paramter object\r
78      *\r
79      * @param repoMetadata the metadata object to be indexed\r
80      * @throws RepositoryIndexException\r
81      */\r
82     private void indexMetadata( RepositoryMetadata repoMetadata )\r
83         throws RepositoryIndexException\r
84     {\r
85         //get lastUpdated from Versioning (specified in Metadata object)\r
86         //get pluginPrefixes from Plugin (spcified in Metadata object) -----> concatenate/append???\r
87         //get the metadatapath: check where metadata is located, then concatenate the groupId,\r
88         // artifactId, version based on its location\r
89         Document doc = new Document();\r
90         doc.add( Field.Keyword( FLD_ID, (String) repoMetadata.getKey() ) );\r
91         String path = "";\r
92         Metadata metadata = repoMetadata.getMetadata();\r
93 \r
94         if ( repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory() )\r
95         {\r
96             path = repoMetadata.getGroupId() + "/";\r
97         }\r
98         else if ( !repoMetadata.storedInGroupDirectory() && !repoMetadata.storedInArtifactVersionDirectory() )\r
99         {\r
100             path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/";\r
101         }\r
102         else if ( !repoMetadata.storedInGroupDirectory() && repoMetadata.storedInArtifactVersionDirectory() )\r
103         {\r
104             path = repoMetadata.getGroupId() + "/" + repoMetadata.getArtifactId() + "/" +\r
105                 repoMetadata.getBaseVersion() + "/";\r
106         }\r
107 \r
108         if ( !repoMetadata.getRemoteFilename().equals( "" ) && repoMetadata.getRemoteFilename() != null )\r
109         {\r
110             path = path + repoMetadata.getRemoteFilename();\r
111         }\r
112         else\r
113         {\r
114             path = path + repoMetadata.getLocalFilename( repository );\r
115         }\r
116         doc.add( Field.Text( FLD_NAME, path ) );\r
117 \r
118         Versioning versioning = metadata.getVersioning();\r
119         if ( versioning != null )\r
120         {\r
121             doc.add( Field.Text( FLD_LASTUPDATE, versioning.getLastUpdated() ) );\r
122         }\r
123         else\r
124         {\r
125             doc.add( Field.Text( FLD_LASTUPDATE, "" ) );\r
126         }\r
127 \r
128         List plugins = metadata.getPlugins();\r
129         String pluginAppended = "";\r
130         for ( Iterator iter = plugins.iterator(); iter.hasNext(); )\r
131         {\r
132             Plugin plugin = (Plugin) iter.next();\r
133             if ( plugin.getPrefix() != null && !plugin.getPrefix().equals( "" ) )\r
134             {\r
135                 pluginAppended = plugin.getPrefix() + "\n";\r
136             }\r
137         }\r
138         doc.add( Field.Text( FLD_PLUGINPREFIX, pluginAppended ) );\r
139         doc.add( Field.Text( FLD_GROUPID, metadata.getGroupId() ) );\r
140 \r
141         if ( metadata.getArtifactId() != null && !metadata.getArtifactId().equals( "" ) )\r
142         {\r
143             doc.add( Field.Text( FLD_ARTIFACTID, metadata.getArtifactId() ) );\r
144         }\r
145         else\r
146         {\r
147             doc.add( Field.Text( FLD_ARTIFACTID, "" ) );\r
148         }\r
149 \r
150         if ( metadata.getVersion() != null && !metadata.getVersion().equals( "" ) )\r
151         {\r
152             doc.add( Field.Text( FLD_VERSION, metadata.getVersion() ) );\r
153         }\r
154         else\r
155         {\r
156             doc.add( Field.Text( FLD_VERSION, "" ) );\r
157         }\r
158         doc.add( Field.Text( FLD_DOCTYPE, METADATA ) );\r
159         doc.add( Field.Keyword( FLD_PACKAGING, "" ) );\r
160         doc.add( Field.Text( FLD_SHA1, "" ) );\r
161         doc.add( Field.Text( FLD_MD5, "" ) );\r
162         doc.add( Field.Text( FLD_CLASSES, "" ) );\r
163         doc.add( Field.Text( FLD_PACKAGES, "" ) );\r
164         doc.add( Field.Text( FLD_FILES, "" ) );\r
165         doc.add( Field.Keyword( FLD_LICENSE_URLS, "" ) );\r
166         doc.add( Field.Keyword( FLD_DEPENDENCIES, "" ) );\r
167         doc.add( Field.Keyword( FLD_PLUGINS_BUILD, "" ) );\r
168         doc.add( Field.Keyword( FLD_PLUGINS_REPORT, "" ) );\r
169         doc.add( Field.Keyword( FLD_PLUGINS_ALL, "" ) );\r
170 \r
171         try\r
172         {\r
173             isIndexed( repoMetadata );\r
174             if ( !isOpen() )\r
175             {\r
176                 open();\r
177             }\r
178             getIndexWriter().addDocument( doc );\r
179         }\r
180         catch ( IOException e )\r
181         {\r
182             throw new RepositoryIndexException( "Error opening index", e );\r
183         }\r
184     }\r
185 \r
186     /**\r
187      * @see org.apache.maven.repository.indexing.AbstractRepositoryIndex#isIndexed(Object)\r
188      */\r
189     public void isIndexed( Object object )\r
190         throws RepositoryIndexException, IOException\r
191     {\r
192         if ( object instanceof RepositoryMetadata )\r
193         {\r
194             RepositoryMetadata repoMetadata = (RepositoryMetadata) object;\r
195             checkIfIndexExists();\r
196             if ( indexExists )\r
197             {\r
198                 validateIndex( FIELDS );\r
199                 deleteDocument( FLD_ID, (String) repoMetadata.getKey() );\r
200             }\r
201         }\r
202         else\r
203         {\r
204             throw new RepositoryIndexException( "Object is not of type metadata." );\r
205         }\r
206     }\r
207 }\r