]> source.dussan.org Git - archiva.git/commitdiff
adding for reference
authorJason van Zyl <jvanzyl@apache.org>
Tue, 28 Feb 2006 02:01:37 +0000 (02:01 +0000)
committerJason van Zyl <jvanzyl@apache.org>
Tue, 28 Feb 2006 02:01:37 +0000 (02:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@381537 13f79535-47bb-0310-9956-ffa450edef68

Indexer.java [new file with mode: 0644]

diff --git a/Indexer.java b/Indexer.java
new file mode 100644 (file)
index 0000000..c2cde6a
--- /dev/null
@@ -0,0 +1,195 @@
+
+package org.maven.indexer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.DateField;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.IndexWriter;
+
+
+/**
+ * Indexer utility used to create repository index 
+ * for using in the repository search (e.g. from IDE plugins). 
+ * 
+ * @author Eugene Kuleshov
+ */
+public class Indexer {
+  public static final String JAR_NAME = "j";
+  public static final String JAR_SIZE = "s";
+  public static final String JAR_DATE = "d";
+  public static final String NAMES = "c";
+  
+  private static long totalClasses = 0;
+  private static long totalFiles = 0;
+  private static long totalSize = 0;
+  
+  public static void main( String[] args) throws IOException {
+    if( args.length<2) {
+      printUsage();
+      return;
+    }
+    
+    String command = args[ 0];
+    if( "index".equals( command)) {
+      String repositoryPath = args[ 1];  
+      String indexPath = args.length==2 ? "index" : args[ 2];
+      
+      Indexer.reindex( new File( indexPath), repositoryPath);
+
+//    } else if( "search".equals( command)) {
+//      String query = args[ 1];
+//      String indexPath = args.length==2 ? "index" : args[ 2];
+//
+//      indexer = new Indexer( new File[] { new File( indexPath)});
+//      Map res = indexer.search( query, NAMES);
+//      
+//      for( Iterator it = res.entrySet().iterator(); it.hasNext();) {
+//        Map.Entry e = ( Map.Entry) it.next();
+//        System.err.println( e);
+//      }
+      System.err.println( "Not implemented yet");
+    
+    }
+  }
+
+  private static void printUsage() {
+    System.err.println( "indexer <command> <args>");
+    System.err.println( "  index <repository path> <index path>");
+//    System.err.println( "  search <query> <index path>");
+  }
+
+  
+  public static void reindex( File indexPath, String repositoryPath) throws IOException {
+    Analyzer analyzer = new StandardAnalyzer();
+
+    IndexWriter w = new IndexWriter( indexPath, analyzer, true);
+    
+    long l1 = System.currentTimeMillis();
+    processDir(new File( repositoryPath), w, repositoryPath);
+    long l2 = System.currentTimeMillis();
+    System.err.println( "Done. "+((l2-l1)/1000f));
+  
+    long l3 = System.currentTimeMillis();
+    System.err.println( "Optimizing...");
+    w.optimize();
+    w.close();
+    long l4 = System.currentTimeMillis();
+    System.err.println( "Done. "+((l4-l3)/1000f));
+    
+    System.err.println( "Total classes: " + totalClasses);
+    System.err.println( "Total jars:    " + totalFiles);
+    System.err.println( "Total size:    " + ( totalSize / 1024 / 1024)+" Mb");
+    System.err.println( "Speed:         " + ( totalSize / ((l2-l1) / 1000f)) + " b/sec");
+    
+    createArchive( indexPath);
+  }
+
+  // TODO close all files and streams in try/finally
+  private static void createArchive( File indexPath ) throws IOException {
+    String name = indexPath.getName();
+    ZipOutputStream zos = new ZipOutputStream( new FileOutputStream( new File( indexPath.getParent(), name + ".zip" ) ) );
+    zos.setLevel( 9 );
+
+    File[] files = indexPath.listFiles();
+    for( int i = 0; i < files.length; i++ ) {
+      ZipEntry e = new ZipEntry( files[i].getName() );
+      zos.putNextEntry( e );
+
+      FileInputStream is = new FileInputStream( files[i] );
+      byte[] buf = new byte[4096];
+      int n;
+      while( ( n = is.read( buf ) ) > 0 ) {
+        zos.write( buf, 0, n );
+      }
+      is.close();
+      zos.flush();
+
+      zos.closeEntry();
+    }
+
+    zos.close();
+  }
+
+  private static void processDir( File dir, IndexWriter w, String repositoryPath) throws IOException {
+    if(dir==null) return;
+
+    File[] files = dir.listFiles();
+    for( int i = 0; i < files.length; i++) {
+      File f = files[ i];
+      if(f.isDirectory()) processDir(f, w, repositoryPath);
+      else processFile(f, w, repositoryPath);
+    }
+  }
+
+  private static void processFile( File f, IndexWriter w, String repositoryPath) {
+    if(f.isFile() && f.getName().endsWith( ".pom")) {  // TODO
+      String name = f.getName();
+      File jarFile = new File( f.getParent(), name.substring( 0, name.length() - 4) + ".jar");
+
+      String absolutePath = f.getAbsolutePath();
+      long size = 0;
+      if( jarFile.exists()) {
+        size = jarFile.length();
+        absolutePath = jarFile.getAbsolutePath();
+      }
+      
+      totalFiles++;
+      totalSize += size;
+      if(( totalFiles % 100)==0) {
+        System.err.println( "Indexing "+totalFiles+" "+f.getParentFile().getAbsolutePath().substring( repositoryPath.length()));
+      }
+
+      Document doc = new Document();
+      doc.add( Field.Text( JAR_NAME, absolutePath.substring( repositoryPath.length())));
+      doc.add( Field.Text( JAR_DATE, DateField.timeToString( f.lastModified())));
+      doc.add( Field.Text( JAR_SIZE, Long.toString(size)));
+      // TODO calculate jar's sha1 or md5
+
+//      ZipFile jar = null;
+      try {
+/*      
+        jar = new ZipFile( f);
+        
+        StringBuffer sb = new StringBuffer();
+        for( Enumeration en = jar.entries(); en.hasMoreElements();) {
+          ZipEntry e = ( ZipEntry) en.nextElement();
+          String name = e.getName();
+          if( name.endsWith( ".class")) {
+            totalClasses++;
+            // TODO verify if class is public or protected
+            // TODO skipp all inner classes for now
+            int i = name.lastIndexOf( "$");
+            if( i==-1) {
+              sb.append( name.substring( 0, name.length() - 6)).append( "\n");
+            }
+          }
+        }
+        doc.add( Field.Text( NAMES, sb.toString()));
+        
+
+      } finally {
+        try {
+          jar.close();
+        } catch( Exception e) {
+        }
+*/    
+      w.addDocument(doc);
+    } catch( Exception e) {
+      System.err.println( "Error for file "+f);
+      System.err.println( "  "+e.getMessage());
+    }
+    }
+  }
+
+}
+