package org.marketcetera.photon.internal.strategy.engine.embedded;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.annotation.concurrent.NotThreadSafe;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.ecore.EObject;
import org.marketcetera.photon.commons.Validate;
import org.marketcetera.photon.commons.emf.EMFFilePersistence;
import org.marketcetera.photon.commons.emf.IEMFPersistence;
import org.marketcetera.photon.strategy.engine.model.core.Strategy;
import org.marketcetera.photon.strategy.engine.model.core.StrategyEngineConnection;
import org.marketcetera.util.misc.ClassVersion;
import com.google.common.collect.Lists;
/* $License$ */
/**
* Provides support for saving and restoring a list of strategies to a file.
* <p>
* This is not thread safe because it reads and writes EMF objects.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: PersistenceService.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@NotThreadSafe
@ClassVersion("$Id: PersistenceService.java 16154 2012-07-14 16:34:05Z colin $")
public final class PersistenceService implements IPersistenceService {
private final File mFile;
private final IEMFPersistence mEMFPersistence;
private boolean mLoading;
/**
* Constructor.
*
* @param file
* the file to use for persistence
* @throws IllegalArgumentException
* if file is null
*/
public PersistenceService(File file) {
Validate.notNull(file, "file"); //$NON-NLS-1$
mFile = file;
mEMFPersistence = new EMFFilePersistence(file);
}
@Override
public synchronized void restore(StrategyEngineConnection connection) {
Validate.notNull(connection, "connection"); //$NON-NLS-1$
if (!mFile.exists()) {
Messages.PERSISTENCE_SERVICE_NO_FILE.debug(this);
return;
} else {
mLoading = true;
try {
final Collection<? extends EObject> restored;
try {
restored = mEMFPersistence.restore();
} catch (Exception e) {
Messages.PERSISTENCE_SERVICE_RESTORE_FAILED.error(this, e);
return;
}
for (EObject object : restored) {
if (object instanceof Strategy) {
final Strategy strategy = (Strategy) object;
try {
connection.deploy(strategy);
} catch (Exception e) {
Messages.PERSISTENCE_SERVICE_DEPLOY_FAILED.error(
this, e, strategy.getInstanceName());
}
} else {
Messages.PERSISTENCE_SERVICE_UNEXPECTED_OBJECT.warn(
this, object.getClass());
}
}
} finally {
mLoading = false;
}
}
}
@Override
public synchronized void save(Collection<? extends Strategy> strategies)
throws IOException {
Validate.noNullElements(strategies, "strategies"); //$NON-NLS-1$
if (mLoading) {
return;
}
List<? extends Strategy> copy = Lists.newArrayList(strategies);
for (Iterator<? extends Strategy> iterator = copy.iterator(); iterator
.hasNext();) {
Strategy strategy = (Strategy) iterator.next();
if (StringUtils.isBlank(strategy.getScriptPath())) {
Messages.PERSISTENCE_SERVICE_IGNORED_STRATEGY_WITH_NO_SCRIPT_PATH
.warn(this, strategy);
iterator.remove();
}
}
mEMFPersistence.save(copy);
}
}