Implementing stream methods. Changing date arguments to java time API.

This commit is contained in:
Martin Stockhammer 2019-08-20 10:01:49 +02:00
parent d4ce38836d
commit 7a5bc65de4
9 changed files with 153 additions and 105 deletions

View File

@ -32,6 +32,11 @@
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@ -91,14 +96,14 @@ public SyndFeed process( Map<String, String> reqParams )
private SyndFeed processNewArtifactsInRepo( String repoId )
throws FeedException
{
Calendar greaterThanThisDate = Calendar.getInstance( GMT_TIME_ZONE );
greaterThanThisDate.add( Calendar.DATE, -( getNumberOfDaysBeforeNow() ) );
greaterThanThisDate.clear( Calendar.MILLISECOND );
ZonedDateTime greaterThanThisDate = ZonedDateTime.of(LocalDateTime.now(), GMT_TIME_ZONE.toZoneId()).minusDays(
getNumberOfDaysBeforeNow()
).truncatedTo(ChronoUnit.SECONDS);
List<ArtifactMetadata> artifacts;
try(RepositorySession session = repositorySessionFactory.createSession())
{
artifacts = session.getRepository().getArtifactsByDateRange(session , repoId, greaterThanThisDate.getTime(), null );
artifacts = session.getRepository().getArtifactsByDateRange(session , repoId, greaterThanThisDate, null );
}
catch ( MetadataRepositoryException e )
{

View File

@ -23,9 +23,7 @@
import com.sun.syndication.feed.synd.SyndFeed;
import junit.framework.TestCase;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.MetadataFacet;
import org.apache.archiva.metadata.repository.AbstractMetadataRepository;
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.rss.RssFeedGenerator;
@ -37,6 +35,7 @@
import org.junit.runner.RunWith;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@ -44,7 +43,6 @@
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.stream.Stream;
@RunWith (ArchivaBlockJUnit4ClassRunner.class)
public class NewArtifactsRssFeedProcessorTest
@ -119,7 +117,7 @@ public void testProcess()
// check that the date used in the call is close to the one passed (5 seconds difference at most)
Calendar cal = Calendar.getInstance( TimeZone.getTimeZone( "GMT" ) );
cal.add( Calendar.DATE, -30 );
assertTrue( ( metadataRepository.getFrom().getTime() - cal.getTimeInMillis() ) < 1000 * 5 );
assertTrue( metadataRepository.getFrom().minus(cal.getTimeInMillis(), ChronoUnit.MILLIS).toInstant().toEpochMilli() < 1000 * 5 );
assertEquals( null, metadataRepository.getTo() );
assertEquals( TEST_REPO, metadataRepository.getRepoId() );
@ -153,7 +151,7 @@ private ArtifactMetadata createArtifact( String artifactId, String version, Date
private class MetadataRepositoryMock
extends AbstractMetadataRepository
{
private Date from, to;
private ZonedDateTime from, to;
private String repoId;
@ -162,7 +160,7 @@ private class MetadataRepositoryMock
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repoId, Date from, Date to )
public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repoId, ZonedDateTime from, ZonedDateTime to )
{
setRepoId( repoId );
setFrom( from );
@ -170,22 +168,22 @@ public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session
return artifactsByDateRange;
}
public void setFrom( Date from )
public void setFrom(ZonedDateTime from )
{
this.from = from;
}
public Date getFrom()
public ZonedDateTime getFrom()
{
return from;
}
public void setTo( Date to )
public void setTo(ZonedDateTime to )
{
this.to = to;
}
public Date getTo()
public ZonedDateTime getTo()
{
return to;
}

View File

@ -23,6 +23,7 @@
import org.apache.archiva.metadata.repository.AbstractMetadataRepository;
import org.apache.archiva.metadata.repository.RepositorySession;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -89,7 +90,7 @@ public void removeMetadataFacet( RepositorySession session, String repoId, Strin
}
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repoId, Date startTime, Date endTime )
public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repoId, ZonedDateTime startTime, ZonedDateTime endTime )
{
return artifacts;
}

View File

@ -28,7 +28,6 @@
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
@ -112,7 +111,7 @@ public void removeMetadataFacet( RepositorySession session, String repositoryId,
}
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repositoryId, Date startTime, Date endTime )
public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime )
throws MetadataRepositoryException
{
throw new UnsupportedOperationException();

View File

@ -24,12 +24,9 @@
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
import org.apache.maven.index_shaded.lucene.util.packed.DirectMonotonicReader;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;
@ -192,25 +189,51 @@ MetadataFacet getMetadataFacet( RepositorySession session, String repositoryId,
throws MetadataRepositoryException;
/**
* Returns the facet instance using the proper class.
* Returns the facet instance for the given class, which is stored on repository level for the given name.
* If the given name does not point to a instance that can be represented by this class, <code>null</code> will be returned.
* If the facet is not found the method returns <code>null</code>.
*
* @param session The repository session
* @param repositoryId The repository
* @param repositoryId The id of the repository
* @param clazz The facet object class
* @param name The name of the facet
* @param <T> The facet object
* @return The facet instance if it exists.
* @param name The name of the facet (name or path)
* @param <T> The type of the facet object
* @return The facet instance, if it exists.
* @throws MetadataRepositoryException
*/
<T extends MetadataFacet> T getMetadataFacet(RepositorySession session, String repositoryId, Class<T> clazz, String name)
throws MetadataRepositoryException;
/**
* Adss a facet to the repository level.
*
* @param session The repository session
* @param repositoryId The id of the repository
* @param metadataFacet The facet to add
* @throws MetadataRepositoryException if the facet cannot be stored.
*/
void addMetadataFacet( RepositorySession session, String repositoryId, MetadataFacet metadataFacet )
throws MetadataRepositoryException;
/**
* Removes all facets with the given facetId from the repository level.
*
* @param session The repository session
* @param repositoryId The id of the repository
* @param facetId The facet id
* @throws MetadataRepositoryException if the removal fails
*/
void removeMetadataFacets( RepositorySession session, String repositoryId, String facetId )
throws MetadataRepositoryException;
/**
* Removes the given facet from the repository level, if it exists.
*
* @param session The repository session
* @param repositoryId The id of the repository
* @param facetId The facet id
* @param name The facet name or path
*/
void removeMetadataFacet( RepositorySession session, String repositoryId, String facetId, String name )
throws MetadataRepositoryException;
@ -225,9 +248,18 @@ void removeMetadataFacet( RepositorySession session, String repositoryId, String
* @return
* @throws MetadataRepositoryException
*/
List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repositoryId, Date startTime, Date endTime )
List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime )
throws MetadataRepositoryException;
/**
* Returns all the artifacts
* @param session
* @param repositoryId
* @param startTime
* @param endTime
* @return
* @throws MetadataRepositoryException
*/
Stream<ArtifactMetadata> getArtifactsByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime )
throws MetadataRepositoryException;

View File

@ -35,7 +35,10 @@
import org.springframework.test.context.ContextConfiguration;
import java.text.SimpleDateFormat;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -1221,7 +1224,7 @@ public void testGetArtifactsByDateRangeLowerBound( )
getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
session.save( );
Date date = new Date( artifact.getWhenGathered( ).getTime( ) - 10000 );
ZonedDateTime date = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).minusSeconds(10);
tryAssert( ( ) -> {
List<ArtifactMetadata> artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, date, null );
@ -1240,7 +1243,7 @@ public void testGetArtifactsByDateRangeLowerBoundOutOfRange( )
ArtifactMetadata artifact = createArtifact( );
getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
Date date = new Date( artifact.getWhenGathered( ).getTime( ) + 10000 );
ZonedDateTime date = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).plusSeconds(10);
tryAssert( ( ) -> {
List<ArtifactMetadata> artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, date, null );
@ -1260,8 +1263,8 @@ public void testGetArtifactsByDateRangeLowerAndUpperBound( )
getRepository( ).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 );
ZonedDateTime lower = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).minusSeconds(10);
ZonedDateTime upper = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).plusSeconds(10);
tryAssert( ( ) -> {
List<ArtifactMetadata> artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, lower, upper );
@ -1281,7 +1284,7 @@ public void testGetArtifactsByDateRangeUpperBound( )
getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
session.save( );
Date upper = new Date( artifact.getWhenGathered( ).getTime( ) + 10000 );
ZonedDateTime upper = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).plusSeconds(10);
tryAssert( ( ) -> {
List<ArtifactMetadata> artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, upper );
@ -1301,7 +1304,7 @@ public void testGetArtifactsByDateRangeUpperBoundOutOfRange( )
getRepository( ).updateArtifact( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
session.save( );
Date upper = new Date( artifact.getWhenGathered( ).getTime( ) - 10000 );
ZonedDateTime upper = ZonedDateTime.from(artifact.getWhenGathered().toInstant()).minusSeconds(10);
tryAssert( ( ) -> {
List<ArtifactMetadata> artifacts = getRepository( ).getArtifactsByDateRange( session, TEST_REPO_ID, null, upper );

View File

@ -64,7 +64,6 @@
import org.apache.archiva.metadata.repository.cassandra.model.Project;
import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel;
import org.apache.archiva.metadata.repository.cassandra.model.Repository;
import org.apache.archiva.repository.RepositoryException;
import org.apache.commons.lang.StringUtils;
import org.modelmapper.ModelMapper;
import org.slf4j.Logger;
@ -1748,8 +1747,8 @@ public void removeMetadataFacet( RepositorySession session, final String reposit
}
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, final String repositoryId, final Date startTime,
final Date endTime )
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, final String repositoryId, final ZonedDateTime startTime,
final ZonedDateTime endTime )
throws MetadataRepositoryException
{
@ -1761,11 +1760,11 @@ public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session
if ( startTime != null )
{
query = query.addGteExpression( WHEN_GATHERED.toString(), startTime.getTime() );
query = query.addGteExpression( WHEN_GATHERED.toString(), startTime.toInstant().toEpochMilli() );
}
if ( endTime != null )
{
query = query.addLteExpression( WHEN_GATHERED.toString(), endTime.getTime() );
query = query.addLteExpression( WHEN_GATHERED.toString(), endTime.toInstant().toEpochMilli() );
}
QueryResult<OrderedRows<String, String, Long>> result = query.execute();

View File

@ -486,7 +486,7 @@ public void removeMetadataFacet( RepositorySession session, String repoId, Strin
}
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repoId, Date startTime, Date endTime )
public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repoId, ZonedDateTime startTime, ZonedDateTime endTime )
throws MetadataRepositoryException
{
try
@ -520,8 +520,8 @@ public Stream<ArtifactMetadata> getArtifactsByDateRangeStream( RepositorySession
return null;
}
private void getArtifactsByDateRange( RepositorySession session, List<ArtifactMetadata> artifacts, String repoId, String ns, Date startTime,
Date endTime )
private void getArtifactsByDateRange( RepositorySession session, List<ArtifactMetadata> artifacts, String repoId, String ns, ZonedDateTime startTime,
ZonedDateTime endTime )
throws MetadataRepositoryException
{
try
@ -537,9 +537,9 @@ private void getArtifactsByDateRange( RepositorySession session, List<ArtifactMe
{
for ( ArtifactMetadata artifact : getArtifacts( session, repoId, ns, project, version ) )
{
if ( startTime == null || startTime.before( artifact.getWhenGathered() ) )
if ( startTime == null || startTime.isBefore( ZonedDateTime.from(artifact.getWhenGathered().toInstant()) ) )
{
if ( endTime == null || endTime.after( artifact.getWhenGathered() ) )
if ( endTime == null || endTime.isAfter( ZonedDateTime.from(artifact.getWhenGathered().toInstant()) ) )
{
artifacts.add( artifact );
}

View File

@ -73,20 +73,8 @@
import java.io.InputStreamReader;
import java.io.Reader;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
@ -549,15 +537,18 @@ public <T extends MetadataFacet> Stream<T> getMetadataFacetStream( RepositorySes
final MetadataFacetFactory<T> factory = metadataService.getFactory( facetClazz );
final String facetId = factory.getFacetId( );
final String facetPath = '/'+getFacetPath( repositoryId, facetId );
String q = "SELECT * FROM ["+FACET_NODE_TYPE+"] AS facet WHERE ISDESCENDANTNODE(facet, ["+facetPath+"]) ORDER BY [facet].[archiva:name]";
Map<String, String> params = new HashMap<>( );
StringBuilder query = new StringBuilder("SELECT * FROM [");
query.append(FACET_NODE_TYPE).append("] AS facet WHERE ISDESCENDANTNODE(facet, [")
.append(facetPath).append("]) ORDER BY [facet].[archiva:name]");
String q = query.toString();
Map<String, String> params = new HashMap<>( );
QueryResult result = runNativeJcrQuery( jcrSession, q, params, offset, maxEntries );
return StreamSupport.stream( createResultSpliterator( result, (Row row)-> {
try
{
Node node = row.getNode( "facet" );
String facetName = node.getProperty( "archiva:name" ).getString();
return createFacet( factory, node, repositoryId, facetName );
return createFacetFromNode( factory, node, repositoryId, facetName );
}
catch ( RepositoryException e )
{
@ -606,7 +597,7 @@ public <T extends MetadataFacet> T getMetadataFacet( RepositorySession session,
return null;
}
return createFacet( factory, node, repositoryId, name );
return createFacetFromNode( factory, node, repositoryId, name );
}
catch ( PathNotFoundException e )
{
@ -619,12 +610,21 @@ public <T extends MetadataFacet> T getMetadataFacet( RepositorySession session,
return null;
}
@Nullable
private <T extends MetadataFacet> T createFacet( MetadataFacetFactory<T> factory, Node node, String repositoryId, String name ) throws RepositoryException
private <T extends MetadataFacet> T createFacetFromNode(final MetadataFacetFactory<T> factory, final Node node) throws RepositoryException {
return createFacetFromNode(factory, node, null, null);
}
private <T extends MetadataFacet> T createFacetFromNode(final MetadataFacetFactory<T> factory, final Node node,
final String repositoryId, final String name ) throws RepositoryException
{
if ( factory != null )
{
T metadataFacet = factory.createMetadataFacet( repositoryId, name );
T metadataFacet;
if (repositoryId!=null) {
metadataFacet = factory.createMetadataFacet( repositoryId, name );
} else {
metadataFacet = factory.createMetadataFacet();
}
Map<String, String> map = new HashMap<>();
for ( Property property : JcrUtils.getProperties( node ) )
{
@ -745,38 +745,53 @@ public void removeMetadataFacet( RepositorySession session, String repositoryId,
}
}
private String buildArtifactByDateRangeQuery(String repoId, ZonedDateTime startTime, ZonedDateTime endTime) {
StringBuilder q = getArtifactQuery( repoId );
if ( startTime != null )
{
q.append(" AND [artifact].[whenGathered] >= $start");
}
if ( endTime != null )
{
q.append(" AND [artifact].[whenGathered] <= $end");
}
q.append(" ORDER BY [artifact].[whenGathered]");
return q.toString();
}
private QueryResult queryArtifactByDateRange(Session jcrSession, String repositoryId,
ZonedDateTime startTime, ZonedDateTime endTime,
long offset, long maxEntries) throws MetadataRepositoryException {
String q = buildArtifactByDateRangeQuery(repositoryId, startTime, endTime);
try {
Query query = jcrSession.getWorkspace().getQueryManager().createQuery(q, Query.JCR_SQL2);
query.setOffset(offset);
query.setLimit(maxEntries);
ValueFactory valueFactory = jcrSession.getValueFactory();
if (startTime != null) {
query.bindValue("start", valueFactory.createValue(createCalendar(startTime)));
}
if (endTime != null) {
query.bindValue("end", valueFactory.createValue(createCalendar(endTime)));
}
return query.execute();
} catch (RepositoryException e) {
throw new MetadataRepositoryException(e.getMessage(), e);
}
}
@Override
public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repoId, Date startTime, Date endTime )
public List<ArtifactMetadata> getArtifactsByDateRange(RepositorySession session, String repoId, ZonedDateTime startTime, ZonedDateTime endTime )
throws MetadataRepositoryException
{
final Session jcrSession = getSession( session );
List<ArtifactMetadata> artifacts;
String q = getArtifactQuery( repoId );
if ( startTime != null )
{
q += " AND [whenGathered] >= $start";
}
if ( endTime != null )
{
q += " AND [whenGathered] <= $end";
}
try
{
Query query = jcrSession.getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 );
ValueFactory valueFactory = jcrSession.getValueFactory();
if ( startTime != null )
{
query.bindValue( "start", valueFactory.createValue( createCalendar( startTime ) ) );
}
if ( endTime != null )
{
query.bindValue( "end", valueFactory.createValue( createCalendar( endTime ) ) );
}
QueryResult result = query.execute();
QueryResult result = queryArtifactByDateRange(jcrSession, repoId, startTime, endTime, 0, Long.MAX_VALUE);
artifacts = new ArrayList<>();
for ( Node n : JcrUtils.getNodes( result ) )
@ -794,7 +809,15 @@ public List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session
@Override
public Stream<ArtifactMetadata> getArtifactsByDateRangeStream( RepositorySession session, String repositoryId, ZonedDateTime startTime, ZonedDateTime endTime, long offset, long maxEntries ) throws MetadataRepositoryException
{
return null;
final Session jcrSession = getSession( session );
QueryResult result = queryArtifactByDateRange(jcrSession, repositoryId, startTime, endTime, offset, maxEntries);
return StreamSupport.stream(createResultSpliterator(result, (row) -> {
try {
return getArtifactFromNode(repositoryId, row.getNode("artifact"));
} catch (RepositoryException e) {
return null;
}
}), false);
}
@ -970,7 +993,7 @@ public List<ArtifactMetadata> getArtifacts( RepositorySession session, String re
final Session jcrSession = getSession( session );
List<ArtifactMetadata> artifacts;
String q = getArtifactQuery( repositoryId );
String q = getArtifactQuery( repositoryId ).toString();
try
{
@ -993,9 +1016,9 @@ public List<ArtifactMetadata> getArtifacts( RepositorySession session, String re
return artifacts;
}
private static String getArtifactQuery( String repositoryId )
private static StringBuilder getArtifactQuery( String repositoryId )
{
return new StringBuilder(QUERY_ARTIFACT_1).append(getRepositoryContentPath( repositoryId )).append(QUERY_ARTIFACT_2).toString();
return new StringBuilder(QUERY_ARTIFACT_1).append(getRepositoryContentPath( repositoryId )).append(QUERY_ARTIFACT_2);
}
@Override
@ -1210,17 +1233,7 @@ private void retrieveFacetProperties( FacetedMetadata metadata, Node node ) thro
}
else
{
MetadataFacet facet = factory.createMetadataFacet();
Map<String, String> map = new HashMap<>();
for ( Property property : JcrUtils.getProperties( n ) )
{
String p = property.getName();
if ( !p.startsWith( "jcr:" ) )
{
map.put( p, property.getString() );
}
}
facet.fromProperties( map );
MetadataFacet facet = createFacetFromNode(factory, n);
metadata.addFacet( facet );
}
}
@ -1869,11 +1882,9 @@ private Node getOrAddArtifactNode( Session jcrSession, String repositoryId, Stri
return node;
}
private static Calendar createCalendar( Date time )
private static Calendar createCalendar( ZonedDateTime time )
{
Calendar cal = Calendar.getInstance();
cal.setTime( time );
return cal;
return GregorianCalendar.from(time);
}
private String join( Collection<String> ids )