/*
* Copyright (c) 2004-2011 Marco Maccaferri and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.charts.views;
import java.util.Calendar;
import java.util.Date;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipsetrader.core.feed.IHistory;
import org.eclipsetrader.core.feed.TimeSpan;
import org.eclipsetrader.core.feed.TimeSpan.Units;
import org.eclipsetrader.core.instruments.ISecurity;
import org.eclipsetrader.core.repositories.IRepositoryService;
import org.eclipsetrader.ui.internal.UIActivator;
public class ChartLoadJob extends Job {
ISecurity security;
TimeSpan timeSpan;
TimeSpan resolutionTimeSpan;
IHistory history;
IHistory subsetHistory;
public ChartLoadJob(ISecurity security) {
super(""); //$NON-NLS-1$
this.security = security;
}
public void setTimeSpan(TimeSpan timeSpan) {
this.timeSpan = timeSpan;
}
public void setResolutionTimeSpan(TimeSpan resolutionTimeSpan) {
this.resolutionTimeSpan = resolutionTimeSpan;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask(getName(), IProgressMonitor.UNKNOWN);
try {
buildHistory();
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, UIActivator.PLUGIN_ID, 0, Messages.ChartLoadJob_ExceptionMessage + security.getName(), e);
UIActivator.log(status);
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
void buildHistory() {
history = subsetHistory = getHistoryFor(security);
if (timeSpan != null) {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MILLISECOND, 999);
if (timeSpan.getUnits() == Units.Days) {
int index = history.getOHLC().length - timeSpan.getLength();
if (index < 0) {
index = 0;
}
Date firstDate = history.getOHLC()[index].getDate();
subsetHistory = history.getSubset(firstDate, null, resolutionTimeSpan);
}
else {
c = Calendar.getInstance();
if (history.getLast() != null) {
c.setTime(history.getLast().getDate());
}
else {
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
}
switch (timeSpan.getUnits()) {
case Months:
c.add(Calendar.MONTH, -timeSpan.getLength());
if (resolutionTimeSpan != null) {
subsetHistory = history.getSubset(c.getTime(), null, resolutionTimeSpan);
}
else {
subsetHistory = history.getSubset(c.getTime(), null);
}
break;
case Years:
c.add(Calendar.YEAR, -timeSpan.getLength());
subsetHistory = history.getSubset(c.getTime(), null);
break;
}
}
}
}
IHistory getHistoryFor(ISecurity security) {
IRepositoryService repository = UIActivator.getDefault().getRepositoryService();
return repository.getHistoryFor(security);
}
public IHistory getHistory() {
return history;
}
public IHistory getSubsetHistory() {
return subsetHistory;
}
public TimeSpan getResolutionTimeSpan() {
return resolutionTimeSpan;
}
}