This is an automated email from the git hooks/post-receive script. New commit to branch feature/7017 in repository observe. See http://git.codelutin.com/observe.git commit ea291d359521f79ccea2bdc89c0d357fe4c3b0f4 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Apr 28 17:34:37 2015 +0200 refactor save action for table entities --- .../observe/services/AbstractObserveService.java | 74 ++++++++- .../ird/observe/services/data/TripServiceImpl.java | 4 +- .../services/data/seine/TargetSampleService.java | 12 +- .../data/seine/TargetSampleServiceImpl.java | 176 +++++++++++++++++++-- .../table/impl/seine/TargetSampleUIHandler.java | 99 ++---------- 5 files changed, 270 insertions(+), 95 deletions(-) diff --git a/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java b/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java index 0e6e506..807403a 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/AbstractObserveService.java @@ -14,6 +14,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.TopiaEntityBinder; @@ -272,7 +273,6 @@ public abstract class AbstractObserveService implements ObserveService { public abstract E onUpdate(P parentBean, E toSave, E beanToSave); } - public <P extends TopiaEntity, E extends TopiaEntity> void doDelete(String parentId, String idToDelete, DeleteAction<P, E> deleteAction) { P parent = null; @@ -315,6 +315,78 @@ public abstract class AbstractObserveService implements ObserveService { } + public <P extends TopiaEntity, E extends TopiaEntity> void doSaveList(P parentToSave, Collection<E> childrentoSave, SaveCollectionAction<P, E> saveCollectionAction ) { + + saveCollectionAction.prepareSave(parentToSave, childrentoSave); + + P parentSaved = getDao(saveCollectionAction.parentClass).findByTopiaId(parentToSave.getTopiaId()); + + List<E> oldChilds = new ArrayList<E>(saveCollectionAction.getChildren(parentSaved)); + + saveCollectionAction.clearChildren(parentSaved); + + TopiaDAO<E> dao = getDao(saveCollectionAction.entityClass); + + for (E childToSave : childrentoSave) { + + E childSaved; + + if (childToSave.getTopiaId() == null) { + + // creation du fils + childSaved = saveCollectionAction.onCreateChild(childToSave); + + } else { + + // mise a jour du fils + childSaved = dao.findByTopiaId(childToSave.getTopiaId()); + + childSaved = saveCollectionAction.onUpdateChild(childToSave, childSaved); + } + + saveCollectionAction.addChild(parentSaved, childSaved); + } + + // on donne la main aux implantations pour faire des traitements + // supplémentaires + saveCollectionAction.onUpdateFinalize(parentToSave, oldChilds); + + + } + + + protected abstract class SaveCollectionAction<P extends TopiaEntity, E extends TopiaEntity> { + + protected final Class<P> parentClass; + + protected final Class<E> entityClass; + + public SaveCollectionAction(Class<P> parentClass, Class<E> entityClass) { + this.parentClass = parentClass; + this.entityClass = entityClass; + } + + public void prepareSave(P parent, Collection<E> tosaves) { + // par defaut, rien de specifique a faire avant de faire la sauvegarde + } + + public void onUpdateFinalize(P parent, Collection<E> oldChilds) throws TopiaException { + // par défaut, rien à faire + } + + + public abstract Collection<E> getChildren(P parent); + + public abstract void clearChildren(P parent); + + public abstract E onCreateChild(E childToSave); + + public abstract E onUpdateChild(E childToSave, E childSaved); + + public abstract void addChild(P parent, E child); + + } + public <E extends TopiaEntity> void checkNotNullAndNoneExistingEntity(String variableName, E entity) { TopiaEntityHelper.checkNotNullAndNoneExistingEntity(variableName, entity); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/TripServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/TripServiceImpl.java index 4a7e2c9..96a740b 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/TripServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/TripServiceImpl.java @@ -55,7 +55,7 @@ public class TripServiceImpl extends AbstractObserveService implements TripServi Trip trip; - if (tripId.startsWith(TripSeine.class.getSimpleName())) { + if (tripId.startsWith(TripSeine.class.getName())) { trip = findByTopiaId(TripSeine.class, tripId); } else { trip = findByTopiaId(TripLongline.class, tripId); @@ -70,7 +70,7 @@ public class TripServiceImpl extends AbstractObserveService implements TripServi Trip trip; - if (tripId.startsWith(TripSeine.class.getSimpleName())) { + if (tripId.startsWith(TripSeine.class.getName())) { trip = findByTopiaId(TripSeine.class, tripId); } else { trip = findByTopiaId(TripLongline.class, tripId); diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java index 84fb0e4..82fe30f 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleService.java @@ -2,7 +2,10 @@ package fr.ird.observe.services.data.seine; import fr.ird.observe.entities.referentiel.Species; import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.entities.seine.TargetSample; +import fr.ird.observe.services.Commit; import fr.ird.observe.services.ObserveService; +import org.nuiton.topia.persistence.util.TopiaEntityBinder; import java.util.Collection; import java.util.List; @@ -17,7 +20,7 @@ public interface TargetSampleService extends ObserveService { List<Species> getAvailableEspeceForTargetSample(String setSeineId, boolean discarded); - String getTargetSampleId(String setSeineId, boolean discarded); + TargetSample getTargetSample(String setSeineId, boolean discarded); boolean canUseTargetSample(String setSeineId, boolean discarded); @@ -26,5 +29,12 @@ public interface TargetSampleService extends ObserveService { Collection<Species> speciessToDelete, List<TargetLength> tailleToDelete, boolean discarded); + @Commit + void delete(String setId, TargetSample bean); + String save(String setSeineId, TargetSample toSave, Collection<TargetLength> childrenToSave); + + TopiaEntityBinder<TargetLength> getChildBinderForEdit(); + + TopiaEntityBinder<TargetSample> getBinderForEdit(); } diff --git a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java index b9d8aaa..4b8021c 100644 --- a/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java +++ b/observe-services/src/main/java/fr/ird/observe/services/data/seine/TargetSampleServiceImpl.java @@ -1,13 +1,18 @@ package fr.ird.observe.services.data.seine; +import fr.ird.observe.BinderService; import fr.ird.observe.entities.referentiel.Species; import fr.ird.observe.entities.seine.SetSeine; import fr.ird.observe.entities.seine.TargetCatch; import fr.ird.observe.entities.seine.TargetLength; +import fr.ird.observe.entities.seine.TargetLengthDAO; import fr.ird.observe.entities.seine.TargetSample; +import fr.ird.observe.entities.seine.TargetSampleDAO; import fr.ird.observe.services.AbstractObserveService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.util.TopiaEntityBinder; +import org.nuiton.util.beans.BinderModelBuilder; import java.util.ArrayList; import java.util.Collection; @@ -24,6 +29,14 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T /** Logger. */ private static final Log log = LogFactory.getLog(TargetSampleServiceImpl.class); + protected TargetSampleDAO getDao() { + return (TargetSampleDAO) getDao(TargetSample.class); + } + + protected TargetLengthDAO getChildDao() { + return (TargetLengthDAO) getDao(TargetLength.class); + } + @Override public List<Species> getAvailableEspeceForTargetSample(String setSeineId, boolean discarded) { @@ -68,11 +81,11 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T @Override - public String getTargetSampleId(String setSeineId, boolean discarded) { + public TargetSample getTargetSample(String setSeineId, boolean discarded) { SetSeine setSeine = findByTopiaId(SetSeine.class, setSeineId); - String targetSampleId = null; + TargetSample toLoad = null; if (!setSeine.isNonTargetSampleEmpty()) { @@ -81,19 +94,33 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T Boolean isDiscarded = targetSample.getDiscarded(); - if (discarded) { - if (isDiscarded != null && isDiscarded) { - targetSampleId = targetSample.getTopiaId(); - } - } else if (isDiscarded == null || !isDiscarded) { - targetSampleId = targetSample.getTopiaId(); + if (discarded == (isDiscarded != null && isDiscarded)) { + toLoad = targetSample; } } } - return targetSampleId; + TargetSample loaded = getDao().newInstance(); + + if (toLoad != null) { + + getBinderForEdit().copy(toLoad, loaded, TargetSample.PROPERTY_TARGET_LENGTH); + + for (TargetLength childToLoad : toLoad.getTargetLength()) { + + TargetLength childLoaded = getChildDao().newInstance(); + + getChildBinderForEdit().copy(childToLoad, childLoaded); + + loaded.addTargetLength(childLoaded); + + } + } + + + return loaded; } @@ -139,4 +166,135 @@ public class TargetSampleServiceImpl extends AbstractObserveService implements T } + @Override + public void delete(String setId, TargetSample bean) { + doDelete(setId, bean.getTopiaId(), new DeleteAction<SetSeine, TargetSample>(SetSeine.class, TargetSample.class) { + @Override + public void onDelete(SetSeine parent, TargetSample toDelete) { + super.onDelete(parent, toDelete); + parent.removeTargetSample(toDelete); + } + }); + + } + + @Override + public String save(String setSeineId, TargetSample toSave, Collection<TargetLength> childrenToSave) { + + String savedId = doSave(setSeineId, toSave, new SaveAction<SetSeine, TargetSample>(SetSeine.class, TargetSample.class) { + @Override + public TargetSample onCreate(SetSeine parent, TargetSample toCreate) { + + TargetSample created = getDao().create(); + getBinderForEdit().copyExcluding(toCreate, created, TargetSample.PROPERTY_TARGET_LENGTH); + parent.addTargetSample(created); + getDao().update(created); + return created; + } + + @Override + public TargetSample onUpdate(SetSeine parentBean, TargetSample toSave, TargetSample beanToSave) { + getBinderForEdit().copyExcluding(toSave, beanToSave, TargetSample.PROPERTY_TARGET_LENGTH); + getDao().update(beanToSave); + return beanToSave; + } + }); + + toSave.setTopiaId(savedId); + + doSaveList(toSave, childrenToSave, new SaveCollectionAction<TargetSample, TargetLength>(TargetSample.class, TargetLength.class) { + + @Override + public void prepareSave(TargetSample parent, Collection<TargetLength> tosaves) { + + for (TargetLength targetLength : tosaves) { + + // on attache a l'echantillon + targetLength.setTargetSample(parent); + } + + } + + @Override + public Collection<TargetLength> getChildren(TargetSample parent) { + return parent.getTargetLength(); + } + + @Override + public void clearChildren(TargetSample parent) { + parent.clearTargetLength(); + } + + @Override + public TargetLength onCreateChild(TargetLength childToSave) { + TargetLength childSaved = getChildDao().create(); + getChildBinderForEdit().copy(childToSave, childSaved); + getChildDao().update(childSaved); + return childSaved; + } + + @Override + public TargetLength onUpdateChild(TargetLength childToSave, TargetLength childSaved) { + getChildBinderForEdit().copy(childToSave, childSaved); + getChildDao().update(childSaved); + return childSaved; + } + + @Override + public void addChild(TargetSample parent, TargetLength child) { + parent.addTargetLength(child); + } + }); + + return savedId; + + } + + @Override + public TopiaEntityBinder<TargetLength> getChildBinderForEdit() { + TopiaEntityBinder<TargetLength> r = loadBinder("-forEdit", TargetLength.class, new CreateBinder<TargetLength>() { + + @Override + public BinderModelBuilder<TargetLength, TargetLength> createBinderBuilder(BinderService binderService, String name) { + + BinderModelBuilder<TargetLength, TargetLength> builder = binderService.newBinderBuilder( + TargetLength.class, + TargetLength.PROPERTY_TARGET_SAMPLE, + TargetLength.PROPERTY_SPECIES, + TargetLength.PROPERTY_LENGTH, + TargetLength.PROPERTY_LENGTH_SOURCE, + TargetLength.PROPERTY_WEIGHT, + TargetLength.PROPERTY_WEIGHT_SOURCE, + TargetLength.PROPERTY_COUNT, + TargetLength.PROPERTY_MEASURE_TYPE, + TargetLength.PROPERTY_ACQUISITION_MODE); + + return builder; + } + + }); + + return r; + } + + @Override + public TopiaEntityBinder<TargetSample> getBinderForEdit() { + TopiaEntityBinder<TargetSample> r = loadBinder("-forEdit", TargetSample.class, new CreateBinder<TargetSample>() { + + @Override + public BinderModelBuilder<TargetSample, TargetSample> createBinderBuilder(BinderService binderService, String name) { + + BinderModelBuilder<TargetSample, TargetSample> builder = binderService.newBinderBuilder( + TargetSample.class, + TargetSample.PROPERTY_TARGET_LENGTH, + TargetSample.PROPERTY_COMMENT); + + return builder; + } + + }); + + return r; + } + } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java index b1cbfb3..098aafe 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/content/table/impl/seine/TargetSampleUIHandler.java @@ -22,7 +22,6 @@ package fr.ird.observe.ui.content.table.impl.seine; import fr.ird.observe.DataService; -import fr.ird.observe.ObserveDAOHelper; import fr.ird.observe.db.DataContext; import fr.ird.observe.db.DataSource; import fr.ird.observe.db.DataSourceException; @@ -39,8 +38,6 @@ import fr.ird.observe.ui.content.table.ContentTableUI; import fr.ird.observe.ui.content.table.ContentTableUIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaException; import org.nuiton.validator.NuitonValidatorScope; import javax.swing.JComponent; @@ -48,7 +45,6 @@ import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; import java.util.List; import static org.nuiton.i18n.I18n.n; @@ -129,7 +125,8 @@ public class TargetSampleUIHandler extends ContentTableUIHandler<TargetSample, T String setId = dataContext.getSelectedSetId(); // on doit récupérer l'unique échantillonThon de la calée - String id = getService(TargetSampleService.class).getTargetSampleId(setId, discarded); + TargetSample targetSample = getService(TargetSampleService.class).getTargetSample(setId, discarded); + String id = targetSample == null ? null : targetSample.getTopiaId(); return id; } @@ -141,37 +138,24 @@ public class TargetSampleUIHandler extends ContentTableUIHandler<TargetSample, T String setId = dataContext.getSelectedSetId(); + TargetSampleService service = getService(TargetSampleService.class); + if (mode == ContentMode.UPDATE) { // on ne charge les speciess uniquement si on est en mode édition - TargetSampleService service = getService(TargetSampleService.class); + List<Species> speciesList = service.getAvailableEspeceForTargetSample(setId, discarded); getUi().getSpecies().setData(speciesList); } - // on doit récupérer l'unique échantillonThon de la calée - String id = getEditBeanIdToLoad(dataContext, dataService, dataSource); + TargetSample beanToLoad = getService(TargetSampleService.class).getTargetSample(setId, discarded); TargetSample editBean = getBean(); - if (log.isInfoEnabled()) { - log.info(prefix + " - set id : " + setId); - log.info(prefix + " - echantillon thon id : " + id); - log.info(prefix + " - edit bean id : " + editBean.getTopiaId()); - } - - if (id == null) { + service.getBinderForEdit().copy(beanToLoad, editBean); - // l'échantillon n'existe pas encore, donc rien a faire - getLoadBinder().load(null, editBean, true); - - getModel().getChildsUpdator().setChilds(editBean, new ArrayList<TargetLength>()); - } else { - - // preparation du bean d'édition - dataService.loadEditEntity(dataSource, id, getLoadExecutor()); - } + getModel().getChildsUpdator().setChilds(editBean, beanToLoad.getTargetLength()); getModel().setMode(mode); @@ -181,80 +165,31 @@ public class TargetSampleUIHandler extends ContentTableUIHandler<TargetSample, T return editBean; } - @Override - protected boolean prepareSave(TargetSample bean, List<TargetLength> objets) throws DataSourceException { - - boolean withLengths = !objets.isEmpty(); - - if (withLengths) { - - if (bean.getTopiaId() == null) { - - String setId = getDataContext().getSelectedSetId(); - - // l'échantillon n'existe pas encore, il faut le créer - - if (log.isDebugEnabled()) { - log.debug("Will create targetSample " + bean + " for " + setId); - } - - getDataService().create(getDataSource(), setId, bean, null, getCreateExecutor()); - - } - - for (TargetLength targetLength : objets) { - - // on attache a l'echantillon - targetLength.setTargetSample(bean); - } - - } - return true; - - } @Override protected void doPersist(TargetSample bean, DataService dataService, DataSource dataSource) throws DataSourceException { + TargetSampleService service = getService(TargetSampleService.class); + + String setId = getDataContext().getSelectedSetId(); + if (bean.getTopiaId() != null && bean.isTargetLengthEmpty()) { // remove orphan target sample - - String setId = getDataContext().getSelectedSetId(); if (log.isInfoEnabled()) { log.info("Remove obsolete targetSample " + bean.getTopiaId() + " from Set: " + setId); } - getDataService().delete(getDataSource(), setId, bean, getDeleteExecutor()); - - } else { - // normal persist - super.doPersist(bean, dataService, dataSource); + service.delete(setId, bean); - } + } else { - } + String savedId = service.save(setId, bean, bean.getTargetLength()); - @Override - protected TargetSample onCreate(TopiaContext tx, - Object parent, - TargetSample editBean) throws TopiaException { - SetSeine parentBean = (SetSeine) parent; - TargetSample beanToSave = - ObserveDAOHelper.getTargetSampleDAO(tx).create(); - beanToSave.setDiscarded(discarded); - editBean.setTopiaId(beanToSave.getTopiaId()); - editBean.setTopiaCreateDate(beanToSave.getTopiaCreateDate()); - editBean.setTopiaVersion(beanToSave.getTopiaVersion()); - parentBean.addTargetSample(beanToSave); - return beanToSave; - } + bean.setTopiaId(savedId); - @Override - protected void onDelete(TopiaContext tx, Object parent, TargetSample beanToDelete) throws TopiaException { - SetSeine parentBean = (SetSeine) parent; - parentBean.removeTargetSample(beanToDelete); + } } @Override -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.