blob: a0138e88dbbef598e9be81a09c606c10f285bbc5 [file] [log] [blame]
package org.apache.archiva.metadata.repository.jcr;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.archiva.metadata.model.MetadataFacetFactory;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import java.util.Collections;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
/**
* Hello world!
*/
public class QueryRepoApp
{
public static void main( String[] args )
throws RepositoryException
{
RepositoryConfig config = RepositoryConfig.create( "src/main/repository.xml", "jcr" );
Repository repository = new TransientRepository( config );
JcrMetadataRepository jcrMetadataRepository = new JcrMetadataRepository(
Collections.<String, MetadataFacetFactory>emptyMap(), repository );
try
{
Session session = jcrMetadataRepository.getJcrSession();
QueryManager queryManager = session.getWorkspace().getQueryManager();
queryProjectsWithDependency( queryManager, "org.springframework", "spring-web", "2.5.6" );
queryProjectsWithDependency( queryManager, "org.springframework", "spring-web" );
queryProjectsWithDependency( queryManager, "org.codehaus.plexus", "plexus-utils" );
// queryAllArtifactsInRepo( queryManager );
//
// queryAllProjectsInRepo( queryManager );
//
// queryAllGroupsInRepo( queryManager );
}
finally
{
jcrMetadataRepository.close();
}
}
private static void queryProjectsWithDependency( QueryManager queryManager, String namespace, String project )
throws RepositoryException
{
queryProjectsWithDependency( queryManager, namespace, project, null );
}
private static void queryAllGroupsInRepo( QueryManager queryManager )
throws RepositoryException
{
System.out.println( "querying # groups in repo" );
long time = System.currentTimeMillis();
// query = queryManager.createQuery(
// "SELECT * FROM [archiva:namespace] WHERE ISDESCENDANTNODE([/repositories/internal/content]) AND namespace IS NOT NULL",
// Query.JCR_SQL2 );
Query query = queryManager.createQuery(
"SELECT * FROM archiva:namespace WHERE jcr:path LIKE '/repositories/internal/content/%' AND namespace IS NOT NULL ORDER BY jcr:score",
Query.SQL );
System.out.println(
"groups = " + query.execute().getRows().getSize() + " in " + ( System.currentTimeMillis() - time ) +
" ms" );
}
private static void queryProjectsWithDependency( QueryManager queryManager, String namespace, String project,
String version )
throws RepositoryException
{
System.out.println( "querying dependencies on project " + namespace + ":" + project + ":" + version );
long time = System.currentTimeMillis();
// TODO: bind variables instead
String q =
"SELECT * FROM [archiva:dependency] WHERE ISDESCENDANTNODE([/repositories/internal/content]) AND [groupId]='" +
namespace + "' AND [artifactId]='" + project + "'";
if ( version != null )
{
q += " AND [version]='" + version + "'";
}
Query query = queryManager.createQuery( q, Query.JCR_SQL2 );
QueryResult execute = query.execute();
System.out.println( "query in " + ( System.currentTimeMillis() - time ) + " ms" );
time = System.currentTimeMillis();
for ( Row r : JcrUtils.getRows( execute ) )
{
Node n = r.getNode();
// n = n.getParent(); // dependency version
String dependencyVersion = n.getName();
// n = n.getParent(); // dependency project
// n = n.getParent(); // dependency namespace
n = n.getParent(); // dependencies element
n = n.getParent(); // project version
String usedByProjectVersion = n.getName();
n = n.getParent(); // project
String usedByProject = n.getName();
n = n.getParent(); // namespace
String usedByNamespace = n.getProperty( "namespace" ).getString();
System.out.println(
usedByNamespace + ":" + usedByProject + ":" + usedByProjectVersion + " -> " + dependencyVersion );
}
System.out.println( "results in " + ( System.currentTimeMillis() - time ) + " ms" );
}
private static void queryAllProjectsInRepo( QueryManager queryManager )
throws RepositoryException
{
System.out.println( "querying # projects in repo" );
long time = System.currentTimeMillis();
Query query = queryManager.createQuery(
"SELECT * FROM archiva:project WHERE jcr:path LIKE '/repositories/internal/content/%' ORDER BY jcr:score",
Query.SQL );
// query = queryManager.createQuery(
// "SELECT * FROM [archiva:project] WHERE ISDESCENDANTNODE([/repositories/internal/content])",
// Query.JCR_SQL2 );
System.out.println(
"projects = " + query.execute().getRows().getSize() + " in " + ( System.currentTimeMillis() - time ) +
" ms" );
}
private static void queryAllArtifactsInRepo( QueryManager queryManager )
throws RepositoryException
{
System.out.println( "querying # artifacts in repo" );
long time = System.currentTimeMillis();
// fails on Jackrabbit 2.2.0
// String q = "SELECT size FROM [archiva:artifact] AS artifact WHERE ISDESCENDANTNODE([/repositories/internal/content])";
// Query query = session.getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 );
// String q = "SELECT size FROM archiva:artifact WHERE jcr:path LIKE '/repositories/internal/content/%'";
// Query query = session.getWorkspace().getQueryManager().createQuery( q, Query.SQL );
//
String q = "SELECT size FROM [archiva:artifact]";
Query query = queryManager.createQuery( q, Query.JCR_SQL2 );
QueryResult queryResult = query.execute();
System.out.println( "query in " + ( System.currentTimeMillis() - time ) + "ms" );
time = System.currentTimeMillis();
long totalSize = 0, totalJars = 0, totalArtifacts = 0;
for ( Row row : JcrUtils.getRows( queryResult ) )
{
totalSize += row.getValue( "size" ).getLong();
if ( row.getNode().getName().endsWith( ".jar" ) )
{
totalJars++;
}
totalArtifacts++;
}
System.out.println( totalArtifacts + " artifacts, " + totalSize + " bytes, " + totalJars + " jars (count in " +
( System.currentTimeMillis() - time ) + "ms)" );
}
}