mirror of https://github.com/apache/archiva.git
[MRM-127] add index record classes
git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@425379 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ef773988c8
commit
c2939d7bd4
|
@ -51,14 +51,30 @@ import java.util.zip.ZipOutputStream;
|
||||||
public class EclipseRepositoryIndex
|
public class EclipseRepositoryIndex
|
||||||
extends AbstractRepositoryIndex
|
extends AbstractRepositoryIndex
|
||||||
{
|
{
|
||||||
|
// TODO: change constants to an enumerated type
|
||||||
|
/**
|
||||||
|
* Field name for the JAR filename.
|
||||||
|
*/
|
||||||
private static final String JAR_NAME = "j";
|
private static final String JAR_NAME = "j";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field name for the JAR file size.
|
||||||
|
*/
|
||||||
private static final String JAR_SIZE = "s";
|
private static final String JAR_SIZE = "s";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field name for the JAR last modified timestamp.
|
||||||
|
*/
|
||||||
private static final String JAR_DATE = "d";
|
private static final String JAR_DATE = "d";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field name for the list of classes in the JAR.
|
||||||
|
*/
|
||||||
private static final String NAMES = "c";
|
private static final String NAMES = "c";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field name for the MD5 checksum of the JAR.
|
||||||
|
*/
|
||||||
private static final String MD5 = "m";
|
private static final String MD5 = "m";
|
||||||
|
|
||||||
private Digester digester;
|
private Digester digester;
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.repository.digest.Digester;
|
||||||
|
import org.apache.maven.repository.digest.DigesterException;
|
||||||
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for the index record factories.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public abstract class AbstractArtifactIndexRecordFactory
|
||||||
|
extends AbstractLogEnabled
|
||||||
|
implements RepositoryIndexRecordFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @plexus.requirement
|
||||||
|
*/
|
||||||
|
private Digester digester;
|
||||||
|
|
||||||
|
protected String readChecksum( File file, String algorithm )
|
||||||
|
{
|
||||||
|
String checksum;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
checksum = digester.createChecksum( file, algorithm ).toLowerCase();
|
||||||
|
}
|
||||||
|
catch ( DigesterException e )
|
||||||
|
{
|
||||||
|
getLogger().error( "Error getting checksum for artifact file, leaving empty in index: " + e.getMessage() );
|
||||||
|
checksum = null;
|
||||||
|
}
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List readFilesInArchive( File file )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
ZipFile zipFile = new ZipFile( file );
|
||||||
|
List files = new ArrayList( zipFile.size() );
|
||||||
|
|
||||||
|
for ( Enumeration entries = zipFile.entries(); entries.hasMoreElements(); )
|
||||||
|
{
|
||||||
|
ZipEntry entry = (ZipEntry) entries.nextElement();
|
||||||
|
|
||||||
|
files.add( entry.getName() );
|
||||||
|
}
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isClass( String name )
|
||||||
|
{
|
||||||
|
// TODO: verify if class is public or protected (this might require the original ZipEntry)
|
||||||
|
return name.endsWith( ".class" ) && name.lastIndexOf( "$" ) < 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,162 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The a record with the fields in the minimal index.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public class MinimalArtifactIndexRecord
|
||||||
|
implements RepositoryIndexRecord
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The classes in the archive for the artifact, if it is a JAR. The package name is <b>not</b> included.
|
||||||
|
*/
|
||||||
|
private String classes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The MD5 checksum of the artifact file.
|
||||||
|
*/
|
||||||
|
private String md5Checksum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The filename of the artifact file (no path).
|
||||||
|
*/
|
||||||
|
private String filename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp that the artifact file was last modified.
|
||||||
|
*/
|
||||||
|
private long lastModified;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The size of the artifact file in bytes.
|
||||||
|
*/
|
||||||
|
private long size;
|
||||||
|
|
||||||
|
public void setClasses( String classes )
|
||||||
|
{
|
||||||
|
this.classes = classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMd5Checksum( String md5Checksum )
|
||||||
|
{
|
||||||
|
this.md5Checksum = md5Checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilename( String filename )
|
||||||
|
{
|
||||||
|
this.filename = filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModified( long lastModified )
|
||||||
|
{
|
||||||
|
this.lastModified = lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSize( long size )
|
||||||
|
{
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClasses()
|
||||||
|
{
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMd5Checksum()
|
||||||
|
{
|
||||||
|
return md5Checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilename()
|
||||||
|
{
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastModified()
|
||||||
|
{
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getSize()
|
||||||
|
{
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection RedundantIfStatement
|
||||||
|
*/
|
||||||
|
public boolean equals( Object obj )
|
||||||
|
{
|
||||||
|
if ( this == obj )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( obj == null || getClass() != obj.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinimalArtifactIndexRecord that = (MinimalArtifactIndexRecord) obj;
|
||||||
|
|
||||||
|
if ( lastModified != that.lastModified )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( size != that.size )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( classes != null ? !classes.equals( that.classes ) : that.classes != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !filename.equals( that.filename ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( md5Checksum != null ? !md5Checksum.equals( that.md5Checksum ) : that.md5Checksum != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection UnnecessaryParentheses
|
||||||
|
*/
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
int result = classes != null ? classes.hashCode() : 0;
|
||||||
|
result = 31 * result + ( md5Checksum != null ? md5Checksum.hashCode() : 0 );
|
||||||
|
result = 31 * result + filename.hashCode();
|
||||||
|
result = 31 * result + (int) ( lastModified ^ ( lastModified >>> 32 ) );
|
||||||
|
result = 31 * result + (int) ( size ^ ( size >>> 32 ) );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return "Filename: " + filename + "; checksum: " + md5Checksum + "; size: " + size + "; lastModified: " +
|
||||||
|
new Date( lastModified ) + "; classes: " + classes;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
import org.apache.maven.repository.digest.Digester;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An index record type for the minimal index.
|
||||||
|
*
|
||||||
|
* @author Edwin Punzalan
|
||||||
|
* @author Brett Porter
|
||||||
|
* @plexus.component role="org.apache.maven.repository.indexing.record.RepositoryIndexRecordFactory" role-hint="minimal"
|
||||||
|
*/
|
||||||
|
public class MinimalArtifactIndexRecordFactory
|
||||||
|
extends AbstractArtifactIndexRecordFactory
|
||||||
|
{
|
||||||
|
public RepositoryIndexRecord createRecord( Artifact artifact )
|
||||||
|
{
|
||||||
|
MinimalArtifactIndexRecord record = null;
|
||||||
|
|
||||||
|
File file = artifact.getFile();
|
||||||
|
if ( file != null && "jar".equals( artifact.getType() ) && file.exists() )
|
||||||
|
{
|
||||||
|
String md5 = readChecksum( file, Digester.MD5 );
|
||||||
|
|
||||||
|
List files = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
files = readFilesInArchive( file );
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
getLogger().error( "Error reading artifact file, omitting from index: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( files != null )
|
||||||
|
{
|
||||||
|
record = new MinimalArtifactIndexRecord();
|
||||||
|
record.setMd5Checksum( md5 );
|
||||||
|
record.setFilename( file.getName() );
|
||||||
|
record.setLastModified( file.lastModified() );
|
||||||
|
record.setSize( file.length() );
|
||||||
|
record.setClasses( getClassesFromFiles( files ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getClassesFromFiles( List files )
|
||||||
|
{
|
||||||
|
StringBuffer classes = new StringBuffer();
|
||||||
|
|
||||||
|
for ( Iterator i = files.iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String name = (String) i.next();
|
||||||
|
|
||||||
|
if ( isClass( name ) )
|
||||||
|
{
|
||||||
|
int idx = name.lastIndexOf( '/' );
|
||||||
|
String classname = name.substring( idx + 1, name.length() - 6 );
|
||||||
|
classes.append( classname ).append( "\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return classes.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A repository index record.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public interface RepositoryIndexRecord
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The layout of a record in a repository index.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public interface RepositoryIndexRecordFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The Plexus role.
|
||||||
|
*/
|
||||||
|
String ROLE = RepositoryIndexRecordFactory.class.getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an index record from an artifact.
|
||||||
|
*
|
||||||
|
* @param artifact the artifact
|
||||||
|
* @return the index record
|
||||||
|
*/
|
||||||
|
RepositoryIndexRecord createRecord( Artifact artifact );
|
||||||
|
}
|
|
@ -0,0 +1,191 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The a record with the fields in the standard index.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public class StandardArtifactIndexRecord
|
||||||
|
extends MinimalArtifactIndexRecord
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The SHA-1 checksum of the artifact file.
|
||||||
|
*/
|
||||||
|
private String sha1Checksum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The artifact's group.
|
||||||
|
*/
|
||||||
|
private String groupId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The artifact's identifier within the group.
|
||||||
|
*/
|
||||||
|
private String artifactId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The artifact's version.
|
||||||
|
*/
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The classifier, if there is one.
|
||||||
|
*/
|
||||||
|
private String classifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The artifact type (from the file).
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of packages (separated by '\n') in the artifact if it contains Java classes.
|
||||||
|
*/
|
||||||
|
private String packages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of files (separated by '\n') in the artifact if it is an archive.
|
||||||
|
*/
|
||||||
|
private String files;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The identifier of the repository that the artifact came from.
|
||||||
|
*/
|
||||||
|
private String repository;
|
||||||
|
|
||||||
|
public void setSha1Checksum( String sha1Checksum )
|
||||||
|
{
|
||||||
|
this.sha1Checksum = sha1Checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId( String groupId )
|
||||||
|
{
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArtifactId( String artifactId )
|
||||||
|
{
|
||||||
|
this.artifactId = artifactId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion( String version )
|
||||||
|
{
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassifier( String classifier )
|
||||||
|
{
|
||||||
|
this.classifier = classifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType( String type )
|
||||||
|
{
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPackages( String packages )
|
||||||
|
{
|
||||||
|
this.packages = packages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFiles( String files )
|
||||||
|
{
|
||||||
|
this.files = files;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepository( String repository )
|
||||||
|
{
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection RedundantIfStatement
|
||||||
|
*/
|
||||||
|
public boolean equals( Object obj )
|
||||||
|
{
|
||||||
|
if ( this == obj )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( obj == null || getClass() != obj.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !super.equals( obj ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
StandardArtifactIndexRecord that = (StandardArtifactIndexRecord) obj;
|
||||||
|
|
||||||
|
if ( !artifactId.equals( that.artifactId ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( classifier != null ? !classifier.equals( that.classifier ) : that.classifier != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( files != null ? !files.equals( that.files ) : that.files != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !groupId.equals( that.groupId ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( packages != null ? !packages.equals( that.packages ) : that.packages != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( repository != null ? !repository.equals( that.repository ) : that.repository != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( sha1Checksum != null ? !sha1Checksum.equals( that.sha1Checksum ) : that.sha1Checksum != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( type != null ? !type.equals( that.type ) : that.type != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !version.equals( that.version ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
int result = super.hashCode();
|
||||||
|
result = 31 * result + ( sha1Checksum != null ? sha1Checksum.hashCode() : 0 );
|
||||||
|
result = 31 * result + groupId.hashCode();
|
||||||
|
result = 31 * result + artifactId.hashCode();
|
||||||
|
result = 31 * result + version.hashCode();
|
||||||
|
result = 31 * result + ( classifier != null ? classifier.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( type != null ? type.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( packages != null ? packages.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( files != null ? files.hashCode() : 0 );
|
||||||
|
result = 31 * result + ( repository != null ? repository.hashCode() : 0 );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
import org.apache.maven.repository.digest.Digester;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An index record type for the standard index.
|
||||||
|
*
|
||||||
|
* @author Edwin Punzalan
|
||||||
|
* @author Brett Porter
|
||||||
|
* @plexus.component role="org.apache.maven.repository.indexing.record.RepositoryIndexRecordFactory" role-hint="standard"
|
||||||
|
*/
|
||||||
|
public class StandardArtifactIndexRecordFactory
|
||||||
|
extends AbstractArtifactIndexRecordFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A list of artifact types to treat as a zip archive.
|
||||||
|
*
|
||||||
|
* @todo this should be smarter (perhaps use plexus archiver to look for an unarchiver, and make the ones for zip configurable since sar, par, etc can be added at random.
|
||||||
|
*/
|
||||||
|
private static final Set ARCHIVE_TYPES =
|
||||||
|
new HashSet( Arrays.asList( new String[]{"jar", "zip", "ejb", "par", "sar", "war", "ear"} ) );
|
||||||
|
|
||||||
|
public RepositoryIndexRecord createRecord( Artifact artifact )
|
||||||
|
{
|
||||||
|
StandardArtifactIndexRecord record = null;
|
||||||
|
|
||||||
|
File file = artifact.getFile();
|
||||||
|
if ( file != null && file.exists() )
|
||||||
|
{
|
||||||
|
String md5 = readChecksum( file, Digester.MD5 );
|
||||||
|
String sha1 = readChecksum( file, Digester.SHA1 );
|
||||||
|
|
||||||
|
List files = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if ( ARCHIVE_TYPES.contains( artifact.getType() ) )
|
||||||
|
{
|
||||||
|
files = readFilesInArchive( file );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
files = Collections.EMPTY_LIST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
getLogger().error( "Error reading artifact file, omitting from index: " + e.getMessage() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( files != null )
|
||||||
|
{
|
||||||
|
record = new StandardArtifactIndexRecord();
|
||||||
|
|
||||||
|
record.setGroupId( artifact.getGroupId() );
|
||||||
|
record.setArtifactId( artifact.getArtifactId() );
|
||||||
|
record.setVersion( artifact.getVersion() );
|
||||||
|
record.setClassifier( artifact.getClassifier() );
|
||||||
|
record.setType( artifact.getType() );
|
||||||
|
record.setMd5Checksum( md5 );
|
||||||
|
record.setSha1Checksum( sha1 );
|
||||||
|
record.setFilename( file.getName() );
|
||||||
|
record.setLastModified( file.lastModified() );
|
||||||
|
record.setSize( file.length() );
|
||||||
|
record.setRepository( artifact.getRepository().getId() );
|
||||||
|
/* TODO! these come from the POM and metadata, so probably part of an update record method instead
|
||||||
|
record.setPluginPrefix( pluginPrefix );
|
||||||
|
record.setPackaging( packaging );
|
||||||
|
indexPlugins( doc, FLD_PLUGINS_BUILD, pom.getBuild().getPlugins().iterator() );
|
||||||
|
indexReportPlugins( doc, FLD_PLUGINS_REPORT, pom.getReporting().getPlugins().iterator() );
|
||||||
|
record.setDependencies( dependencies );
|
||||||
|
record.setLicenses( licenses );
|
||||||
|
*/
|
||||||
|
populateArchiveEntries( files, record );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateArchiveEntries( List files, StandardArtifactIndexRecord record )
|
||||||
|
{
|
||||||
|
StringBuffer classes = new StringBuffer();
|
||||||
|
StringBuffer packages = new StringBuffer();
|
||||||
|
StringBuffer fileBuffer = new StringBuffer();
|
||||||
|
|
||||||
|
for ( Iterator i = files.iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String name = (String) i.next();
|
||||||
|
|
||||||
|
// ignore directories
|
||||||
|
if ( !name.endsWith( "/" ) )
|
||||||
|
{
|
||||||
|
fileBuffer.append( name ).append( "\n" );
|
||||||
|
|
||||||
|
if ( isClass( name ) )
|
||||||
|
{
|
||||||
|
int idx = name.lastIndexOf( '/' );
|
||||||
|
String classname = name.substring( idx + 1, name.length() - 6 );
|
||||||
|
classes.append( classname ).append( "\n" );
|
||||||
|
|
||||||
|
if ( idx > 0 )
|
||||||
|
{
|
||||||
|
String packageName = name.substring( 0, idx ).replace( '/', '.' );
|
||||||
|
if ( packages.indexOf( packageName ) < 0 )
|
||||||
|
{
|
||||||
|
packages.append( packageName ).append( "\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setClasses( classes.toString() );
|
||||||
|
record.setPackages( packages.toString() );
|
||||||
|
record.setFiles( fileBuffer.toString() );
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,10 +66,10 @@ Indexer Design
|
||||||
* Reduced Size Index
|
* Reduced Size Index
|
||||||
|
|
||||||
An additional index is maintained by the repository manager in the
|
An additional index is maintained by the repository manager in the
|
||||||
{{{../apidocs/org/apache/maven/repository/indexing/MinimalIndex.html} MinimalIndex}} class. This indexes all of the
|
{{{../apidocs/org/apache/maven/repository/indexing/MinimalArtifactIndexRecord.html} MinimalIndex}} class. This
|
||||||
same artifacts as the first index, but stores them with shorter field names and less information to maintain a smaller
|
indexes all of the same artifacts as the first index, but stores them with shorter field names and less information to
|
||||||
size. This index is appropriate for use by certain clients such as IDE integration for fast searching. For a fuller
|
maintain a smaller size. This index is appropriate for use by certain clients such as IDE integration for fast
|
||||||
interface to the repository information, the integration should use the XMLRPC interface.
|
searching. For a fuller interface to the repository information, the integration should use the XMLRPC interface.
|
||||||
|
|
||||||
The following fields are in the reduced index:
|
The following fields are in the reduced index:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
||||||
|
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||||
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the minimal artifact index record.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public class MinimalArtifactIndexRecordFactoryTest
|
||||||
|
extends PlexusTestCase
|
||||||
|
{
|
||||||
|
private RepositoryIndexRecordFactory factory;
|
||||||
|
|
||||||
|
private ArtifactRepository repository;
|
||||||
|
|
||||||
|
private ArtifactFactory artifactFactory;
|
||||||
|
|
||||||
|
private static final String TEST_GROUP_ID = "org.apache.maven.repository.record";
|
||||||
|
|
||||||
|
protected void setUp()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
factory = (RepositoryIndexRecordFactory) lookup( RepositoryIndexRecordFactory.ROLE, "minimal" );
|
||||||
|
|
||||||
|
artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
|
||||||
|
|
||||||
|
ArtifactRepositoryFactory repositoryFactory =
|
||||||
|
(ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
|
||||||
|
|
||||||
|
ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
|
||||||
|
|
||||||
|
File file = getTestFile( "src/test/managed-repository" );
|
||||||
|
repository =
|
||||||
|
repositoryFactory.createArtifactRepository( "test", file.toURI().toURL().toString(), layout, null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIndexedJar()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-jar" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
MinimalArtifactIndexRecord expectedRecord = new MinimalArtifactIndexRecord();
|
||||||
|
expectedRecord.setMd5Checksum( "3a0adc365f849366cd8b633cad155cb7" );
|
||||||
|
expectedRecord.setFilename( "test-jar-1.0.jar" );
|
||||||
|
expectedRecord.setLastModified( artifact.getFile().lastModified() );
|
||||||
|
expectedRecord.setSize( artifact.getFile().length() );
|
||||||
|
expectedRecord.setClasses( "A\nB\nC\n" );
|
||||||
|
|
||||||
|
assertEquals( "check record", expectedRecord, record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorruptJar()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-corrupt-jar" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
assertNull( "Confirm no record is returned", record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNonJar()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-dll", "1.0.1.34", "dll" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
assertNull( "Confirm no record is returned", record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testMissingFile()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-foo" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
assertNull( "Confirm no record is returned", record );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artifact createArtifact( String artifactId )
|
||||||
|
{
|
||||||
|
return createArtifact( artifactId, "1.0", "jar" );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artifact createArtifact( String artifactId, String version, String type )
|
||||||
|
{
|
||||||
|
Artifact artifact = artifactFactory.createBuildArtifact( TEST_GROUP_ID, artifactId, version, type );
|
||||||
|
artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
|
||||||
|
return artifact;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
package org.apache.maven.repository.indexing.record;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2006 The Apache Software Foundation.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
||||||
|
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||||
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the minimal artifact index record.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
|
||||||
|
*/
|
||||||
|
public class StandardArtifactIndexRecordFactoryTest
|
||||||
|
extends PlexusTestCase
|
||||||
|
{
|
||||||
|
private RepositoryIndexRecordFactory factory;
|
||||||
|
|
||||||
|
private ArtifactRepository repository;
|
||||||
|
|
||||||
|
private ArtifactFactory artifactFactory;
|
||||||
|
|
||||||
|
private static final String TEST_GROUP_ID = "org.apache.maven.repository.record";
|
||||||
|
|
||||||
|
protected void setUp()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
factory = (RepositoryIndexRecordFactory) lookup( RepositoryIndexRecordFactory.ROLE, "standard" );
|
||||||
|
|
||||||
|
artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
|
||||||
|
|
||||||
|
ArtifactRepositoryFactory repositoryFactory =
|
||||||
|
(ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.ROLE );
|
||||||
|
|
||||||
|
ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE, "default" );
|
||||||
|
|
||||||
|
File file = getTestFile( "src/test/managed-repository" );
|
||||||
|
repository =
|
||||||
|
repositoryFactory.createArtifactRepository( "test", file.toURI().toURL().toString(), layout, null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIndexedJar()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-jar" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
StandardArtifactIndexRecord expectedRecord = new StandardArtifactIndexRecord();
|
||||||
|
expectedRecord.setMd5Checksum( "3a0adc365f849366cd8b633cad155cb7" );
|
||||||
|
expectedRecord.setFilename( "test-jar-1.0.jar" );
|
||||||
|
expectedRecord.setLastModified( artifact.getFile().lastModified() );
|
||||||
|
expectedRecord.setSize( artifact.getFile().length() );
|
||||||
|
expectedRecord.setClasses( "A\nB\nC\n" );
|
||||||
|
expectedRecord.setArtifactId( "test-jar" );
|
||||||
|
expectedRecord.setGroupId( TEST_GROUP_ID );
|
||||||
|
expectedRecord.setVersion( "1.0" );
|
||||||
|
expectedRecord.setFiles( "META-INF/MANIFEST.MF\nA.class\nb/B.class\nb/c/C.class\n" );
|
||||||
|
expectedRecord.setPackages( "b\nb.c\n" );
|
||||||
|
expectedRecord.setSha1Checksum( "c66f18bf192cb613fc2febb4da541a34133eedc2" );
|
||||||
|
expectedRecord.setType( "jar" );
|
||||||
|
expectedRecord.setRepository( "test" );
|
||||||
|
|
||||||
|
assertEquals( "check record", expectedRecord, record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCorruptJar()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-corrupt-jar" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
assertNull( "Confirm no record is returned", record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDll()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-dll", "1.0.1.34", "dll" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
StandardArtifactIndexRecord expectedRecord = new StandardArtifactIndexRecord();
|
||||||
|
expectedRecord.setMd5Checksum( "d41d8cd98f00b204e9800998ecf8427e" );
|
||||||
|
expectedRecord.setFilename( "test-dll-1.0.1.34.dll" );
|
||||||
|
expectedRecord.setLastModified( artifact.getFile().lastModified() );
|
||||||
|
expectedRecord.setSize( artifact.getFile().length() );
|
||||||
|
expectedRecord.setArtifactId( "test-dll" );
|
||||||
|
expectedRecord.setGroupId( TEST_GROUP_ID );
|
||||||
|
expectedRecord.setVersion( "1.0.1.34" );
|
||||||
|
expectedRecord.setSha1Checksum( "da39a3ee5e6b4b0d3255bfef95601890afd80709" );
|
||||||
|
expectedRecord.setType( "dll" );
|
||||||
|
expectedRecord.setRepository( "test" );
|
||||||
|
expectedRecord.setClasses( "" );
|
||||||
|
expectedRecord.setPackages( "" );
|
||||||
|
expectedRecord.setFiles( "" );
|
||||||
|
|
||||||
|
assertEquals( "check record", expectedRecord, record );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testMissingFile()
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test-foo" );
|
||||||
|
|
||||||
|
RepositoryIndexRecord record = factory.createRecord( artifact );
|
||||||
|
|
||||||
|
assertNull( "Confirm no record is returned", record );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artifact createArtifact( String artifactId )
|
||||||
|
{
|
||||||
|
return createArtifact( artifactId, "1.0", "jar" );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artifact createArtifact( String artifactId, String version, String type )
|
||||||
|
{
|
||||||
|
Artifact artifact = artifactFactory.createBuildArtifact( TEST_GROUP_ID, artifactId, version, type );
|
||||||
|
artifact.setFile( new File( repository.getBasedir(), repository.pathOf( artifact ) ) );
|
||||||
|
artifact.setRepository( repository );
|
||||||
|
return artifact;
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Loading…
Reference in New Issue