1 package fr.ifremer.quadrige3.synchro.service.referential; 2 3 /*- 4 * #%L 5 * Quadrige3 Core :: Quadrige3 Synchro Core 6 * $Id:$ 7 * $HeadURL:$ 8 * %% 9 * Copyright (C) 2017 Ifremer 10 * %% 11 * This program is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Affero General Public License as published by 13 * the Free Software Foundation, either version 3 of the License, or 14 * (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU Affero General Public License 22 * along with this program. If not, see <http://www.gnu.org/licenses/>. 23 * #L% 24 */ 25 26 import fr.ifremer.common.synchro.service.RejectedRow; 27 import fr.ifremer.common.synchro.service.SynchroResult; 28 import fr.ifremer.quadrige3.synchro.service.SynchroDirection; 29 import org.springframework.transaction.annotation.Propagation; 30 import org.springframework.transaction.annotation.Transactional; 31 32 import java.io.File; 33 import java.sql.Timestamp; 34 import java.util.Map; 35 import java.util.Properties; 36 import java.util.Set; 37 38 /** 39 * <p> 40 * ReferentialSynchroService interface. 41 * </p> 42 * 43 */ 44 @Transactional(propagation = Propagation.SUPPORTS) 45 public interface ReferentialSynchroService { 46 47 /** 48 * Create a synchro context, from a source database directory (HSQLDB only), and with a last synchronization date. 49 * This use local connection properties as source properties, but change JDBC URL to use the given directory 50 * 51 * @param sourceDbDirectory 52 * a directory with a HSQLDB directory. 53 * @param lastSynchronizationDate 54 * the last synchro date 55 * @param enableDelete 56 * a boolean. 57 * @param enableInsertUpdate 58 * a boolean. 59 * @return a new context for synchronization 60 * @param direction 61 * a {@link fr.ifremer.quadrige3.synchro.service.SynchroDirection} object. 62 * @param userId 63 * a int. 64 * @param statusCodeIncludes 65 * a {@link java.util.Set} object. 66 */ 67 ReferentialSynchroContext createSynchroContext(File sourceDbDirectory, 68 Timestamp lastSynchronizationDate, 69 boolean enableDelete, 70 boolean enableInsertUpdate, 71 SynchroDirection direction, 72 int userId, 73 Set<String> statusCodeIncludes); 74 75 /** 76 * Create a synchro context, using configuration properties for target and source properties, and with a last 77 * synchronization date. 78 * 79 * @param sourceConnectionProperties 80 * Properties to use as source connection (could be Oracle, HSQLDB...) 81 * @param lastSynchronizationDate 82 * the last synchro date 83 * @param enableDelete 84 * a boolean. 85 * @param enableInsertUpdate 86 * a boolean. 87 * @param statusCodeIncludes 88 * status codes to include. Or null for 'all' 89 * @return a new context for synchronization 90 * @param direction 91 * a {@link fr.ifremer.quadrige3.synchro.service.SynchroDirection} object. 92 * @param userId 93 * a int. 94 */ 95 ReferentialSynchroContext createSynchroContext(Properties sourceConnectionProperties, 96 Timestamp lastSynchronizationDate, 97 boolean enableDelete, 98 boolean enableInsertUpdate, 99 SynchroDirection direction, 100 int userId, 101 Set<String> statusCodeIncludes); 102 103 /** 104 * Prepare the synchronize operation from the target data database supported 105 * by this service, says just compute nb rows to update for each table and 106 * update the result model. 107 * <p/> 108 * This method use Propagation.REQUIRES_NEW, because the transaction will be mark as rollbackOnly. (could not be set 109 * as readOnly, because of insertions into TEMP_QUERY_PARAMETER table) 110 * 111 * @param context 112 * Context of synchronization 113 */ 114 @Transactional(propagation = Propagation.REQUIRED) 115 void prepare(ReferentialSynchroContext context); 116 117 /** 118 * <p> 119 * synchronize. 120 * </p> 121 * 122 * @param context 123 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 124 */ 125 @Transactional(propagation = Propagation.REQUIRED) 126 void synchronize(ReferentialSynchroContext context); 127 128 /** 129 * <p> 130 * getSourceLastUpdateDate. 131 * </p> 132 * 133 * @param synchroContext 134 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 135 * @return a {@link java.sql.Timestamp} object. 136 */ 137 @Transactional(readOnly = true, propagation = Propagation.REQUIRED) 138 Timestamp getSourceLastUpdateDate(ReferentialSynchroContext synchroContext); 139 140 /** 141 * <p> 142 * finish. 143 * </p> 144 * 145 * @param synchroContext 146 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 147 * @param resultWithPendingOperation 148 * a {@link fr.ifremer.common.synchro.service.SynchroResult} object. 149 * @param rejectStrategies 150 * a {@link java.util.Map} object. 151 */ 152 @Transactional(propagation = Propagation.REQUIRED) 153 void finish(ReferentialSynchroContext synchroContext, SynchroResult resultWithPendingOperation, 154 Map<RejectedRow.Cause, RejectedRow.ResolveStrategy> rejectStrategies); 155 }