/*******************************************************************************
 * Copyright 2013 Michael Marconi
 * 
 * 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 oncue.worker;

import static akka.pattern.Patterns.ask;

import java.util.concurrent.TimeoutException;

import oncue.common.messages.CleanupJobs;
import oncue.common.messages.Job;

import org.joda.time.Duration;

import scala.concurrent.Await;
import akka.util.Timeout;

/**
 * This job will clean up complete and failed runs from the backing store.
 * You'll probably want to run this as a timed job on a schedule.
 */
public class MaintenanceWorker extends AbstractWorker {

	private static final String EXPIRATION_AGE = "expiration-age";
	private static final String INCLUDE_FAILED_JOBS = "include-failed-jobs";

	@Override
	public void doWork(Job job) throws Exception {
		processJob();
	}

	private void processJob() throws Exception {

		boolean includeFailedJobs = false;
		if (job.getParams().containsKey(INCLUDE_FAILED_JOBS))
			includeFailedJobs = new Boolean(job.getParams().get(INCLUDE_FAILED_JOBS));

		if (!job.getParams().containsKey(EXPIRATION_AGE))
			throw new IllegalArgumentException(
					"You must define the 'expiration-age' parameter in the configuration of a maintenance worker");

		Duration expirationAge = Duration.millis(scala.concurrent.duration.Duration.create(
				job.getParams().get(EXPIRATION_AGE)).toMillis());
		CleanupJobs cleanupJobs = new CleanupJobs(includeFailedJobs, expirationAge);

		try {
			Await.result(
					ask(getContext().actorFor(settings.SCHEDULER_PATH), cleanupJobs, new Timeout(
							settings.SCHEDULER_TIMEOUT)), settings.SCHEDULER_TIMEOUT);
		} catch (TimeoutException e) {
			throw new RuntimeException("Timeout waiting for scheduler to clean up jobs");
		}
	}

	@Override
	protected void redoWork(Job job) throws Exception {
		processJob();
	}
}

/*******************************************************************************
 * Copyright 2013 Michael Marconi
 * 
 * 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 oncue.worker;

import static akka.pattern.Patterns.ask;

import java.util.concurrent.TimeoutException;

import oncue.common.messages.CleanupJobs;
import oncue.common.messages.Job;

import org.joda.time.Duration;

import scala.concurrent.Await;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import akka.util.Timeout;

/**
 * This job will clean up complete and failed runs from the backing store.
 * You'll probably want to run this as a timed job on a schedule.
 */
public class MaintenanceWorker extends AbstractWorker {

	private static final String EXPIRATION_AGE = "expiration-age";
	private static final String INCLUDE_FAILED_JOBS = "include-failed-jobs";
	private LoggingAdapter log = Logging.getLogger(getContext().system(), this);

	@Override
	public void doWork(Job job) throws Exception {
		processJob();
	}

	private void processJob() throws Exception {

		boolean includeFailedJobs = false;
		if (job.getParams().containsKey(INCLUDE_FAILED_JOBS))
			includeFailedJobs = new Boolean(job.getParams().get(INCLUDE_FAILED_JOBS));

		if (!job.getParams().containsKey(EXPIRATION_AGE))
			throw new IllegalArgumentException(
					"You must define the 'expiration-age' parameter in the configuration of a maintenance worker");

		Duration expirationAge = Duration.millis(scala.concurrent.duration.Duration.create(
				job.getParams().get(EXPIRATION_AGE)).toMillis());
		CleanupJobs cleanupJobs = new CleanupJobs(includeFailedJobs, expirationAge);

		try {
			Object object = Await.result(
					ask(getContext().actorFor(settings.SCHEDULER_PATH), cleanupJobs, new Timeout(
							settings.SCHEDULER_TIMEOUT)), settings.SCHEDULER_TIMEOUT);
			log.info(object.toString());
		} catch (TimeoutException e) {
			throw new RuntimeException("Timeout waiting for scheduler to clean up jobs");
		}
	}

	@Override
	protected void redoWork(Job job) throws Exception {
		processJob();
	}
}

Add rudimentary logging to see when maintenance worker has finished