blob: 01d9628bb389bac85bf77c7e19714d7d44fd3187 [file] [log] [blame]
/*
* Copyright (c) 2012, Niclas Hedhman. All Rights Reserved.
*
* Licensed 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.
*/
package org.apache.zest.library.scheduler.timeline;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.zest.api.injection.scope.Structure;
import org.apache.zest.api.injection.scope.This;
import org.apache.zest.api.structure.Module;
import org.apache.zest.api.value.ValueBuilder;
import org.apache.zest.library.scheduler.Schedule;
public class TimelineScheduleMixin
implements Timeline
{
@Structure
private Module module;
@This
private TimelineScheduleState state;
@This
private Schedule me;
@Override
public Iterable<TimelineRecord> getLastRecords( int maxResults )
{
List<TimelineRecord> timelineRecords = state.history().get();
int size = timelineRecords.size();
if( size < maxResults )
{
return Collections.unmodifiableCollection( timelineRecords );
}
SortedSet<TimelineRecord> result = new TreeSet<>();
for( int i = size - maxResults; i < size; i++ )
{
result.add( timelineRecords.get( i ) );
}
return result;
}
@Override
public Iterable<TimelineRecord> getNextRecords( int maxResults )
{
SortedSet<TimelineRecord> result = new TreeSet<>();
long time = System.currentTimeMillis();
for( int i = 0; i < maxResults; i++ )
{
time = me.nextRun( time );
result.add( createFutureRecord( time ) );
}
return result;
}
@Override
public Iterable<TimelineRecord> getRecords( ZonedDateTime from, ZonedDateTime to )
{
return getRecords( from.toInstant().toEpochMilli(), to.toInstant().toEpochMilli() );
}
@Override
public Iterable<TimelineRecord> getRecords( long from, long to )
{
long now = System.currentTimeMillis();
SortedSet<TimelineRecord> result = new TreeSet<>();
result.addAll( getPastRecords( from ) );
result.addAll( getFutureRecords( now, to ) );
return result;
}
private Collection<? extends TimelineRecord> getPastRecords( long from )
{
SortedSet<TimelineRecord> result = new TreeSet<>();
List<TimelineRecord> timelineRecords = state.history().get();
for( TimelineRecord record : timelineRecords )
{
Long timestamp = record.timestamp().get();
if( timestamp >= from )
{
result.add( record );
}
}
return result;
}
private Collection<? extends TimelineRecord> getFutureRecords( long now, long to )
{
if( now > to )
{
return Collections.emptyList();
}
SortedSet<TimelineRecord> result = new TreeSet<>();
long time = now;
while( time <= to )
{
time = me.nextRun( time );
if( time <= to )
{
result.add( createFutureRecord( time ) );
}
}
return result;
}
private TimelineRecord createFutureRecord( long when )
{
ValueBuilder<TimelineRecord> builder = module.newValueBuilder( TimelineRecord.class );
TimelineRecord prototype = builder.prototype();
prototype.step().set( TimelineRecordStep.FUTURE );
prototype.taskName().set( me.task().get().name().get() );
List<String> tags = me.task().get().tags().get();
prototype.taskTags().set( tags );
prototype.timestamp().set( when );
prototype.scheduleIdentity().set( me.identity().get() );
prototype.details().set( "" );
return builder.newInstance();
}
}