Modified: 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java?view=diff&rev=439935&r1=439934&r2=439935
==============================================================================
--- 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java
 (original)
+++ 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndex.java
 Sun Sep  3 22:34:42 2006
@@ -22,18 +22,24 @@
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
+import org.apache.lucene.index.IndexModifier;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermEnum;
 import org.apache.lucene.search.Hits;
 import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
 import org.apache.maven.archiva.indexer.RepositoryIndexException;
 import org.apache.maven.archiva.indexer.RepositoryIndexSearchException;
 import org.apache.maven.archiva.indexer.query.Query;
 import org.apache.maven.archiva.indexer.record.MinimalIndexRecordFields;
 import org.apache.maven.archiva.indexer.record.RepositoryIndexRecord;
+import org.apache.maven.archiva.indexer.record.RepositoryIndexRecordFactory;
 import org.apache.maven.archiva.indexer.record.StandardIndexRecordFields;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.project.MavenProjectBuilder;
 
 import java.io.File;
 import java.io.IOException;
@@ -41,8 +47,11 @@
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Lucene implementation of a repository index.
@@ -66,12 +75,22 @@
 
     private static Analyzer luceneAnalyzer = new LuceneAnalyzer();
 
+    private MavenProjectBuilder projectBuilder;
+
     public LuceneRepositoryArtifactIndex( File indexPath, 
LuceneIndexRecordConverter converter )
     {
         this.indexLocation = indexPath;
         this.converter = converter;
     }
 
+    public LuceneRepositoryArtifactIndex( File indexLocation, 
LuceneIndexRecordConverter converter,
+                                          MavenProjectBuilder projectBuilder )
+    {
+        this.indexLocation = indexLocation;
+        this.converter = converter;
+        this.projectBuilder = projectBuilder;
+    }
+
     public void indexRecords( Collection records )
         throws RepositoryIndexException
     {
@@ -117,23 +136,7 @@
         }
         finally
         {
-            close( indexWriter );
-        }
-    }
-
-    private void close( IndexWriter indexWriter )
-        throws RepositoryIndexException
-    {
-        try
-        {
-            if ( indexWriter != null )
-            {
-                indexWriter.close();
-            }
-        }
-        catch ( IOException e )
-        {
-            throw new RepositoryIndexException( e.getMessage(), e );
+            closeQuietly( indexWriter );
         }
     }
 
@@ -241,9 +244,9 @@
             {
                 indexReader = IndexReader.open( indexLocation );
 
-                for ( Iterator artifacts = records.iterator(); 
artifacts.hasNext(); )
+                for ( Iterator i = records.iterator(); i.hasNext(); )
                 {
-                    RepositoryIndexRecord record = (RepositoryIndexRecord) 
artifacts.next();
+                    RepositoryIndexRecord record = (RepositoryIndexRecord) 
i.next();
 
                     if ( record != null )
                     {
@@ -259,11 +262,124 @@
             }
             finally
             {
-                if ( indexReader != null )
+                closeQuietly( indexReader );
+            }
+        }
+    }
+
+    public Collection getAllRecords()
+        throws RepositoryIndexSearchException
+    {
+        return search( new LuceneQuery( new MatchAllDocsQuery() ) );
+    }
+
+    public Collection getAllRecordKeys()
+        throws RepositoryIndexException
+    {
+        Set keys = new HashSet();
+
+        if ( exists() )
+        {
+            IndexReader indexReader = null;
+            TermEnum terms = null;
+            try
+            {
+                indexReader = IndexReader.open( indexLocation );
+
+                terms = indexReader.terms( new Term( FLD_PK, "" ) );
+                while ( FLD_PK.equals( terms.term().field() ) )
+                {
+                    keys.add( terms.term().text() );
+
+                    if ( !terms.next() )
+                    {
+                        break;
+                    }
+                }
+            }
+            catch ( IOException e )
+            {
+                throw new RepositoryIndexException( "Error deleting document: 
" + e.getMessage(), e );
+            }
+            finally
+            {
+                closeQuietly( indexReader );
+                closeQuietly( terms );
+            }
+        }
+        return keys;
+    }
+
+    public void indexArtifacts( List artifacts, RepositoryIndexRecordFactory 
factory )
+        throws RepositoryIndexException
+    {
+        IndexModifier indexModifier = null;
+        try
+        {
+            indexModifier = new IndexModifier( indexLocation, getAnalyzer(), 
!exists() );
+
+            int count = 0;
+            for ( Iterator i = artifacts.iterator(); i.hasNext(); count++ )
+            {
+                Artifact artifact = (Artifact) i.next();
+                RepositoryIndexRecord record = factory.createRecord( artifact 
);
+
+                if ( record != null )
+                {
+                    Term term = new Term( FLD_PK, record.getPrimaryKey() );
+
+                    indexModifier.deleteDocuments( term );
+
+                    Document document = converter.convert( record );
+                    document.add(
+                        new Field( FLD_PK, record.getPrimaryKey(), 
Field.Store.NO, Field.Index.UN_TOKENIZED ) );
+
+                    indexModifier.addDocument( document );
+                }
+
+                if ( count % 100 == 0 )
                 {
-                    closeQuietly( indexReader );
+                    // MNG-142 - the project builder retains a lot of objects 
in its inflexible cache. This is a hack
+                    // around that. TODO: remove when it is configurable
+                    flushProjectBuilderCacheHack();
                 }
             }
+            indexModifier.optimize();
+        }
+        catch ( IOException e )
+        {
+            throw new RepositoryIndexException( "Error updating index: " + 
e.getMessage(), e );
+        }
+        finally
+        {
+            closeQuietly( indexModifier );
+        }
+    }
+
+    private void flushProjectBuilderCacheHack()
+    {
+        try
+        {
+            if ( projectBuilder != null )
+            {
+                java.lang.reflect.Field f = 
projectBuilder.getClass().getDeclaredField( "rawProjectCache" );
+                f.setAccessible( true );
+                Map cache = (Map) f.get( projectBuilder );
+                cache.clear();
+
+                f = projectBuilder.getClass().getDeclaredField( 
"processedProjectCache" );
+                f.setAccessible( true );
+                cache = (Map) f.get( projectBuilder );
+                cache.clear();
+            }
+        }
+        catch ( NoSuchFieldException e )
+        {
+            throw new RuntimeException( e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            throw new RuntimeException( e );
         }
     }
 
@@ -351,6 +467,54 @@
         catch ( IOException e )
         {
             // ignore
+        }
+    }
+
+    private static void closeQuietly( TermEnum terms )
+        throws RepositoryIndexException
+    {
+        if ( terms != null )
+        {
+            try
+            {
+                terms.close();
+            }
+            catch ( IOException e )
+            {
+                // ignore
+            }
+        }
+    }
+
+    private static void closeQuietly( IndexWriter indexWriter )
+        throws RepositoryIndexException
+    {
+        try
+        {
+            if ( indexWriter != null )
+            {
+                indexWriter.close();
+            }
+        }
+        catch ( IOException e )
+        {
+            // write should compain if it can't be closed, data probably not 
persisted
+            throw new RepositoryIndexException( e.getMessage(), e );
+        }
+    }
+
+    private static void closeQuietly( IndexModifier indexModifier )
+    {
+        if ( indexModifier != null )
+        {
+            try
+            {
+                indexModifier.close();
+            }
+            catch ( IOException e )
+            {
+                // ignore
+            }
         }
     }
 

Modified: 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java?view=diff&rev=439935&r1=439934&r2=439935
==============================================================================
--- 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java
 (original)
+++ 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/lucene/LuceneRepositoryArtifactIndexFactory.java
 Sun Sep  3 22:34:42 2006
@@ -18,6 +18,7 @@
 
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
 import org.apache.maven.archiva.indexer.RepositoryArtifactIndexFactory;
+import org.apache.maven.project.MavenProjectBuilder;
 
 import java.io.File;
 
@@ -30,13 +31,19 @@
 public class LuceneRepositoryArtifactIndexFactory
     implements RepositoryArtifactIndexFactory
 {
+    /**
+     * @plexus.requirement
+     * @todo remove when MNG-142 is fixed
+     */
+    private MavenProjectBuilder projectBuilder;
+
     public RepositoryArtifactIndex createStandardIndex( File indexPath )
     {
-        return new LuceneRepositoryArtifactIndex( indexPath, new 
LuceneStandardIndexRecordConverter() );
+        return new LuceneRepositoryArtifactIndex( indexPath, new 
LuceneStandardIndexRecordConverter(), projectBuilder );
     }
 
     public RepositoryArtifactIndex createMinimalIndex( File indexPath )
     {
-        return new LuceneRepositoryArtifactIndex( indexPath, new 
LuceneMinimalIndexRecordConverter() );
+        return new LuceneRepositoryArtifactIndex( indexPath, new 
LuceneMinimalIndexRecordConverter(), projectBuilder );
     }
 }

Modified: 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/record/StandardArtifactIndexRecord.java
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/record/StandardArtifactIndexRecord.java?view=diff&rev=439935&r1=439934&r2=439935
==============================================================================
--- 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/record/StandardArtifactIndexRecord.java
 (original)
+++ 
maven/archiva/trunk/archiva-indexer/src/main/java/org/apache/maven/archiva/indexer/record/StandardArtifactIndexRecord.java
 Sun Sep  3 22:34:42 2006
@@ -401,4 +401,9 @@
     {
         return dependencies;
     }
+
+    public String getPrimaryKey()
+    {
+        return groupId + ":" + artifactId + ":" + version + ( classifier != 
null ? ":" + classifier : "" );
+    }
 }


Reply via email to