r296 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service tutti-service/src/main/java/fr/ifremer/tutti/se
Author: tchemit Date: 2013-02-01 19:37:33 +0100 (Fri, 01 Feb 2013) New Revision: 296 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/296 Log: - use adagio persistence driver if in data directory - can not edit / validate catches if program has no zone - cache form the moment batch not used tabs Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceTest.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceService.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceService.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceService.java 2013-02-01 18:37:33 UTC (rev 296) @@ -54,4 +54,5 @@ // @Transactional(readOnly = false) void deleteProtocol(String protocolId); + void init(); } Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceAdagioImpl.java 2013-02-01 18:37:33 UTC (rev 296) @@ -73,37 +73,37 @@ private static final Log log = LogFactory.getLog(TuttiPersistenceAdagioImpl.class); - @Autowired(required = true) + @Autowired protected ReferentialPersistenceService referentialService; - @Autowired(required = true) + @Autowired protected ProgramPersistenceService programService; - @Autowired(required = true) + @Autowired protected CruisePersistenceService cruiseService; - @Autowired(required = true) + @Autowired protected FishingOperationPersistenceService fishingOperationService; - @Autowired(required = true) + @Autowired protected CatchBatchPersistenceService catchBatchService; - @Autowired(required = true) + @Autowired protected SpeciesBatchPersistenceService speciesBatchService; - @Autowired(required = true) + @Autowired protected BenthosBatchPersistenceService benthosBatchService; - @Autowired(required = true) + @Autowired protected PlanktonBatchPersistenceService planktonBatchService; - @Autowired(required = true) + @Autowired protected MacroWasteBatchPersistenceService macroWasteBatchService; - @Autowired(required = true) + @Autowired protected AccidentalBatchPersistenceService accidentalBatchService; - @Autowired(required = true) + @Autowired protected ProtocolPersistenceService protocolService; @Override @@ -116,6 +116,7 @@ if (log.isInfoEnabled()) { log.info("Open persistence driver " + getImplementationName()); } + protocolService.init(); } @Override Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/config/TuttiPersistenceAdagioConfig.java 2013-02-01 18:37:33 UTC (rev 296) @@ -55,6 +55,16 @@ private static final Log log = LogFactory.getLog(TuttiPersistenceAdagioConfig.class); + private static TuttiPersistenceAdagioConfig instance; + + public static TuttiPersistenceAdagioConfig getInstance() { + return instance; + } + + public static void setInstance(TuttiPersistenceAdagioConfig instance) { + TuttiPersistenceAdagioConfig.instance = instance; + } + protected final ApplicationConfig config; public TuttiPersistenceAdagioConfig(ApplicationConfig config) { Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/AbstractPersistenceService.java 2013-02-01 18:37:33 UTC (rev 296) @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import fr.ifremer.adagio.core.dao.administration.programStrategy.ProgramDao; +import fr.ifremer.tutti.persistence.config.TuttiPersistenceAdagioConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Query; @@ -64,6 +65,23 @@ @Resource(name = "programDao") protected ProgramDao programDao; + protected TuttiPersistenceAdagioConfig config; + + public void init() { + if (config == null) { + + config = TuttiPersistenceAdagioConfig.getInstance(); + + Preconditions.checkNotNull( + config, "No config found in " + + TuttiPersistenceAdagioConfig.class.getName()); + } + } + + public void setConfig(TuttiPersistenceAdagioConfig config) { + this.config = config; + } + protected final SessionFactory getSessionFactory() { return sessionFactory; } @@ -78,7 +96,7 @@ Object result = query.uniqueResult(); return (Object[]) result; } - + protected <T> T queryUniqueTyped(String queryName, Object... params) { Query query = createQuery(queryName, params); @@ -124,12 +142,12 @@ } return query; } - - protected <T extends Serializable> T load(Class<? extends T> clazz, Serializable id) { + + protected <T extends Serializable> T load(Class<? extends T> clazz, Serializable id) { T load = (T) getCurrentSession().load(clazz, id); return load; } - + protected int queryUpdate(String queryName, Object... params) { Query query = createQuery(queryName, params); Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceImpl.java 2013-02-01 18:37:33 UTC (rev 296) @@ -55,12 +55,6 @@ public static final String TUTTI_PROTOCOL_EXTENSION = "tuttiProtocol"; - protected TuttiPersistenceAdagioConfig config; - - public void setConfig(TuttiPersistenceAdagioConfig config) { - this.config = config; - } - @Override public List<String> getAllProtocolId() { Modified: trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java =================================================================== --- trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/main/java/fr/ifremer/tutti/persistence/service/TuttiPersistenceServiceLocator.java 2013-02-01 18:37:33 UTC (rev 296) @@ -110,15 +110,26 @@ } public static ProtocolPersistenceService getProtocolPersistenceService() { - return instance().getService("protocolPersistenceService", - ProtocolPersistenceService.class); + ProtocolPersistenceService result = instance().getService("protocolPersistenceService", + ProtocolPersistenceService.class); + result.init(); + return result; } public static ReferentialSynchronizeService getReferentialSynchronizeService() { return instance().getService("referentialSynchronizeService", ReferentialSynchronizeService.class); } - + + @Override + public <S> S getService(String name, Class<S> serviceType) { + S service = super.getService(name, serviceType); + if (service instanceof AbstractPersistenceService) { + ((AbstractPersistenceService) service).init(); + } + return service; + } + public static void close() { instance().shutdown(); } Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java =================================================================== --- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/DatabaseResource.java 2013-02-01 18:37:33 UTC (rev 296) @@ -155,6 +155,8 @@ config.initConfig(loader); + TuttiPersistenceAdagioConfig.setInstance(config); + if (log.isDebugEnabled()) { log.debug("Use conf.properties at " + config.getDbConfigurationPath()); } @@ -183,6 +185,8 @@ // push back default tutti configuration TuttiPersistenceServiceLocator.initTuttiDefault(); } + + TuttiPersistenceAdagioConfig.setInstance(null); } public Connection createEmptyDb(String dbDirectory, Modified: trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceTest.java =================================================================== --- trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceTest.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-persistence-adagio/src/test/java/fr/ifremer/tutti/persistence/service/ProtocolPersistenceServiceTest.java 2013-02-01 18:37:33 UTC (rev 296) @@ -87,7 +87,6 @@ @Before public void setUp() throws Exception { service = TuttiPersistenceServiceLocator.getProtocolPersistenceService(); - ((ProtocolPersistenceServiceImpl) service).setConfig(dbResource.getConfig()); } @Test @@ -105,7 +104,12 @@ @Test public void getProtocol(/*String id*/) { - + TuttiProtocol protocol = createProtocolFixture(); + TuttiProtocol createdProtocol = service.createProtocol(protocol); + Assert.assertNotNull(createdProtocol); + String id = createdProtocol.getId(); + TuttiProtocol loadedProtocol = service.getProtocol(id); + Assert.assertNotNull(loadedProtocol); } @Test Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-02-01 18:37:33 UTC (rev 296) @@ -70,12 +70,8 @@ /** Logger. */ private static final Log log = LogFactory.getLog(PersistenceService.class); - protected TuttiPersistence devDriver; - protected TuttiPersistence driver; - protected ProtocolPersistenceService protocolPersistenceService; - @Override public void setServiceContext(TuttiServiceContext context) { super.setServiceContext(context); @@ -106,18 +102,10 @@ TuttiServiceConfig serviceConfig = context.getConfig(); - TuttiPersistenceDevConfig devDriverConfig = serviceConfig.getDevDriverConfig(); + TuttiPersistenceAdagioConfig driverConfig = + serviceConfig.getAdagioDriverConfig(); + TuttiPersistenceAdagioConfig.setInstance(driverConfig); - devDriver = new TuttiPersistenceDevImpl(devDriverConfig); - - if (log.isInfoEnabled()) { - log.info("Will open persistence driver " + devDriver.getImplementationName()); - } - - devDriver.open(); - - TuttiPersistenceAdagioConfig driverConfig = serviceConfig.getAdagioDriverConfig(); - if (driverConfig.isDbExists()) { // can use adagio driver @@ -129,6 +117,10 @@ } else { // still on dev drvier + + TuttiPersistenceDevConfig devDriverConfig = + serviceConfig.getDevDriverConfig(); + if (log.isWarnEnabled()) { log.warn("--------------------------------------------------------------------"); @@ -139,13 +131,54 @@ log.warn("--------------------------------------------------------------------"); } - driver = devDriver; + driver = new TuttiPersistenceDevImpl(devDriverConfig) { + + ProtocolPersistenceService protocolPersistenceService = new ProtocolPersistenceServiceImpl(); + + @Override + public void open() throws IOException { + super.open(); + + protocolPersistenceService.init(); + } + + @Override + public List<String> getAllProtocolNames() { + return protocolPersistenceService.getAllProtocolNames(); + } + + @Override + public List<TuttiProtocol> getAllProtocol() { + return protocolPersistenceService.getAllProtocol(); + } + + @Override + public TuttiProtocol getProtocol(String id) { + return protocolPersistenceService.getProtocol(id); + } + + @Override + public TuttiProtocol createProtocol(TuttiProtocol bean) { + return protocolPersistenceService.createProtocol(bean); + } + + @Override + public TuttiProtocol saveProtocol(TuttiProtocol bean) { + return protocolPersistenceService.saveProtocol(bean); + } + + @Override + public void deleteProtocol(String id) { + protocolPersistenceService.deleteProtocol(id); + } + }; + + if (log.isInfoEnabled()) { + log.info("Will open persistence driver " + driver.getImplementationName()); + } + + driver.open(); } - - //TODO: TC use driver - protocolPersistenceService = new ProtocolPersistenceServiceImpl(); - //TuttiPersistenceServiceLocator.getProtocolPersistenceService(); - ((ProtocolPersistenceServiceImpl) protocolPersistenceService).setConfig(driverConfig); } @Override @@ -155,7 +188,6 @@ log.info("Will close persistence Service " + getImplementationName()); } - IOUtils.closeQuietly(devDriver); IOUtils.closeQuietly(driver); } @@ -165,112 +197,112 @@ @Override public List<Vessel> getAllScientificVessel() { - return devDriver.getAllScientificVessel(); + return driver.getAllScientificVessel(); } @Override public List<Vessel> getAllFishingVessel() { - return devDriver.getAllFishingVessel(); + return driver.getAllFishingVessel(); } @Override public List<Species> getAllSpecies() { - return devDriver.getAllSpecies(); + return driver.getAllSpecies(); } @Override public Species getSpecies(String speciesId) { - return devDriver.getSpecies(speciesId); + return driver.getSpecies(speciesId); } @Override public List<Caracteristic> getAllCaracteristic() { - return devDriver.getAllCaracteristic(); + return driver.getAllCaracteristic(); } @Override public List<Zone> getAllProgramZone() { - return devDriver.getAllProgramZone(); + return driver.getAllProgramZone(); } @Override public List<Country> getAllCountry() { - return devDriver.getAllCountry(); + return driver.getAllCountry(); } @Override public List<Gear> getAllScientificGear() { - return devDriver.getAllScientificGear(); + return driver.getAllScientificGear(); } @Override public List<Gear> getAllFishingGear() { - return devDriver.getAllFishingGear(); + return driver.getAllFishingGear(); } @Override public List<Person> getAllPerson() { - return devDriver.getAllPerson(); + return driver.getAllPerson(); } @Override public List<FishingOperationLocation> getAllFishingOperationStrata(String zoneId) { - return devDriver.getAllFishingOperationStrata(zoneId); + return driver.getAllFishingOperationStrata(zoneId); } @Override public List<FishingOperationLocation> getAllFishingOperationSubStrata(String zoneId, String strataId) { - return devDriver.getAllFishingOperationSubStrata(zoneId, strataId); + return driver.getAllFishingOperationSubStrata(zoneId, strataId); } @Override public List<FishingOperationLocation> getAllFishingOperationLocation(String zoneId, String strataId, String subStrataId) { - return devDriver.getAllFishingOperationLocation(zoneId, strataId, subStrataId); + return driver.getAllFishingOperationLocation(zoneId, strataId, subStrataId); } @Override public Caracteristic getSizeCategoryCaracteristic() { - return devDriver.getSizeCategoryCaracteristic(); + return driver.getSizeCategoryCaracteristic(); } @Override public Caracteristic getSexCaracteristic() { - return devDriver.getSexCaracteristic(); + return driver.getSexCaracteristic(); } @Override public Caracteristic getSortedUnsortedCaracteristic() { - return devDriver.getSortedUnsortedCaracteristic(); + return driver.getSortedUnsortedCaracteristic(); } @Override public Caracteristic getMaturityCaracteristic() { - return devDriver.getMaturityCaracteristic(); + return driver.getMaturityCaracteristic(); } @Override public Caracteristic getMacroWasteCategoryCaracteristic() { - return devDriver.getMacroWasteCategoryCaracteristic(); + return driver.getMacroWasteCategoryCaracteristic(); } @Override public Caracteristic getMacroWasteSizeCategoryCaracteristic() { - return devDriver.getMacroWasteSizeCategoryCaracteristic(); + return driver.getMacroWasteSizeCategoryCaracteristic(); } @Override public Vessel getVessel(String vesselCode) { - return devDriver.getVessel(vesselCode); + return driver.getVessel(vesselCode); } @Override public boolean isSortedQualitativeValue(CaracteristicQualitativeValue value) { - return devDriver.isSortedQualitativeValue(value); + return driver.isSortedQualitativeValue(value); } @Override public Person getPerson(Integer personId) { - return devDriver.getPerson(personId); + return driver.getPerson(personId); } //------------------------------------------------------------------------// @@ -279,22 +311,22 @@ @Override public List<Program> getAllProgram() { - return devDriver.getAllProgram(); + return driver.getAllProgram(); } @Override public Program getProgram(String id) { - return devDriver.getProgram(id); + return driver.getProgram(id); } @Override public Program createProgram(Program bean) { - return devDriver.createProgram(bean); + return driver.createProgram(bean); } @Override public Program saveProgram(Program bean) { - return devDriver.saveProgram(bean); + return driver.saveProgram(bean); } //------------------------------------------------------------------------// @@ -303,22 +335,22 @@ @Override public List<Cruise> getAllCruise(String programId) { - return devDriver.getAllCruise(programId); + return driver.getAllCruise(programId); } @Override public Cruise getCruise(String id) { - return devDriver.getCruise(id); + return driver.getCruise(id); } @Override public Cruise createCruise(Cruise bean) { - return devDriver.createCruise(bean); + return driver.createCruise(bean); } @Override public Cruise saveCruise(Cruise bean) { - return devDriver.saveCruise(bean); + return driver.saveCruise(bean); } //------------------------------------------------------------------------// @@ -327,32 +359,32 @@ @Override public List<String> getAllProtocolNames() { - return protocolPersistenceService.getAllProtocolNames(); + return driver.getAllProtocolNames(); } @Override public List<TuttiProtocol> getAllProtocol() { - return protocolPersistenceService.getAllProtocol(); + return driver.getAllProtocol(); } @Override public TuttiProtocol getProtocol(String id) { - return protocolPersistenceService.getProtocol(id); + return driver.getProtocol(id); } @Override public TuttiProtocol createProtocol(TuttiProtocol bean) { - return protocolPersistenceService.createProtocol(bean); + return driver.createProtocol(bean); } @Override public TuttiProtocol saveProtocol(TuttiProtocol bean) { - return protocolPersistenceService.saveProtocol(bean); + return driver.saveProtocol(bean); } @Override public void deleteProtocol(String id) { - protocolPersistenceService.deleteProtocol(id); + driver.deleteProtocol(id); } //------------------------------------------------------------------------// @@ -361,22 +393,22 @@ @Override public List<FishingOperation> getAllFishingOperation(String cruiseId) { - return devDriver.getAllFishingOperation(cruiseId); + return driver.getAllFishingOperation(cruiseId); } @Override public FishingOperation getFishingOperation(String id) { - return devDriver.getFishingOperation(id); + return driver.getFishingOperation(id); } @Override public FishingOperation createFishingOperation(FishingOperation bean) { - return devDriver.createFishingOperation(bean); + return driver.createFishingOperation(bean); } @Override public FishingOperation saveFishingOperation(FishingOperation bean) { - return devDriver.saveFishingOperation(bean); + return driver.saveFishingOperation(bean); } //------------------------------------------------------------------------// @@ -385,17 +417,17 @@ @Override public CatchBatch getCatchBatchFromFishingOperation(String id) { - return devDriver.getCatchBatchFromFishingOperation(id); + return driver.getCatchBatchFromFishingOperation(id); } @Override public CatchBatch createCatchBatch(CatchBatch bean) { - return devDriver.createCatchBatch(bean); + return driver.createCatchBatch(bean); } @Override public CatchBatch saveCatchBatch(CatchBatch bean) { - return devDriver.saveCatchBatch(bean); + return driver.saveCatchBatch(bean); } //------------------------------------------------------------------------// @@ -405,49 +437,49 @@ @Override public List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId) { - return devDriver.getAllRootSpeciesBatch(fishingOperationId); + return driver.getAllRootSpeciesBatch(fishingOperationId); } @Override public List<SpeciesBatch> getAllSpeciesBatch(String fishingOperationId) { - return devDriver.getAllSpeciesBatch(fishingOperationId); + return driver.getAllSpeciesBatch(fishingOperationId); } @Override public SpeciesBatch getSpeciesBatch(String id) { - return devDriver.getSpeciesBatch(id); + return driver.getSpeciesBatch(id); } @Override public SpeciesBatch createSpeciesBatch(SpeciesBatch bean, String parentBatchId) { - return devDriver.createSpeciesBatch(bean, parentBatchId); + return driver.createSpeciesBatch(bean, parentBatchId); } @Override public SpeciesBatch saveSpeciesBatch(SpeciesBatch bean) { - return devDriver.saveSpeciesBatch(bean); + return driver.saveSpeciesBatch(bean); } @Override public void deleteSpeciesBatch(String id) { - devDriver.deleteSpeciesBatch(id); + driver.deleteSpeciesBatch(id); } @Override public void deleteSpeciesSubBatch(String id) { - devDriver.deleteSpeciesSubBatch(id); + driver.deleteSpeciesSubBatch(id); } @Override public List<SpeciesBatchFrequency> getAllSpeciesBatchFrequency(String speciesBatchId) { - return devDriver.getAllSpeciesBatchFrequency(speciesBatchId); + return driver.getAllSpeciesBatchFrequency(speciesBatchId); } @Override public List<SpeciesBatchFrequency> saveSpeciesBatchFrequency(String speciesBatchId, List<SpeciesBatchFrequency> frequencies) { - return devDriver.saveSpeciesBatchFrequency(speciesBatchId, frequencies); + return driver.saveSpeciesBatchFrequency(speciesBatchId, frequencies); } //------------------------------------------------------------------------// @@ -456,27 +488,27 @@ @Override public List<BenthosBatch> getAllBenthosBatch(String fishingOperationId) { - return devDriver.getAllBenthosBatch(fishingOperationId); + return driver.getAllBenthosBatch(fishingOperationId); } @Override public BenthosBatch getBenthosBatch(String id) { - return devDriver.getBenthosBatch(id); + return driver.getBenthosBatch(id); } @Override public BenthosBatch createBenthosBatch(BenthosBatch bean) { - return devDriver.createBenthosBatch(bean); + return driver.createBenthosBatch(bean); } @Override public BenthosBatch saveBenthosBatch(BenthosBatch bean) { - return devDriver.saveBenthosBatch(bean); + return driver.saveBenthosBatch(bean); } @Override public void deleteBenthosBatch(String id) { - devDriver.deleteBenthosBatch(id); + driver.deleteBenthosBatch(id); } //------------------------------------------------------------------------// @@ -485,27 +517,27 @@ @Override public List<PlanktonBatch> getAllPlanktonBatch(String fishingOperationId) { - return devDriver.getAllPlanktonBatch(fishingOperationId); + return driver.getAllPlanktonBatch(fishingOperationId); } @Override public PlanktonBatch getPlanktonBatch(String id) { - return devDriver.getPlanktonBatch(id); + return driver.getPlanktonBatch(id); } @Override public PlanktonBatch createPlanktonBatch(PlanktonBatch bean) { - return devDriver.createPlanktonBatch(bean); + return driver.createPlanktonBatch(bean); } @Override public PlanktonBatch savePlanktonBatch(PlanktonBatch bean) { - return devDriver.savePlanktonBatch(bean); + return driver.savePlanktonBatch(bean); } @Override public void deletePlanktonBatch(String id) { - devDriver.deletePlanktonBatch(id); + driver.deletePlanktonBatch(id); } //------------------------------------------------------------------------// @@ -514,27 +546,27 @@ @Override public List<MacroWasteBatch> getAllMacroWasteBatch(String fishingOperationId) { - return devDriver.getAllMacroWasteBatch(fishingOperationId); + return driver.getAllMacroWasteBatch(fishingOperationId); } @Override public MacroWasteBatch getMacroWasteBatch(String id) { - return devDriver.getMacroWasteBatch(id); + return driver.getMacroWasteBatch(id); } @Override public MacroWasteBatch createMacroWasteBatch(MacroWasteBatch bean) { - return devDriver.createMacroWasteBatch(bean); + return driver.createMacroWasteBatch(bean); } @Override public MacroWasteBatch saveMacroWasteBatch(MacroWasteBatch bean) { - return devDriver.saveMacroWasteBatch(bean); + return driver.saveMacroWasteBatch(bean); } @Override public void deleteMacroWasteBatch(String id) { - devDriver.deleteMacroWasteBatch(id); + driver.deleteMacroWasteBatch(id); } //------------------------------------------------------------------------// @@ -543,27 +575,27 @@ @Override public List<AccidentalBatch> getAllAccidentalBatch(String fishingOperationId) { - return devDriver.getAllAccidentalBatch(fishingOperationId); + return driver.getAllAccidentalBatch(fishingOperationId); } @Override public AccidentalBatch getAccidentalBatch(String id) { - return devDriver.getAccidentalBatch(id); + return driver.getAccidentalBatch(id); } @Override public AccidentalBatch createAccidentalBatch(AccidentalBatch bean) { - return devDriver.createAccidentalBatch(bean); + return driver.createAccidentalBatch(bean); } @Override public AccidentalBatch saveAccidentalBatch(AccidentalBatch bean) { - return devDriver.saveAccidentalBatch(bean); + return driver.saveAccidentalBatch(bean); } @Override public void deleteAccidentalBatch(String id) { - devDriver.deleteAccidentalBatch(id); + driver.deleteAccidentalBatch(id); } //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-01 18:37:33 UTC (rev 296) @@ -55,6 +55,7 @@ import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; +import javax.swing.JOptionPane; import javax.swing.JRootPane; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; @@ -76,7 +77,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.swing.JOptionPane; import static org.nuiton.i18n.I18n._; @@ -99,7 +99,7 @@ public abstract void onCloseUI(); public abstract M getModel(); - + public abstract SwingValidator<M> getValidator(); protected final TuttiUIContext context; @@ -133,14 +133,14 @@ * Can the UI be closed? It is useful whe the user wants to exit the current * screen but the model is modified: we can then ask the user if he wants to * save or not. - * + * * @param nextScreen the next screen to display - * @return + * @return */ public boolean canCloseUI(TuttiScreen nextScreen) { return true; } - + public void setText(KeyEvent event, String property) { JTextComponent field = (JTextComponent) event.getSource(); String value = field.getText(); @@ -229,7 +229,7 @@ public void closeDialog(TuttiUI ui) { SwingUtil.getParentContainer(ui, JDialog.class).setVisible(false); } - + public int askSaveBeforeLeaving(Component parent) { int i = JOptionPane.showConfirmDialog( parent, @@ -302,7 +302,7 @@ if (data == null) { data = Lists.newArrayList(); } - + if (log.isInfoEnabled()) { log.info("entity comboBox list [" + beanType.getName() + "] : " + (data == null ? 0 : data.size())); @@ -436,6 +436,11 @@ validator.addPropertyChangeListener(SimpleBeanValidator.VALID_PROPERTY, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { + if (log.isDebugEnabled()) { + log.debug("Model [" + model + + "] pass to valid state [" + + evt.getNewValue() + "]"); + } model.setValid((Boolean) evt.getNewValue()); } }); Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2013-02-01 18:37:33 UTC (rev 296) @@ -312,7 +312,7 @@ default: case SELECT_CRUISE: - screenUI = new SelectCruiseUI(context); + screenUI = new SelectCruiseUI(ui); screenTitle = _("tutti.title.home"); break; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUI.jaxx 2013-02-01 18:37:33 UTC (rev 296) @@ -28,6 +28,8 @@ fr.ifremer.tutti.persistence.entities.data.Program fr.ifremer.tutti.persistence.entities.data.Cruise fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol + + fr.ifremer.tutti.ui.swing.TuttiUI fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.util.ActionListCellRenderer @@ -42,10 +44,11 @@ protected TuttiUIContext uiContext; - public SelectCruiseUI(TuttiUIContext context) { - this.uiContext = context; + public SelectCruiseUI(TuttiUI parentUI) { + JAXXUtil.initContext(this, parentUI); + uiContext = parentUI.getHandler().getContext(); SelectCruiseUIHandler handler = - new SelectCruiseUIHandler(context, this); + new SelectCruiseUIHandler(parentUI, this); setContextValue(handler); handler.beforeInitUI(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-02-01 18:37:33 UTC (rev 296) @@ -31,8 +31,10 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; -import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.MainUI; +import fr.ifremer.tutti.ui.swing.TuttiUI; import jaxx.runtime.swing.editor.bean.BeanComboBox; +import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,7 +45,6 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; -import jaxx.runtime.validator.swing.SwingValidator; /** * Main ui content to select cruise. @@ -61,8 +62,8 @@ protected final SelectCruiseUI ui; - public SelectCruiseUIHandler(TuttiUIContext context, SelectCruiseUI ui) { - super(context); + public SelectCruiseUIHandler(TuttiUI<?, ?> parentUI, SelectCruiseUI ui) { + super(parentUI.getHandler().getContext()); this.ui = ui; persistenceService = context.getService(PersistenceService.class); } @@ -81,7 +82,15 @@ public void beforeInitUI() { SelectCruiseUIModel model = new SelectCruiseUIModel(); + //TODO TC: shoudl have program with their zone here directly List<Program> programs = persistenceService.getAllProgram(); + List<Program> loadedPrograms = + Lists.newArrayListWithCapacity(programs.size()); + for (Program program : programs) { + loadedPrograms.add(persistenceService.getProgram(program.getId())); + } + programs = loadedPrograms; + model.setPrograms(programs); if (programs.isEmpty()) { @@ -150,30 +159,6 @@ model.getPrograms(), model.getProgram()); -// ui.getProgramCombobox().setAutoComplete(false); -// ui.getProgramCombobox().setEditable(true); -// -// JComboBox combobox = ui.getProgramCombobox().getCombobox(); -// ComboBoxSearchable comboBoxSearchable = new ComboBoxSearchable(combobox) { -// -// final Decorator<Program> decorator = getDecorator(Program.class, null); -// -// @Override -// protected String convertElementToString(Object object) { -// return decorator.toString(object); -// } -// }; -// -// comboBoxSearchable.setRefreshPopupDuringSearching(true); -// comboBoxSearchable.setShowPopupDuringSearching(true); -// comboBoxSearchable.setFromStart(false); -// comboBoxSearchable.setHideSearchPopupOnEvent(false); -// comboBoxSearchable.setHeavyweightComponentEnabled(true); -// comboBoxSearchable.setForeground(Color.GREEN); -// -// AutoCompletion i= new AutoCompletion(combobox, comboBoxSearchable); - - initBeanComboBox(ui.getCruiseCombobox(), model.getCruises(), model.getCruise()); @@ -182,50 +167,6 @@ model.getProtocols(), model.getProtocol()); -// JComboBox newProtocolComboBox = ui.getNewProtocolComboBox(); -// DefaultComboBoxModel newProtocolActions = (DefaultComboBoxModel) newProtocolComboBox.getModel(); -// newProtocolActions.addElement(new NewProtocolAction(this)); -// newProtocolActions.addElement(new ImportProtocolAction(this)); -// -// JComboBox editProtocolComboBox = ui.getEditProtocolComboBox(); -// DefaultComboBoxModel editProtocolActions = (DefaultComboBoxModel) editProtocolComboBox.getModel(); -// editProtocolActions.addElement(new EditSelectedProtocolAction(this)); -// editProtocolActions.addElement(new CloneProtocolAction(this)); -// editProtocolActions.addElement(new ExportProtocolAction(this)); -// editProtocolComboBox.setModel(editProtocolActions); - -// newProtocolCombo.addMouseListener(new MouseAdapter() { -// -// @Override -// public void mouseEntered(MouseEvent e) { -// newProtocolCombo.showPopup(); -// } -// -// }); -// newProtocolCombo.addPopupMenuListener(new PopupMenuListener() { -// -// @Override -// public void popupMenuWillBecomeVisible(PopupMenuEvent e) { -// newProtocolCombo.getComponentPopupMenu().addMouseListener(new MouseAdapter() { -// -// @Override -// public void mouseExited(MouseEvent e) { -// newProtocolCombo.hidePopup(); -// } -// -// }); -// } -// -// @Override -// public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { -// } -// -// @Override -// public void popupMenuCanceled(PopupMenuEvent e) { -// } -// }); - - model.addPropertyChangeListener(SelectCruiseUIModel.PROPERTY_PROGRAM, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -271,10 +212,19 @@ } }); + MainUI main = ui.getContextValue(MainUI.class, MainUI.class.getName()); + main.clearValidators(); + main.registerValidator(getValidator()); + + listenValidatorValid(getValidator(), model); + + getValidator().setBean(model); + ui.applyDataBinding(SelectCruiseUI.BINDING_EDIT_PROGRAM_BUTTON_ENABLED); ui.applyDataBinding(SelectCruiseUI.BINDING_EDIT_CRUISE_BUTTON_ENABLED); + ui.applyDataBinding(SelectCruiseUI.BINDING_EDIT_CATCHES_BUTTON_ENABLED); + ui.applyDataBinding(SelectCruiseUI.BINDING_VALIDATE_CATCHES_BUTTON_ENABLED); - listenValidatorValid(getValidator(), model); } @Override Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUI.jaxx 2013-02-01 18:37:33 UTC (rev 296) @@ -311,30 +311,30 @@ </JPanel> </tab> <tab id='benthosTab' title='tutti.label.tab.benthos'> - <JXTitledPanel id='benthosTabFishingOperationReminderLabel'> + <!--JXTitledPanel id='benthosTabFishingOperationReminderLabel'> <BenthosBatchUI id='benthosTabContent' constructorParams='this'/> - </JXTitledPanel> + </JXTitledPanel--> </tab> <tab id='planktonTab' title='tutti.label.tab.plancton'> - <JXTitledPanel id='planktonTabFishingOperationReminderLabel'> + <!--JXTitledPanel id='planktonTabFishingOperationReminderLabel'> <PlanktonBatchUI id='planktonTabContent' constructorParams='this'/> - </JXTitledPanel> + </JXTitledPanel--> </tab> <tab id='macroWasteTab' title='tutti.label.tab.macroDechet'> - <JXTitledPanel id='macroWasteTabFishingOperationReminderLabel'> + <!--JXTitledPanel id='macroWasteTabFishingOperationReminderLabel'> <MacroWasteBatchUI id='macroWasteTabContent' constructorParams='this'/> - </JXTitledPanel> + </JXTitledPanel--> </tab> <tab id='accidentalTab' title='tutti.label.tab.accidentel'> - <JXTitledPanel id='accidentalTabFishingOperationReminderLabel'> + <!--JXTitledPanel id='accidentalTabFishingOperationReminderLabel'> <AccidentalBatchUI id='accidentalTabContent' constructorParams='this'/> - </JXTitledPanel> + </JXTitledPanel--> </tab> <tab id='observationIndividuelTab' title='tutti.label.tab.observationIndividuel'> - <JXTitledPanel id='observationTabFishingOperationReminderLabel'> + <!--JXTitledPanel id='observationTabFishingOperationReminderLabel'> <JLabel text='tutti.to.be.done' horizontalAlignment='{JLabel.CENTER}'/> - </JXTitledPanel> + </JXTitledPanel--> </tab> </JTabbedPane> Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/EditCatchesUIHandler.java 2013-02-01 18:37:33 UTC (rev 296) @@ -135,10 +135,10 @@ // close batches tabs, then general tab closeUI(ui.getSpeciesTabContent()); - closeUI(ui.getBenthosTabContent()); - closeUI(ui.getPlanktonTabContent()); - closeUI(ui.getMacroWasteTabContent()); - closeUI(ui.getAccidentalTabContent()); +// closeUI(ui.getBenthosTabContent()); +// closeUI(ui.getPlanktonTabContent()); +// closeUI(ui.getMacroWasteTabContent()); +// closeUI(ui.getAccidentalTabContent()); } @Override @@ -185,10 +185,10 @@ } ui.getSpeciesTabContent().getHandler().clearTableSelection(); - ui.getBenthosTabContent().getHandler().clearTableSelection(); - ui.getPlanktonTabContent().getHandler().clearTableSelection(); - ui.getMacroWasteTabContent().getHandler().clearTableSelection(); - ui.getAccidentalTabContent().getHandler().clearTableSelection(); +// ui.getBenthosTabContent().getHandler().clearTableSelection(); +// ui.getPlanktonTabContent().getHandler().clearTableSelection(); +// ui.getMacroWasteTabContent().getHandler().clearTableSelection(); +// ui.getAccidentalTabContent().getHandler().clearTableSelection(); // 2) Use new selected fishingOperation @@ -226,18 +226,18 @@ // 3) Propagate title to others tabs ui.getCatchesCaracteristicsTabPane().setTitle(fishingOperationText); ui.getSpeciesTabFishingOperationReminderLabel().setTitle(fishingOperationText); - ui.getBenthosTabFishingOperationReminderLabel().setTitle(fishingOperationText); - ui.getPlanktonTabFishingOperationReminderLabel().setTitle(fishingOperationText); - ui.getMacroWasteTabFishingOperationReminderLabel().setTitle(fishingOperationText); - ui.getAccidentalTabFishingOperationReminderLabel().setTitle(fishingOperationText); +// ui.getBenthosTabFishingOperationReminderLabel().setTitle(fishingOperationText); +// ui.getPlanktonTabFishingOperationReminderLabel().setTitle(fishingOperationText); +// ui.getMacroWasteTabFishingOperationReminderLabel().setTitle(fishingOperationText); +// ui.getAccidentalTabFishingOperationReminderLabel().setTitle(fishingOperationText); // 4) Propagate new selected fishingoperation to others tabs ui.getSpeciesTabContent().getHandler().selectFishingOperation(bean); - ui.getBenthosTabContent().getHandler().selectFishingOperation(bean); - ui.getPlanktonTabContent().getHandler().selectFishingOperation(bean); - ui.getMacroWasteTabContent().getHandler().selectFishingOperation(bean); - ui.getAccidentalTabContent().getHandler().selectFishingOperation(bean); +// ui.getBenthosTabContent().getHandler().selectFishingOperation(bean); +// ui.getPlanktonTabContent().getHandler().selectFishingOperation(bean); +// ui.getMacroWasteTabContent().getHandler().selectFishingOperation(bean); +// ui.getAccidentalTabContent().getHandler().selectFishingOperation(bean); ui.getTabPane().repaint(); } @@ -256,8 +256,7 @@ showInformationMessage( "[ Captures - Caractéristiques générales ] " + - "Sauvegarde des modifications de " + decorate(catchBatch) + - "."); + "Sauvegarde des modifications du résumé de la capture."); persistenceService.saveCatchBatch(catchBatch); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolSpeciesRowModel.java 2013-02-01 18:37:33 UTC (rev 296) @@ -38,7 +38,9 @@ public class EditProtocolSpeciesRowModel extends AbstractTuttiBeanUIModel<SpeciesProtocol, EditProtocolSpeciesRowModel> { private static final long serialVersionUID = 1L; - + + public static final String PROPERTY_SPECIES_CRUISE_CODE = "speciesCruiseCode"; + public static final String PROPERTY_SPECIES = "species"; public static final String PROPERTY_SIZE_ENABLED = "sizeEnabled"; @@ -50,7 +52,7 @@ public static final String PROPERTY_AGE_ENABLED = "ageEnabled"; public static final String PROPERTY_LENGTH_STEP_PMFM = "lengthStepPmfm"; - + public static final String PROPERTY_WEIGHT_ENABLED = "weightEnabled"; public static final String PROPERTY_COUNT_IF_NO_FREQUENCY_ENABLED = "countIfNoFrequencyEnabled"; @@ -59,6 +61,8 @@ protected Species species; + protected String speciesCruiseCode; + protected boolean sizeEnabled; protected boolean sexEnabled; @@ -66,7 +70,7 @@ protected boolean maturityEnabled; protected boolean ageEnabled; - + protected Caracteristic lengthStepPmfm; protected boolean weightEnabled; @@ -101,6 +105,16 @@ firePropertyChange(PROPERTY_SPECIES, oldValue, species); } + public String getSpeciesCruiseCode() { + return speciesCruiseCode; + } + + public void setSpeciesCruiseCode(String speciesCruiseCode) { + Object oldValue = getSpeciesCruiseCode(); + this.speciesCruiseCode = speciesCruiseCode; + firePropertyChange(PROPERTY_SPECIES_CRUISE_CODE, oldValue, speciesCruiseCode); + } + public boolean isSizeEnabled() { return sizeEnabled; } @@ -184,5 +198,5 @@ this.calcifySampleEnabled = calcifySampleEnabled; firePropertyChange(PROPERTY_CALCIFY_SAMPLE_ENABLED, oldValue, calcifySampleEnabled); } - + } Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml =================================================================== --- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml 2013-02-01 17:07:19 UTC (rev 295) +++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIModel-error-validation.xml 2013-02-01 18:37:33 UTC (rev 296) @@ -29,8 +29,10 @@ <field name="program"> - <field-validator type="required" short-circuit="true"> - <param name="fieldName">program.zone</param> + <field-validator type="fieldexpression" short-circuit="true"> + <param name="expression"> + <![CDATA[ program == null || program.zone != null ]]> + </param> <message>tutti.validator.error.program.zone.required</message> </field-validator> </field>
participants (1)
-
tchemit@users.forge.codelutin.com