]> source.dussan.org Git - archiva.git/blob
2815183a0f16f718125e8599c1f50e35e5b34a5e
[archiva.git] /
1 package org.apache.maven.repository.indexing;
2
3 /*
4  * Copyright 2005-2006 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18
19 import org.apache.lucene.index.IndexReader;
20 import org.apache.lucene.index.IndexWriter;
21 import org.codehaus.plexus.logging.AbstractLogEnabled;
22
23 import java.io.File;
24 import java.io.IOException;
25 import java.util.Collection;
26
27 /**
28  * Abstract class for RepositoryIndexers
29  *
30  * @author Edwin Punzalan
31  */
32 public abstract class AbstractRepositoryIndex
33     extends AbstractLogEnabled
34     implements RepositoryIndex
35 {
36     private String indexPath;
37
38     private boolean indexOpen;
39
40     private IndexReader indexReader;
41
42     private IndexWriter indexWriter;
43
44     /**
45      * method to encapsulate the optimize() method for lucene
46      */
47     public void optimize()
48         throws RepositoryIndexException
49     {
50         if ( !indexOpen )
51         {
52             throw new RepositoryIndexException( "Unable to optimize index on a closed index" );
53         }
54
55         try
56         {
57             indexWriter.optimize();
58         }
59         catch ( IOException ioe )
60         {
61             throw new RepositoryIndexException( "Failed to optimize index", ioe );
62         }
63     }
64
65     /**
66      * method used to query the index status
67      *
68      * @return true if the index is open.
69      */
70     public boolean isOpen()
71     {
72         return indexOpen;
73     }
74
75     /**
76      * method used to close all open streams to the index directory
77      */
78     public void close()
79         throws RepositoryIndexException
80     {
81         try
82         {
83             if ( indexWriter != null )
84             {
85                 indexWriter.close();
86                 indexWriter = null;
87             }
88
89             if ( indexReader != null )
90             {
91                 indexReader.close();
92                 indexReader = null;
93             }
94
95             indexOpen = false;
96         }
97         catch ( IOException e )
98         {
99             throw new RepositoryIndexException( e.getMessage(), e );
100         }
101     }
102
103     /**
104      * method for opening the index directory for indexing operations
105      */
106     public void open( String indexPath )
107         throws RepositoryIndexException
108     {
109         try
110         {
111             this.indexPath = indexPath;
112             validateIndex();
113         }
114         catch ( IOException e )
115         {
116             throw new RepositoryIndexException( e );
117         }
118     }
119
120     public String getIndexPath()
121     {
122         return indexPath;
123     }
124
125     protected IndexWriter getIndexWriter()
126         throws IOException
127     {
128         if ( indexWriter == null )
129         {
130             indexWriter = new IndexWriter( indexPath, getAnalyzer(), false );
131         }
132         return indexWriter;
133     }
134
135     private IndexReader getIndexReader()
136         throws IOException
137     {
138         if ( indexReader == null )
139         {
140             indexReader = IndexReader.open( indexPath );
141         }
142         return indexReader;
143     }
144
145     /**
146      * method for validating an index directory
147      *
148      * @throws RepositoryIndexException if the given indexPath is not valid for this type of RepositoryIndex
149      */
150     private void validateIndex()
151         throws RepositoryIndexException, IOException
152     {
153         File indexDir = new File( indexPath );
154         if ( IndexReader.indexExists( indexDir ) )
155         {
156             IndexReader indexReader = getIndexReader();
157             if ( indexReader.numDocs() > 0 )
158             {
159                 Collection fields = indexReader.getFieldNames();
160                 String[] indexFields = getIndexFields();
161                 for ( int idx = 0; idx < indexFields.length; idx++ )
162                 {
163                     if ( !fields.contains( indexFields[idx] ) )
164                     {
165                         throw new RepositoryIndexException(
166                             "The Field " + indexFields[idx] + " does not exist in " + "index path " + indexPath + "." );
167                     }
168                 }
169             }
170             else
171             {
172                 getLogger().info( "Skipping index field validations for empty index." );
173             }
174         }
175         else if ( !indexDir.exists() )
176         {
177             indexWriter = new IndexWriter( indexPath, getAnalyzer(), true );
178             getLogger().info( "New index directory created in: " + indexDir.getAbsolutePath() );
179         }
180         else if ( indexDir.isDirectory() )
181         {
182             throw new RepositoryIndexException( indexPath + " is not a valid index directory." );
183         }
184         else
185         {
186             throw new RepositoryIndexException( indexPath + " is not a directory." );
187         }
188
189         indexOpen = true;
190     }
191 }