/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) 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
*/
package org.jabylon.scheduler.internal.jobs;
import java.util.Collection;
import java.util.Map;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.jabylon.common.team.TeamProvider;
import org.jabylon.common.team.TeamProviderException;
import org.jabylon.common.team.TeamProviderUtil;
import org.jabylon.common.util.PreferencesUtil;
import org.jabylon.properties.ProjectVersion;
import org.jabylon.properties.PropertyFileDiff;
import org.jabylon.resources.persistence.PropertyPersistenceService;
import org.jabylon.scheduler.JobUtil;
import org.jabylon.scheduler.JobExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(enabled = true, immediate = true)
@Service
public class TeamUpdateJob implements JobExecution {
public static final String JOB_ID = "job.team.update";
private static final Logger logger = LoggerFactory.getLogger(TeamUpdateJob.class);
@org.apache.felix.scr.annotations.Property(value = "false", name = JobExecution.PROP_JOB_ACTIVE)
private String ACTIVE = JobExecution.PROP_JOB_ACTIVE;
/** every hour */
@Property(value = "0 0 * * * ?", name = JobExecution.PROP_JOB_SCHEDULE)
public static final String DEFAULT_SCHEDULE = "0 0 * * * ?";
@Property(value = "%update.job.name", name = JobExecution.PROP_JOB_NAME)
private String NAME = JobExecution.PROP_JOB_NAME;
/** at 2 am every day */
@Property(value = "%update.job.description", name = JobExecution.PROP_JOB_DESCRIPTION)
private String DESCRIPTION = JobExecution.PROP_JOB_DESCRIPTION;
@Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY,policy=ReferencePolicy.DYNAMIC)
private PropertyPersistenceService persistenceService;
public void bindPersistenceService(PropertyPersistenceService persistenceService)
{
this.persistenceService = persistenceService;
}
public void unbindPersistenceService(PropertyPersistenceService persistenceService)
{
if(persistenceService==this.persistenceService)
persistenceService = null;
}
@Override
public void run(IProgressMonitor monitor, Map<String, Object> jobContext) throws Exception {
ProjectVersion version = JobUtil.getDomainObject(jobContext);
TeamProvider provider = TeamProviderUtil.getTeamProvider(version.getParent().getTeamProvider());
if(provider==null)
{
logger.error("Team Provider "+version.getParent().getTeamProvider()+" was not available. Update canceled");
return;
}
CDOTransaction transaction = JobUtil.openTransaction(jobContext);
try {
version = transaction.getObject(version);
SubMonitor subMonitor = SubMonitor.convert(monitor, "Updating", 100);
Collection<PropertyFileDiff> updates = provider.update(version, subMonitor.newChild(50));
subMonitor.setWorkRemaining(updates.size() * 2);
subMonitor.subTask("Processing updates");
for (PropertyFileDiff updatedFile : updates) {
version.partialScan(PreferencesUtil.getScanConfigForProject(version.getParent()), updatedFile);
subMonitor.worked(1);
}
subMonitor.setTaskName("Database Sync");
transaction.commit(subMonitor.newChild(updates.size()));
} catch (TeamProviderException e) {
logger.error("Update failed",e);
} catch (CommitException e) {
logger.error("Failed to commit the transaction",e);
} finally {
transaction.close();
if(persistenceService!=null)
persistenceService.clearCache();
else
logger.error("Could not obtain property persistence service");
}
}
@Override
public boolean retryOnError() {
return false;
}
@Override
public String getID() {
return JOB_ID;
}
}