/* AWE - Amanzi Wireless Explorer * http://awe.amanzi.org * (C) 2008-2009, AmanziTel AB * * This library is provided under the terms of the Eclipse Public License * as described at http://www.eclipse.org/legal/epl-v10.html. Any use, * reproduction or distribution of the library constitutes recipient's * acceptance of this agreement. * * This library is distributed WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ package org.amanzi.neo.loader.core.saver.impl.internal; import java.util.ArrayList; import java.util.List; import org.amanzi.awe.ui.events.impl.ShowGISOnMap; import org.amanzi.awe.ui.manager.AWEEventManager; import org.amanzi.awe.ui.manager.EventChain; import org.amanzi.neo.core.transactional.AbstractTransactional; import org.amanzi.neo.loader.core.IData; import org.amanzi.neo.loader.core.exception.impl.UnderlyingModelException; import org.amanzi.neo.loader.core.internal.IConfiguration; import org.amanzi.neo.loader.core.saver.ISaver; import org.amanzi.neo.models.IModel; import org.amanzi.neo.models.exceptions.ModelException; import org.amanzi.neo.models.exceptions.ParameterInconsistencyException; import org.amanzi.neo.models.project.IProjectModel; import org.amanzi.neo.models.render.IGISModel; import org.amanzi.neo.models.render.IRenderableModel; import org.amanzi.neo.providers.IProjectModelProvider; import org.apache.log4j.Logger; /** * TODO Purpose of * <p> * </p> * * @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com) * @since 1.0.0 */ public abstract class AbstractSaver<C extends IConfiguration, D extends IData> extends AbstractTransactional implements ISaver<C, D> { private static final Logger LOGGER = Logger.getLogger(AbstractSaver.class); private C configuration; private final List<IModel> processedModels = new ArrayList<IModel>(); private final IProjectModelProvider projectModelProvider; private IProjectModel currentProject; protected AbstractSaver(final IProjectModelProvider projectModelProvider) { super(); this.projectModelProvider = projectModelProvider; } @Override // TODO: do not throw Model Exception in Loader public void init(final C configuration) throws ModelException { this.configuration = configuration; this.currentProject = projectModelProvider.getActiveProjectModel(); startTransaction(); } @Override public void finishUp() { saveTx(true, true); EventChain eventChain = new EventChain(true); eventChain.addEvent(AWEEventManager.DATA_UPDATED_EVENT); for (IModel model : processedModels) { try { model.finishUp(); if (model.isRenderable()) { for (IGISModel gisModel : ((IRenderableModel)model).getAllGIS()) { eventChain.addEvent(new ShowGISOnMap(gisModel, this)); } } } catch (ModelException e) { LOGGER.error("an exception occured on finishing up a saver", e); } } saveTx(true, false); AWEEventManager.getManager().fireEventChain(eventChain); } @Override public void save(final D data) { try { saveInModel(data); updateTransaction(); } catch (ParameterInconsistencyException e) { LOGGER.error(e.getParameterName()); } catch (ModelException e) { saveTx(false, true); throw new UnderlyingModelException(e); } } protected void flushModels() { for (IModel model : processedModels) { try { model.flush(); } catch (ModelException e) { throw new UnderlyingModelException(e); } } } @Override protected void saveTx(final boolean success, final boolean shouldContinue) { if (success) { flushModels(); } super.saveTx(success, shouldContinue); } protected abstract void saveInModel(D data) throws ModelException; protected C getConfiguration() { return configuration; } protected void addProcessedModel(final IModel model) { this.processedModels.add(model); } protected IProjectModel getCurrentProject() { return currentProject; } }