1 package fr.ifremer.quadrige2.synchro.service.referential; 2 3 /*- 4 * #%L 5 * Quadrige2 Core :: Quadrige2 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.SynchroContext; 28 import fr.ifremer.common.synchro.service.SynchroResult; 29 import fr.ifremer.quadrige2.synchro.service.SynchroDirection; 30 import org.springframework.transaction.annotation.Propagation; 31 import org.springframework.transaction.annotation.Transactional; 32 33 import java.io.File; 34 import java.sql.Timestamp; 35 import java.util.Map; 36 import java.util.Properties; 37 import java.util.Set; 38 39 /** 40 * <p> 41 * ReferentialSynchroService interface. 42 * </p> 43 * 44 */ 45 @Transactional(propagation = Propagation.SUPPORTS) 46 public interface ReferentialSynchroService { 47 48 /** 49 * Create a synchro context, from a source database directory (HSQLDB only), and with a last synchronization date. 50 * This use local connection properties as source properties, but change JDBC URL to use the given directory 51 * 52 * @param sourceDbDirectory 53 * a directory with a HSQLDB directory. 54 * @param lastSynchronizationDate 55 * the last synchro date 56 * @param enableDelete 57 * a boolean. 58 * @param enableInsertUpdate 59 * a boolean. 60 * @return a new context for synchronization 61 * @param direction 62 * a {@link fr.ifremer.quadrige2.synchro.service.SynchroDirection} object. 63 * @param userId 64 * a int. 65 * @param statusCodeIncludes 66 * a {@link java.util.Set} object. 67 */ 68 ReferentialSynchroContext createSynchroContext(File sourceDbDirectory, 69 Timestamp lastSynchronizationDate, 70 boolean enableDelete, 71 boolean enableInsertUpdate, 72 SynchroDirection direction, 73 int userId, 74 Set<String> statusCodeIncludes); 75 76 /** 77 * Create a synchro context, using configuration properties for target and source properties, and with a last 78 * synchronization date. 79 * 80 * @param sourceConnectionProperties 81 * Properties to use as source connection (could be Oracle, HSQLDB...) 82 * @param lastSynchronizationDate 83 * the last synchro date 84 * @param enableDelete 85 * a boolean. 86 * @param enableInsertUpdate 87 * a boolean. 88 * @param statusCodeIncludes 89 * status codes to include. Or null for 'all' 90 * @return a new context for synchronization 91 * @param direction 92 * a {@link fr.ifremer.quadrige2.synchro.service.SynchroDirection} object. 93 * @param userId 94 * a int. 95 */ 96 ReferentialSynchroContext createSynchroContext(Properties sourceConnectionProperties, 97 Timestamp lastSynchronizationDate, 98 boolean enableDelete, 99 boolean enableInsertUpdate, 100 SynchroDirection direction, 101 int userId, 102 Set<String> statusCodeIncludes); 103 104 /** 105 * Prepare the synchronize operation from the target data database supported 106 * by this service, says just compute nb rows to update for each table and 107 * update the result model. 108 * <p/> 109 * This method use Propagation.REQUIRES_NEW, because the transaction will be mark as rollbackOnly. (could not be set 110 * as readOnly, because of insertions into TEMP_QUERY_PARAMETER table) 111 * 112 * @param context 113 * Context of synchronization 114 */ 115 @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 116 void prepare(SynchroContext context); 117 118 /** 119 * <p> 120 * synchronize. 121 * </p> 122 * 123 * @param context 124 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 125 */ 126 @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 127 void synchronize(SynchroContext context); 128 129 /** 130 * <p> 131 * getSourceLastUpdateDate. 132 * </p> 133 * 134 * @param synchroContext 135 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 136 * @return a {@link java.sql.Timestamp} object. 137 */ 138 @Transactional(readOnly = true, propagation = Propagation.REQUIRED) 139 Timestamp getSourceLastUpdateDate(SynchroContext synchroContext); 140 141 /** 142 * <p> 143 * finish. 144 * </p> 145 * 146 * @param synchroContext 147 * a {@link fr.ifremer.common.synchro.service.SynchroContext} object. 148 * @param resultWithPendingOperation 149 * a {@link fr.ifremer.common.synchro.service.SynchroResult} object. 150 * @param rejectStrategies 151 * a {@link java.util.Map} object. 152 */ 153 @Transactional(readOnly = false, propagation = Propagation.REQUIRED) 154 void finish(SynchroContext synchroContext, SynchroResult resultWithPendingOperation, 155 Map<RejectedRow.Cause, RejectedRow.ResolveStrategy> rejectStrategies); 156 }