diff options
author | Martin Stockhammer <martin_s@apache.org> | 2017-06-21 23:52:17 +0200 |
---|---|---|
committer | olivier lamy <olamy@apache.org> | 2017-06-24 09:05:49 +1000 |
commit | 7d2cc26b4bf41a5e9429aba3a54665669cf6cf79 (patch) | |
tree | 5c06c9cb818b8ec661ab058d32adf9ba6b097eb5 /archiva-modules/plugins | |
parent | 42df217cd095a98ab935885a1c6e6e4f10a37954 (diff) | |
download | archiva-7d2cc26b4bf41a5e9429aba3a54665669cf6cf79.tar.gz archiva-7d2cc26b4bf41a5e9429aba3a54665669cf6cf79.zip |
Adding jcr oak implementation
Diffstat (limited to 'archiva-modules/plugins')
8 files changed, 469 insertions, 101 deletions
diff --git a/archiva-modules/plugins/metadata-store-jcr/pom.xml b/archiva-modules/plugins/metadata-store-jcr/pom.xml index 8fa30860c..831b639b0 100644 --- a/archiva-modules/plugins/metadata-store-jcr/pom.xml +++ b/archiva-modules/plugins/metadata-store-jcr/pom.xml @@ -28,6 +28,9 @@ <artifactId>metadata-store-jcr</artifactId> <packaging>bundle</packaging> <name>Archiva Core Plugins :: JCR Storage for Metadata</name> + <properties> + <jcr-oak.version>1.7.1</jcr-oak.version> + </properties> <dependencies> <dependency> <groupId>org.apache.archiva</groupId> @@ -48,6 +51,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> @@ -55,25 +64,42 @@ </dependency> <dependency> <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-jcr-commons</artifactId> + <artifactId>oak-jcr</artifactId> + <version>${jcr-oak.version}</version> </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> + <version>${jcr-oak.version}</version> + </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> @@ -98,6 +124,51 @@ <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> </dependencies> <build> <testResources> @@ -126,8 +197,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 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 364930998..2bf94063f 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 @@ -37,6 +37,8 @@ import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.MetadataResolutionException; 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; @@ -139,6 +141,8 @@ public class JcrMetadataRepository registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.FACET_NODE_TYPE ); registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.DEPENDENCY_NODE_TYPE ); + + } private static void registerMixinNodeType( NodeTypeManager nodeTypeManager, String name ) @@ -156,6 +160,8 @@ public class JcrMetadataRepository } } + + @Override public void updateProject( String repositoryId, ProjectMetadata project ) throws MetadataRepositoryException @@ -755,6 +761,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; } @@ -1418,11 +1428,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)"; @@ -1432,7 +1440,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 ) ); } @@ -1555,7 +1562,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 ) @@ -1565,7 +1572,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 ) @@ -1594,6 +1601,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( "/" ) ) { @@ -1614,8 +1622,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/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..65e1acec8 --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/RepositoryFactory.java @@ -0,0 +1,285 @@ +package org.apache.archiva.metadata.repository.jcr; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.util.concurrent.MoreExecutors; +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.IndexConstants; +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.ExternalObserverBuilder; +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.plugins.index.lucene.util.LuceneInitializerHelper; +import org.apache.jackrabbit.oak.segment.SegmentNodeStore; +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.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME; +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 +{ + + Logger log = LoggerFactory.getLogger( RepositoryFactory.class ); + + public static final String SEGMENT_FILE_TYPE = "oak-segment-tar"; + public static final String IN_MEMORY_TYPE = "oak-memory"; + + String storeType = SEGMENT_FILE_TYPE; + + Path repositoryPath = Paths.get( "repository" ); + + public Repository createRepository( ) throws IOException, InvalidFileStoreVersionException + { + NodeStore nodeStore; + if ( SEGMENT_FILE_TYPE.equals( storeType ) ) + { + FileStore fs = FileStoreBuilder.fileStoreBuilder( repositoryPath.toFile( ) ).build( ); + nodeStore = SegmentNodeStoreBuilders.builder( fs ).build( ); + } else if (IN_MEMORY_TYPE.equals(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: "+lucene+" myIndex "+lucene.getChildNode( "myIndex" )); + log.info("myIndex "+lucene.getChildNode( "myIndex" ).getProperties()); + // IndexUtils.createIndexDefinition( ) + + } + } ); + + ExecutorService executorService = createExecutor(); + 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: "+oak+" with nodeStore "+nodeStore); + Jcr jcr = new Jcr(oak).with( editorProvider ).with( (Observer) provider ) + .with(localIndexObserver) + // .with(observer) + .with( ( QueryIndexProvider) provider ) + .withAsyncIndexing("async",5 ); + Repository r = jcr.createRepository(); + try + { + Thread.currentThread().sleep(1000); + } + catch ( InterruptedException e ) + { + e.printStackTrace( ); + } + return r; + + + } + + public String getStoreType( ) + { + return storeType; + } + + public void setStoreType( String 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 ) + { + e.printStackTrace( ); + } + } + } + + private ExecutorService createExecutor() { + ThreadPoolExecutor executor = new ThreadPoolExecutor(0, 5, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<Runnable>(), 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/main/resources/log4j2-test.xml b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/log4j2-test.xml new file mode 100644 index 000000000..74dd0773f --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/log4j2-test.xml @@ -0,0 +1,42 @@ +<?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="trace"/> + + <root level="debug" includeLocation="true"> + <appender-ref ref="console"/> + </root> + </loggers> +</configuration>
\ No newline at end of file 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..f98b79bd1 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 @@ -19,14 +19,14 @@ --> <beans xmlns="http://www.springframework.org/schema/beans" - 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"> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> - <bean id="repository" class="org.apache.jackrabbit.core.RepositoryImpl" destroy-method="shutdown"> - <constructor-arg ref="config"/> + <bean id="repositoryFactory" class="org.apache.archiva.metadata.repository.jcr.RepositoryFactory" > + <property name="storeType" value="oak-segment-tar" /> </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 id="repository" class="org.apache.archiva.metadata.repository.jcr.RepositoryFactory" factory-method="createRepository" + factory-bean="repositoryFactory"> </bean> </beans>
\ No newline at end of file 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..74dd0773f --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/test/resources/log4j2-test.xml @@ -0,0 +1,42 @@ +<?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="trace"/> + + <root level="debug" includeLocation="true"> + <appender-ref ref="console"/> + </root> + </loggers> +</configuration>
\ No newline at end of file diff --git a/archiva-modules/plugins/repository-statistics/pom.xml b/archiva-modules/plugins/repository-statistics/pom.xml index 2d20acacb..ccbdbfc49 100644 --- a/archiva-modules/plugins/repository-statistics/pom.xml +++ b/archiva-modules/plugins/repository-statistics/pom.xml @@ -45,10 +45,6 @@ <artifactId>jcr</artifactId> </dependency> <dependency> - <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-jcr-commons</artifactId> - </dependency> - <dependency> <groupId>org.apache.archiva</groupId> <artifactId>archiva-test-utils</artifactId> <version>${project.version}</version> @@ -60,17 +56,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-core</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> @@ -96,7 +81,6 @@ <Import-Package> javax.jcr, javax.jcr.query, - org.apache.jackrabbit.commons;version="[2.3,3)", 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}, |