diff options
Diffstat (limited to 'archiva-modules/plugins')
15 files changed, 587 insertions, 133 deletions
diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml index 4c978436b..ab01552b5 100644 --- a/archiva-modules/plugins/maven2-repository/pom.xml +++ b/archiva-modules/plugins/maven2-repository/pom.xml @@ -277,7 +277,7 @@ <executions> <execution> <id>test-repository</id> - <phase>generate-test-resources</phase> + <phase>process-test-classes</phase> <goals> <goal>unpack-dependencies</goal> </goals> diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraRepositorySessionFactory.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraRepositorySessionFactory.java index d45e2cb10..2e434fc6e 100644 --- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraRepositorySessionFactory.java +++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraRepositorySessionFactory.java @@ -82,4 +82,10 @@ public class CassandraRepositorySessionFactory return new RepositorySession( metadataRepository, metadataResolver ); } + + @Override + public void close() + { + cassandraArchivaManager.shutdown(); + } } diff --git a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java index 0d63f4ee9..ce640fe1d 100644 --- a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java +++ b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileRepositorySessionFactory.java @@ -42,21 +42,12 @@ import java.util.Map; public class FileRepositorySessionFactory implements RepositorySessionFactory { - /** - * - */ private Map<String, MetadataFacetFactory> metadataFacetFactories; - /** - * - */ @Inject @Named( value = "archivaConfiguration#default" ) private ArchivaConfiguration configuration; - /** - * - */ @Inject private MetadataResolver metadataResolver; @@ -87,4 +78,10 @@ public class FileRepositorySessionFactory return new RepositorySession( metadataRepository, metadataResolver ); } + + @Override + public void close() + { + // no op + } } diff --git a/archiva-modules/plugins/metadata-store-jcr/pom.xml b/archiva-modules/plugins/metadata-store-jcr/pom.xml index 8e71c4c89..609011387 100644 --- a/archiva-modules/plugins/metadata-store-jcr/pom.xml +++ b/archiva-modules/plugins/metadata-store-jcr/pom.xml @@ -52,6 +52,12 @@ <artifactId>archiva-test-utils</artifactId> <version>${project.version}</version> <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>javax.jcr</groupId> @@ -59,25 +65,40 @@ </dependency> <dependency> <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-jcr-commons</artifactId> + <artifactId>oak-jcr</artifactId> </dependency> <dependency> <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-core</artifactId> - <scope>provided</scope> - <!-- could trim more, but since it's just for test we don't need to worry --> + <artifactId>oak-segment-tar</artifactId> + </dependency> + <dependency> + <groupId>org.apache.jackrabbit</groupId> + <artifactId>oak-lucene</artifactId> + <version>${jcr-oak.version}</version> <exclusions> <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-misc</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-facet</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> </dependency> <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j-impl</artifactId> + </dependency> + <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> @@ -102,6 +123,57 @@ <artifactId>xercesImpl</artifactId> <scope>test</scope> </dependency> + + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-core</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-misc</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-facet</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-codecs</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-queryparser</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-sandbox</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-highlighter</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-memory</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-analyzers-common</artifactId> + <version>${lucene.version}</version> + </dependency> + <dependency> + <groupId>io.dropwizard.metrics</groupId> + <artifactId>metrics-core</artifactId> + <version>3.1.0</version> + </dependency> </dependencies> <build> <testResources> @@ -134,8 +206,6 @@ org.apache.archiva.metadata.model;version=${project.version}, org.apache.archiva.metadata.repository;version=${project.version}, org.apache.commons.lang;version="[2.4,3)", - org.apache.jackrabbit.commons;version="[2.3,3)", - org.apache.jackrabbit.core.config, org.springframework*;version="[3,4)", org.slf4j;resolution:=optional, org.apache.commons.lang.time @@ -143,6 +213,15 @@ </instructions> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <systemPropertyVariables> + <appserver.base>${project.build.directory}/jcr/repo</appserver.base> + </systemPropertyVariables> + </configuration> + </plugin> </plugins> </build> </project> diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/ArchivaJcrRepositoryConfig.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/ArchivaJcrRepositoryConfig.java deleted file mode 100644 index 8271e2bec..000000000 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/ArchivaJcrRepositoryConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -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.jackrabbit.core.config.ConfigurationException; -import org.apache.jackrabbit.core.config.RepositoryConfig; -import org.slf4j.LoggerFactory; - -import java.io.File; - -/** - * @author Olivier Lamy - * @since 1.4-M1 - */ -public class ArchivaJcrRepositoryConfig -{ - // Recommended to avoid inconsistencies caused by race conditions. - static - { - if ( !System.getProperties( ).containsKey( "org.apache.jackrabbit.core.state.validatehierarchy" ) ) - { - System.setProperty( "org.apache.jackrabbit.core.state.validatehierarchy", "true" ); - } - } - - public static RepositoryConfig create( String file, String home ) - throws ConfigurationException - { - File homeFile = new File( home ); - if ( !homeFile.exists( ) ) - { - homeFile.mkdirs( ); - } - - File configurationFile = new File( file ); - if ( !configurationFile.exists( ) ) - { - String resourcePath = "org/apache/archiva/metadata/repository/jcr/repository.xml"; - LoggerFactory.getLogger( ArchivaJcrRepositoryConfig.class ).info( - "no repository.xml file in path {} so use default from resources path {}", file, resourcePath ); - // use bundled repository.xml - return RepositoryConfig.create( - Thread.currentThread( ).getContextClassLoader( ).getResourceAsStream( resourcePath ), home ); - } - - return RepositoryConfig.create( file, home ); - } -} diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java index f8393b888..9fca6b848 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java @@ -40,6 +40,8 @@ import org.apache.archiva.metadata.repository.stats.model.RepositoryStatistics; import org.apache.archiva.metadata.repository.stats.model.RepositoryStatisticsProvider; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.commons.JcrUtils; +import org.apache.jackrabbit.oak.plugins.index.IndexUtils; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -143,6 +145,8 @@ public class JcrMetadataRepository registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.FACET_NODE_TYPE ); registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.DEPENDENCY_NODE_TYPE ); + + } private static void registerMixinNodeType( NodeTypeManager nodeTypeManager, String name ) @@ -160,6 +164,8 @@ public class JcrMetadataRepository } } + + @Override public void updateProject( String repositoryId, ProjectMetadata project ) throws MetadataRepositoryException @@ -759,6 +765,10 @@ public class JcrMetadataRepository { throw new MetadataRepositoryException( e.getMessage(), e ); } + log.info("Artifacts found {}", artifacts.size()); + for (ArtifactMetadata meta : artifacts) { + log.info("Artifact: "+meta.getVersion()+" "+meta.getFacetList()); + } return artifacts; } @@ -1422,11 +1432,9 @@ public class JcrMetadataRepository } @Override - public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact ) + public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean e ) throws MetadataRepositoryException { - // we can't do exact search in any property (*), we need a key - boolean e = exact && key != null; String theKey = key == null ? "*" : "[" + key + "]"; String projectVersionCondition = e ? "(projectVersion." + theKey + " = $value)" : "contains([projectVersion]." + theKey + ", $value)"; @@ -1436,7 +1444,6 @@ public class JcrMetadataRepository + ARTIFACT_NODE_TYPE + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) LEFT OUTER JOIN [" + FACET_NODE_TYPE + "] AS facet ON ISCHILDNODE(facet, projectVersion) WHERE (" + projectVersionCondition + " OR " + facetCondition + ")"; - return runJcrQuery( repositoryId, q, ImmutableMap.of( "value", text ) ); } @@ -1559,7 +1566,7 @@ public class JcrMetadataRepository private static String getRepositoryContentPath( String repositoryId ) { - return getRepositoryPath( repositoryId ) + "/content/"; + return getRepositoryPath( repositoryId ) + "/content"; } private static String getFacetPath( String repositoryId, String facetId ) @@ -1569,7 +1576,7 @@ public class JcrMetadataRepository private static String getNamespacePath( String repositoryId, String namespace ) { - return getRepositoryContentPath( repositoryId ) + namespace.replace( '.', '/' ); + return getRepositoryContentPath( repositoryId ) + "/" + namespace.replace( '.', '/' ); } private static String getProjectPath( String repositoryId, String namespace, String projectId ) @@ -1598,6 +1605,7 @@ public class JcrMetadataRepository private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType ) throws RepositoryException { + log.debug("getOrAddNodeByPath"+baseNode+" "+name+" "+nodeType); Node node = baseNode; for ( String n : name.split( "/" ) ) { @@ -1618,8 +1626,10 @@ public class JcrMetadataRepository private Node getOrAddRepositoryNode( String repositoryId ) throws RepositoryException { + log.debug("getOrAddRepositoryNode "+repositoryId); Node root = getJcrSession().getRootNode(); Node node = JcrUtils.getOrAddNode( root, "repositories" ); + log.debug("Repositories "+node); node = JcrUtils.getOrAddNode( node, repositoryId ); return node; } diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySessionFactory.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySessionFactory.java index 1c51dfc73..0b775c796 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySessionFactory.java +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySessionFactory.java @@ -33,16 +33,19 @@ import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.jcr.Repository; import javax.jcr.RepositoryException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; /** * */ -@Service("repositorySessionFactory#jcr") +@Service( "repositorySessionFactory#jcr" ) public class JcrRepositorySessionFactory implements RepositorySessionFactory { @@ -54,7 +57,6 @@ public class JcrRepositorySessionFactory private Map<String, MetadataFacetFactory> metadataFacetFactories; - @Inject private Repository repository; // Lazy evaluation to avoid problems with circular dependencies during initialization @@ -63,6 +65,8 @@ public class JcrRepositorySessionFactory @Inject private RepositorySessionFactoryBean repositorySessionFactoryBean; + private RepositoryFactory repositoryFactory; + @Override public RepositorySession createSession() { @@ -85,8 +89,10 @@ public class JcrRepositorySessionFactory } // Lazy evaluation to avoid problems with circular dependencies during initialization - private MetadataResolver getMetadataResolver() { - if (this.metadataResolver==null) { + private MetadataResolver getMetadataResolver() + { + if ( this.metadataResolver == null ) + { this.metadataResolver = applicationContext.getBean( MetadataResolver.class ); } return this.metadataResolver; @@ -97,7 +103,7 @@ public class JcrRepositorySessionFactory throws Exception { - // skip initialisation if not cassandra + // skip initialisation if not jcr if ( !StringUtils.equals( repositorySessionFactoryBean.getId(), "jcr" ) ) { return; @@ -123,6 +129,12 @@ public class JcrRepositorySessionFactory JcrMetadataRepository metadataRepository = null; try { + + repositoryFactory = new RepositoryFactory(); + // FIXME this need to be configurable + Path directoryPath = Paths.get( System.getProperty( "appserver.base" ), "data/jcr" ); + repositoryFactory.setRepositoryPath( directoryPath ); + repository = repositoryFactory.createRepository(); metadataRepository = new JcrMetadataRepository( metadataFacetFactories, repository ); JcrMetadataRepository.initialize( metadataRepository.getJcrSession() ); } @@ -141,4 +153,10 @@ public class JcrRepositorySessionFactory stopWatch.stop(); logger.info( "time to initialize JcrRepositorySessionFactory: {}", stopWatch.getTime() ); } + + @PreDestroy + public void close() + { + repositoryFactory.close(); + } } diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/RepositoryFactory.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/RepositoryFactory.java new file mode 100644 index 000000000..b1b821dc8 --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/RepositoryFactory.java @@ -0,0 +1,350 @@ +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 com.google.common.collect.ImmutableSet; +import org.apache.commons.lang.time.StopWatch; +import org.apache.jackrabbit.JcrConstants; +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.plugins.index.IndexUtils; +import org.apache.jackrabbit.oak.plugins.index.lucene.ExtractedTextCache; +import org.apache.jackrabbit.oak.plugins.index.lucene.IndexCopier; +import org.apache.jackrabbit.oak.plugins.index.lucene.IndexTracker; +import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexEditorProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.hybrid.DocumentQueue; +import org.apache.jackrabbit.oak.plugins.index.lucene.hybrid.LocalIndexObserver; +import org.apache.jackrabbit.oak.plugins.index.lucene.hybrid.NRTIndexFactory; +import org.apache.jackrabbit.oak.plugins.index.lucene.reader.DefaultIndexReaderFactory; +import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders; +import org.apache.jackrabbit.oak.segment.file.FileStore; +import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder; +import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; +import org.apache.jackrabbit.oak.spi.commit.Observer; +import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer; +import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider; +import org.apache.jackrabbit.oak.spi.mount.Mounts; +import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import javax.jcr.Repository; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.apache.archiva.metadata.repository.jcr.RepositoryFactory.StoreType.IN_MEMORY_TYPE; +import static org.apache.archiva.metadata.repository.jcr.RepositoryFactory.StoreType.SEGMENT_FILE_TYPE; +import static org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INCLUDE_PROPERTY_TYPES; + +/** + * Created by martin on 14.06.17. + * + * @author Martin Stockhammer + * @since 3.0.0 + */ +public class RepositoryFactory +{ + + private Logger log = LoggerFactory.getLogger( RepositoryFactory.class ); + + private FileStore fileStore; + + private NodeStore nodeStore; + + private ExecutorService executorService; + + public enum StoreType + { + SEGMENT_FILE_TYPE, + IN_MEMORY_TYPE; + } + + private StoreType storeType = SEGMENT_FILE_TYPE; + + private Path repositoryPath = Paths.get( "repository" ); + + public Repository createRepository() + throws IOException, InvalidFileStoreVersionException + { + createExecutor(); + + if ( SEGMENT_FILE_TYPE == storeType ) + { + fileStore = FileStoreBuilder.fileStoreBuilder( repositoryPath.toFile() ).build(); + nodeStore = SegmentNodeStoreBuilders.builder( fileStore ) // + .withStatisticsProvider( StatisticsProvider.NOOP ) // + .build(); + } + else if ( IN_MEMORY_TYPE == storeType ) + { + nodeStore = null; + } + else + { + throw new IllegalArgumentException( "Store type " + storeType + " not recognized" ); + } + + Oak oak = nodeStore == null ? new Oak() : new Oak( nodeStore ); + oak.with( new RepositoryInitializer() + { + @Override + public void initialize( @Nonnull NodeBuilder root ) + { + log.info( "Creating index " ); + + NodeBuilder lucene = IndexUtils.getOrCreateOakIndex( root ).child( "lucene" ); + lucene.setProperty( JcrConstants.JCR_PRIMARYTYPE, "oak:QueryIndexDefinition", Type.NAME ); + + lucene.setProperty( "compatVersion", 2 ); + lucene.setProperty( "type", "lucene" ); + // lucene.setProperty("async", "async"); + lucene.setProperty( INCLUDE_PROPERTY_TYPES, ImmutableSet.of( "String" ), Type.STRINGS ); + // lucene.setProperty("refresh",true); + lucene.setProperty( "async", ImmutableSet.of( "async", "sync" ), Type.STRINGS ); + NodeBuilder rules = lucene.child( "indexRules" ). + setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + rules.setProperty( ":childOrder", ImmutableSet.of( "archiva:projectVersion", // + "archiva:artifact", // + "archiva:facet", // + "archiva:namespace", // + "archiva:project" ), // + Type.STRINGS ); + NodeBuilder allProps = rules.child( "archiva:projectVersion" ) // + .child( "properties" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME ) // + .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // + .setProperty( "indexNodeName", true ) // + .child( "allProps" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + allProps.setProperty( "name", ".*" ); + allProps.setProperty( "isRegexp", true ); + allProps.setProperty( "nodeScopeIndex", true ); + allProps.setProperty( "index", true ); + allProps.setProperty( "analyzed", true ); + // allProps.setProperty("propertyIndex",true); + allProps = rules.child( "archiva:artifact" ) // + .child( "properties" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME ) // + .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // + .setProperty( "indexNodeName", true ).child( "allProps" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + allProps.setProperty( "name", ".*" ); + allProps.setProperty( "isRegexp", true ); + allProps.setProperty( "nodeScopeIndex", true ); + allProps.setProperty( "index", true ); + allProps.setProperty( "analyzed", true ); + allProps = rules.child( "archiva:facet" ) // + .child( "properties" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME ) // + .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // + .setProperty( "indexNodeName", true ) // + .child( "allProps" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + allProps.setProperty( "name", ".*" ); + allProps.setProperty( "isRegexp", true ); + allProps.setProperty( "nodeScopeIndex", true ); + allProps.setProperty( "index", true ); + allProps.setProperty( "analyzed", true ); + allProps = rules.child( "archiva:namespace" ) // + .child( "properties" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME ) // + .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // + .setProperty( "indexNodeName", true ) // + .child( "allProps" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + allProps.setProperty( "name", ".*" ); + allProps.setProperty( "isRegexp", true ); + allProps.setProperty( "nodeScopeIndex", true ); + allProps.setProperty( "index", true ); + allProps.setProperty( "analyzed", true ); + allProps = rules.child( "archiva:project" ) // + .child( "properties" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME ) // + .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // + .setProperty( "indexNodeName", true ) // + .child( "allProps" ) // + .setProperty( JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED, Type.NAME ); + allProps.setProperty( "name", ".*" ); + allProps.setProperty( "isRegexp", true ); + allProps.setProperty( "nodeScopeIndex", true ); + allProps.setProperty( "index", true ); + allProps.setProperty( "analyzed", true ); + + log.info( "Index: {} myIndex {}", lucene, lucene.getChildNode( "myIndex" ) ); + log.info( "myIndex {}", lucene.getChildNode( "myIndex" ).getProperties() ); + // IndexUtils.createIndexDefinition( ) + + } + } ); + + StatisticsProvider statsProvider = StatisticsProvider.NOOP; + int queueSize = Integer.getInteger( "queueSize", 10000 ); + File indexDir = Files.createTempDirectory( "archiva_index" ).toFile(); + log.info( "Queue Index {}", indexDir.toString() ); + IndexCopier indexCopier = new IndexCopier( executorService, indexDir, true ); + NRTIndexFactory nrtIndexFactory = new NRTIndexFactory( indexCopier, statsProvider ); + MountInfoProvider mountInfoProvider = Mounts.defaultMountInfoProvider(); + IndexTracker tracker = + new IndexTracker( new DefaultIndexReaderFactory( mountInfoProvider, indexCopier ), nrtIndexFactory ); + DocumentQueue queue = new DocumentQueue( queueSize, tracker, executorService, statsProvider ); + LocalIndexObserver localIndexObserver = new LocalIndexObserver( queue, statsProvider ); + LuceneIndexProvider provider = new LuceneIndexProvider( tracker ); + + // ExternalObserverBuilder builder = new ExternalObserverBuilder(queue, tracker, statsProvider, +// executorService, queueSize); +// Observer observer = builder.build(); +// builder.getBackgroundObserver(); + + LuceneIndexEditorProvider editorProvider = // + new LuceneIndexEditorProvider( null, tracker, // + new ExtractedTextCache( 0, 0 ), // + null, mountInfoProvider ); + editorProvider.setIndexingQueue( queue ); + + log.info( "Oak: {} with nodeStore {}", oak, nodeStore ); + Jcr jcr = new Jcr( oak ).with( editorProvider ) // + .with( (Observer) provider ) // + .with( localIndexObserver ) + // .with(observer) + .with( (QueryIndexProvider) provider ); // + //.withAsyncIndexing( "async", 5 ); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + Repository r = jcr.createRepository(); + stopWatch.stop(); + log.info( "time to create jcr repository: {} ms", stopWatch.getTime() ); +// try +// { +// Thread.currentThread().sleep( 1000 ); +// } +// catch ( InterruptedException e ) +// { +// log.error( e.getMessage(), e ); +// } + return r; + + + } + + public void close() + { + if ( fileStore != null ) + { + fileStore.close(); + } + if (executorService != null) + { + executorService.shutdownNow(); + } + } + + public StoreType getStoreType() + { + return storeType; + } + + public void setStoreType( StoreType storeType ) + { + this.storeType = storeType; + } + + public Path getRepositoryPath() + { + return repositoryPath; + } + + public void setRepositoryPath( Path repositoryPath ) + { + this.repositoryPath = repositoryPath; + } + + public void setRepositoryPath( String repositoryPath ) + { + this.repositoryPath = Paths.get( repositoryPath ); + if ( !Files.exists( this.repositoryPath ) ) + { + try + { + Files.createDirectories( this.repositoryPath ); + } + catch ( IOException e ) + { + log.error( e.getMessage(), e ); + throw new IllegalArgumentException( "cannot create directory:" + repositoryPath, e ); + } + } + } + + private void createExecutor() + { + if (executorService ==null ) + { + executorService = Executors.newCachedThreadPool(); + } + +// +// ThreadPoolExecutor executor = +// new ThreadPoolExecutor( 0, 5, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), +// new ThreadFactory() +// { +// private final AtomicInteger counter = new AtomicInteger(); +// +// private final Thread.UncaughtExceptionHandler handler = +// new Thread.UncaughtExceptionHandler() +// { +// @Override +// public void uncaughtException( Thread t, Throwable e ) +// { +// log.warn( "Error occurred in asynchronous processing ", e ); +// } +// }; +// +// @Override +// public Thread newThread( @Nonnull Runnable r ) +// { +// Thread thread = new Thread( r, createName() ); +// thread.setDaemon( true ); +// thread.setPriority( Thread.MIN_PRIORITY ); +// thread.setUncaughtExceptionHandler( handler ); +// return thread; +// } +// +// private String createName() +// { +// return "oak-lucene-" + counter.getAndIncrement(); +// } +// } ); +// executor.setKeepAliveTime( 1, TimeUnit.MINUTES ); +// executor.allowCoreThreadTimeOut( true ); +// return executor; + } + +} diff --git a/archiva-modules/plugins/metadata-store-jcr/src/test/filtered-resources/META-INF/spring-context.xml b/archiva-modules/plugins/metadata-store-jcr/src/test/filtered-resources/META-INF/spring-context.xml index 43f6d0829..c07cc52d5 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/test/filtered-resources/META-INF/spring-context.xml +++ b/archiva-modules/plugins/metadata-store-jcr/src/test/filtered-resources/META-INF/spring-context.xml @@ -22,11 +22,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - <bean id="repository" class="org.apache.jackrabbit.core.RepositoryImpl" destroy-method="shutdown"> - <constructor-arg ref="config"/> - </bean> - <bean id="config" class="org.apache.jackrabbit.core.config.RepositoryConfig" factory-method="create"> - <constructor-arg value="${basedir}/src/test/repository.xml"/> - <constructor-arg value="${project.build.directory}/jcr"/> - </bean> + </beans>
\ No newline at end of file diff --git a/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepositoryTest.java index 5efabdfad..e87d53f98 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepositoryTest.java +++ b/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepositoryTest.java @@ -22,17 +22,19 @@ package org.apache.archiva.metadata.repository.jcr; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; import org.apache.commons.io.FileUtils; +import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; import org.junit.After; import org.junit.Before; -import org.junit.Test; +import org.junit.BeforeClass; import org.springframework.context.ApplicationContext; -import java.io.File; -import java.util.Map; import javax.inject.Inject; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; +import java.io.File; +import java.io.IOException; +import java.util.Map; public class JcrMetadataRepositoryTest extends AbstractMetadataRepositoryTest @@ -42,6 +44,21 @@ public class JcrMetadataRepositoryTest @Inject private ApplicationContext applicationContext; + private static Repository jcrRepository; + + @BeforeClass + public static void setupSpec() throws IOException, InvalidFileStoreVersionException + { + File directory = new File( "target/test-repositories" ); + if ( directory.exists() ) + { + FileUtils.deleteDirectory( directory ); + } + RepositoryFactory factory = new RepositoryFactory(); + factory.setRepositoryPath( directory.getPath() ); + jcrRepository = factory.createRepository(); + } + @Before @Override public void setUp() @@ -49,17 +66,11 @@ public class JcrMetadataRepositoryTest { super.setUp(); - File directory = new File( "target/test-repositories" ); - if ( directory.exists() ) - { - FileUtils.deleteDirectory( directory ); - } Map<String, MetadataFacetFactory> factories = createTestMetadataFacetFactories(); // TODO: probably don't need to use Spring for this - Repository repository = applicationContext.getBean( Repository.class ); - jcrMetadataRepository = new JcrMetadataRepository( factories, repository ); + jcrMetadataRepository = new JcrMetadataRepository( factories, jcrRepository ); try { @@ -70,6 +81,7 @@ public class JcrMetadataRepositoryTest // removing content is faster than deleting and re-copying the files from target/jcr session.getRootNode().getNode( "repositories" ).remove(); + session.save(); } catch ( RepositoryException e ) { diff --git a/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java b/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java index 63bfffb6f..be07e2e73 100644 --- a/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java +++ b/archiva-modules/plugins/metadata-store-jcr/src/test/java/org/apache/archiva/metadata/repository/stats/JcrRepositoryStatisticsGatheringTest.java @@ -24,32 +24,26 @@ import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.jcr.JcrMetadataRepository; +import org.apache.archiva.metadata.repository.jcr.RepositoryFactory; import org.apache.archiva.metadata.repository.stats.model.DefaultRepositoryStatistics; -import org.apache.archiva.test.utils.ArchivaBlockJUnit4ClassRunner; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.commons.io.FileUtils; import org.apache.jackrabbit.commons.JcrUtils; -import org.apache.jackrabbit.core.TransientRepository; -import org.apache.jackrabbit.core.config.RepositoryConfig; -import org.apache.regexp.RE; +import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; import org.junit.After; -import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import javax.inject.Inject; -import javax.inject.Named; import javax.jcr.ImportUUIDBehavior; -import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.SimpleCredentials; -import javax.jcr.Workspace; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.NodeTypeTemplate; import java.io.File; @@ -59,12 +53,9 @@ import java.util.Date; import java.util.Map; import java.util.zip.GZIPInputStream; -import static org.junit.Assert.assertEquals; - @RunWith( ArchivaSpringJUnit4ClassRunner.class ) @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } ) public class JcrRepositoryStatisticsGatheringTest extends TestCase - { private static final int TOTAL_FILE_COUNT = 1000; @@ -80,25 +71,30 @@ public class JcrRepositoryStatisticsGatheringTest extends TestCase @Inject private ApplicationContext applicationContext; - @Inject - @Named("repository") - Repository jcrRepository; - Session session; + private static Repository jcrRepository; - - @Before - public void setUp() - throws Exception + @BeforeClass + public static void setupSpec() throws IOException, InvalidFileStoreVersionException { - File directory = new File( "target/test-repositories" ); if ( directory.exists() ) { FileUtils.deleteDirectory( directory ); } + RepositoryFactory factory = new RepositoryFactory(); + factory.setRepositoryPath( directory.getPath() ); + factory.setStoreType( RepositoryFactory.StoreType.IN_MEMORY_TYPE ); + jcrRepository = factory.createRepository(); + } + + + @Before + public void setUp() + throws Exception + { Map<String, MetadataFacetFactory> factories = AbstractMetadataRepositoryTest.createTestMetadataFacetFactories(); @@ -106,6 +102,9 @@ public class JcrRepositoryStatisticsGatheringTest extends TestCase // TODO: probably don't need to use Spring for this JcrMetadataRepository jcrMetadataRepository = new JcrMetadataRepository( factories, jcrRepository ); + + session = jcrMetadataRepository.getJcrSession(); + try { session = jcrMetadataRepository.getJcrSession(); diff --git a/archiva-modules/plugins/metadata-store-jcr/src/test/resources/log4j2-test.xml b/archiva-modules/plugins/metadata-store-jcr/src/test/resources/log4j2-test.xml new file mode 100644 index 000000000..7f4b0cd9c --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/test/resources/log4j2-test.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + ~ 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. + --> + + +<configuration status="debug"> + + <appenders> + <Console name="console" target="SYSTEM_OUT"> + <!--PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/--> + <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}" /> + </Console> + + </appenders> + <loggers> + <logger name="org.apache.jackrabbit" level="info"/> + <root level="info" includeLocation="true"> + <appender-ref ref="console"/> + </root> + </loggers> +</configuration>
\ No newline at end of file diff --git a/archiva-modules/plugins/problem-reports/pom.xml b/archiva-modules/plugins/problem-reports/pom.xml index 20db52b92..d08bccb6b 100644 --- a/archiva-modules/plugins/problem-reports/pom.xml +++ b/archiva-modules/plugins/problem-reports/pom.xml @@ -112,7 +112,7 @@ <executions> <execution> <id>test-repository</id> - <phase>generate-test-resources</phase> + <phase>process-test-classes</phase> <goals> <goal>unpack-dependencies</goal> </goals> diff --git a/archiva-modules/plugins/repository-statistics/pom.xml b/archiva-modules/plugins/repository-statistics/pom.xml index acfea4f97..2a1926d42 100644 --- a/archiva-modules/plugins/repository-statistics/pom.xml +++ b/archiva-modules/plugins/repository-statistics/pom.xml @@ -45,6 +45,10 @@ <artifactId>slf4j-api</artifactId> </dependency> <dependency> + <groupId>javax.jcr</groupId> + <artifactId>jcr</artifactId> + </dependency> + <dependency> <groupId>org.apache.archiva</groupId> <artifactId>archiva-test-utils</artifactId> <version>${project.version}</version> @@ -65,6 +69,16 @@ <artifactId>xercesImpl</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.jackrabbit</groupId> + <artifactId>jackrabbit-jcr-commons</artifactId> + <version>2.15.2</version> + </dependency> + <dependency> + <groupId>org.apache.archiva</groupId> + <artifactId>metadata-store-jcr</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> <plugins> @@ -79,6 +93,8 @@ org.apache.archiva.metadata.repository.stats;version=${project.version} </Export-Package> <Import-Package> + javax.jcr, + javax.jcr.query, org.apache.archiva.metadata.model;version=${project.version}, org.apache.archiva.metadata.repository;version=${project.version}, org.apache.archiva.metadata.repository.storage.maven2;version=${project.version}, diff --git a/archiva-modules/plugins/stage-repository-merge/pom.xml b/archiva-modules/plugins/stage-repository-merge/pom.xml index d425434e0..4023b24a1 100644 --- a/archiva-modules/plugins/stage-repository-merge/pom.xml +++ b/archiva-modules/plugins/stage-repository-merge/pom.xml @@ -153,7 +153,7 @@ <executions> <execution> <id>test-repository</id> - <phase>generate-test-resources</phase> + <phase>process-test-classes</phase> <goals> <goal>unpack-dependencies</goal> </goals> |