Skip to content

Commit

Permalink
Ability to have unknown parts of multi-part ProgressListener
Browse files Browse the repository at this point in the history
where the unknown parts won't affect total count and instead be seen
as periods where no progress is happening.
  • Loading branch information
tinwelint committed Jan 12, 2017
1 parent 18dde83 commit c50a0d9
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 13 deletions.
Expand Up @@ -39,7 +39,10 @@ public RecordScanner( String name, Statistics statistics, int threads, BoundedIt
super( name, statistics, threads ); super( name, statistics, threads );
this.store = store; this.store = store;
this.processor = processor; this.processor = processor;
this.progress = builder.progressForPart( name, store.maxCount() ); long maxCount = store.maxCount();
this.progress = maxCount == -1
? builder.progressForUnknownPart( name )
: builder.progressForPart( name, maxCount );
this.warmUpStores = warmUpStores; this.warmUpStores = warmUpStores;
} }


Expand Down
Expand Up @@ -28,9 +28,9 @@


final class Aggregator final class Aggregator
{ {
private final Map<ProgressListener.MultiPartProgressListener, ProgressListener.MultiPartProgressListener.State> states = private final Map<ProgressListener, ProgressListener.MultiPartProgressListener.State> states =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
private Indicator indicator; private final Indicator indicator;
@SuppressWarnings("unused"/*accessed through updater*/) @SuppressWarnings("unused"/*accessed through updater*/)
private volatile long progress; private volatile long progress;
@SuppressWarnings("unused"/*accessed through updater*/) @SuppressWarnings("unused"/*accessed through updater*/)
Expand All @@ -46,10 +46,10 @@ public Aggregator( Indicator indicator )
this.indicator = indicator; this.indicator = indicator;
} }


synchronized void add( ProgressListener.MultiPartProgressListener progress ) synchronized void add( ProgressListener progress, long totalCount )
{ {
states.put( progress, ProgressListener.MultiPartProgressListener.State.INIT ); states.put( progress, ProgressListener.MultiPartProgressListener.State.INIT );
this.totalCount += progress.totalCount; this.totalCount += totalCount;
} }


synchronized Completion initialize() synchronized Completion initialize()
Expand Down
Expand Up @@ -94,7 +94,7 @@ public final ProgressListener openEnded( String process, int resolution )
public static class MultiPartBuilder public static class MultiPartBuilder
{ {
private Aggregator aggregator; private Aggregator aggregator;
private Set<String> parts = new HashSet<String>(); private Set<String> parts = new HashSet<>();
private Completion completion = null; private Completion completion = null;


private MultiPartBuilder( ProgressMonitorFactory factory, String process ) private MultiPartBuilder( ProgressMonitorFactory factory, String process )
Expand All @@ -104,17 +104,37 @@ private MultiPartBuilder( ProgressMonitorFactory factory, String process )


public ProgressListener progressForPart( String part, long totalCount ) public ProgressListener progressForPart( String part, long totalCount )
{ {
if ( aggregator == null ) assertNotBuilt();
{ assertUniquePart( part );
throw new IllegalStateException( "Builder has been completed." ); ProgressListener.MultiPartProgressListener progress =
} new ProgressListener.MultiPartProgressListener( aggregator, part, totalCount );
aggregator.add( progress, totalCount );
return progress;
}

public ProgressListener progressForUnknownPart( String part )
{
assertNotBuilt();
assertUniquePart( part );
ProgressListener progress = ProgressListener.NONE;
aggregator.add( progress, 0 );
return progress;
}

private void assertUniquePart( String part )
{
if ( !parts.add( part ) ) if ( !parts.add( part ) )
{ {
throw new IllegalArgumentException( String.format( "Part '%s' has already been defined.", part ) ); throw new IllegalArgumentException( String.format( "Part '%s' has already been defined.", part ) );
} }
ProgressListener.MultiPartProgressListener progress = new ProgressListener.MultiPartProgressListener( aggregator, part, totalCount ); }
aggregator.add( progress );
return progress; private void assertNotBuilt()
{
if ( aggregator == null )
{
throw new IllegalStateException( "Builder has been completed." );
}
} }


public Completion build() public Completion build()
Expand Down

0 comments on commit c50a0d9

Please sign in to comment.