/**
*
*/
package goko;
import java.util.Date;
import javax.inject.Inject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Creatable;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.workbench.IWorkbench;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.jface.dialogs.MessageDialog;
import org.goko.core.common.exception.GkException;
import org.goko.core.config.EnumUpdateCheckFrequency;
import org.goko.core.config.GokoPreference;
import org.goko.core.log.GkLog;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
/**
* Performs an update check when the application startup process completes.
* This class gets called by the {@link GokoLifeCycleManager}
*
* @author PsyKo
*/
@Creatable
public class AutomaticUpdateCheck implements EventHandler{
private static GkLog LOG = GkLog.getLogger(AutomaticUpdateCheck.class);
@Inject
private IProvisioningAgent agent;
@Inject
private IProgressMonitor monitor;
@Inject
private UISynchronize sync;
@Inject
private IEclipseContext context;
/** (inheritDoc)
* @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
*/
@Override
public void handleEvent(Event event) {
try{
if(GokoPreference.getInstance().isCheckForUpdate()){
EnumUpdateCheckFrequency frequency = GokoPreference.getInstance().getUpdateCheckFrequency();
Date lastCheck = GokoPreference.getInstance().getLastUpdateCheckTimestamp();
boolean recheck = false;
final long msPerDay = 1000 * 60 * 60 * 24;
if(frequency == EnumUpdateCheckFrequency.EVERY_START){
recheck = true;
}else if(frequency == EnumUpdateCheckFrequency.ONCE_A_DAY){
if( (new Date().getTime() - lastCheck.getTime()) > msPerDay){
recheck = true;
}
}else if(frequency == EnumUpdateCheckFrequency.ONCE_A_WEEK){
if( (new Date().getTime() - lastCheck.getTime()) > 7 * msPerDay){
recheck = true;
}
}
if(recheck){
LOG.info("Checking for update...");
GokoPreference.getInstance().setLastUpdateCheckTimestamp(new Date());
final GokoUpdateCheckRunnable updateCheck = new GokoUpdateCheckRunnable();
final IWorkbench workbench = context.get(IWorkbench.class);
IStatus result = updateCheck.update(agent, monitor, sync, workbench, true);
if(GokoUpdateCheckRunnable.UPDATE_AVAILABLE.equals(result)){
sync.syncExec(new Runnable() {
/** (inheritDoc) @see java.lang.Runnable#run() */
@Override
public void run() {
boolean performUpdate = MessageDialog.openQuestion(null,
"Updates available",
"There are updates available. Do you want to install them now?");
if(performUpdate){
// Asynchronous execution required to allow the job progress to close
Job applyUpdateJob = new Job("Checking for updates"){
@Override
protected IStatus run(IProgressMonitor monitor) {
return updateCheck.performUpdate(monitor, sync, workbench);
}
};
applyUpdateJob.setUser(true);
applyUpdateJob.schedule();
}
}
});
}
}
}
}catch(GkException e){
LOG.error(e);
}
}
}