From: Martin Stockhammer Date: Thu, 15 Aug 2019 20:54:14 +0000 (+0200) Subject: Improving metadata session handling and JCR indexing X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e4f38c2fbe1f6ce82da98ca9d67d6cc41757f833;p=archiva.git Improving metadata session handling and JCR indexing --- diff --git a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java index 78b5b4d83..2d7587902 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java +++ b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java @@ -25,10 +25,12 @@ import org.apache.archiva.metadata.generic.GenericMetadataFacetFactory; import org.apache.archiva.metadata.model.*; import org.apache.archiva.repository.Repository; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.format.annotation.NumberFormat; import org.springframework.test.context.ContextConfiguration; import java.text.SimpleDateFormat; @@ -36,14 +38,13 @@ import java.util.*; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(ArchivaSpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml"}) +@RunWith( ArchivaSpringJUnit4ClassRunner.class ) +@ContextConfiguration( locations = {"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml"} ) public abstract class AbstractMetadataRepositoryTest - extends TestCase { + extends TestCase +{ protected static final String OTHER_REPO_ID = "other-repo"; - protected MetadataRepository repository; - protected RepositorySessionFactory sessionFactory; protected static final String TEST_REPO_ID = "test"; @@ -55,9 +56,9 @@ public abstract class AbstractMetadataRepositoryTest private static final String TEST_PROJECT_VERSION_2_0 = "2.0"; - private static final String TEST_URL = "http://archiva.apache.org"; + protected static final String TEST_URL = "http://archiva.apache.org"; - private static final Organization TEST_ORGANIZATION = new Organization("Apache", "http://apache.org"); + private static final Organization TEST_ORGANIZATION = new Organization( "Apache", "http://apache.org" ); private static final String TEST_FACET_ID = "test-facet-id"; @@ -75,790 +76,958 @@ public abstract class AbstractMetadataRepositoryTest private static final String TEST_METADATA_VALUE = "testmetadata"; - protected Logger log = LoggerFactory.getLogger(getClass()); + protected Logger log = LoggerFactory.getLogger( getClass( ) ); /* * Used by tryAssert to allow to throw exceptions in the lambda expression. */ @FunctionalInterface - private interface AssertFunction { - void accept() throws Exception; + protected interface AssertFunction + { + void accept( ) throws Exception; } - private void tryAssert(AssertFunction func) throws Exception { - tryAssert(func, 5, 500); + protected void tryAssert( AssertFunction func ) throws Exception + { + tryAssert( func, 20, 500 ); } + + protected abstract RepositorySessionFactory getSessionFactory( ); + + protected abstract MetadataRepository getRepository( ); + /* * Runs the assert method until the assert is successful or the number of retries - * is reached. Needed because the JCR Oak index update is asynchronous, so updates + * is reached. This is needed because the JCR Oak index update is asynchronous, so updates * may not be visible immediately after the modification. */ - private void tryAssert(AssertFunction func, int retries, int sleepMillis) throws Exception { + private void tryAssert( AssertFunction func, int retries, int sleepMillis ) throws Exception + { Throwable t = null; int retry = retries; - while (retry-- > 0) { - try { - func.accept(); + while ( retry-- > 0 ) + { + try + { + func.accept( ); return; - } catch (Exception | AssertionError e) { + } + catch ( Exception | AssertionError e ) + { t = e; - Thread.currentThread().sleep(sleepMillis); - log.warn("Retrying assert " + retry); + Thread.currentThread( ).sleep( sleepMillis ); + log.warn( "Retrying assert {}: {}", retry, e.getMessage( ) ); } } - if (retry <= 0 && t != null) { - if (t instanceof RuntimeException) { + log.warn( "Retries: {}, Exception: {}", retry, t.getMessage( ) ); + if ( retry <= 0 && t != null ) + { + if ( t instanceof RuntimeException ) + { throw (RuntimeException) t; - } else if (t instanceof Exception) { + } + else if ( t instanceof Exception ) + { throw (Exception) t; } + else if ( t instanceof Error ) + { + throw (Error) t; + } } } - public static Map createTestMetadataFacetFactories() { - Map factories = new HashMap<>(); - factories.put(TEST_FACET_ID, new MetadataFacetFactory() { + public static Map createTestMetadataFacetFactories( ) + { + Map factories = new HashMap<>( ); + factories.put( TEST_FACET_ID, new MetadataFacetFactory( ) + { @Override - public MetadataFacet createMetadataFacet() { - return new TestMetadataFacet(TEST_METADATA_VALUE); + public MetadataFacet createMetadataFacet( ) + { + return new TestMetadataFacet( TEST_METADATA_VALUE ); } @Override - public MetadataFacet createMetadataFacet(String repositoryId, String name) { - return new TestMetadataFacet(TEST_METADATA_VALUE); + public MetadataFacet createMetadataFacet( String repositoryId, String name ) + { + return new TestMetadataFacet( TEST_METADATA_VALUE ); } - }); + } ); // add to ensure we don't accidentally create an empty facet ID. - factories.put("", new MetadataFacetFactory() { + factories.put( "", new MetadataFacetFactory( ) + { @Override - public MetadataFacet createMetadataFacet() { - return new TestMetadataFacet("", TEST_VALUE); + public MetadataFacet createMetadataFacet( ) + { + return new TestMetadataFacet( "", TEST_VALUE ); } @Override - public MetadataFacet createMetadataFacet(String repositoryId, String name) { - return new TestMetadataFacet("", TEST_VALUE); + public MetadataFacet createMetadataFacet( String repositoryId, String name ) + { + return new TestMetadataFacet( "", TEST_VALUE ); } - }); + } ); // for the getArtifactsByProjectVersionMetadata tests - factories.put(GenericMetadataFacet.FACET_ID, new GenericMetadataFacetFactory()); + factories.put( GenericMetadataFacet.FACET_ID, new GenericMetadataFacetFactory( ) ); return factories; } @Test - public void testRootNamespaceWithNoMetadataRepository() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - Collection namespaces = repository.getRootNamespaces(session, TEST_REPO_ID); - assertThat(namespaces).isNotNull().isEmpty(); + public void testRootNamespaceWithNoMetadataRepository( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> { + Collection namespaces = getRepository( ).getRootNamespaces( session, TEST_REPO_ID ); + assertThat( namespaces ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testGetNamespaceOnly() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isEmpty(); + public void testGetNamespaceOnly( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> { + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isEmpty( ); + } ); + getRepository( ).updateNamespace( session, TEST_REPO_ID, TEST_NAMESPACE ); - repository.updateNamespace(session, TEST_REPO_ID, TEST_NAMESPACE); + tryAssert( ( ) -> { + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isNotEmpty( ).contains( + TEST_NAMESPACE ).hasSize( 1 ); + } ); + getRepository( ).removeNamespace( session, TEST_REPO_ID, TEST_NAMESPACE ); - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isNotEmpty().contains( - TEST_NAMESPACE).hasSize(1); - - repository.removeNamespace(session, TEST_REPO_ID, TEST_NAMESPACE); - - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isEmpty(); + tryAssert( ( ) -> { + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testGetProjectOnly() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetProjectOnly( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - assertNull(repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT)); - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isEmpty(); + tryAssert( ( ) -> { + assertNull( getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ) ); + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isEmpty( ); + } ); - ProjectMetadata project = new ProjectMetadata(); - project.setId(TEST_PROJECT); - project.setNamespace(TEST_NAMESPACE); + ProjectMetadata project = new ProjectMetadata( ); + project.setId( TEST_PROJECT ); + project.setNamespace( TEST_NAMESPACE ); - repository.updateProject(session, TEST_REPO_ID, project); + getRepository( ).updateProject( session, TEST_REPO_ID, project ); - project = repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); - assertEquals(TEST_PROJECT, project.getId()); - assertEquals(TEST_NAMESPACE, project.getNamespace()); + tryAssert( ( ) -> { + ProjectMetadata proj = getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); + assertEquals( TEST_PROJECT, proj.getId( ) ); + assertEquals( TEST_NAMESPACE, proj.getNamespace( ) ); + } ); // test that namespace is also constructed - Collection namespaces = repository.getRootNamespaces( session, TEST_REPO_ID); - assertThat(namespaces).isNotNull().isNotEmpty().contains(TEST_NAMESPACE).hasSize(1); + tryAssert( ( ) -> { + Collection namespaces = getRepository( ).getRootNamespaces( session, TEST_REPO_ID ); + + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).contains( TEST_NAMESPACE ).hasSize( 1 ); + } ); } } @Test - public void testGetProjectVersionOnly() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetProjectVersionOnly( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + + tryAssert( ( ) -> { + assertNull( getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ); + assertNull( getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ) ); + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isEmpty( ); + } ); + + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); - assertNull(repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION)); - assertNull(repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT)); - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isEmpty(); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); + metadata = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( TEST_PROJECT_VERSION, metadata.getId( ) ); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + tryAssert( ( ) -> { - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(TEST_PROJECT_VERSION, metadata.getId()); + // test that namespace and project is also constructed + Collection namespaces = getRepository( ).getRootNamespaces( session, TEST_REPO_ID ); - // test that namespace and project is also constructed - Collection namespaces = repository.getRootNamespaces(session, TEST_REPO_ID); + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_NAMESPACE ); - assertThat(namespaces).isNotNull().isNotEmpty().hasSize(1).contains(TEST_NAMESPACE); + } ); - ProjectMetadata projectMetadata = repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); - assertNotNull(projectMetadata); - assertEquals(TEST_PROJECT, projectMetadata.getId()); - assertEquals(TEST_NAMESPACE, projectMetadata.getNamespace()); + tryAssert( ( ) -> { + + ProjectMetadata projectMetadata = getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); + assertNotNull( projectMetadata ); + assertEquals( TEST_PROJECT, projectMetadata.getId( ) ); + assertEquals( TEST_NAMESPACE, projectMetadata.getNamespace( ) ); + } ); } } @Test - public void testGetArtifactOnly() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetArtifactOnly( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - assertThat(new ArrayList<>( - repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION))).isNotNull().isEmpty(); - assertThat( - repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION)).isNull(); - assertThat(repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT)).isNull(); + tryAssert( ( ) -> { + assertThat( new ArrayList<>( + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ) ) ).isNotNull( ).isEmpty( ); + assertThat( + getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNull( ); + assertThat( getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ) ).isNull( ); - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isEmpty(); + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isEmpty( ); - ArtifactMetadata metadata = createArtifact(); + } ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + ArtifactMetadata metadata = createArtifact( ); - Collection artifacts = - repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - //assertEquals( Collections.singletonList( metadata ), new ArrayList( artifacts ) ); - assertThat(artifacts).containsExactly(metadata); - // test that namespace, project and project version is also constructed + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); + + tryAssert( ( ) -> { + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + //assertEquals( Collections.singletonList( metadata ), new ArrayList( artifacts ) ); + assertThat( artifacts ).containsExactly( metadata ); + // test that namespace, project and project version is also constructed - assertThat(repository.getRootNamespaces(session, TEST_REPO_ID)).isNotNull().isNotEmpty().contains( - TEST_NAMESPACE).hasSize(1); + assertThat( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ) ).isNotNull( ).isNotEmpty( ).contains( + TEST_NAMESPACE ).hasSize( 1 ); - ProjectMetadata projectMetadata = repository.getProject(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); - assertEquals(TEST_PROJECT, projectMetadata.getId()); - assertEquals(TEST_NAMESPACE, projectMetadata.getNamespace()); + ProjectMetadata projectMetadata = getRepository( ).getProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); + assertEquals( TEST_PROJECT, projectMetadata.getId( ) ); + assertEquals( TEST_NAMESPACE, projectMetadata.getNamespace( ) ); - ProjectVersionMetadata projectVersionMetadata = - repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(TEST_PROJECT_VERSION, projectVersionMetadata.getId()); + ProjectVersionMetadata projectVersionMetadata = + getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( TEST_PROJECT_VERSION, projectVersionMetadata.getId( ) ); + } ); } } @Test - public void testUpdateProjectVersionMetadataWithNoOtherArchives() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testUpdateProjectVersionMetadataWithNoOtherArchives( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - MailingList mailingList = new MailingList(); - mailingList.setName("Foo List"); - mailingList.setOtherArchives(Collections.emptyList()); - metadata.setMailingLists(Arrays.asList(mailingList)); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + MailingList mailingList = new MailingList( ); + mailingList.setName( "Foo List" ); + mailingList.setOtherArchives( Collections.emptyList( ) ); + metadata.setMailingLists( Arrays.asList( mailingList ) ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(TEST_PROJECT_VERSION, metadata.getId()); + metadata = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( TEST_PROJECT_VERSION, metadata.getId( ) ); - List mailingLists = metadata.getMailingLists(); + List mailingLists = metadata.getMailingLists( ); - assertThat(mailingLists).isNotNull().isNotEmpty().hasSize(1); + assertThat( mailingLists ).isNotNull( ).isNotEmpty( ).hasSize( 1 ); - mailingList = metadata.getMailingLists().get(0); - assertEquals("Foo List", mailingList.getName()); + mailingList = metadata.getMailingLists( ).get( 0 ); + assertEquals( "Foo List", mailingList.getName( ) ); - List others = mailingList.getOtherArchives(); - assertThat(others).isNotNull().isEmpty(); + List others = mailingList.getOtherArchives( ); + assertThat( others ).isNotNull( ).isEmpty( ); } } @Test - public void testUpdateProjectVersionMetadataWithAllElements() - throws Exception { - - try (RepositorySession session = sessionFactory.createSession()) { - - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); + public void testUpdateProjectVersionMetadataWithAllElements( ) + throws Exception + { - metadata.setName("project name"); - metadata.setDescription("project description"); - metadata.setUrl("the url"); + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - MailingList mailingList = new MailingList(); - mailingList.setName("Foo List"); - mailingList.setUnsubscribeAddress("UnsubscribeAddress"); - mailingList.setSubscribeAddress("SubscribeAddress"); - mailingList.setPostAddress("PostAddress"); - mailingList.setMainArchiveUrl("MainArchiveUrl"); - mailingList.setOtherArchives(Arrays.asList("other archive")); - metadata.setMailingLists(Arrays.asList(mailingList)); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); - Scm scm = new Scm(); - scm.setConnection("connection"); - scm.setDeveloperConnection("dev conn"); - scm.setUrl("url"); - metadata.setScm(scm); - - CiManagement ci = new CiManagement(); - ci.setSystem("system"); - ci.setUrl("ci url"); - metadata.setCiManagement(ci); - - IssueManagement tracker = new IssueManagement(); - tracker.setSystem("system"); - tracker.setUrl("issue tracker url"); - metadata.setIssueManagement(tracker); + metadata.setName( "project name" ); + metadata.setDescription( "project description" ); + metadata.setUrl( "the url" ); - metadata.setOrganization(TEST_ORGANIZATION); + MailingList mailingList = new MailingList( ); + mailingList.setName( "Foo List" ); + mailingList.setUnsubscribeAddress( "UnsubscribeAddress" ); + mailingList.setSubscribeAddress( "SubscribeAddress" ); + mailingList.setPostAddress( "PostAddress" ); + mailingList.setMainArchiveUrl( "MainArchiveUrl" ); + mailingList.setOtherArchives( Arrays.asList( "other archive" ) ); + metadata.setMailingLists( Arrays.asList( mailingList ) ); - License l = new License(); - l.setName("license name"); - l.setUrl("license url"); - metadata.addLicense(l); + Scm scm = new Scm( ); + scm.setConnection( "connection" ); + scm.setDeveloperConnection( "dev conn" ); + scm.setUrl( "url" ); + metadata.setScm( scm ); + + CiManagement ci = new CiManagement( ); + ci.setSystem( "system" ); + ci.setUrl( "ci url" ); + metadata.setCiManagement( ci ); + + IssueManagement tracker = new IssueManagement( ); + tracker.setSystem( "system" ); + tracker.setUrl( "issue tracker url" ); + metadata.setIssueManagement( tracker ); + + metadata.setOrganization( TEST_ORGANIZATION ); - Dependency d = new Dependency(); - d.setArtifactId("artifactId"); - d.setClassifier("classifier"); - d.setGroupId("groupId"); - d.setScope("scope"); - d.setSystemPath("system path"); - d.setType("type"); - d.setVersion("version"); - d.setOptional(true); - metadata.addDependency(d); + License l = new License( ); + l.setName( "license name" ); + l.setUrl( "license url" ); + metadata.addLicense( l ); + + Dependency d = new Dependency( ); + d.setArtifactId( "artifactId" ); + d.setClassifier( "classifier" ); + d.setGroupId( "groupId" ); + d.setScope( "scope" ); + d.setSystemPath( "system path" ); + d.setType( "type" ); + d.setVersion( "version" ); + d.setOptional( true ); + metadata.addDependency( d ); + + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); + + metadata = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( TEST_PROJECT_VERSION, metadata.getId( ) ); + assertEquals( TEST_PROJECT_VERSION, metadata.getVersion( ) ); + assertEquals( "project name", metadata.getName( ) ); + assertEquals( "project description", metadata.getDescription( ) ); + assertEquals( "the url", metadata.getUrl( ) ); + + assertEquals( "connection", metadata.getScm( ).getConnection( ) ); + assertEquals( "dev conn", metadata.getScm( ).getDeveloperConnection( ) ); + assertEquals( "url", metadata.getScm( ).getUrl( ) ); + + assertEquals( "system", metadata.getCiManagement( ).getSystem( ) ); + assertEquals( "ci url", metadata.getCiManagement( ).getUrl( ) ); + + assertEquals( "system", metadata.getIssueManagement( ).getSystem( ) ); + assertEquals( "issue tracker url", metadata.getIssueManagement( ).getUrl( ) ); + + assertEquals( TEST_ORGANIZATION.getName( ), metadata.getOrganization( ).getName( ) ); + assertEquals( TEST_ORGANIZATION.getUrl( ), metadata.getOrganization( ).getUrl( ) ); + + assertEquals( 1, metadata.getMailingLists( ).size( ) ); + MailingList retrievedMailingList = metadata.getMailingLists( ).get( 0 ); + assertEquals( mailingList.getName( ), retrievedMailingList.getName( ) ); + assertEquals( mailingList.getMainArchiveUrl( ), retrievedMailingList.getMainArchiveUrl( ) ); + assertEquals( mailingList.getPostAddress( ), retrievedMailingList.getPostAddress( ) ); + assertEquals( mailingList.getSubscribeAddress( ), retrievedMailingList.getSubscribeAddress( ) ); + assertEquals( mailingList.getUnsubscribeAddress( ), retrievedMailingList.getUnsubscribeAddress( ) ); + assertThat( retrievedMailingList.getOtherArchives( ) ) // + .isNotNull( ) // + .isNotEmpty( ) // + .hasSize( 1 ) // + .contains( "other archive" ); + + assertEquals( 1, metadata.getLicenses( ).size( ) ); + l = metadata.getLicenses( ).get( 0 ); + assertEquals( "license name", l.getName( ) ); + assertEquals( "license url", l.getUrl( ) ); + + assertEquals( 1, metadata.getDependencies( ).size( ) ); + d = metadata.getDependencies( ).get( 0 ); + assertEquals( "artifactId", d.getArtifactId( ) ); + assertEquals( "classifier", d.getClassifier( ) ); + assertEquals( "groupId", d.getGroupId( ) ); + assertEquals( "scope", d.getScope( ) ); + assertEquals( "system path", d.getSystemPath( ) ); + assertEquals( "type", d.getType( ) ); + assertEquals( "version", d.getVersion( ) ); + assertTrue( d.isOptional( ) ); + } + } + + @Test + public void testUpdateProjectVersionMetadataIncomplete( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + metadata.setIncomplete( true ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); - - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(TEST_PROJECT_VERSION, metadata.getId()); - assertEquals(TEST_PROJECT_VERSION, metadata.getVersion()); - assertEquals("project name", metadata.getName()); - assertEquals("project description", metadata.getDescription()); - assertEquals("the url", metadata.getUrl()); + tryAssert( ( ) -> { + ProjectVersionMetadata metadata1 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( true, metadata1.isIncomplete( ) ); + assertNull( metadata1.getCiManagement( ) ); + assertNull( metadata1.getScm( ) ); + assertNull( metadata1.getIssueManagement( ) ); + assertNull( metadata1.getOrganization( ) ); + assertEquals( "", metadata1.getDescription( ) ); + assertEquals( "", metadata1.getName( ) ); + assertEquals( TEST_PROJECT_VERSION, metadata1.getId( ) ); + assertEquals( TEST_PROJECT_VERSION, metadata1.getVersion( ) ); + assertTrue( metadata1.getMailingLists( ).isEmpty( ) ); + assertTrue( metadata1.getLicenses( ).isEmpty( ) ); + assertTrue( metadata1.getDependencies( ).isEmpty( ) ); + } ); + } + } - assertEquals("connection", metadata.getScm().getConnection()); - assertEquals("dev conn", metadata.getScm().getDeveloperConnection()); - assertEquals("url", metadata.getScm().getUrl()); + @Test + public void testUpdateProjectVersionMetadataWithExistingFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - assertEquals("system", metadata.getCiManagement().getSystem()); - assertEquals("ci url", metadata.getCiManagement().getUrl()); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + MetadataFacet facet = new TestMetadataFacet( "baz" ); + metadata.addFacet( facet ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - assertEquals("system", metadata.getIssueManagement().getSystem()); - assertEquals("issue tracker url", metadata.getIssueManagement().getUrl()); + tryAssert( ( ) -> { - assertEquals(TEST_ORGANIZATION.getName(), metadata.getOrganization().getName()); - assertEquals(TEST_ORGANIZATION.getUrl(), metadata.getOrganization().getUrl()); + ProjectVersionMetadata metadata1 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( Collections.singleton( TEST_FACET_ID ), metadata1.getFacetIds( ) ); + } ); - assertEquals(1, metadata.getMailingLists().size()); - MailingList retrievedMailingList = metadata.getMailingLists().get(0); - assertEquals(mailingList.getName(), retrievedMailingList.getName()); - assertEquals(mailingList.getMainArchiveUrl(), retrievedMailingList.getMainArchiveUrl()); - assertEquals(mailingList.getPostAddress(), retrievedMailingList.getPostAddress()); - assertEquals(mailingList.getSubscribeAddress(), retrievedMailingList.getSubscribeAddress()); - assertEquals(mailingList.getUnsubscribeAddress(), retrievedMailingList.getUnsubscribeAddress()); - assertThat(retrievedMailingList.getOtherArchives()) // - .isNotNull() // - .isNotEmpty() // - .hasSize(1) // - .contains("other archive"); + metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - assertEquals(1, metadata.getLicenses().size()); - l = metadata.getLicenses().get(0); - assertEquals("license name", l.getName()); - assertEquals("license url", l.getUrl()); + tryAssert( ( ) -> { - assertEquals(1, metadata.getDependencies().size()); - d = metadata.getDependencies().get(0); - assertEquals("artifactId", d.getArtifactId()); - assertEquals("classifier", d.getClassifier()); - assertEquals("groupId", d.getGroupId()); - assertEquals("scope", d.getScope()); - assertEquals("system path", d.getSystemPath()); - assertEquals("type", d.getType()); - assertEquals("version", d.getVersion()); - assertTrue(d.isOptional()); + ProjectVersionMetadata metadata2 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( Collections.singleton( TEST_FACET_ID ), metadata2.getFacetIds( ) ); + TestMetadataFacet testFacet = (TestMetadataFacet) metadata2.getFacet( TEST_FACET_ID ); + assertEquals( "baz", testFacet.getValue( ) ); + } ); } } @Test - public void testUpdateProjectVersionMetadataIncomplete() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testUpdateProjectVersionMetadataWithNoExistingFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - metadata.setIncomplete(true); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(true, metadata.isIncomplete()); - assertNull(metadata.getCiManagement()); - assertNull(metadata.getScm()); - assertNull(metadata.getIssueManagement()); - assertNull(metadata.getOrganization()); - assertNull(metadata.getDescription()); - assertNull(metadata.getName()); - assertEquals(TEST_PROJECT_VERSION, metadata.getId()); - assertEquals(TEST_PROJECT_VERSION, metadata.getVersion()); - assertTrue(metadata.getMailingLists().isEmpty()); - assertTrue(metadata.getLicenses().isEmpty()); - assertTrue(metadata.getDependencies().isEmpty()); - } - } - - @Test - public void testUpdateProjectVersionMetadataWithExistingFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - MetadataFacet facet = new TestMetadataFacet("baz"); - metadata.addFacet(facet); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + tryAssert( ( ) -> { + ProjectVersionMetadata metadata1 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(Collections.singleton(TEST_FACET_ID), metadata.getFacetIds()); + assertThat( metadata1.getFacetIds( ) ).isNotNull( ).isEmpty( ); + } ); - metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + ProjectVersionMetadata metadata1 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(Collections.singleton(TEST_FACET_ID), metadata.getFacetIds()); - TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); - assertEquals("baz", testFacet.getValue()); + tryAssert( ( ) -> { + ProjectVersionMetadata metadata2 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertThat( metadata2.getFacetIds( ) ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testUpdateProjectVersionMetadataWithNoExistingFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testUpdateProjectVersionMetadataWithExistingFacetsFacetPropertyWasRemoved( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + Map additionalProps = new HashMap<>( ); + additionalProps.put( "deleteKey", "deleteValue" ); - assertThat(metadata.getFacetIds()).isNotNull().isEmpty(); + MetadataFacet facet = new TestMetadataFacet( TEST_FACET_ID, "baz", additionalProps ); + metadata.addFacet( facet ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertThat(metadata.getFacetIds()).isNotNull().isEmpty(); - } - } - - @Test - public void testUpdateProjectVersionMetadataWithExistingFacetsFacetPropertyWasRemoved() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + tryAssert( ( ) -> { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); + ProjectVersionMetadata metad = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - Map additionalProps = new HashMap<>(); - additionalProps.put("deleteKey", "deleteValue"); + assertThat( metad.getFacetIds( ) ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_FACET_ID ); - MetadataFacet facet = new TestMetadataFacet(TEST_FACET_ID, "baz", additionalProps); - metadata.addFacet(facet); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + } ); - assertThat(metadata.getFacetIds()).isNotNull().isNotEmpty().hasSize(1).contains(TEST_FACET_ID); + ProjectVersionMetadata metad = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + TestMetadataFacet testFacet = (TestMetadataFacet) metad.getFacet( TEST_FACET_ID ); + Map facetProperties = testFacet.toProperties( ); - TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); - Map facetProperties = testFacet.toProperties(); + assertEquals( "deleteValue", facetProperties.get( "deleteKey" ) ); - assertEquals("deleteValue", facetProperties.get("deleteKey")); + facetProperties.remove( "deleteKey" ); - facetProperties.remove("deleteKey"); + TestMetadataFacet newTestFacet = new TestMetadataFacet( TEST_FACET_ID, testFacet.getValue( ), facetProperties ); + metadata.addFacet( newTestFacet ); - TestMetadataFacet newTestFacet = new TestMetadataFacet(TEST_FACET_ID, testFacet.getValue(), facetProperties); - metadata.addFacet(newTestFacet); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + ProjectVersionMetadata metad2 = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - assertThat(metadata.getFacetIds()).isNotNull().isNotEmpty().hasSize(1).contains(TEST_FACET_ID); - testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); - assertFalse(testFacet.toProperties().containsKey("deleteKey")); + assertThat( metad2.getFacetIds( ) ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_FACET_ID ); + TestMetadataFacet testFacet2 = (TestMetadataFacet) metad2.getFacet( TEST_FACET_ID ); + assertFalse( testFacet2.toProperties( ).containsKey( "deleteKey" ) ); + } ); } } @Test - public void testGetArtifactsDoesntReturnProjectVersionMetadataFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetArtifactsDoesntReturnProjectVersionMetadataFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata(); - versionMetadata.setId(TEST_PROJECT_VERSION); + ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata( ); + versionMetadata.setId( TEST_PROJECT_VERSION ); - MetadataFacet facet = new TestMetadataFacet(TEST_FACET_ID, "baz"); - versionMetadata.addFacet(facet); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, versionMetadata); + MetadataFacet facet = new TestMetadataFacet( TEST_FACET_ID, "baz" ); + versionMetadata.addFacet( facet ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, versionMetadata ); + ArtifactMetadata artifactMetadata = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifactMetadata ); + session.save( ); - ArtifactMetadata artifactMetadata = createArtifact(); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifactMetadata); - session.save(); + tryAssert( ( ) -> { - Collection artifacts = - repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - assertEquals(Collections.singletonList(artifactMetadata), new ArrayList<>(artifacts)); - artifacts = repository.getArtifacts(session, TEST_REPO_ID); - assertEquals(Collections.singletonList(artifactMetadata), new ArrayList<>(artifacts)); + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + assertEquals( Collections.singletonList( artifactMetadata ), new ArrayList<>( artifacts ) ); + + artifacts = getRepository( ).getArtifacts( session, TEST_REPO_ID ); + assertEquals( Collections.singletonList( artifactMetadata ), new ArrayList<>( artifacts ) ); - artifacts = repository.getArtifactsByChecksum(session, TEST_REPO_ID, TEST_SHA1); - assertEquals(Collections.singletonList(artifactMetadata), new ArrayList<>(artifacts)); + artifacts = getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ); + assertEquals( Collections.singletonList( artifactMetadata ), new ArrayList<>( artifacts ) ); - artifacts = repository.getArtifactsByChecksum(session, TEST_REPO_ID, TEST_MD5); - assertEquals(Collections.singletonList(artifactMetadata), new ArrayList<>(artifacts)); + artifacts = getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ); + assertEquals( Collections.singletonList( artifactMetadata ), new ArrayList<>( artifacts ) ); - artifacts = repository.getArtifactsByDateRange(session, TEST_REPO_ID, null, null); - assertEquals(Collections.singletonList(artifactMetadata), new ArrayList<>(artifacts)); + artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, null ); + assertEquals( Collections.singletonList( artifactMetadata ), new ArrayList<>( artifacts ) ); + } ); } } @Test - public void testUpdateArtifactMetadataWithExistingFacetsFacetPropertyWasRemoved() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testUpdateArtifactMetadataWithExistingFacetsFacetPropertyWasRemoved( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ArtifactMetadata metadata = createArtifact(); + ArtifactMetadata metadata = createArtifact( ); - Map additionalProps = new HashMap<>(); - additionalProps.put("deleteKey", "deleteValue"); + Map additionalProps = new HashMap<>( ); + additionalProps.put( "deleteKey", "deleteValue" ); - MetadataFacet facet = new TestMetadataFacet(TEST_FACET_ID, "baz", additionalProps); - metadata.addFacet(facet); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + MetadataFacet facet = new TestMetadataFacet( TEST_FACET_ID, "baz", additionalProps ); + metadata.addFacet( facet ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); - Collection artifacts = - repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + + assertThat( artifacts ).isNotNull( ).isNotEmpty( ).hasSize( 1 ); + } ); - assertThat(artifacts).isNotNull().isNotEmpty().hasSize(1); - metadata = artifacts.iterator().next(); + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + metadata = artifacts.iterator( ).next( ); - Collection ids = metadata.getFacetIds(); - assertThat(ids).isNotNull().isNotEmpty().hasSize(1).contains(TEST_FACET_ID); + Collection ids = metadata.getFacetIds( ); + assertThat( ids ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_FACET_ID ); - TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); - Map facetProperties = testFacet.toProperties(); + TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet( TEST_FACET_ID ); + Map facetProperties = testFacet.toProperties( ); - assertEquals("deleteValue", facetProperties.get("deleteKey")); + assertEquals( "deleteValue", facetProperties.get( "deleteKey" ) ); - facetProperties.remove("deleteKey"); + facetProperties.remove( "deleteKey" ); - TestMetadataFacet newTestFacet = new TestMetadataFacet(TEST_FACET_ID, testFacet.getValue(), facetProperties); - metadata.addFacet(newTestFacet); + TestMetadataFacet newTestFacet = new TestMetadataFacet( TEST_FACET_ID, testFacet.getValue( ), facetProperties ); + metadata.addFacet( newTestFacet ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); + session.save( ); - artifacts = repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + Collection artifacts1 = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - assertThat(artifacts).isNotNull().isNotEmpty().hasSize(1); - metadata = artifacts.iterator().next(); + assertThat( artifacts1 ).isNotNull( ).isNotEmpty( ).hasSize( 1 ); + } ); + Collection artifacts1 = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + metadata = artifacts.iterator( ).next( ); - ids = metadata.getFacetIds(); - assertThat(ids).isNotNull().isNotEmpty().hasSize(1).contains(TEST_FACET_ID); + ids = metadata.getFacetIds( ); + assertThat( ids ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_FACET_ID ); - testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); + testFacet = (TestMetadataFacet) metadata.getFacet( TEST_FACET_ID ); - Map props = testFacet.toProperties(); - assertThat(props).isNotNull().doesNotContainKey("deleteKey"); + Map props = testFacet.toProperties( ); + assertThat( props ).isNotNull( ).doesNotContainKey( "deleteKey" ); } } @Test - public void testUpdateArtifactMetadataWithExistingFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testUpdateArtifactMetadataWithExistingFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ArtifactMetadata metadata = createArtifact(); - MetadataFacet facet = new TestMetadataFacet("baz"); - metadata.addFacet(facet); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + ArtifactMetadata metadata = createArtifact( ); + MetadataFacet facet = new TestMetadataFacet( "baz" ); + metadata.addFacet( facet ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); - metadata = repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION).iterator().next(); - assertEquals(Collections.singleton(TEST_FACET_ID), metadata.getFacetIds()); + metadata = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ).iterator( ).next( ); + assertEquals( Collections.singleton( TEST_FACET_ID ), metadata.getFacetIds( ) ); - metadata = createArtifact(); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + metadata = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); - metadata = repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION).iterator().next(); - assertEquals(Collections.singleton(TEST_FACET_ID), metadata.getFacetIds()); - TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet(TEST_FACET_ID); - assertEquals("baz", testFacet.getValue()); + metadata = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ).iterator( ).next( ); + assertEquals( Collections.singleton( TEST_FACET_ID ), metadata.getFacetIds( ) ); + TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet( TEST_FACET_ID ); + assertEquals( "baz", testFacet.getValue( ) ); } } @Test - public void testUpdateArtifactMetadataWithNoExistingFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata metadata = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + public void testUpdateArtifactMetadataWithNoExistingFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata metadata = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); + + tryAssert( ( ) -> { + + ArtifactMetadata metadata2 = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ).iterator( ).next( ); + assertEquals( Collections.emptyList( ), new ArrayList( metadata2.getFacetIds( ) ) ); - metadata = repository.getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION).iterator().next(); - assertEquals(Collections.emptyList(), new ArrayList(metadata.getFacetIds())); + } ); - metadata = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata); + metadata = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ).iterator( ).next( ); + metadata = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, metadata ); - metadata = repository.getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION).iterator().next(); - assertEquals(Collections.emptyList(), new ArrayList(metadata.getFacetIds())); + tryAssert( ( ) -> { + ArtifactMetadata metadata3 = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ).iterator( ).next( ); + assertEquals( Collections.emptyList( ), new ArrayList( metadata3.getFacetIds( ) ) ); + } ); } } @Test - public void testGetMetadataFacet() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet(TEST_VALUE)); + public void testGetMetadataFacet( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet( TEST_VALUE ) ); TestMetadataFacet test = - (TestMetadataFacet) repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME); + (TestMetadataFacet) getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ); - assertEquals(new TestMetadataFacet(TEST_VALUE), test); + assertEquals( new TestMetadataFacet( TEST_VALUE ), test ); } } @Test - public void testGetMetadataFacetWhenEmpty() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - assertNull(repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME)); - + public void testGetMetadataFacetWhenEmpty( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> assertNull( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ) ) ); } } @Test - public void testGetMetadataFacetWhenUnknownName() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet(TEST_VALUE)); - - assertNull(repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, UNKNOWN)); + public void testGetMetadataFacetWhenUnknownName( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet( TEST_VALUE ) ); + tryAssert( ( ) -> assertNull( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, UNKNOWN ) ) ); } } @Test - public void testGetMetadataFacetWhenDefaultValue() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet(null)); + public void testGetMetadataFacetWhenDefaultValue( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet( null ) ); - MetadataFacet metadataFacet = repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME); + tryAssert( ( ) -> { + MetadataFacet metadataFacet = getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ); - assertEquals(new TestMetadataFacet(TEST_METADATA_VALUE), metadataFacet); + assertEquals( new TestMetadataFacet( TEST_METADATA_VALUE ), metadataFacet ); + } ); } } @Test - public void testGetMetadataFacetWhenUnknownFacetId() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - assertNull(repository.getMetadataFacet( session, TEST_REPO_ID, UNKNOWN, TEST_NAME)); + public void testGetMetadataFacetWhenUnknownFacetId( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + assertNull( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, UNKNOWN, TEST_NAME ) ); } } @Test - public void testGetMetadataFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet(TEST_VALUE)); + public void testGetMetadataFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet( TEST_VALUE ) ); - assertEquals(Collections.singletonList(TEST_NAME), - repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID)); + assertEquals( Collections.singletonList( TEST_NAME ), + getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ) ); } } @Test - public void testGetMetadataFacetsWhenEmpty() - throws Exception { + public void testGetMetadataFacetsWhenEmpty( ) + throws Exception + { - try (RepositorySession session = sessionFactory.createSession()) { - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertTrue(facets.isEmpty()); + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> { + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertTrue( facets.isEmpty( ) ); + } ); } } @Test - public void testRemoveFacets() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet(TEST_VALUE)); + public void testRemoveFacets( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new TestMetadataFacet( TEST_VALUE ) ); - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertFalse(facets.isEmpty()); + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertFalse( facets.isEmpty( ) ); - repository.removeMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); + getRepository( ).removeMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); - facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertTrue(facets.isEmpty()); + facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertTrue( facets.isEmpty( ) ); } } @Test - public void testRemoveFacetsWhenEmpty() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertTrue(facets.isEmpty()); - - repository.removeMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); + public void testRemoveFacetsWhenEmpty( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertTrue( facets.isEmpty( ) ); - facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertTrue(facets.isEmpty()); + getRepository( ).removeMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + tryAssert( ( ) -> { + List facets1 = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertTrue( facets1.isEmpty( ) ); + } ); } } @Test - public void testRemoveFacetsWhenUnknown() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testRemoveFacetsWhenUnknown( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { // testing no exception - repository.removeMetadataFacets( session, TEST_REPO_ID, UNKNOWN); + getRepository( ).removeMetadataFacets( session, TEST_REPO_ID, UNKNOWN ); } } @Test - public void testRemoveFacetWhenUnknown() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testRemoveFacetWhenUnknown( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { // testing no exception - repository.removeMetadataFacet( session, TEST_REPO_ID, UNKNOWN, TEST_NAME); + getRepository( ).removeMetadataFacet( session, TEST_REPO_ID, UNKNOWN, TEST_NAME ); } } @Test - public void testRemoveFacet() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - TestMetadataFacet metadataFacet = new TestMetadataFacet(TEST_VALUE); - repository.addMetadataFacet( session, TEST_REPO_ID, metadataFacet); + public void testRemoveFacet( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + TestMetadataFacet metadataFacet = new TestMetadataFacet( TEST_VALUE ); + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, metadataFacet ); - assertEquals(metadataFacet, repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME)); - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertFalse(facets.isEmpty()); + assertEquals( metadataFacet, getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ) ); + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertFalse( facets.isEmpty( ) ); - repository.removeMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME); + getRepository( ).removeMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ); - assertNull(repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME)); - facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertTrue(facets.isEmpty()); + assertNull( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ) ); + facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertTrue( facets.isEmpty( ) ); } } @Test - public void testRemoveFacetWhenEmpty() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertThat(facets).isNotNull().isEmpty(); - assertThat(repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME)).isNull(); + public void testRemoveFacetWhenEmpty( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> { + + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertThat( facets ).isNotNull( ).isEmpty( ); + assertThat( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ) ).isNull( ); + + } ); + getRepository( ).removeMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ); - repository.removeMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME); + tryAssert( ( ) -> { - facets = repository.getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID); - assertThat(facets).isNotNull().isEmpty(); - assertThat(repository.getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME)).isNull(); + List facets2 = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, TEST_FACET_ID ); + assertThat( facets2 ).isNotNull( ).isEmpty( ); + assertThat( getRepository( ).getMetadataFacet( session, TEST_REPO_ID, TEST_FACET_ID, TEST_NAME ) ).isNull( ); + } ); } } @Test - public void hasMetadataFacetStart() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - assertFalse(repository.hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName())); + public void hasMetadataFacetStart( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + assertFalse( getRepository( ).hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ) ); } } @Test - public void hasMetadataFacet() - throws Exception { + public void hasMetadataFacet( ) + throws Exception + { - try (RepositorySession session = sessionFactory.createSession()) { - assertFalse(repository.hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName())); + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + assertFalse( getRepository( ).hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ) ); - Calendar cal = Calendar.getInstance(); + Calendar cal = Calendar.getInstance( ); - repository.addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics("first", cal.getTime())); + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics( "first", cal.getTime( ) ) ); - assertTrue(repository.hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName())); + assertTrue( getRepository( ).hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ) ); - cal.add(Calendar.MINUTE, 2); + cal.add( Calendar.MINUTE, 2 ); - repository.addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics("second", cal.getTime())); + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics( "second", cal.getTime( ) ) ); - cal.add(Calendar.MINUTE, 2); + cal.add( Calendar.MINUTE, 2 ); - repository.addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics("third", cal.getTime())); + getRepository( ).addMetadataFacet( session, TEST_REPO_ID, new KindOfRepositoryStatistics( "third", cal.getTime( ) ) ); - List facets = repository.getMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName()); + List facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ); - assertThat(facets).isNotNull().isNotEmpty().hasSize(3); + assertThat( facets ).isNotNull( ).isNotEmpty( ).hasSize( 3 ); - assertTrue(repository.hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName())); + assertTrue( getRepository( ).hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ) ); - repository.removeMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName()); + getRepository( ).removeMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ); - assertFalse(repository.hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName())); + assertFalse( getRepository( ).hasMetadataFacet( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ) ); - facets = repository.getMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName()); + facets = getRepository( ).getMetadataFacets( session, TEST_REPO_ID, KindOfRepositoryStatistics.class.getName( ) ); - assertThat(facets).isNotNull().isEmpty(); + assertThat( facets ).isNotNull( ).isEmpty( ); } @@ -866,1088 +1035,1293 @@ public abstract class AbstractMetadataRepositoryTest @Test - public void testGetArtifacts() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact1 = createArtifact(); - ArtifactMetadata artifact2 = createArtifact("pom"); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2); + public void testGetArtifacts( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact1 = createArtifact( ); + ArtifactMetadata artifact2 = createArtifact( "pom" ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1 ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2 ); - Collection artifacts = - repository.getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - ArrayList actual = new ArrayList<>(artifacts); - Collections.sort(actual, (o1, o2) -> o1.getId().compareTo(o2.getId())); - assertEquals(Arrays.asList(artifact1, artifact2), actual); + tryAssert( ( ) -> { + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + ArrayList actual = new ArrayList<>( artifacts ); + Collections.sort( actual, ( o1, o2 ) -> o1.getId( ).compareTo( o2.getId( ) ) ); + assertEquals( Arrays.asList( artifact1, artifact2 ), actual ); + } ); } } @Test - public void testGetArtifactVersions() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact1 = createArtifact(); + public void testGetArtifactVersions( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact1 = createArtifact( ); String version1 = "1.0-20091212.012345-1"; - artifact1.setId(artifact1.getProject() + "-" + version1 + ".jar"); - artifact1.setVersion(version1); - ArtifactMetadata artifact2 = createArtifact(); + artifact1.setId( artifact1.getProject( ) + "-" + version1 + ".jar" ); + artifact1.setVersion( version1 ); + ArtifactMetadata artifact2 = createArtifact( ); String version2 = "1.0-20091212.123456-2"; - artifact2.setId(artifact2.getProject() + "-" + version2 + ".jar"); - artifact2.setVersion(version2); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2); + artifact2.setId( artifact2.getProject( ) + "-" + version2 + ".jar" ); + artifact2.setVersion( version2 ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1 ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2 ); - Collection versions = - repository.getArtifactVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + Collection versions = + getRepository( ).getArtifactVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - assertThat(versions).isNotNull().isNotEmpty().contains(version1, version2); + assertThat( versions ).isNotNull( ).isNotEmpty( ).contains( version1, version2 ); + } ); } } @Test - public void testGetArtifactVersionsMultipleArtifactsSingleVersion() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact1 = createArtifact(); - artifact1.setId(TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar"); - ArtifactMetadata artifact2 = createArtifact(); - artifact2.setId(TEST_PROJECT + "-" + TEST_PROJECT_VERSION + "-sources.jar"); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2); + public void testGetArtifactVersionsMultipleArtifactsSingleVersion( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact1 = createArtifact( ); + artifact1.setId( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" ); + ArtifactMetadata artifact2 = createArtifact( ); + artifact2.setId( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + "-sources.jar" ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1 ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact2 ); - Collection versions = - repository.getArtifactVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + Collection versions = + getRepository( ).getArtifactVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - assertThat(versions).isNotNull().isNotEmpty().hasSize(1).containsExactly(TEST_PROJECT_VERSION); + assertThat( versions ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).containsExactly( TEST_PROJECT_VERSION ); + } ); } } @Test - public void testGetArtifactsByDateRangeOpen() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + public void testGetArtifactsByDateRangeOpen( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, null, null); - - assertEquals(Collections.singletonList(artifact), artifacts); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, null ); + assertEquals( Collections.singletonList( artifact ), artifacts ); + } ); } } @Test - public void testGetArtifactsByDateRangeSparseNamespace() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetArtifactsByDateRangeSparseNamespace( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { String namespace = "org.apache.archiva"; - ArtifactMetadata artifact = createArtifact(); - artifact.setNamespace(namespace); - repository.updateArtifact( session, TEST_REPO_ID, namespace, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); - - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, null, null); + ArtifactMetadata artifact = createArtifact( ); + artifact.setNamespace( namespace ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, namespace, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - tryAssert(() -> assertEquals(Collections.singletonList(artifact), artifacts)); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, null ); + tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), artifacts ) ); + } ); } } @Test - public void testGetArtifactsByDateRangeLowerBound() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + public void testGetArtifactsByDateRangeLowerBound( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - Date date = new Date(artifact.getWhenGathered().getTime() - 10000); + Date date = new Date( artifact.getWhenGathered( ).getTime( ) - 10000 ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, date, null); - - assertEquals(Collections.singletonList(artifact), artifacts); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, date, null ); + assertEquals( Collections.singletonList( artifact ), artifacts ); + } ); } } @Test - public void testGetArtifactsByDateRangeLowerBoundOutOfRange() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - - Date date = new Date(artifact.getWhenGathered().getTime() + 10000); + public void testGetArtifactsByDateRangeLowerBoundOutOfRange( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, date, null); + Date date = new Date( artifact.getWhenGathered( ).getTime( ) + 10000 ); - assertThat(artifacts).isNotNull().isEmpty(); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, date, null ); + assertThat( artifacts ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testGetArtifactsByDateRangeLowerAndUpperBound() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); - - Date lower = new Date(artifact.getWhenGathered().getTime() - 10000); - Date upper = new Date(artifact.getWhenGathered().getTime() + 10000); + public void testGetArtifactsByDateRangeLowerAndUpperBound( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, lower, upper); + Date lower = new Date( artifact.getWhenGathered( ).getTime( ) - 10000 ); + Date upper = new Date( artifact.getWhenGathered( ).getTime( ) + 10000 ); - assertEquals(Collections.singletonList(artifact), artifacts); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, lower, upper ); + assertEquals( Collections.singletonList( artifact ), artifacts ); + } ); } } @Test - public void testGetArtifactsByDateRangeUpperBound() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + public void testGetArtifactsByDateRangeUpperBound( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - Date upper = new Date(artifact.getWhenGathered().getTime() + 10000); + Date upper = new Date( artifact.getWhenGathered( ).getTime( ) + 10000 ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, null, upper); - - assertEquals(Collections.singletonList(artifact), artifacts); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, upper ); + assertEquals( Collections.singletonList( artifact ), artifacts ); + } ); } } @Test - public void testGetArtifactsByDateRangeUpperBoundOutOfRange() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); - - Date upper = new Date(artifact.getWhenGathered().getTime() - 10000); + public void testGetArtifactsByDateRangeUpperBoundOutOfRange( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - List artifacts = repository.getArtifactsByDateRange( session, TEST_REPO_ID, null, upper); + Date upper = new Date( artifact.getWhenGathered( ).getTime( ) - 10000 ); - assertThat(artifacts).isNotNull().isEmpty(); + tryAssert( ( ) -> { + List artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, upper ); + assertThat( artifacts ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testGetArtifactsByRepoId() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); - - tryAssert(() -> { - List artifacts = repository.getArtifacts(session, TEST_REPO_ID); - assertEquals(Collections.singletonList(artifact), artifacts); - } + public void testGetArtifactsByRepoId( ) + throws Exception + { + ArtifactMetadata artifact; + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); + } + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + tryAssert( ( ) -> { + session.refreshAndDiscard( ); + List artifacts = getRepository( ).getArtifacts( session, TEST_REPO_ID ); + assertEquals( Collections.singletonList( artifact ), artifacts ); + } ); } } @Test - public void testGetArtifactsByRepoIdMultipleCopies() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + public void testGetArtifactsByRepoIdMultipleCopies( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - ArtifactMetadata secondArtifact = createArtifact(); - secondArtifact.setRepositoryId(OTHER_REPO_ID); - repository.updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact); - session.save(); + ArtifactMetadata secondArtifact = createArtifact( ); + secondArtifact.setRepositoryId( OTHER_REPO_ID ); + getRepository( ).updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact ); + session.save( ); // test it restricts to the appropriate repository - tryAssert(() -> assertEquals(Collections.singletonList(artifact), repository.getArtifacts( session, TEST_REPO_ID))); - tryAssert(() -> assertEquals(Collections.singletonList(secondArtifact), repository.getArtifacts( session, OTHER_REPO_ID))); + tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), getRepository( ).getArtifacts( session, TEST_REPO_ID ) ) ); + tryAssert( ( ) -> assertEquals( Collections.singletonList( secondArtifact ), getRepository( ).getArtifacts( session, OTHER_REPO_ID ) ) ); } } @Test - public void testGetArtifactsByDateRangeMultipleCopies() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + public void testGetArtifactsByDateRangeMultipleCopies( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - ArtifactMetadata secondArtifact = createArtifact(); - secondArtifact.setRepositoryId(OTHER_REPO_ID); - repository.updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact); - session.save(); - - // test it restricts to the appropriate repository - assertEquals(Collections.singletonList(artifact), - repository.getArtifactsByDateRange( session, TEST_REPO_ID, null, null)); - assertEquals(Collections.singletonList(secondArtifact), - repository.getArtifactsByDateRange( session, OTHER_REPO_ID, null, null)); + ArtifactMetadata secondArtifact = createArtifact( ); + secondArtifact.setRepositoryId( OTHER_REPO_ID ); + getRepository( ).updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact ); + session.save( ); + tryAssert( ( ) -> { + // test it restricts to the appropriate repository + assertEquals( Collections.singletonList( artifact ), + getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, null ) ); + } ); + tryAssert( ( ) -> { + assertEquals( Collections.singletonList( secondArtifact ), + getRepository( ).getArtifactsByDateRange( session, OTHER_REPO_ID, null, null ) ); + } ); } } @Test - public void testGetArtifactsByChecksumMultipleCopies() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + public void testGetArtifactsByChecksumMultipleCopies( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - ArtifactMetadata secondArtifact = createArtifact(); - secondArtifact.setRepositoryId(OTHER_REPO_ID); - repository.updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact); - session.save(); + ArtifactMetadata secondArtifact = createArtifact( ); + secondArtifact.setRepositoryId( OTHER_REPO_ID ); + getRepository( ).updateArtifact( session, OTHER_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, secondArtifact ); + session.save( ); - // test it restricts to the appropriate repository - assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1))); - assertEquals(Collections.singletonList(secondArtifact), new ArrayList<>( - repository.getArtifactsByChecksum( session, OTHER_REPO_ID, TEST_SHA1))); - assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5))); - assertEquals(Collections.singletonList(secondArtifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, OTHER_REPO_ID, TEST_MD5))); + tryAssert( ( ) -> { + // test it restricts to the appropriate repository + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ) ); + } ); + tryAssert( ( ) -> { + assertEquals( Collections.singletonList( secondArtifact ), new ArrayList<>( + getRepository( ).getArtifactsByChecksum( session, OTHER_REPO_ID, TEST_SHA1 ) ) ); + } ); + tryAssert( ( ) -> { + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ) ); + } ); + tryAssert( ( ) -> { + assertEquals( Collections.singletonList( secondArtifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, OTHER_REPO_ID, TEST_MD5 ) ) ); + } ); } } @Test - public void testGetNamespacesWithSparseDepth() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - repository.updateNamespace( session, TEST_REPO_ID, "org.apache.maven.shared"); + public void testGetNamespacesWithSparseDepth( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + getRepository( ).updateNamespace( session, TEST_REPO_ID, "org.apache.maven.shared" ); + + tryAssert( ( ) -> { - Collection namespaces = repository.getRootNamespaces( session, TEST_REPO_ID); + Collection namespaces = getRepository( ).getRootNamespaces( session, TEST_REPO_ID ); - assertThat(namespaces).isNotNull().isNotEmpty().hasSize(1).contains("org"); + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "org" ); - namespaces = repository.getNamespaces( session, TEST_REPO_ID, "org"); - assertThat(namespaces).isNotNull().isNotEmpty().hasSize(1).contains("apache"); + namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org" ); + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "apache" ); - namespaces = repository.getNamespaces( session, TEST_REPO_ID, "org.apache"); - assertThat(namespaces).isNotNull().isNotEmpty().hasSize(1).contains("maven"); + namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org.apache" ); + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "maven" ); - namespaces = repository.getNamespaces( session, TEST_REPO_ID, "org.apache.maven"); - assertThat(namespaces).isNotNull().isNotEmpty().hasSize(1).contains("shared"); + namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org.apache.maven" ); + assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "shared" ); + } ); } } @Test - public void testGetNamespacesWithProjectsPresent() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetNamespacesWithProjectsPresent( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { String namespace = "org.apache.maven.shared"; - repository.updateNamespace( session, TEST_REPO_ID, namespace); + getRepository( ).updateNamespace( session, TEST_REPO_ID, namespace ); - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); - repository.updateProjectVersion( session, TEST_REPO_ID, namespace, TEST_PROJECT, metadata); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, namespace, TEST_PROJECT, metadata ); - Collection namespaces = repository.getNamespaces( session, TEST_REPO_ID, namespace); + Collection namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, namespace ); - assertThat(namespaces).isNotNull().isEmpty(); + assertThat( namespaces ).isNotNull( ).isEmpty( ); } } @Test - public void testGetProjectsWithOtherNamespacesPresent() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ProjectMetadata projectMetadata = new ProjectMetadata(); - projectMetadata.setId(TEST_PROJECT); - projectMetadata.setNamespace("org.apache.maven"); - repository.updateProject( session, TEST_REPO_ID, projectMetadata); + public void testGetProjectsWithOtherNamespacesPresent( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ProjectMetadata projectMetadata = new ProjectMetadata( ); + projectMetadata.setId( TEST_PROJECT ); + projectMetadata.setNamespace( "org.apache.maven" ); + getRepository( ).updateProject( session, TEST_REPO_ID, projectMetadata ); - repository.updateNamespace( session, TEST_REPO_ID, "org.apache.maven.shared"); + getRepository( ).updateNamespace( session, TEST_REPO_ID, "org.apache.maven.shared" ); - Collection projects = repository.getProjects( session, TEST_REPO_ID, "org.apache.maven"); + Collection projects = getRepository( ).getProjects( session, TEST_REPO_ID, "org.apache.maven" ); - assertThat(projects).isNotNull().isNotEmpty().hasSize(1).contains(TEST_PROJECT); + assertThat( projects ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( TEST_PROJECT ); } } @Test - public void testGetProjectVersionsWithOtherNamespacesPresent() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testGetProjectVersionsWithOtherNamespacesPresent( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { // an unusual case but technically possible where a project namespace matches another project's name - ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata(); - versionMetadata.setId(TEST_PROJECT_VERSION); - repository.updateProjectVersion( session, TEST_REPO_ID, "org.apache.maven", TEST_PROJECT, versionMetadata); + ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata( ); + versionMetadata.setId( TEST_PROJECT_VERSION ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, "org.apache.maven", TEST_PROJECT, versionMetadata ); - repository.updateProjectVersion( session, TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT, - "other-project", versionMetadata); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT, + "other-project", versionMetadata ); Collection versions = - repository.getProjectVersions( session, TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT, "other-project"); - assertThat(versions).isNotNull().isNotEmpty().contains(TEST_PROJECT_VERSION); + getRepository( ).getProjectVersions( session, TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT, "other-project" ); + assertThat( versions ).isNotNull( ).isNotEmpty( ).contains( TEST_PROJECT_VERSION ); - versions = repository.getProjectVersions( session, TEST_REPO_ID, "org.apache.maven", TEST_PROJECT); + versions = getRepository( ).getProjectVersions( session, TEST_REPO_ID, "org.apache.maven", TEST_PROJECT ); - assertThat(versions).isNotNull().isNotEmpty().contains(TEST_PROJECT_VERSION); + assertThat( versions ).isNotNull( ).isNotEmpty( ).contains( TEST_PROJECT_VERSION ); } } @Test - public void testGetArtifactsByChecksumSingleResultMd5() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + public void testGetArtifactsByChecksumSingleResultMd5( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5))); + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ) ); } } @Test - public void testGetArtifactsByChecksumSingleResultSha1() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + public void testGetArtifactsByChecksumSingleResultSha1( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1))); + assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ) ); } } @Test - public void testGetArtifactsByChecksumDeepNamespace() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); + public void testGetArtifactsByChecksumDeepNamespace( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); String namespace = "multi.level.ns"; - artifact.setNamespace(namespace); - repository.updateArtifact( session, TEST_REPO_ID, namespace, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - session.save(); + artifact.setNamespace( namespace ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, namespace, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + session.save( ); - tryAssert(() -> assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1)))); - tryAssert(() -> assertEquals(Collections.singletonList(artifact), - new ArrayList<>(repository.getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5)))); + tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ) ) ); + tryAssert( ( ) -> assertEquals( Collections.singletonList( artifact ), + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ) ) ); } } @Test - public void testGetArtifactsByChecksumMultipleResult() - throws Exception { + public void testGetArtifactsByChecksumMultipleResult( ) + throws Exception + { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact1 = createArtifact(); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1); + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact1 = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact1 ); String newProjectId = "another-project"; - ArtifactMetadata artifact2 = createArtifact(); - artifact2.setProject(newProjectId); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, newProjectId, TEST_PROJECT_VERSION, artifact2); - session.save(); + ArtifactMetadata artifact2 = createArtifact( ); + artifact2.setProject( newProjectId ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, newProjectId, TEST_PROJECT_VERSION, artifact2 ); + session.save( ); - tryAssert(() -> { + tryAssert( ( ) -> { List artifacts = - new ArrayList<>(repository.getArtifactsByChecksum(session, TEST_REPO_ID, TEST_SHA1)); - Collections.sort(artifacts, new ArtifactMetadataComparator()); - assertEquals(Arrays.asList(artifact2, artifact1), artifacts); - }); + new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_SHA1 ) ); + Collections.sort( artifacts, new ArtifactMetadataComparator( ) ); + assertEquals( Arrays.asList( artifact2, artifact1 ), artifacts ); + } ); - tryAssert(() -> { - ArrayList artifacts = new ArrayList<>(repository.getArtifactsByChecksum(session, TEST_REPO_ID, TEST_MD5)); - Collections.sort(artifacts, new ArtifactMetadataComparator()); - assertEquals(Arrays.asList(artifact2, artifact1), artifacts); - }); + tryAssert( ( ) -> { + ArrayList artifacts = new ArrayList<>( getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, TEST_MD5 ) ); + Collections.sort( artifacts, new ArtifactMetadataComparator( ) ); + assertEquals( Arrays.asList( artifact2, artifact1 ), artifacts ); + } ); } } @Test - public void testGetArtifactsByChecksumNoResult() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - - Collection artifactsByChecksum = - repository.getArtifactsByChecksum( session, TEST_REPO_ID, "not checksum"); - assertThat(artifactsByChecksum).isNotNull().isEmpty(); + public void testGetArtifactsByChecksumNoResult( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - } - } + tryAssert( ( ) -> { + Collection artifactsByChecksum = + getRepository( ).getArtifactsByChecksum( session, TEST_REPO_ID, "not checksum" ); - @Test - public void testGetArtifactsByProjectVersionMetadata() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet( session,10); - Collection artifactsByMetadata = - repository.getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID); - assertThat(artifactsByMetadata).hasSize(1); - ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator().next(); - assertThat(artifactMetadata.getId()).isEqualTo("projectId-1.0.jar"); - assertThat(artifactMetadata.getSha1()).isEqualTo(TEST_SHA1); - assertThat(artifactMetadata.getRepositoryId()).isEqualTo(TEST_REPO_ID); + assertThat( artifactsByChecksum ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testGetArtifactsByProjectVersionMetadataNoRepository() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); - Collection artifactsByMetadata = - repository.getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null); - assertThat(artifactsByMetadata).hasSize(1); - assertThat(artifactsByMetadata.iterator().next().getRepositoryId()).isNotNull().isNotEmpty(); + public void testGetArtifactsByProjectVersionMetadata( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session, 10 ); + + tryAssert( ( ) -> { + Collection artifactsByMetadata = + getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID ); + assertThat( artifactsByMetadata ).hasSize( 1 ); + ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator( ).next( ); + assertThat( artifactMetadata.getId( ) ).isEqualTo( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" ); + assertThat( artifactMetadata.getSha1( ) ).isEqualTo( TEST_SHA1 ); + assertThat( artifactMetadata.getRepositoryId( ) ).isEqualTo( TEST_REPO_ID ); + } ); } } @Test - public void testGetArtifactsByProjectVersionMetadataAllRepositories() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); - Collection artifactsByMetadata = - repository.getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null); - assertThat(artifactsByMetadata).hasSize(1); + public void testGetArtifactsByProjectVersionMetadataNoRepository( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByMetadata = + getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null ); + assertThat( artifactsByMetadata ).hasSize( 1 ); + assertThat( artifactsByMetadata.iterator( ).next( ).getRepositoryId( ) ).isNotNull( ).isNotEmpty( ); + } ); } } @Test - public void testGetArtifactsByMetadataAllRepositories() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithMavenArtifactFacet(session); - tryAssert(() -> { + public void testGetArtifactsByProjectVersionMetadataAllRepositories( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByMetadata = - repository.getArtifactsByMetadata(session, "foo", TEST_METADATA_VALUE, null); - assertThat(artifactsByMetadata).hasSize(1); - ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator().next(); - assertThat(artifactMetadata.getId()).isEqualTo("projectId-1.0.jar"); - assertThat(artifactMetadata.getSha1()).isEqualTo(TEST_SHA1); - assertThat(artifactMetadata.getRepositoryId()).isEqualTo(TEST_REPO_ID); - MetadataFacet facet = artifactMetadata.getFacet(TEST_FACET_ID); - assertThat(facet).isNotNull(); - assertThat(facet.toProperties()).isEqualTo(Collections.singletonMap("foo", TEST_METADATA_VALUE)); - }); + getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null ); + assertThat( artifactsByMetadata ).hasSize( 1 ); + } ); } } @Test - public void testGetArtifactsByPropertySingleResult() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithData(session); + public void testGetArtifactsByMetadataAllRepositories( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithMavenArtifactFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByMetadata = + getRepository( ).getArtifactsByMetadata( session, "foo", TEST_METADATA_VALUE, null ); + assertThat( artifactsByMetadata ).hasSize( 1 ); + ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator( ).next( ); + assertThat( artifactMetadata.getId( ) ).isEqualTo( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" ); + assertThat( artifactMetadata.getSha1( ) ).isEqualTo( TEST_SHA1 ); + assertThat( artifactMetadata.getRepositoryId( ) ).isEqualTo( TEST_REPO_ID ); + MetadataFacet facet = artifactMetadata.getFacet( TEST_FACET_ID ); + assertThat( facet ).isNotNull( ); + assertThat( facet.toProperties( ) ).isEqualTo( Collections.singletonMap( "foo", TEST_METADATA_VALUE ) ); + } ); + } + } + + @Test + public void testGetArtifactsByPropertySingleResult( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithData( session ); // only works on JCR implementation - // Collection artifactsByProperty = repository.getArtifactsByProperty( "org.name", TEST_ORGANIZATION.getName(), TEST_REPO_ID ); - Collection artifactsByProperty = repository.getArtifactsByProperty( session, "url", TEST_URL, TEST_REPO_ID); - assertThat(artifactsByProperty).hasSize(1); - ArtifactMetadata artifactMetadata = artifactsByProperty.iterator().next(); - assertThat(artifactMetadata.getId()).isEqualTo("projectId-1.0.jar"); - assertThat(artifactMetadata.getSha1()).isEqualTo(TEST_SHA1); - assertThat(artifactMetadata.getRepositoryId()).isEqualTo(TEST_REPO_ID); + // Collection artifactsByProperty = getRepository().getArtifactsByProperty( "org.name", TEST_ORGANIZATION.getName(), TEST_REPO_ID ); + tryAssert( ( ) -> { + + Collection artifactsByProperty = getRepository( ).getArtifactsByProperty( session, "url", TEST_URL, TEST_REPO_ID ); + assertThat( artifactsByProperty ).hasSize( 1 ); + ArtifactMetadata artifactMetadata = artifactsByProperty.iterator( ).next( ); + assertThat( artifactMetadata.getId( ) ).isEqualTo( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" ); + assertThat( artifactMetadata.getSha1( ) ).isEqualTo( TEST_SHA1 ); + assertThat( artifactMetadata.getRepositoryId( ) ).isEqualTo( TEST_REPO_ID ); + } ); } } @Test - public void testDeleteRepository() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testDeleteRepository( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - repository.updateNamespace(session, TEST_REPO_ID, TEST_NAMESPACE); + getRepository( ).updateNamespace( session, TEST_REPO_ID, TEST_NAMESPACE ); - ProjectMetadata project1 = new ProjectMetadata(); - project1.setNamespace(TEST_NAMESPACE); - project1.setId("project1"); - repository.updateProject(session, TEST_REPO_ID, project1); - ProjectMetadata project2 = new ProjectMetadata(); - project2.setNamespace(TEST_NAMESPACE); - project2.setId("project2"); - repository.updateProject(session, TEST_REPO_ID, project2); + ProjectMetadata project1 = new ProjectMetadata( ); + project1.setNamespace( TEST_NAMESPACE ); + project1.setId( "project1" ); + getRepository( ).updateProject( session, TEST_REPO_ID, project1 ); + ProjectMetadata project2 = new ProjectMetadata( ); + project2.setNamespace( TEST_NAMESPACE ); + project2.setId( "project2" ); + getRepository( ).updateProject( session, TEST_REPO_ID, project2 ); - ArtifactMetadata artifact1 = createArtifact(); - artifact1.setProject("project1"); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, "project1", TEST_PROJECT_VERSION, artifact1); - ArtifactMetadata artifact2 = createArtifact(); - artifact2.setProject("project2"); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, "project2", TEST_PROJECT_VERSION, artifact2); - session.save(); + ArtifactMetadata artifact1 = createArtifact( ); + artifact1.setProject( "project1" ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, "project1", TEST_PROJECT_VERSION, artifact1 ); + ArtifactMetadata artifact2 = createArtifact( ); + artifact2.setProject( "project2" ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, "project2", TEST_PROJECT_VERSION, artifact2 ); + session.save( ); - List expected = Arrays.asList(artifact1, artifact2); - Collections.sort(expected, new ArtifactMetadataComparator()); + List expected = Arrays.asList( artifact1, artifact2 ); + Collections.sort( expected, new ArtifactMetadataComparator( ) ); - tryAssert(() -> { + tryAssert( ( ) -> { List actual = - new ArrayList<>(repository.getArtifactsByDateRange(session, TEST_REPO_ID, null, null)); - Collections.sort(actual, new ArtifactMetadataComparator()); - assertEquals(expected, actual); - }); + new ArrayList<>( getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, null ) ); + Collections.sort( actual, new ArtifactMetadataComparator( ) ); + assertEquals( expected, actual ); + } ); - repository.removeRepository(session, TEST_REPO_ID); + getRepository( ).removeRepository( session, TEST_REPO_ID ); - assertTrue(repository.getArtifacts(session, TEST_REPO_ID).isEmpty()); - assertTrue(repository.getRootNamespaces(session, TEST_REPO_ID).isEmpty()); + tryAssert( ( ) -> { + assertTrue( getRepository( ).getArtifacts( session, TEST_REPO_ID ).isEmpty( ) ); + assertTrue( getRepository( ).getRootNamespaces( session, TEST_REPO_ID ).isEmpty( ) ); + } ); } } @Test - public void testDeleteArtifact() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testDeleteArtifact( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ArtifactMetadata artifact = createArtifact(); - artifact.addFacet(new TestMetadataFacet("value")); + ArtifactMetadata artifact = createArtifact( ); + artifact.addFacet( new TestMetadataFacet( "value" ) ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - assertThat(repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION)).containsExactly(artifact); + assertThat( getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ) ).containsExactly( artifact ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION_2_0, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION_2_0, artifact ); - Collection versions = repository.getProjectVersions(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + Collection versions = getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); - log.info("versions {}", versions); + log.info( "versions {}", versions ); - assertThat(versions).isNotNull().isNotEmpty().hasSize(2).contains("1.0", "2.0"); + assertThat( versions ).isNotNull( ).isNotEmpty( ).hasSize( 2 ).contains( "1.0", "2.0" ); - repository.removeArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact.getId()); + getRepository( ).removeArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact.getId( ) ); - versions = repository.getProjectVersions(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + versions = getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); - log.info("versions {}", versions); + log.info( "versions {}", versions ); - assertThat(versions).isNotNull().isNotEmpty().hasSize(1).contains("2.0"); + assertThat( versions ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "2.0" ); - assertThat(repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION)).isNotNull().isEmpty(); + assertThat( getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNotNull( ).isEmpty( ); - assertThat(repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, - TEST_PROJECT, TEST_PROJECT_VERSION_2_0)).isNotEmpty().hasSize(1); + assertThat( getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, + TEST_PROJECT, TEST_PROJECT_VERSION_2_0 ) ).isNotEmpty( ).hasSize( 1 ); } } @Test - public void deleteArtifact() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - artifact.addFacet(new TestMetadataFacet("value")); + public void deleteArtifact( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + artifact.addFacet( new TestMetadataFacet( "value" ) ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - Collection artifacts = - repository.getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + tryAssert( ( ) -> { + Collection artifacts = + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - assertEquals(Collections.singletonList(artifact), new ArrayList<>(artifacts)); + assertEquals( Collections.singletonList( artifact ), new ArrayList<>( artifacts ) ); - repository.removeArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact.getId()); + } ); - artifacts = repository.getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + getRepository( ).removeArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact.getId( ) ); - assertThat(artifacts).isNotNull().isEmpty(); + tryAssert( ( ) -> { + Collection artifacts = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + + assertThat( artifacts ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void deleteVersion() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - artifact.addFacet(new TestMetadataFacet("value")); + public void deleteVersion( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + artifact.addFacet( new TestMetadataFacet( "value" ) ); + + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + tryAssert( ( ) -> { - Collection versions = repository.getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + Collection versions = getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); - assertThat(versions).isNotNull().isNotEmpty().hasSize(1); + assertThat( versions ).isNotNull( ).isNotEmpty( ).hasSize( 1 ); + } ); - repository.removeProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + getRepository( ).removeProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); - versions = repository.getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + tryAssert( ( ) -> { - assertThat(versions).isNotNull().isEmpty(); + Collection versions1 = getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); + assertThat( versions1 ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void deleteProject() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - ArtifactMetadata artifact = createArtifact(); - artifact.addFacet(new TestMetadataFacet("value")); + public void deleteProject( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + ArtifactMetadata artifact = createArtifact( ); + artifact.addFacet( new TestMetadataFacet( "value" ) ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - repository.updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); - assertEquals(1, repository.getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT).size()); + assertEquals( 1, getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ).size( ) ); - repository.removeProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + getRepository( ).removeProject( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); - Collection versions = repository.getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT); + Collection versions = getRepository( ).getProjectVersions( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ); - assertThat(versions).isNotNull().isEmpty(); + assertThat( versions ).isNotNull( ).isEmpty( ); } } @Test - public void deleteSnapshotVersion() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void deleteSnapshotVersion( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ArtifactMetadata artifactOne = createArtifact(); - artifactOne.setVersion("2.0-20120618.214127-1"); - artifactOne.setProjectVersion("2.0-SNAPSHOT"); - artifactOne.addFacet(new TestMetadataFacet("value")); - artifactOne.setId(TEST_PROJECT + "-" + "2.0-20120618.214127-1" + "." + "jar"); + ArtifactMetadata artifactOne = createArtifact( ); + artifactOne.setVersion( "2.0-20120618.214127-1" ); + artifactOne.setProjectVersion( "2.0-SNAPSHOT" ); + artifactOne.addFacet( new TestMetadataFacet( "value" ) ); + artifactOne.setId( TEST_PROJECT + "-" + "2.0-20120618.214127-1" + "." + "jar" ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT", artifactOne); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT", artifactOne ); - ArtifactMetadata artifactTwo = createArtifact(); - artifactTwo.setVersion("2.0-20120618.214135-2"); - artifactTwo.setProjectVersion("2.0-SNAPSHOT"); - artifactTwo.addFacet(new TestMetadataFacet("value")); - artifactTwo.setId(TEST_PROJECT + "-" + "2.0-20120618.214135-2" + "." + "jar"); + ArtifactMetadata artifactTwo = createArtifact( ); + artifactTwo.setVersion( "2.0-20120618.214135-2" ); + artifactTwo.setProjectVersion( "2.0-SNAPSHOT" ); + artifactTwo.addFacet( new TestMetadataFacet( "value" ) ); + artifactTwo.setId( TEST_PROJECT + "-" + "2.0-20120618.214135-2" + "." + "jar" ); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT", artifactTwo); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT", artifactTwo ); Collection artifactMetadatas = - repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT"); + getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT" ); - assertThat(artifactMetadatas).isNotNull().isNotEmpty().hasSize(2); + assertThat( artifactMetadatas ).isNotNull( ).isNotEmpty( ).hasSize( 2 ); - log.info("artifactMetadatas: {}", artifactMetadatas); + log.info( "artifactMetadatas: {}", artifactMetadatas ); - repository.removeArtifact(session, artifactOne, "2.0-SNAPSHOT"); + getRepository( ).removeArtifact( session, artifactOne, "2.0-SNAPSHOT" ); - artifactMetadatas = repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT"); + artifactMetadatas = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT" ); - assertThat(artifactMetadatas).isNotNull().isNotEmpty().hasSize(1); + assertThat( artifactMetadatas ).isNotNull( ).isNotEmpty( ).hasSize( 1 ); - repository.removeArtifact(session, artifactTwo, "2.0-SNAPSHOT"); + getRepository( ).removeArtifact( session, artifactTwo, "2.0-SNAPSHOT" ); - artifactMetadatas = repository.getArtifacts(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT"); + artifactMetadatas = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT" ); - assertThat(artifactMetadatas).isNotNull().isEmpty(); + assertThat( artifactMetadatas ).isNotNull( ).isEmpty( ); } } @Test - public void testgetProjectReferences() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testgetProjectReferences( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - ProjectVersionMetadata metadata = new ProjectVersionMetadata(); - metadata.setId(TEST_PROJECT_VERSION); + ProjectVersionMetadata metadata = new ProjectVersionMetadata( ); + metadata.setId( TEST_PROJECT_VERSION ); - metadata.setName("project name"); - metadata.setDescription("project description"); - metadata.setUrl("the url"); + metadata.setName( "project name" ); + metadata.setDescription( "project description" ); + metadata.setUrl( "the url" ); - Dependency d = new Dependency(); - d.setArtifactId("artifactId"); - d.setClassifier("classifier"); - d.setGroupId("groupId"); - d.setScope("scope"); - d.setSystemPath("system path"); - d.setType("type"); - d.setVersion("version"); - d.setOptional(true); - metadata.addDependency(d); + Dependency d = new Dependency( ); + d.setArtifactId( "artifactId" ); + d.setClassifier( "classifier" ); + d.setGroupId( "groupId" ); + d.setScope( "scope" ); + d.setSystemPath( "system path" ); + d.setType( "type" ); + d.setVersion( "version" ); + d.setOptional( true ); + metadata.addDependency( d ); - d = new Dependency(); - d.setArtifactId("artifactId1"); - d.setClassifier("classifier"); - d.setGroupId("groupId"); - d.setScope("scope"); - d.setSystemPath("system path"); - d.setType("type"); - d.setVersion("version1"); - d.setOptional(true); - metadata.addDependency(d); + d = new Dependency( ); + d.setArtifactId( "artifactId1" ); + d.setClassifier( "classifier" ); + d.setGroupId( "groupId" ); + d.setScope( "scope" ); + d.setSystemPath( "system path" ); + d.setType( "type" ); + d.setVersion( "version1" ); + d.setOptional( true ); + metadata.addDependency( d ); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); - session.save(); + session.save( ); - metadata = repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); + metadata = getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + final Dependency dd = d; - Collection references = - repository.getProjectReferences(session, TEST_REPO_ID, d.getGroupId(), d.getArtifactId(), d.getVersion()); - log.info("references: {}", references); + tryAssert( ( ) -> { - assertThat(references).isNotNull().hasSize(1).contains( - new ProjectVersionReference(ProjectVersionReference.ReferenceType.DEPENDENCY, TEST_PROJECT, TEST_NAMESPACE, - TEST_PROJECT_VERSION)); + Collection references = + getRepository( ).getProjectReferences( session, TEST_REPO_ID, dd.getGroupId( ), dd.getArtifactId( ), dd.getVersion( ) ); + log.info( "references: {}", references ); + assertThat( references ).isNotNull( ).hasSize( 1 ).contains( + new ProjectVersionReference( ProjectVersionReference.ReferenceType.DEPENDENCY, TEST_PROJECT, TEST_NAMESPACE, + TEST_PROJECT_VERSION )); + } + ); } } @Test - public void testSearchArtifactsByKey() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithData(session); - session.refreshAndDiscard(); - Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, false); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); + public void testSearchArtifactsByKey( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithData( session ); + } + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + session.refreshAndDiscard( ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); } } @Test - public void testSearchArtifactsByKeyExact() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithData(session); - Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, true); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); - artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "org.name", "pache", true); - assertThat(artifactsByProperty).isNotNull().isEmpty(); - + public void testSearchArtifactsByKeyExact( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithData( session ); + } + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + session.refreshAndDiscard( ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, true ); + assertThat( artifactsByProperty ).describedAs( "Artifact search by url=%s must give a result.", TEST_URL ).isNotNull( ).isNotEmpty( ); + artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, "org.name", "pache", true ); + assertThat( artifactsByProperty ).describedAs( "Artifact search by text org.name='pache' must be empty" ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testSearchArtifactsByFacetKey() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); - } - // Thread.currentThread().sleep(5000); - try (RepositorySession session = sessionFactory.createSession()) { - session.refresh(); - System.out.println(repository.getRootNamespaces(session, TEST_REPO_ID)); - - Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_KEY, TEST_METADATA_VALUE, false); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); + public void testSearchArtifactsByFacetKey( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_KEY, TEST_METADATA_VALUE, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); } } @Test - public void testSearchArtifactsByFacetKeyAllRepos() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { + public void testSearchArtifactsByFacetKeyAllRepos( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { - createArtifactWithGenericMetadataFacet(session); - tryAssert(() -> { - Collection artifactsByProperty = repository.searchArtifacts(session, null, TEST_METADATA_KEY, TEST_METADATA_VALUE, false); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); - }); + createArtifactWithGenericMetadataFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, null, TEST_METADATA_KEY, TEST_METADATA_VALUE, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); } } @Test - public void testSearchArtifactsFullText() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); + public void testSearchArtifactsFullText( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); // only works in JCR - // Collection artifactsByProperty = repository.searchArtifacts( TEST_URL, TEST_REPO_ID, false ); - Collection artifactsByProperty = - repository.searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, false); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); + // Collection artifactsByProperty = getRepository().searchArtifacts( TEST_URL, TEST_REPO_ID, false ); + tryAssert( ( ) -> { + Collection artifactsByProperty = + getRepository( ).searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); } } @Test - public void testSearchArtifactsFullTextExact() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); + public void testSearchArtifactsFullTextExact( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); // only works in JCR - // Collection artifactsByProperty = repository.searchArtifacts( TEST_URL, TEST_REPO_ID, true ); - Collection artifactsByProperty = - repository.searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, true); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); - artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE.substring(2), true); - assertThat(artifactsByProperty).isNotNull().isEmpty(); + // Collection artifactsByProperty = getRepository().searchArtifacts( TEST_URL, TEST_REPO_ID, true ); + + tryAssert( ( ) -> { + Collection artifactsByProperty = + getRepository( ).searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, true ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE.substring( 2 ), true ); + assertThat( artifactsByProperty ).isNotNull( ).isEmpty( ); + } ); } } @Test - public void testSearchArtifactsFullTextByFacet() - throws Exception { - try (RepositorySession session = sessionFactory.createSession()) { - createArtifactWithGenericMetadataFacet(session); - Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, false); - assertThat(artifactsByProperty).isNotNull().isNotEmpty(); - + public void testSearchArtifactsFullTextByFacet( ) + throws Exception + { + try ( RepositorySession session = getSessionFactory( ).createSession( ) ) + { + createArtifactWithGenericMetadataFacet( session ); + tryAssert( ( ) -> { + Collection artifactsByProperty = getRepository( ).searchArtifacts( session, TEST_REPO_ID, TEST_METADATA_VALUE, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } ); + } } - private static ProjectMetadata createProject() { - return createProject(TEST_NAMESPACE); + private static ProjectMetadata createProject( ) + { + return createProject( TEST_NAMESPACE ); } - private static ProjectMetadata createProject(String ns) { - ProjectMetadata project = new ProjectMetadata(); - project.setId(TEST_PROJECT); - project.setNamespace(ns); + private static ProjectMetadata createProject( String ns ) + { + ProjectMetadata project = new ProjectMetadata( ); + project.setId( TEST_PROJECT ); + project.setNamespace( ns ); return project; } - private void createArtifactWithGenericMetadataFacet(RepositorySession session) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - createArtifactWithGenericMetadataFacet( session,1); + private void createArtifactWithGenericMetadataFacet( RepositorySession session ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + createArtifactWithGenericMetadataFacet( session, 1 ); } - private void createArtifactWithGenericMetadataFacet(RepositorySession session, int artifacts) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - MetadataFacet metadataFacet = new GenericMetadataFacet(); - Map properties = new HashMap<>(); - properties.put(TEST_METADATA_KEY, TEST_METADATA_VALUE); - metadataFacet.fromProperties(properties); - createArtifactWithFacet(session, artifacts, null, metadataFacet); + private void createArtifactWithGenericMetadataFacet( RepositorySession session, int artifacts ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + MetadataFacet metadataFacet = new GenericMetadataFacet( ); + Map properties = new HashMap<>( ); + properties.put( TEST_METADATA_KEY, TEST_METADATA_VALUE ); + metadataFacet.fromProperties( properties ); + createArtifactWithFacet( session, artifacts, null, metadataFacet ); } - private void createArtifactWithMavenArtifactFacet(RepositorySession session) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - createArtifactWithMavenArtifactFacet(session, 1); + private void createArtifactWithMavenArtifactFacet( RepositorySession session ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + createArtifactWithMavenArtifactFacet( session, 1 ); } - private void createArtifactWithMavenArtifactFacet(RepositorySession session, int artifacts) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - TestMetadataFacet facet = new TestMetadataFacet(TEST_METADATA_VALUE); - createArtifactWithFacet(session, artifacts, facet, null); + private void createArtifactWithMavenArtifactFacet( RepositorySession session, int artifacts ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + TestMetadataFacet facet = new TestMetadataFacet( TEST_METADATA_VALUE ); + createArtifactWithFacet( session, artifacts, facet, null ); } - private void createArtifactWithFacet(RepositorySession session, int artifacts, MetadataFacet artifactFacet, - MetadataFacet projectVersionMetadataFacet) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - for (int i = 0; i < artifacts; i++) { - ArtifactMetadata artifact = createArtifact(); - if (artifactFacet != null) { - artifact.addFacet(artifactFacet); - } - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); - } - if (projectVersionMetadataFacet != null) { - ProjectVersionMetadata metadata = - repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - metadata.addFacet(projectVersionMetadataFacet); - metadata.setOrganization(TEST_ORGANIZATION); - metadata.setUrl(TEST_URL); - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); + private void createArtifactWithFacet( RepositorySession session, int artifacts, MetadataFacet artifactFacet, + MetadataFacet projectVersionMetadataFacet ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + for ( int i = 0; i < artifacts; i++ ) + { + ArtifactMetadata artifact = createArtifact( ); + if ( artifactFacet != null ) + { + artifact.addFacet( artifactFacet ); } - session.save(); - } - - private void createArtifactWithData(RepositorySession session) - throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException { - ArtifactMetadata artifact = createArtifact(); - repository.updateArtifact(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + } + if ( projectVersionMetadataFacet != null ) + { ProjectVersionMetadata metadata = - repository.getProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION); - metadata.setOrganization(TEST_ORGANIZATION); - metadata.setUrl(TEST_URL); - - repository.updateProjectVersion(session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata); - session.save(); - } - - private static ArtifactMetadata createArtifact() { - return createArtifact("jar"); - } - - private static ArtifactMetadata createArtifact(String type) { - ArtifactMetadata artifact = new ArtifactMetadata(); - artifact.setId(TEST_PROJECT + "-" + TEST_PROJECT_VERSION + "." + type); - artifact.setWhenGathered(new Date()); - artifact.setNamespace(TEST_NAMESPACE); - artifact.setProject(TEST_PROJECT); - artifact.setRepositoryId(TEST_REPO_ID); - artifact.setFileLastModified(System.currentTimeMillis()); - artifact.setVersion(TEST_PROJECT_VERSION); - artifact.setProjectVersion(TEST_PROJECT_VERSION); - artifact.setMd5(TEST_MD5); - artifact.setSha1(TEST_SHA1); + getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + metadata.addFacet( projectVersionMetadataFacet ); + metadata.setOrganization( TEST_ORGANIZATION ); + metadata.setUrl( TEST_URL ); + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); + } + session.save( ); + } + + protected void createArtifactWithData( RepositorySession session ) + throws MetadataRepositoryException, MetadataResolutionException, MetadataSessionException + { + ArtifactMetadata artifact = createArtifact( ); + getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); + ProjectVersionMetadata metadata = + getRepository( ).getProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); + metadata.setOrganization( TEST_ORGANIZATION ); + metadata.setUrl( TEST_URL ); + + getRepository( ).updateProjectVersion( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata ); + session.save( ); + } + + private static ArtifactMetadata createArtifact( ) + { + return createArtifact( "jar" ); + } + + private static ArtifactMetadata createArtifact( String type ) + { + ArtifactMetadata artifact = new ArtifactMetadata( ); + artifact.setId( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + "." + type ); + artifact.setWhenGathered( new Date( ) ); + artifact.setNamespace( TEST_NAMESPACE ); + artifact.setProject( TEST_PROJECT ); + artifact.setRepositoryId( TEST_REPO_ID ); + artifact.setFileLastModified( System.currentTimeMillis( ) ); + artifact.setVersion( TEST_PROJECT_VERSION ); + artifact.setProjectVersion( TEST_PROJECT_VERSION ); + artifact.setMd5( TEST_MD5 ); + artifact.setSha1( TEST_SHA1 ); return artifact; } private static class ArtifactMetadataComparator - implements Comparator { + implements Comparator + { @Override - public final int compare(ArtifactMetadata a, ArtifactMetadata b) { - return a.getProject().compareTo(b.getProject()); + public final int compare( ArtifactMetadata a, ArtifactMetadata b ) + { + return a.getProject( ).compareTo( b.getProject( ) ); } } private static class KindOfRepositoryStatistics - implements MetadataFacet { + implements MetadataFacet + { private String value; private Date date; static final String SCAN_TIMESTAMP_FORMAT = "yyyy/MM/dd/HHmmss.SSS"; - private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("UTC"); + private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" ); - private KindOfRepositoryStatistics(String value, Date date) { + private KindOfRepositoryStatistics( String value, Date date ) + { this.value = value; this.date = date; } @Override - public String getName() { - return createNameFormat().format(date); + public String getName( ) + { + return createNameFormat( ).format( date ); } - private static SimpleDateFormat createNameFormat() { - SimpleDateFormat fmt = new SimpleDateFormat(SCAN_TIMESTAMP_FORMAT); - fmt.setTimeZone(UTC_TIME_ZONE); + private static SimpleDateFormat createNameFormat( ) + { + SimpleDateFormat fmt = new SimpleDateFormat( SCAN_TIMESTAMP_FORMAT ); + fmt.setTimeZone( UTC_TIME_ZONE ); return fmt; } @Override - public String getFacetId() { - return KindOfRepositoryStatistics.class.getName(); + public String getFacetId( ) + { + return KindOfRepositoryStatistics.class.getName( ); } @Override - public Map toProperties() { - return Collections.emptyMap(); + public Map toProperties( ) + { + return Collections.emptyMap( ); } @Override - public void fromProperties(Map properties) { + public void fromProperties( Map properties ) + { // no op } } private static class TestMetadataFacet - implements MetadataFacet { + implements MetadataFacet + { private String testFacetId; private Map additionalProps; private String value; - private TestMetadataFacet(String value) { + private TestMetadataFacet( String value ) + { this.value = value; testFacetId = TEST_FACET_ID; } - private TestMetadataFacet(String facetId, String value) { + private TestMetadataFacet( String facetId, String value ) + { this.value = value; testFacetId = facetId; } - private TestMetadataFacet(String facetId, String value, Map additionalProps) { - this(facetId, value); + private TestMetadataFacet( String facetId, String value, Map additionalProps ) + { + this( facetId, value ); this.additionalProps = additionalProps; } @Override - public String getFacetId() { + public String getFacetId( ) + { return testFacetId; } @Override - public String getName() { + public String getName( ) + { return TEST_NAME; } @Override - public Map toProperties() { - if (value != null) { - if (additionalProps == null) { - return Collections.singletonMap("foo", value); - } else { - Map props = new HashMap<>(); - props.put("foo", value); - - for (String key : additionalProps.keySet()) { - props.put(key, additionalProps.get(key)); + public Map toProperties( ) + { + if ( value != null ) + { + if ( additionalProps == null ) + { + return Collections.singletonMap( "foo", value ); + } + else + { + Map props = new HashMap<>( ); + props.put( "foo", value ); + + for ( String key : additionalProps.keySet( ) ) + { + props.put( key, additionalProps.get( key ) ); } return props; } - } else { - return Collections.emptyMap(); + } + else + { + return Collections.emptyMap( ); } } @Override - public void fromProperties(Map properties) { - String value = properties.get("foo"); - if (value != null) { + public void fromProperties( Map properties ) + { + String value = properties.get( "foo" ); + if ( value != null ) + { this.value = value; } - properties.remove("foo"); + properties.remove( "foo" ); - if (additionalProps == null) { - additionalProps = new HashMap<>(); + if ( additionalProps == null ) + { + additionalProps = new HashMap<>( ); } - for (String key : properties.keySet()) { - additionalProps.put(key, properties.get(key)); + for ( String key : properties.keySet( ) ) + { + additionalProps.put( key, properties.get( key ) ); } } - public String getValue() { + public String getValue( ) + { return value; } @Override - public String toString() { + public String toString( ) + { return "TestMetadataFacet{" + "value='" + value + '\'' + '}'; } @Override - public boolean equals(Object o) { - if (this == o) { + public boolean equals( Object o ) + { + if ( this == o ) + { return true; } - if (o == null || getClass() != o.getClass()) { + if ( o == null || getClass( ) != o.getClass( ) ) + { return false; } TestMetadataFacet that = (TestMetadataFacet) o; - if (value != null ? !value.equals(that.value) : that.value != null) { + if ( value != null ? !value.equals( that.value ) : that.value != null ) + { return false; } @@ -1955,8 +2329,9 @@ public abstract class AbstractMetadataRepositoryTest } @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; + public int hashCode( ) + { + return value != null ? value.hashCode( ) : 0; } } } diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java index edb711538..6bd8c28c9 100644 --- a/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java +++ b/archiva-modules/plugins/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepositoryTest.java @@ -21,6 +21,8 @@ package org.apache.archiva.metadata.repository.cassandra; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel; import org.junit.After; import org.junit.Before; @@ -47,6 +49,18 @@ public class CassandraMetadataRepositoryTest CassandraMetadataRepository cmr; + @Override + protected RepositorySessionFactory getSessionFactory( ) + { + return null; + } + + @Override + protected MetadataRepository getRepository( ) + { + return cmr; + } + @Before @Override public void setUp() @@ -63,7 +77,6 @@ public class CassandraMetadataRepositoryTest Map factories = createTestMetadataFacetFactories(); this.cmr = new CassandraMetadataRepository( factories, null, cassandraArchivaManager ); - this.repository = this.cmr; clearReposAndNamespace( cassandraArchivaManager ); } @@ -90,7 +103,7 @@ public class CassandraMetadataRepositoryTest this.cmr.removeProjectVersion( null, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); assertThat( - repository.getProjectVersion( null , TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNull(); + cmr.getProjectVersion( null , TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ).isNull(); assertThat( cmr.getMailingLists( key ) ).isNotNull().isEmpty(); diff --git a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java index 346c5c708..93ef8ce80 100644 --- a/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java +++ b/archiva-modules/plugins/metadata-store-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java @@ -24,6 +24,8 @@ import org.apache.archiva.configuration.Configuration; import org.apache.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; +import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.junit.Before; import org.junit.Ignore; @@ -39,6 +41,21 @@ public class FileMetadataRepositoryTest extends AbstractMetadataRepositoryTest { + private FileMetadataRepository repository; + private RepositorySessionFactory sessionFactory = null; + + @Override + protected MetadataRepository getRepository( ) + { + return this.repository; + } + + @Override + protected RepositorySessionFactory getSessionFactory( ) + { + return this.sessionFactory; + } + @Before @Override public void setUp() diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java new file mode 100644 index 000000000..e4faa4e1f --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java @@ -0,0 +1,46 @@ +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. + */ + +/** + * Node types and properties defined in the schema. + * + * @author Martin Stockhammer + */ +public interface JcrConstants +{ + String BASE_NODE_TYPE = "archiva:base"; + String NAMESPACE_NODE_TYPE = "archiva:namespace"; + String PROJECT_NODE_TYPE = "archiva:project"; + String PROJECT_VERSION_NODE_TYPE = "archiva:projectVersion"; + String ARTIFACT_NODE_TYPE = "archiva:artifact"; + String REPOSITORY_NODE_TYPE = "archiva:repository"; + String FACET_NODE_TYPE = "archiva:facet"; + String MIXIN_META_SCM = "archiva:meta_scm"; + String MIXIN_META_CI = "archiva:meta_ci"; + String MIXIN_META_ISSUE = "archiva:meta_issue"; + String MIXIN_META_ORGANIZATION = "archiva:meta_organization"; + String MIXIN_META_LICENSE = "archiva:meta_license"; + String MIXIN_META_MAILINGLIST = "archiva:meta_mailinglist"; + String DEPENDENCY_NODE_TYPE = "archiva:dependency"; + + // Must be alphabetically ordered! + String[] PROJECT_VERSION_VERSION_PROPERTIES = {"ci.system","ci.url", "description", "incomplete", "issue.system","issue.url", "name", "org.name", "org.url", "url", "scm.connection", "scm.developerConnection", "scm.url"}; +} 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 47c48614f..f9df40d7c 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 @@ -42,7 +42,10 @@ import org.apache.archiva.metadata.repository.RepositorySession; 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.JcrConstants; import org.apache.jackrabbit.commons.JcrUtils; +import org.apache.jackrabbit.commons.cnd.CndImporter; +import org.apache.jackrabbit.commons.cnd.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,6 +66,9 @@ import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import javax.jcr.query.Row; import javax.jcr.query.RowIterator; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -77,6 +83,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import static javax.jcr.Property.JCR_LAST_MODIFIED; +import static org.apache.archiva.metadata.repository.jcr.JcrConstants.DEPENDENCY_NODE_TYPE; +import static org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_VERSION_PROPERTIES; + /** * TODO below: revise storage format for project version metadata * TODO revise reference storage @@ -85,34 +95,23 @@ public class JcrMetadataRepository implements MetadataRepository, RepositoryStatisticsProvider { - private static final String JCR_LAST_MODIFIED = "jcr:lastModified"; - - static final String NAMESPACE_NODE_TYPE = "archiva:namespace"; - - static final String PROJECT_NODE_TYPE = "archiva:project"; - - static final String PROJECT_VERSION_NODE_TYPE = "archiva:projectVersion"; - - static final String ARTIFACT_NODE_TYPE = "archiva:artifact"; - private static final String QUERY_ARTIFACT_1 = "SELECT * FROM [" + ARTIFACT_NODE_TYPE + "] AS artifact WHERE ISDESCENDANTNODE(artifact,'/"; - static final String FACET_NODE_TYPE = "archiva:facet"; + private static final String QUERY_ARTIFACT_1 = "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + "] AS artifact WHERE ISDESCENDANTNODE(artifact,'/"; - static final String QUERY_ARTIFACTS_BY_PROJECT_VERSION_1 = "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + ARTIFACT_NODE_TYPE - + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) INNER JOIN [" + FACET_NODE_TYPE + static final String QUERY_ARTIFACTS_BY_PROJECT_VERSION_1 = "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) INNER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE + "] AS facet ON ISCHILDNODE(facet, projectVersion) WHERE ([facet].["; static final String QUERY_ARTIFACTS_BY_PROJECT_VERSION_2= "] = $value)"; - static final String QUERY_ARTIFACTS_BY_METADATA_1 = "SELECT * FROM [" + ARTIFACT_NODE_TYPE + "] AS artifact INNER JOIN [" + FACET_NODE_TYPE + static final String QUERY_ARTIFACTS_BY_METADATA_1 = "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + "] AS artifact INNER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE + "] AS facet ON ISCHILDNODE(facet, artifact) WHERE ([facet].["; static final String QUERY_ARTIFACTS_BY_METADATA_2 = "] = $value)"; - static final String QUERY_ARTIFACTS_BY_PROPERTY_1 = "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + ARTIFACT_NODE_TYPE + static final String QUERY_ARTIFACTS_BY_PROPERTY_1 = "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE + "] AS projectVersion INNER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) WHERE ([projectVersion].["; static final String QUERY_ARTIFACTS_BY_PROPERTY_2 = "] = $value)"; - private static final String DEPENDENCY_NODE_TYPE = "archiva:dependency"; private static final String QUERY_ARTIFACT_2 = "')"; private final Map metadataFacetFactories; @@ -148,12 +147,29 @@ public class JcrMetadataRepository } NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager(); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.NAMESPACE_NODE_TYPE ); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.PROJECT_NODE_TYPE ); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.PROJECT_VERSION_NODE_TYPE ); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.ARTIFACT_NODE_TYPE ); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.FACET_NODE_TYPE ); - registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.DEPENDENCY_NODE_TYPE ); + try( + Reader cndReader = new InputStreamReader( + Thread.currentThread( ).getContextClassLoader( ).getResourceAsStream( "org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd" ) )) + { + CndImporter.registerNodeTypes( cndReader, session ); + } + catch ( ParseException e ) + { + e.printStackTrace( ); + } + catch ( IOException e ) + { + e.printStackTrace( ); + } + + +// registerMixinNodeType( nodeTypeManager, REPOSITORY_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, NAMESPACE_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, PROJECT_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, PROJECT_VERSION_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, ARTIFACT_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, FACET_NODE_TYPE ); +// registerMixinNodeType( nodeTypeManager, DEPENDENCY_NODE_TYPE ); } @@ -168,13 +184,14 @@ public class JcrMetadataRepository NodeTypeTemplate nodeType = nodeTypeManager.createNodeTypeTemplate(); nodeType.setMixin( true ); nodeType.setName( name ); + nodeType.setQueryable( true ); nodeTypeManager.registerNodeType( nodeType, false ); } } private Session getSession(RepositorySession repositorySession) throws MetadataRepositoryException { - if (repositorySession instanceof JcrSession) { - return ( (JcrSession) repositorySession ).getJcrSession(); + if (repositorySession instanceof JcrRepositorySession ) { + return ( (JcrRepositorySession) repositorySession ).getJcrSession(); } else { throw new MetadataRepositoryException( "The given session object is not a JcrSession instance: " + repositorySession.getClass( ).getName( ) ); } @@ -216,6 +233,7 @@ public class JcrMetadataRepository Node node = getOrAddArtifactNode( jcrSession, repositoryId, namespace, projectId, projectVersion, artifactMeta.getId() ); + node.setProperty( "id", artifactMeta.getId( ) ); Calendar cal = Calendar.getInstance(); cal.setTime( artifactMeta.getFileLastModified() ); node.setProperty( JCR_LAST_MODIFIED, cal ); @@ -245,8 +263,8 @@ public class JcrMetadataRepository if ( metadataFacet != null ) { // recreate, to ensure properties are removed - Node n = node.addNode( facetId ); - n.addMixin( FACET_NODE_TYPE ); + Node n = node.addNode( facetId); + n.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE ); for ( Map.Entry entry : metadataFacet.toProperties().entrySet() ) { @@ -273,9 +291,9 @@ public class JcrMetadataRepository { Node versionNode = getOrAddProjectVersionNode( jcrSession, repositoryId, namespace, projectId, versionMetadata.getId() ); - - versionNode.setProperty( "name", versionMetadata.getName() ); - versionNode.setProperty( "description", versionMetadata.getDescription() ); + versionNode.setProperty( "id", versionMetadata.getId( ) ); + versionNode.setProperty( "name", StringUtils.isEmpty( versionMetadata.getName() ) ? "" : versionMetadata.getName() ); + versionNode.setProperty( "description", StringUtils.isEmpty( versionMetadata.getDescription() ) ? "" : versionMetadata.getDescription() ); versionNode.setProperty( "url", versionMetadata.getUrl() ); versionNode.setProperty( "incomplete", versionMetadata.isIncomplete() ); @@ -343,8 +361,8 @@ public class JcrMetadataRepository } id += "." + dependency.getType(); - Node n = JcrUtils.getOrAddNode( dependenciesNode, id ); - n.addMixin( DEPENDENCY_NODE_TYPE ); + Node n = JcrUtils.getOrAddNode( dependenciesNode, id, DEPENDENCY_NODE_TYPE ); + n.setProperty( "id", id ); // FIXME: remove temp code just to make it keep working n.setProperty( "groupId", dependency.getGroupId() ); @@ -379,7 +397,7 @@ public class JcrMetadataRepository versionNode.getNode( facet.getFacetId() ).remove(); } Node n = versionNode.addNode( facet.getFacetId() ); - n.addMixin( FACET_NODE_TYPE ); + n.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE ); for ( Map.Entry entry : facet.toProperties().entrySet() ) { @@ -398,6 +416,7 @@ public class JcrMetadataRepository try { Node node = getOrAddNamespaceNode( jcrSession, repositoryId, namespace ); + node.setProperty( "id", namespace ); node.setProperty( "namespace", namespace ); } catch ( RepositoryException e ) @@ -429,7 +448,7 @@ public class JcrMetadataRepository while ( nodeIterator.hasNext() ) { Node node = nodeIterator.next(); - if ( node.isNodeType( PROJECT_NODE_TYPE ) && projectId.equals( node.getName() ) ) + if ( node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE ) && projectId.equals( node.getName() ) ) { node.remove(); } @@ -593,7 +612,7 @@ public class JcrMetadataRepository if ( root.hasNode( path ) ) { Node node = root.getNode( path ); - if ( node.isNodeType( NAMESPACE_NODE_TYPE ) ) + if ( node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.NAMESPACE_NODE_TYPE ) ) { node.remove(); } @@ -729,11 +748,20 @@ public class JcrMetadataRepository return artifacts; } - private List runJcrQuery( Session jcrSession, String repositoryId, String q, Map bindings ) + public List runJcrQuery( Session jcrSession, String repositoryId, String q, Map bindingParam) throws MetadataRepositoryException { + return runJcrQuery( jcrSession, repositoryId, q, bindingParam, true ); + } + + public List runJcrQuery( final Session jcrSession, final String repositoryId, final String qParam, + final Map bindingParam, final boolean checkPath ) + throws MetadataRepositoryException + { + + String q = qParam; List artifacts; - if ( repositoryId != null ) + if ( repositoryId != null && checkPath ) { q += " AND ISDESCENDANTNODE(artifact,'/" + getRepositoryContentPath( repositoryId ) + "')"; } @@ -742,17 +770,7 @@ public class JcrMetadataRepository try { - Query query = jcrSession.getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 ); - ValueFactory valueFactory = jcrSession.getValueFactory(); - for ( Entry entry : bindings.entrySet() ) - { - query.bindValue( entry.getKey(), valueFactory.createValue( entry.getValue() ) ); - } - long start = Calendar.getInstance().getTimeInMillis(); - QueryResult result = query.execute(); - long end = Calendar.getInstance().getTimeInMillis(); - log.info( "JCR Query ran in {} milliseconds: {}", end - start, q ); - + QueryResult result = runNativeJcrQuery( jcrSession, q, bindingParam ); artifacts = new ArrayList<>(); RowIterator rows = result.getRows(); while ( rows.hasNext() ) @@ -774,6 +792,36 @@ public class JcrMetadataRepository return artifacts; } + public QueryResult runNativeJcrQuery( final Session jcrSession, final String q, final Map bindingParam) + throws MetadataRepositoryException + { + Map bindings; + if (bindingParam==null) { + bindings = new HashMap<>( ); + } else { + bindings = bindingParam; + } + + try + { + Query query = jcrSession.getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 ); + ValueFactory valueFactory = jcrSession.getValueFactory(); + for ( Entry entry : bindings.entrySet() ) + { + query.bindValue( entry.getKey(), valueFactory.createValue( entry.getValue() ) ); + } + long start = System.currentTimeMillis( ); + QueryResult result = query.execute(); + long end = System.currentTimeMillis( ); + log.info( "JCR Query ran in {} milliseconds: {}", end - start, q ); + return result; + } + catch ( RepositoryException e ) + { + throw new MetadataRepositoryException( e.getMessage(), e ); + } + } + @Override public List getArtifactsByProjectVersionMetadata( RepositorySession session, String key, String value, String repositoryId ) throws MetadataRepositoryException @@ -841,7 +889,7 @@ public class JcrMetadataRepository artifacts = new ArrayList<>(); for ( Node n : JcrUtils.getNodes( result ) ) { - if ( n.isNodeType( ARTIFACT_NODE_TYPE ) ) + if ( n.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE ) ) { artifacts.add( getArtifactFromNode( repositoryId, n ) ); } @@ -1061,7 +1109,7 @@ public class JcrMetadataRepository { for ( Node n : JcrUtils.getChildNodes( node ) ) { - if ( n.isNodeType( FACET_NODE_TYPE ) ) + if ( n.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE ) ) { String name = n.getName(); MetadataFacetFactory factory = metadataFacetFactories.get( name ); @@ -1202,7 +1250,7 @@ public class JcrMetadataRepository try { - return getNodeNames( getSession(session), path, NAMESPACE_NODE_TYPE ); + return getNodeNames( getSession(session), path, org.apache.archiva.metadata.repository.jcr.JcrConstants.NAMESPACE_NODE_TYPE ); } catch ( MetadataRepositoryException e ) { @@ -1216,7 +1264,7 @@ public class JcrMetadataRepository { try { - return getNodeNames( getSession(session), getNamespacePath( repositoryId, namespace ), PROJECT_NODE_TYPE ); + return getNodeNames( getSession(session), getNamespacePath( repositoryId, namespace ), org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE ); } catch ( MetadataRepositoryException e ) { @@ -1230,7 +1278,7 @@ public class JcrMetadataRepository { try { - return getNodeNames( getSession(session), getProjectPath( repositoryId, namespace, projectId ), PROJECT_VERSION_NODE_TYPE ); + return getNodeNames( getSession(session), getProjectPath( repositoryId, namespace, projectId ), org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE ); } catch ( MetadataRepositoryException e ) { @@ -1258,7 +1306,7 @@ public class JcrMetadataRepository for ( Node n : JcrUtils.getChildNodes( node ) ) { - if ( n.isNodeType( ARTIFACT_NODE_TYPE ) ) + if ( n.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE ) ) { if ( n.hasProperty( "version" ) ) { @@ -1297,7 +1345,7 @@ public class JcrMetadataRepository for ( Node node : JcrUtils.getChildNodes( nodeAtPath ) ) { - if ( node.isNodeType( PROJECT_VERSION_NODE_TYPE ) && StringUtils.equals( projectVersion, + if ( node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE ) && StringUtils.equals( projectVersion, node.getName() ) ) { node.remove(); @@ -1333,7 +1381,7 @@ public class JcrMetadataRepository for ( Node node : JcrUtils.getChildNodes( nodeAtPath ) ) { - if ( node.isNodeType( PROJECT_VERSION_NODE_TYPE ) // + if ( node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE ) // && StringUtils.equals( node.getName(), projectVersion ) ) { node.remove(); @@ -1363,7 +1411,7 @@ public class JcrMetadataRepository for ( Node n : JcrUtils.getChildNodes( node ) ) { - if ( n.isNodeType( ARTIFACT_NODE_TYPE ) ) + if ( n.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE ) ) { ArtifactMetadata artifactMetadata = getArtifactFromNode( repositoryId, n ); log.debug( "artifactMetadata: {}", artifactMetadata ); @@ -1409,7 +1457,7 @@ public class JcrMetadataRepository for ( Node n : JcrUtils.getChildNodes( node ) ) { - if ( n.isNodeType( ARTIFACT_NODE_TYPE ) ) + if ( n.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE ) ) { artifacts.add( getArtifactFromNode( repositoryId, n ) ); } @@ -1462,20 +1510,34 @@ public class JcrMetadataRepository } @Override - public List searchArtifacts( RepositorySession session, String repositoryId, String key, String text, boolean e ) + public List searchArtifacts( RepositorySession session, String repositoryId, String key, String text, boolean exact ) throws MetadataRepositoryException { final Session jcrSession = getSession( session ); String theKey = key == null ? "*" : "[" + key + "]"; String projectVersionCondition = - e ? "(projectVersion." + theKey + " = $value)" : "contains([projectVersion]." + theKey + ", $value)"; - String facetCondition = e ? "(facet." + theKey + " = $value)" : "contains([facet]." + theKey + ", $value)"; - String q = - "SELECT * FROM [" + PROJECT_VERSION_NODE_TYPE + "] AS projectVersion LEFT OUTER JOIN [" + 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( jcrSession, repositoryId, q, ImmutableMap.of( "value", text ) ); + exact ? "(projectVersion." + theKey + " = $value)" : "contains([projectVersion]." + theKey + ", $value)"; + String facetCondition = exact ? "(facet." + theKey + " = $value)" : "contains([facet]." + theKey + ", $value)"; + String descendantCondition = repositoryId == null ? + " AND [projectVersion].[jcr:path] LIKE '/repositories/%/content/%'" : + " AND ISDESCENDANTNODE(projectVersion,'/" + getRepositoryContentPath( repositoryId ) + "')"; + List result = new ArrayList<>( ); + if (key!=null && Arrays.binarySearch( PROJECT_VERSION_VERSION_PROPERTIES, key )>=0) + { + // We search only for project version properties if the key is a valid property name + String q1 = + "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE + + "] AS projectVersion LEFT OUTER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) WHERE " + projectVersionCondition + descendantCondition; + result.addAll(runJcrQuery( jcrSession, repositoryId, q1, ImmutableMap.of( "value", text ), false )); + } + String q2 = + "SELECT * FROM [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE + + "] AS projectVersion LEFT OUTER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE + + "] AS artifact ON ISCHILDNODE(artifact, projectVersion) LEFT OUTER JOIN [" + org.apache.archiva.metadata.repository.jcr.JcrConstants.FACET_NODE_TYPE + + "] AS facet ON ISCHILDNODE(facet, projectVersion) WHERE " + facetCondition + descendantCondition; + result.addAll( runJcrQuery( jcrSession, repositoryId, q2, ImmutableMap.of( "value", text ), false ) ); + return result; } private ArtifactMetadata getArtifactFromNode( String repositoryId, Node artifactNode ) @@ -1611,15 +1673,18 @@ public class JcrMetadataRepository private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType ) throws RepositoryException { - log.debug( "getOrAddNodeByPath" + baseNode + " " + name + " " + nodeType ); + log.debug( "getOrAddNodeByPath " + baseNode + " " + name + " " + nodeType ); Node node = baseNode; for ( String n : name.split( "/" ) ) { node = JcrUtils.getOrAddNode( node, n ); - if ( nodeType != null ) + if ( nodeType != null && !node.isNodeType( nodeType )) { node.addMixin( nodeType ); } + if (!node.hasProperty( "id" )) { + node.setProperty( "id", n ); + } } return node; } @@ -1636,7 +1701,13 @@ public class JcrMetadataRepository Node root = jcrSession.getRootNode(); Node node = JcrUtils.getOrAddNode( root, "repositories" ); log.debug( "Repositories " + node ); - node = JcrUtils.getOrAddNode( node, repositoryId ); + node = JcrUtils.getOrAddNode( node, repositoryId, JcrConstants.NT_UNSTRUCTURED ); + if (!node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.REPOSITORY_NODE_TYPE )) { + node.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.REPOSITORY_NODE_TYPE ); + } + if (!node.hasProperty( "id" )) { + node.setProperty( "id", repositoryId ); + } return node; } @@ -1651,7 +1722,7 @@ public class JcrMetadataRepository throws RepositoryException { Node repo = getOrAddRepositoryContentNode( jcrSession, repositoryId ); - return getOrAddNodeByPath( repo, namespace.replace( '.', '/' ), NAMESPACE_NODE_TYPE ); + return getOrAddNodeByPath( repo, namespace.replace( '.', '/' ), org.apache.archiva.metadata.repository.jcr.JcrConstants.NAMESPACE_NODE_TYPE ); } private Node getOrAddProjectNode( Session jcrSession, String repositoryId, String namespace, String projectId ) @@ -1659,7 +1730,14 @@ public class JcrMetadataRepository { Node namespaceNode = getOrAddNamespaceNode( jcrSession, repositoryId, namespace ); Node node = JcrUtils.getOrAddNode( namespaceNode, projectId ); - node.addMixin( PROJECT_NODE_TYPE ); + if (!node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE )) + { + node.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE ); + } + if (!node.hasProperty( "id" )) + { + node.setProperty( "id", projectId ); + } return node; } @@ -1668,9 +1746,19 @@ public class JcrMetadataRepository throws RepositoryException { Node projectNode = getOrAddProjectNode( jcrSession, repositoryId, namespace, projectId ); - Node node = JcrUtils.getOrAddNode( projectNode, projectVersion ); - node.addMixin( PROJECT_VERSION_NODE_TYPE ); - return node; + log.debug( "Project node {}", projectNode ); + Node projectVersionNode = JcrUtils.getOrAddNode( projectNode, projectVersion, JcrConstants.NT_UNSTRUCTURED); + if (!projectVersionNode.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE )) + { + projectVersionNode.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE ); + } + if (!projectVersionNode.hasProperty( "id" )) + { + projectVersionNode.setProperty( "id", projectVersion ); + } + + log.debug( "Project version node {}", projectVersionNode ); + return projectVersionNode; } private Node getOrAddArtifactNode( Session jcrSession, String repositoryId, String namespace, String projectId, String projectVersion, @@ -1678,8 +1766,14 @@ public class JcrMetadataRepository throws RepositoryException { Node versionNode = getOrAddProjectVersionNode( jcrSession, repositoryId, namespace, projectId, projectVersion ); - Node node = JcrUtils.getOrAddNode( versionNode, id ); - node.addMixin( ARTIFACT_NODE_TYPE ); + Node node = JcrUtils.getOrAddNode( versionNode, id); + if (!node.isNodeType( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE )) + { + node.addMixin( org.apache.archiva.metadata.repository.jcr.JcrConstants.ARTIFACT_NODE_TYPE ); + } + if (!node.hasProperty( "id" )) { + node.setProperty( "id", id ); + } return node; } diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySession.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySession.java new file mode 100644 index 000000000..c914c9a55 --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrRepositorySession.java @@ -0,0 +1,129 @@ +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.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.MetadataSessionException; +import org.apache.archiva.metadata.repository.RepositorySession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +/** + * + * Session implementation for a JCR repository. + * + * @author Martin Stockhammer + */ +public class JcrRepositorySession extends RepositorySession implements AutoCloseable +{ + + private static final Logger log = LoggerFactory.getLogger( JcrRepositorySession.class ); + + private Session jcrSession; + private JcrMetadataRepository repository; + + public JcrRepositorySession( JcrMetadataRepository metadataRepository, MetadataResolver resolver) throws RepositoryException + { + super( metadataRepository, resolver ); + this.repository = metadataRepository; + this.jcrSession = metadataRepository.login(); + } + + public Session getJcrSession() { + return jcrSession; + } + + public JcrMetadataRepository getJcrRepository() { + return repository; + } + + @Override + public void close( ) + { + super.close( ); + jcrSession.logout(); + } + + @Override + protected boolean isDirty( ) + { + if (super.isDirty()) { + return true; + } + try + { + return jcrSession.hasPendingChanges( ); + } + catch ( RepositoryException e ) + { + log.error( "Could not check pending changes {}", e.getMessage( ) ); + return true; + } + } + + @Override + public void save( ) throws MetadataSessionException + { + super.save( ); + try + { + jcrSession.save(); + } + catch ( RepositoryException e ) + { + throw new MetadataSessionException( e.getMessage( ), e ); + } + } + + @Override + public void revert( ) throws MetadataSessionException + { + super.revert( ); + try + { + jcrSession.refresh( false ); + } + catch ( RepositoryException e ) + { + throw new MetadataSessionException( e.getMessage( ), e ); + } + } + + @Override + public void refresh() throws MetadataSessionException { + try { + jcrSession.refresh(true); + } catch (RepositoryException e) { + throw new MetadataSessionException(e.getMessage(), e); + } + } + + @Override + public void refreshAndDiscard() throws MetadataSessionException { + try { + jcrSession.refresh(false); + } catch (RepositoryException e) { + throw new MetadataSessionException(e.getMessage(), e); + } + } +} 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 5e0e8dd34..f1f679822 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 @@ -62,7 +62,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor @Inject private RepositorySessionFactoryBean repositorySessionFactoryBean; - private RepositoryFactory repositoryFactory; + private OakRepositoryFactory repositoryFactory; private JcrMetadataRepository jcrMetadataRepository; @@ -71,7 +71,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor { try { - return new JcrSession( jcrMetadataRepository, getMetadataResolver() ); + return new JcrRepositorySession( jcrMetadataRepository, getMetadataResolver() ); } catch ( RepositoryException e ) { @@ -83,7 +83,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor // Lazy evaluation to avoid problems with circular dependencies during initialization private MetadataResolver getMetadataResolver() { - if ( this.metadataResolver == null ) + if ( this.metadataResolver == null && applicationContext!=null) { this.metadataResolver = applicationContext.getBean( MetadataResolver.class ); } @@ -126,7 +126,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor try { - repositoryFactory = new RepositoryFactory(); + repositoryFactory = new OakRepositoryFactory(); // FIXME this need to be configurable Path directoryPath = Paths.get( System.getProperty( "appserver.base" ), "data/jcr" ); repositoryFactory.setRepositoryPath( directoryPath ); @@ -137,7 +137,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor throw new RuntimeException("Fatal error. Could not create metadata repository."); } jcrMetadataRepository = new JcrMetadataRepository( metadataFacetFactories, repository ); - try (JcrSession session = new JcrSession( jcrMetadataRepository, metadataResolver )) { + try ( JcrRepositorySession session = new JcrRepositorySession( jcrMetadataRepository, metadataResolver )) { JcrMetadataRepository.initializeNodeTypes( session.getJcrSession() ); // Saves automatically with close } @@ -153,6 +153,7 @@ public class JcrRepositorySessionFactory extends AbstractRepositorySessionFactor @Override protected void shutdown() { + logger.info( "Shutting down JcrRepositorySessionFactory" ); repositoryFactory.close(); } diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrSession.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrSession.java deleted file mode 100644 index 4b4c455e0..000000000 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrSession.java +++ /dev/null @@ -1,129 +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.archiva.metadata.repository.MetadataResolver; -import org.apache.archiva.metadata.repository.MetadataSessionException; -import org.apache.archiva.metadata.repository.RepositorySession; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.jcr.RepositoryException; -import javax.jcr.Session; - -/** - * - * Session implementation for a JCR repository. - * - * @author Martin Stockhammer - */ -public class JcrSession extends RepositorySession implements AutoCloseable -{ - - private static final Logger log = LoggerFactory.getLogger( JcrSession.class ); - - private Session jcrSession; - private JcrMetadataRepository repository; - - public JcrSession( JcrMetadataRepository metadataRepository, MetadataResolver resolver) throws RepositoryException - { - super( metadataRepository, resolver ); - this.repository = metadataRepository; - this.jcrSession = metadataRepository.login(); - } - - public Session getJcrSession() { - return jcrSession; - } - - public JcrMetadataRepository getJcrRepository() { - return repository; - } - - @Override - public void close( ) - { - super.close( ); - jcrSession.logout(); - } - - @Override - protected boolean isDirty( ) - { - if (super.isDirty()) { - return true; - } - try - { - return jcrSession.hasPendingChanges( ); - } - catch ( RepositoryException e ) - { - log.error( "Could not check pending changes {}", e.getMessage( ) ); - return true; - } - } - - @Override - public void save( ) throws MetadataSessionException - { - super.save( ); - try - { - jcrSession.save(); - } - catch ( RepositoryException e ) - { - throw new MetadataSessionException( e.getMessage( ), e ); - } - } - - @Override - public void revert( ) throws MetadataSessionException - { - super.revert( ); - try - { - jcrSession.refresh( false ); - } - catch ( RepositoryException e ) - { - throw new MetadataSessionException( e.getMessage( ), e ); - } - } - - @Override - public void refresh() throws MetadataSessionException { - try { - jcrSession.refresh(true); - } catch (RepositoryException e) { - throw new MetadataSessionException(e.getMessage(), e); - } - } - - @Override - public void refreshAndDiscard() throws MetadataSessionException { - try { - jcrSession.refresh(false); - } catch (RepositoryException e) { - throw new MetadataSessionException(e.getMessage(), e); - } - } -} diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java new file mode 100644 index 000000000..677bf27d2 --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java @@ -0,0 +1,684 @@ +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.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.apache.commons.lang.time.StopWatch; +import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.plugins.index.AsyncIndexInfoService; +import org.apache.jackrabbit.oak.plugins.index.AsyncIndexInfoServiceImpl; +import org.apache.jackrabbit.oak.plugins.index.IndexInfoProvider; +import org.apache.jackrabbit.oak.plugins.index.IndexPathService; +import org.apache.jackrabbit.oak.plugins.index.IndexPathServiceImpl; +import org.apache.jackrabbit.oak.plugins.index.IndexUtils; +import org.apache.jackrabbit.oak.plugins.index.aggregate.SimpleNodeAggregator; +import org.apache.jackrabbit.oak.plugins.index.lucene.IndexAugmentorFactory; +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.LuceneIndexInfoProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.directory.ActiveDeletedBlobCollectorFactory; +import org.apache.jackrabbit.oak.plugins.index.lucene.directory.BufferedOakDirectory; +import org.apache.jackrabbit.oak.plugins.index.lucene.directory.LuceneIndexImporter; +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.property.PropertyIndexCleaner; +import org.apache.jackrabbit.oak.plugins.index.lucene.reader.DefaultIndexReaderFactory; +import org.apache.jackrabbit.oak.plugins.index.lucene.score.ScorerProviderFactory; +import org.apache.jackrabbit.oak.plugins.index.lucene.score.impl.ScorerProviderFactoryImpl; +import org.apache.jackrabbit.oak.plugins.index.lucene.util.IndexDefinitionBuilder; +import org.apache.jackrabbit.oak.plugins.index.search.ExtractedTextCache; +import org.apache.jackrabbit.oak.plugins.index.search.FulltextIndexConstants; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.plugins.name.Namespaces; +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.blob.FileBlobStore; +import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore; +import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver; +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.namespace.NamespaceConstants; +import org.apache.jackrabbit.oak.spi.query.QueryIndex; +import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; +import org.apache.jackrabbit.oak.spi.state.Clusterable; +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.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nonnull; +import javax.jcr.Repository; +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.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.apache.archiva.metadata.repository.jcr.OakRepositoryFactory.StoreType.IN_MEMORY_TYPE; +import static org.apache.archiva.metadata.repository.jcr.OakRepositoryFactory.StoreType.SEGMENT_FILE_TYPE; +import static org.apache.commons.io.FileUtils.ONE_MB; +import static org.apache.jackrabbit.JcrConstants.*; +import static org.apache.jackrabbit.oak.api.Type.NAME; +import static org.apache.archiva.metadata.repository.jcr.JcrConstants.*; +import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean; +import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.scheduleWithFixedDelay; + +/** + * Created by martin on 14.06.17. + * + * @author Martin Stockhammer + * @since 3.0.0 + */ +public class OakRepositoryFactory +{ + + private Logger log = LoggerFactory.getLogger( OakRepositoryFactory.class ); + + private FileStore fileStore; + + private NodeStore nodeStore; + + private IndexTracker tracker; + + private DocumentQueue documentQueue; + + private NRTIndexFactory nrtIndexFactory; + + private IndexCopier indexCopier; + + private ExecutorService executorService; + private ExtractedTextCache extractedTextCache; + + private boolean hybridIndex = true; + private boolean prefetchEnabled = true; + private boolean enableAsyncIndexOpen = true; + int queueSize = 10000; + int cleanerInterval = 10*60; + boolean enableCopyOnWrite = true; + boolean enableCopyOnRead = true; + int cacheSizeInMB = 20; + int cacheExpiryInSecs = 300; + int threadPoolSize = 5; + + private StatisticsProvider statisticsProvider; + + private MountInfoProvider mountInfoProvider = Mounts.defaultMountInfoProvider(); + + private AsyncIndexInfoService asyncIndexInfoService = null; + + private LuceneIndexProvider indexProvider; + + private ScorerProviderFactory scorerFactory = new ScorerProviderFactoryImpl( ); + private IndexAugmentorFactory augmentorFactory = new IndexAugmentorFactory( ); + + private ActiveDeletedBlobCollectorFactory.ActiveDeletedBlobCollector activeDeletedBlobCollector = ActiveDeletedBlobCollectorFactory.NOOP; + + private QueryIndex.NodeAggregator nodeAggregator = new SimpleNodeAggregator( ); + + private BackgroundObserver backgroundObserver; + + private BackgroundObserver externalIndexObserver; + + private GarbageCollectableBlobStore blobStore; + + private PropertyIndexCleaner cleaner; + + private IndexPathService indexPathService; + + private LuceneIndexEditorProvider editorProvider; + + private Path indexDir; + + public enum StoreType + { + SEGMENT_FILE_TYPE, + IN_MEMORY_TYPE; + } + + private StoreType storeType = SEGMENT_FILE_TYPE; + + private Path repositoryPath = Paths.get( "repository" ); + + public OakRepositoryFactory() { + final OakRepositoryFactory repositoryFactory = this; + Runtime.getRuntime().addShutdownHook( new Thread( ( ) -> { + if (repositoryFactory!=null) + { + repositoryFactory.close( ); + } + } ) ); + } + + private void initializeExtractedTextCache( StatisticsProvider statisticsProvider) { + boolean alwaysUsePreExtractedCache = false; + + extractedTextCache = new ExtractedTextCache( + cacheSizeInMB * ONE_MB, + cacheExpiryInSecs, + alwaysUsePreExtractedCache, + indexDir.toFile(), statisticsProvider); + } + + private IndexTracker createTracker() throws IOException { + IndexTracker tracker; + if (enableCopyOnRead){ + initializeIndexCopier(); + log.info("Enabling CopyOnRead support. Index files would be copied under {}", indexDir.toAbsolutePath()); + if (hybridIndex) { + nrtIndexFactory = new NRTIndexFactory(indexCopier, statisticsProvider); + } + tracker = new IndexTracker(new DefaultIndexReaderFactory(mountInfoProvider, indexCopier), nrtIndexFactory); + } else { + tracker = new IndexTracker(new DefaultIndexReaderFactory(mountInfoProvider, null)); + } + + tracker.setAsyncIndexInfoService(asyncIndexInfoService); + tracker.refresh(); + return tracker; + } + + private void initializeIndexCopier() throws IOException { + if(indexCopier != null){ + return; + } + + if (prefetchEnabled){ + log.info("Prefetching of index files enabled. Index would be opened after copying all new files locally"); + } + + indexCopier = new IndexCopier(getExecutorService(), indexDir.toFile(), prefetchEnabled); + + } + + ExecutorService getExecutorService(){ + if (executorService == null){ + executorService = createExecutor(); + } + return executorService; + } + + private ExecutorService createExecutor() { + ThreadPoolExecutor executor = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 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(@NotNull 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; + } + + private void initialize(){ + if(indexProvider == null){ + return; + } + + if(nodeAggregator != null){ + log.debug("Using NodeAggregator {}", nodeAggregator.getClass()); + } + + indexProvider.setAggregator(nodeAggregator); + } + + private void registerObserver() { + Observer observer = indexProvider; + if (enableAsyncIndexOpen) { + backgroundObserver = new BackgroundObserver(indexProvider, getExecutorService(), 5); + log.info("Registering the LuceneIndexProvider as a BackgroundObserver"); + } + } + + private void registerLocalIndexObserver(IndexTracker tracker) { + if (!hybridIndex){ + log.info("Hybrid indexing feature disabled"); + return; + } + documentQueue = new DocumentQueue( queueSize, tracker, getExecutorService(), statisticsProvider); + LocalIndexObserver localIndexObserver = new LocalIndexObserver(documentQueue, statisticsProvider); + + int observerQueueSize = 1000; + int builderMaxSize = 5000; + // regs.add(bundleContext.registerService(JournalPropertyService.class.getName(), + // new LuceneJournalPropertyService(builderMaxSize), null)); + ExternalObserverBuilder builder = new ExternalObserverBuilder(documentQueue, tracker, statisticsProvider, + getExecutorService(), observerQueueSize); + log.info("Configured JournalPropertyBuilder with max size {} and backed by BackgroundObserver " + + "with queue size {}", builderMaxSize, observerQueueSize); + + Observer observer = builder.build(); + externalIndexObserver = builder.getBackgroundObserver(); + log.info("Hybrid indexing enabled for configured indexes with queue size of {}", queueSize ); + } + + private IndexInfoProvider registerIndexInfoProvider() { + return new LuceneIndexInfoProvider(nodeStore, asyncIndexInfoService, getIndexCheckDir().toFile()); + } + + private Path getIndexCheckDir() { + return checkNotNull(indexDir).resolve("indexCheckDir"); + } + + private LuceneIndexImporter registerIndexImporterProvider() { + return new LuceneIndexImporter(blobStore); + } + + private void registerPropertyIndexCleaner( ) { + + if (cleanerInterval <= 0) { + log.info("Property index cleaner would not be registered"); + return; + } + + cleaner = new PropertyIndexCleaner(nodeStore, indexPathService, asyncIndexInfoService, statisticsProvider); + + //Proxy check for DocumentNodeStore + if (nodeStore instanceof Clusterable ) { + cleaner.setRecursiveDelete(true); + log.info("PropertyIndexCleaner configured to perform recursive delete"); + } + log.info("Property index cleaner configured to run every [{}] seconds", cleanerInterval); + } + + private void registerIndexEditor( IndexTracker tracker) throws IOException { + boolean enableCopyOnWrite = true; + if (enableCopyOnWrite){ + initializeIndexCopier(); + editorProvider = new LuceneIndexEditorProvider(indexCopier, tracker, extractedTextCache, + augmentorFactory, mountInfoProvider, activeDeletedBlobCollector, null, statisticsProvider); + log.info("Enabling CopyOnWrite support. Index files would be copied under {}", indexDir.toAbsolutePath()); + } else { + editorProvider = new LuceneIndexEditorProvider(null, tracker, extractedTextCache, augmentorFactory, + mountInfoProvider, activeDeletedBlobCollector, null, statisticsProvider); + } + editorProvider.setBlobStore(blobStore); + + if (hybridIndex){ + editorProvider.setIndexingQueue(checkNotNull(documentQueue)); + } + + + } + + public Repository createRepository() + throws IOException, InvalidFileStoreVersionException + { + + indexDir = repositoryPath.resolve( ".index-lucene" ); + if (!Files.exists( indexDir )) { + Files.createDirectories( indexDir ); + } + blobStore = new FileBlobStore( indexDir.resolve( "blobs" ).toAbsolutePath().toString() ); + + statisticsProvider = StatisticsProvider.NOOP; + + if ( SEGMENT_FILE_TYPE == storeType ) + { + fileStore = FileStoreBuilder.fileStoreBuilder( repositoryPath.toFile() ) + .withStatisticsProvider( statisticsProvider ) + .build(); + nodeStore = SegmentNodeStoreBuilders.builder( fileStore ) // + .withStatisticsProvider( statisticsProvider ) // + .build(); + } + else if ( IN_MEMORY_TYPE == storeType ) + { + nodeStore = new MemoryNodeStore( ); + } + else + { + throw new IllegalArgumentException( "Store type " + storeType + " not recognized" ); + } + + asyncIndexInfoService = new AsyncIndexInfoServiceImpl( nodeStore ); + + indexPathService = new IndexPathServiceImpl( nodeStore, mountInfoProvider ); + + BufferedOakDirectory.setEnableWritingSingleBlobIndexFile( true ); + + initializeExtractedTextCache( statisticsProvider ); + + tracker = createTracker(); + + indexProvider = new LuceneIndexProvider(tracker, scorerFactory, augmentorFactory); + + initialize(); + registerObserver(); + registerLocalIndexObserver(tracker); + registerIndexInfoProvider(); + registerIndexImporterProvider(); + registerPropertyIndexCleaner(); + + registerIndexEditor(tracker); + + + + RepositoryInitializer repoInitializer = new RepositoryInitializer( ) + { + private IndexDefinitionBuilder.PropertyRule initRegexAll( IndexDefinitionBuilder.IndexRule rule ) { + return rule + .indexNodeName( ) + .property(JCR_LASTMODIFIED ).propertyIndex().type( "Date" ).ordered() + .property(JCR_PRIMARYTYPE).propertyIndex() + .property(JCR_MIXINTYPES).propertyIndex() + .property(JCR_PATH).propertyIndex().ordered() + .property( FulltextIndexConstants.REGEX_ALL_PROPS, true ) + .propertyIndex().analyzed( ).nodeScopeIndex(); + } + + private IndexDefinitionBuilder.PropertyRule initBaseRule( IndexDefinitionBuilder.IndexRule rule ) { + return rule + .sync() + .indexNodeName( ) + .property(JCR_CREATED).propertyIndex().type("Date").ordered() + .property(JCR_LASTMODIFIED ).propertyIndex().type( "Date" ).ordered() + .property(JCR_PRIMARYTYPE).propertyIndex() + .property(JCR_MIXINTYPES).propertyIndex() + .property(JCR_PATH).propertyIndex().ordered() + .property( "id" ).propertyIndex().analyzed( ); + } + + @Override + public void initialize( @Nonnull NodeBuilder root ) + { + NodeBuilder namespaces; + if ( !root.hasChildNode( NamespaceConstants.REP_NAMESPACES ) ) + { + namespaces = Namespaces.createStandardMappings( root ); + Namespaces.buildIndexNode( namespaces ); // index node for faster lookup + } + else + { + namespaces = root.getChildNode( NamespaceConstants.REP_NAMESPACES ); + } + Namespaces.addCustomMapping( namespaces, "http://archiva.apache.org/jcr/", "archiva" ); + + log.info( "Creating index " ); + + NodeBuilder oakIdx = IndexUtils.getOrCreateOakIndex( root ); + if (!oakIdx.hasChildNode( "repo-lucene" )) + { + NodeBuilder lucene = oakIdx.child( "repo-lucene" ); + lucene.setProperty( JCR_PRIMARYTYPE, "oak:QueryIndexDefinition", NAME ); + + lucene.setProperty( "compatVersion", 2 ); + lucene.setProperty( "type", "lucene" ); + // lucene.setProperty("async", "async"); + // lucene.setProperty( INCLUDE_PROPERTY_TYPES, ImmutableSet.of( ), Type.STRINGS ); + // lucene.setProperty("refresh",true); + NodeBuilder rules = lucene.child( "indexRules" ). + setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ); + rules.setProperty( ":childOrder", ImmutableSet.of( + REPOSITORY_NODE_TYPE, + NAMESPACE_NODE_TYPE, // + PROJECT_NODE_TYPE, + PROJECT_VERSION_NODE_TYPE, // + ARTIFACT_NODE_TYPE, // + FACET_NODE_TYPE // + ), Type.STRINGS ); + IndexDefinitionBuilder idxBuilder = new IndexDefinitionBuilder( lucene ); + idxBuilder.async( "async", "nrt" ).includedPaths( "/repositories" ).evaluatePathRestrictions(); + + initBaseRule(idxBuilder.indexRule( REPOSITORY_NODE_TYPE )); + initBaseRule(idxBuilder.indexRule( NAMESPACE_NODE_TYPE )) + .property( "namespace" ).propertyIndex().analyzed(); + initBaseRule(idxBuilder.indexRule( PROJECT_NODE_TYPE )) + .property( "name" ).propertyIndex().analyzed().notNullCheckEnabled().nullCheckEnabled(); + initBaseRule( idxBuilder.indexRule( PROJECT_VERSION_NODE_TYPE ) ) + .property("name").propertyIndex().analyzed().notNullCheckEnabled().nullCheckEnabled() + .property("description").propertyIndex().analyzed().notNullCheckEnabled().nullCheckEnabled() + .property("url").propertyIndex().analyzed( ).notNullCheckEnabled().nullCheckEnabled() + .property("incomplete").type("Boolean").propertyIndex() + .property("mailinglist/name").propertyIndex().analyzed() + .property("license/license.name").propertyIndex().analyzed(); + initBaseRule(idxBuilder.indexRule( ARTIFACT_NODE_TYPE )) + .property( "whenGathered" ).type("Date").propertyIndex().analyzed().ordered() + .property("size").type("Long").propertyIndex().analyzed().ordered() + .property("version").propertyIndex().analyzed().ordered(); + initRegexAll( idxBuilder.indexRule( FACET_NODE_TYPE ) ); + idxBuilder.indexRule( MIXIN_META_SCM ) + .property( "scm.connection" ).propertyIndex() + .property( "scm.developerConnection" ).propertyIndex() + .property( "scm.url").type("URI").propertyIndex().analyzed(); + idxBuilder.indexRule( MIXIN_META_CI ) + .property( "ci.system" ).propertyIndex( ) + .property( "ci.ur" ).propertyIndex( ).analyzed( ); + idxBuilder.indexRule( MIXIN_META_ISSUE ) + .property( "issue.system").propertyIndex() + .property("issue.url").propertyIndex().analyzed(); + idxBuilder.indexRule( MIXIN_META_ORGANIZATION ) + .property( "org.name" ).propertyIndex( ).analyzed( ) + .property( "org.url" ).propertyIndex( ).analyzed( ); + idxBuilder.indexRule( MIXIN_META_LICENSE ) + .property( "license.name" ).propertyIndex( ).analyzed( ) + .property( "license.url" ).propertyIndex( ).analyzed( ); + idxBuilder.indexRule( MIXIN_META_MAILINGLIST ) + .property( "name" ).propertyIndex().analyzed(); + initBaseRule(idxBuilder.indexRule( DEPENDENCY_NODE_TYPE )) + .property( "groupId" ).propertyIndex().analyzed().ordered() + .property( "artifactId").propertyIndex().analyzed().ordered() + .property("version").propertyIndex().analyzed().ordered() + .property("type").propertyIndex().analyzed().ordered() + .property( "classifier" ).propertyIndex().ordered() + .property("scope").propertyIndex() + .property("systemPath").propertyIndex().analyzed() + .property("optional").type("Boolean").propertyIndex(); + + idxBuilder.aggregateRule( PROJECT_VERSION_NODE_TYPE ).include( "dependencies") + .path("dependencies/*" ).relativeNode(); + + idxBuilder.build( ); + + IndexUtils.createIndexDefinition( oakIdx, "baseIndexes", true, false, ImmutableList.of( "jcr:uuid", "rep:principalName" ), null ); + + log.info( "Index: {} repo-lucene: {}", lucene, lucene.getChildNode( "repo-lucene" ) ); + log.info( "repo-lucene Properties: {}", lucene.getChildNode( "repo-lucene" ).getProperties( ) ); + } else { + + NodeBuilder lucene = oakIdx.child( "repo-lucene" ); + lucene.setProperty( "reindex", true ); + log.info( "No Index update" ); + } + // IndexUtils.createIndexDefinition( ) + + } + }; + + // ExternalObserverBuilder builder = new ExternalObserverBuilder(queue, tracker, statsProvider, +// executorService, queueSize); +// Observer observer = builder.build(); +// builder.getBackgroundObserver(); + + + + log.info( "Starting Jcr repo with nodeStore {}", nodeStore ); + Jcr jcr = new Jcr( nodeStore ).with( editorProvider ) // + .with( backgroundObserver ) // + .with( externalIndexObserver ) + // .with(observer) + .with( (QueryIndexProvider) indexProvider ) + .with (repoInitializer) + .withAsyncIndexing( "async", 5 ); + // + //.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() + { + log.info( "Closing JCR RepositoryFactory" ); + if ( fileStore != null ) + { + fileStore.close(); + } + + if (backgroundObserver != null){ + backgroundObserver.close(); + } + + if (externalIndexObserver != null){ + externalIndexObserver.close(); + } + + if (indexProvider != null) { + indexProvider.close(); + indexProvider = null; + } + + if (documentQueue != null){ + try + { + documentQueue.close(); + } + catch ( IOException e ) + { + e.printStackTrace( ); + } + } + + if (nrtIndexFactory != null){ + try + { + nrtIndexFactory.close(); + } + catch ( IOException e ) + { + e.printStackTrace( ); + } + } + + //Close the copier first i.e. before executorService + if (indexCopier != null){ + try + { + indexCopier.close(); + } + catch ( IOException e ) + { + e.printStackTrace( ); + } + } + + if (executorService != null){ + executorService.shutdown(); + try + { + executorService.awaitTermination(1, TimeUnit.MINUTES); + } + catch ( InterruptedException e ) + { + e.printStackTrace( ); + } + } + + if (extractedTextCache != null) { + extractedTextCache.close(); + } + + } + + 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 ); + } + } + } + + +} 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 deleted file mode 100644 index d2f0b11e2..000000000 --- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/RepositoryFactory.java +++ /dev/null @@ -1,367 +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 com.google.common.collect.ImmutableSet; -import org.apache.commons.lang.time.StopWatch; -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.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.plugins.index.search.ExtractedTextCache; -import org.apache.jackrabbit.oak.plugins.name.Namespaces; -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.namespace.NamespaceConstants; -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.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.JcrConstants.JCR_PRIMARYTYPE; -import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; -import static org.apache.jackrabbit.oak.api.Type.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 -{ - - 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 ) - { - NodeBuilder namespaces; - if (!root.hasChildNode(NamespaceConstants.REP_NAMESPACES)) { - namespaces = Namespaces.createStandardMappings(root); - Namespaces.buildIndexNode(namespaces); // index node for faster lookup - } else { - namespaces = root.getChildNode(NamespaceConstants.REP_NAMESPACES); - } - Namespaces.addCustomMapping(namespaces, "http://archiva.apache.org/jcr/", "archiva"); - - log.info( "Creating index " ); - NodeBuilder lucene = IndexUtils.getOrCreateOakIndex( root ).child( "lucene" ); - lucene.setProperty( JCR_PRIMARYTYPE, "oak:QueryIndexDefinition", 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( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ); - rules.setProperty( ":childOrder", ImmutableSet.of( "archiva:projectVersion", // - "archiva:artifact", // - "archiva:facet", // - "archiva:namespace", // - "archiva:project" ), // - Type.STRINGS ); - NodeBuilder allProps = rules.child( "archiva:projectVersion" ) - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME)// - .child( "properties" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ) // - .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // - .setProperty( "indexNodeName", true ) // - .child( "allProps" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, 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") // - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME) - .child("properties") // - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME) // - .setProperty(":childOrder", ImmutableSet.of("allProps"), Type.STRINGS) // - .setProperty("indexNodeName", true) - .child("allProps") - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, 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" ) // - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME) - .child( "properties" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ) // - .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // - .setProperty( "indexNodeName", true ) // - .child( "allProps" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, 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" ) // - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME) - .child( "properties" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ) // - .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // - .setProperty( "indexNodeName", true ) // - .child( "allProps" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, 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" ) // - .setProperty(JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME) - .child( "properties" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME ) // - .setProperty( ":childOrder", ImmutableSet.of( "allProps" ), Type.STRINGS ) // - .setProperty( "indexNodeName", true ) // - .child( "allProps" ) // - .setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, 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 ); - Path indexDir = Files.createTempDirectory( "archiva_index" ); - log.info( "Queue Index {}", indexDir.toString() ); - IndexCopier indexCopier = new IndexCopier( executorService, indexDir.toFile(), 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/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd new file mode 100644 index 000000000..e63d5fdc5 --- /dev/null +++ b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd @@ -0,0 +1,108 @@ +/* + * 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. + */ + + +[archiva:base] abstract mixin + - id (string) + - jcr:lastModified (date) + +[archiva:repository] > archiva:base mixin + + content (archiva:content) primary + +[archiva:content] > archiva:base mixin + + * (archiva:namespace) multiple + +[archiva:namespace] > archiva:base mixin + - namespace (string) + + * (archiva:namespace) multiple + + * (archiva:project) multiple + +[archiva:project] > archiva:base mixin + - name (string) + + * (archiva:projectVersion) multiple + +[archiva:meta_scm] mixin + - scm.connection (string) + - scm.developerConnection (string) + - scm.url (uri) + +[archiva:meta_ci] mixin + - ci.system (string) + - ci.url (uri) + +[archiva:meta_issue] mixin + - issue.system (string) + - issue.url (uri) + +[archiva:meta_organization] mixin + - org.name (string) + - org.url (uri) + +[archiva:meta_license] > archiva:base mixin + - index (long) + - license.name (string) + - license.url (uri) + +[archiva:meta_mailinglist] > archiva:base + - index (long) + - name (string) + - archive (string) + - post (string) + - unsubscribe (string) + - subscribe (string) + - otherArchives (string) multiple + +[archiva:dependency] > archiva:base + - groupId (string) + - artifactId (string) + - version (string) + - type (string) + - classifier (string) + - scope (string) + - systemPath (string) + - optional (boolean) + +[archiva:dependencies] mixin + + * (archiva:dependency) multiple + +[archiva:checksum] + - type (string) + - value (string) + +[archiva:projectVersion] > archiva:base, archiva:meta_scm, archiva:meta_ci, archiva:meta_issue, archiva:meta_organization mixin + - name (string) + - description (string) + - url (uri) + - incomplete (boolean) + + * (archiva:artifact) multiple + + license (archiva:meta_license) multiple + + mailinglist (archiva:meta_mailinglist) multiple + + dependencies (archiva:dependencies) + + * (archiva:facet) multiple + +[archiva:artifact] > archiva:base mixin + - whenGathered (date) + - size (long) + - md5 (string) + - sha1 (string) + - version (string) + + checksum (archiva:checksum) multiple + + * (archiva:facet) multiple + +[archiva:facet] > archiva:base mixin \ 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 bb7b74acf..171d6be60 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 @@ -19,99 +19,164 @@ package org.apache.archiva.metadata.repository.jcr; * under the License. */ +import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; import org.apache.archiva.metadata.repository.DefaultMetadataResolver; -import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.MetadataRepositoryException; +import org.apache.archiva.metadata.repository.MetadataSessionException; +import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; -import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.springframework.context.ApplicationContext; +import org.junit.Test; -import javax.inject.Inject; -import javax.jcr.Repository; +import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.query.QueryResult; +import javax.jcr.query.Row; +import javax.jcr.query.RowIterator; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collection; import java.util.Map; +import static org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_VERSION_NODE_TYPE; +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Using static sessionFactory and repository, because initialization is expensive if we rebuild the whole repository for + * each test. + */ public class JcrMetadataRepositoryTest extends AbstractMetadataRepositoryTest { - @Inject - private ApplicationContext applicationContext; + private static JcrRepositorySessionFactory sessionFactory; + private static JcrMetadataRepository repository; - private static Repository jcrRepository; + @Override + public JcrMetadataRepository getRepository( ) + { + return repository; + } + + @Override + public JcrRepositorySessionFactory getSessionFactory( ) + { + return sessionFactory; + } @BeforeClass - public static void setupSpec() throws IOException, InvalidFileStoreVersionException + public static void setupSpec( ) throws IOException, InvalidFileStoreVersionException { Path directory = Paths.get( "target/test-repositories" ); - if (Files.exists(directory) ) + if ( Files.exists( directory ) ) { org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory ); } - RepositoryFactory factory = new RepositoryFactory(); - factory.setRepositoryPath( directory.toString()); - jcrRepository = factory.createRepository(); + + Map factories = createTestMetadataFacetFactories( ); + JcrRepositorySessionFactory jcrSessionFactory = new JcrRepositorySessionFactory( ); + jcrSessionFactory.setMetadataResolver( new DefaultMetadataResolver( ) ); + jcrSessionFactory.setMetadataFacetFactories( factories ); + + jcrSessionFactory.open( ); + sessionFactory = jcrSessionFactory; + repository = jcrSessionFactory.getMetadataRepository( ); + } @Before - @Override - public void setUp() - throws Exception + public void setup() throws MetadataRepositoryException, RepositoryException, MetadataSessionException { - super.setUp(); - - - Map factories = createTestMetadataFacetFactories(); - -// // TODO: probably don't need to use Spring for this -// jcrMetadataRepository = new JcrMetadataRepository( factories, jcrRepository ); -// -// try -// { -// Session session = jcrMetadataRepository.login(); -// -// // set up namespaces, etc. -// JcrMetadataRepository.initializeNodeTypes( session ); -// -// // removing content is faster than deleting and re-copying the files from target/jcr -// session.getRootNode().getNode( "repositories" ).remove(); -// session.save(); -// } -// catch ( RepositoryException e ) -// { -// // ignore -// } - - // this.repository = jcrMetadataRepository; - JcrRepositorySessionFactory jcrSessionFactory = new JcrRepositorySessionFactory(); - jcrSessionFactory.setMetadataResolver(new DefaultMetadataResolver()); - jcrSessionFactory.setMetadataFacetFactories(factories); - - jcrSessionFactory.open(); - this.sessionFactory = jcrSessionFactory; - this.repository = jcrSessionFactory.getMetadataRepository(); + try( JcrRepositorySession session = (JcrRepositorySession) getSessionFactory().createSession() ) { + Session jcrSession = session.getJcrSession( ); + if (jcrSession.itemExists( "/repositories/test" )) + { + jcrSession.removeItem( "/repositories/test" ); + session.save( ); + } + } + } + @AfterClass + public static void stopSpec( ) + throws Exception + { + if ( repository != null ) + { + try + { + repository.close( ); + } + catch ( Throwable e ) + { + // + } + } + if ( sessionFactory != null ) + { + try + { + sessionFactory.close( ); + } + catch ( Throwable e ) + { + // + } + } } - @After - @Override - public void tearDown() + @Test + public void testSearchArtifactsByKey( ) throws Exception { - repository.close(); - sessionFactory.close(); + try ( RepositorySession session = sessionFactory.createSession( ) ) + { + createArtifactWithData( session ); + } + + + tryAssert( ( ) -> { + try ( RepositorySession session = sessionFactory.createSession( ) ) + { + session.refreshAndDiscard( ); + Session jcrSession = ( (JcrRepositorySession) session ).getJcrSession( ); + assertThat(jcrSession.propertyExists( "/repositories/test/content/mytest/myproject/1.0/url" )).isTrue(); + + Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, false ); + assertThat( artifactsByProperty ).isNotNull( ).isNotEmpty( ); + } + } ); - super.tearDown(); } + @Test + public void testSearchArtifactsByKeyExact() + throws Exception { + try (RepositorySession session = sessionFactory.createSession()) + { + createArtifactWithData( session ); + } + try (RepositorySession session = sessionFactory.createSession()) + { + session.refreshAndDiscard(); + tryAssert(() -> { + Session jcrSession = ( (JcrRepositorySession) session ).getJcrSession( ); + assertThat(jcrSession.propertyExists( "/repositories/test/content/mytest/myproject/1.0/url" )).isTrue(); + Collection artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "url", TEST_URL, true); + assertThat(artifactsByProperty).describedAs( "Artifact search by url=%s must give a result.", TEST_URL ).isNotNull().isNotEmpty(); + artifactsByProperty = repository.searchArtifacts( session, TEST_REPO_ID, "org.name", "pache", true ); + assertThat( artifactsByProperty ).describedAs( "Artifact search by text org.name='pache' must be empty" ).isNotNull( ).isEmpty( ); + } ); + } + } } 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 e123284d2..6fe7da2b4 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 @@ -22,26 +22,25 @@ package org.apache.archiva.metadata.repository.stats; import junit.framework.TestCase; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; +import org.apache.archiva.metadata.repository.DefaultMetadataResolver; +import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.RepositorySession; -import org.apache.archiva.metadata.repository.RepositorySessionFactory; import org.apache.archiva.metadata.repository.jcr.JcrMetadataRepository; import org.apache.archiva.metadata.repository.jcr.JcrRepositorySessionFactory; -import org.apache.archiva.metadata.repository.jcr.RepositoryFactory; +import org.apache.archiva.metadata.repository.jcr.JcrRepositorySession; import org.apache.archiva.metadata.repository.stats.model.DefaultRepositoryStatistics; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.jackrabbit.commons.JcrUtils; import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; import org.junit.After; -import org.junit.Before; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; -import javax.inject.Inject; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; import javax.jcr.Repository; @@ -69,15 +68,8 @@ public class JcrRepositoryStatisticsGatheringTest private static final String TEST_REPO = "test-repo"; - JcrMetadataRepository repository; - JcrRepositorySessionFactory sessionFactory; - - - @Inject - private RepositorySessionFactory repositorySessionFactory; - - @Inject - private ApplicationContext applicationContext; + static JcrMetadataRepository repository; + static JcrRepositorySessionFactory sessionFactory; Session jcrSession; @@ -94,45 +86,38 @@ public class JcrRepositoryStatisticsGatheringTest { org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory ); } - RepositoryFactory factory = new RepositoryFactory(); - factory.setRepositoryPath( directory.toString() ); - factory.setStoreType( RepositoryFactory.StoreType.IN_MEMORY_TYPE ); - jcrRepository = factory.createRepository(); - } + directory = Paths.get( "target/jcr" ); + if (Files.exists( directory )) { + org.apache.archiva.common.utils.FileUtils.deleteDirectory( directory ); + } + Map factories = AbstractMetadataRepositoryTest.createTestMetadataFacetFactories(); - @Before - public void setUp() - throws Exception - { - Map factories = AbstractMetadataRepositoryTest.createTestMetadataFacetFactories(); + JcrRepositorySessionFactory jcrSessionFactory = new JcrRepositorySessionFactory(); + jcrSessionFactory.setMetadataResolver(new DefaultMetadataResolver()); + jcrSessionFactory.setMetadataFacetFactories(factories); - assertNotNull( jcrRepository ); - // TODO: probably don't need to use Spring for this - JcrMetadataRepository jcrMetadataRepository = new JcrMetadataRepository( factories, jcrRepository ); + jcrSessionFactory.open(); + sessionFactory = jcrSessionFactory; + repository = jcrSessionFactory.getMetadataRepository(); + } - jcrSession = jcrMetadataRepository.login(); + @AfterClass + public static void stopSpec() { try { - jcrSession = jcrMetadataRepository.login(); - - // set up namespaces, etc. - JcrMetadataRepository.initializeNodeTypes(jcrSession); - - // removing content is faster than deleting and re-copying the files from target/jcr - jcrSession.getRootNode().getNode( "repositories" ).remove(); + repository.close(); } - catch ( RepositoryException e ) + catch ( MetadataRepositoryException e ) { - // ignore + e.printStackTrace( ); } - - this.repository = jcrMetadataRepository; - this.sessionFactory = new JcrRepositorySessionFactory(); + sessionFactory.close(); } + private static void registerMixinNodeType( NodeTypeManager nodeTypeManager, String type ) throws RepositoryException { @@ -148,8 +133,22 @@ public class JcrRepositoryStatisticsGatheringTest { if ( repository != null ) { - repository.close(); + try + { + repository.close( ); + } catch (Throwable e) { + // + } + } + if (sessionFactory!=null) { + try + { + sessionFactory.close( ); + } catch (Throwable e) { + // + } } + super.tearDown(); } @@ -163,8 +162,8 @@ public class JcrRepositoryStatisticsGatheringTest cal.add(Calendar.HOUR, -1); Date startTime = cal.getTime(); - loadContentIntoRepo(TEST_REPO); - loadContentIntoRepo("another-repo"); + loadContentIntoRepo(repSession, TEST_REPO); + loadContentIntoRepo( repSession, "another-repo"); DefaultRepositoryStatistics testedStatistics = new DefaultRepositoryStatistics(); testedStatistics.setNewFileCount(NEW_FILE_COUNT); @@ -214,17 +213,18 @@ public class JcrRepositoryStatisticsGatheringTest } } - private void loadContentIntoRepo( String repoId ) - throws RepositoryException, IOException + private void loadContentIntoRepo( RepositorySession repoSession, String repoId ) + throws RepositoryException, IOException, MetadataRepositoryException { - Node n = JcrUtils.getOrAddNode( jcrSession.getRootNode(), "repositories" ); + jcrSession = ((JcrRepositorySession) repoSession).getJcrSession(); + Node n = JcrUtils.getOrAddNode( jcrSession.getRootNode( ), "repositories" ); n = JcrUtils.getOrAddNode( n, repoId ); n = JcrUtils.getOrAddNode( n, "content" ); n = JcrUtils.getOrAddNode( n, "org" ); n = JcrUtils.getOrAddNode( n, "apache" ); - GZIPInputStream inputStream = new GZIPInputStream( getClass().getResourceAsStream( "/artifacts.xml.gz" ) ); - jcrSession.importXML( n.getPath(), inputStream, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW ); - jcrSession.save(); + GZIPInputStream inputStream = new GZIPInputStream( getClass( ).getResourceAsStream( "/artifacts.xml.gz" ) ); + jcrSession.importXML( n.getPath( ), inputStream, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW ); + jcrSession.save( ); } } 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 index a2eb7abe3..b9911476e 100644 --- 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 @@ -29,8 +29,10 @@ - - + + + +