View Javadoc
1   package fr.ifremer.quadrige3.synchro.service.data;
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 com.google.common.collect.Multimap;
27  import fr.ifremer.common.synchro.service.SynchroDatabaseConfiguration;
28  import fr.ifremer.quadrige3.core.dao.technical.Assert;
29  import fr.ifremer.quadrige3.core.dao.technical.hibernate.ConfigurationHelper;
30  import fr.ifremer.quadrige3.synchro.meta.DatabaseColumns;
31  import fr.ifremer.quadrige3.synchro.meta.data.DataSynchroTables;
32  import fr.ifremer.quadrige3.synchro.service.AbstractSynchroDatabaseConfiguration;
33  import fr.ifremer.quadrige3.synchro.service.SynchroDirection;
34  import fr.ifremer.quadrige3.synchro.vo.SynchroDateOperatorVO;
35  
36  import java.io.File;
37  import java.util.Date;
38  import java.util.Map;
39  import java.util.Properties;
40  import java.util.Set;
41  
42  /**
43   * <p>
44   * DataSynchroDatabaseConfiguration class.
45   * </p>
46   * 
47   */
48  public class DataSynchroDatabaseConfiguration extends AbstractSynchroDatabaseConfiguration {
49  
50  	/**
51  	 * Temporary database
52  	 */
53  	private static final String IS_TEMPORARY_DATABASE = "quadrige3.synchro.database.isTemporary";
54  
55  	/**
56  	 * Column remote id
57  	 */
58  	private static final String COLUMN_REMOTE_ID = "synchro.database.column.remoteId";
59  
60  	/**
61  	 * Column synchronization_status
62  	 */
63  	private static final String COLUMN_SYNCHRONIZATION_STATUS = "synchro.database.column.synchronizationStatus";
64  
65  	/**
66  	 * Parameter for photo folder
67  	 */
68  	public static String DB_PHOTO_DIRECTORY = "quadrige3.synchro.database.photo.directory";
69  
70  	private final DataSynchroContext context;
71  
72  	private String columnRemoteId;
73  
74  	private String columnSynchronizationStatus;
75  
76  	private File dbPhotoDirectory;
77  
78  	/**
79  	 * <p>
80  	 * Constructor for DataSynchroDatabaseConfiguration.
81  	 * </p>
82  	 * 
83  	 * @param context
84  	 *            a {@link fr.ifremer.quadrige3.synchro.service.data.DataSynchroContext} object.
85  	 * @param otherBean
86  	 *            a {@link fr.ifremer.common.synchro.service.SynchroDatabaseConfiguration} object.
87  	 */
88  	public DataSynchroDatabaseConfiguration(DataSynchroContext context, SynchroDatabaseConfiguration otherBean) {
89  		copy(otherBean);
90  		Assert.notNull(context);
91  		this.context = context;
92  	}
93  
94  	/**
95  	 * <p>
96  	 * Constructor for DataSynchroDatabaseConfiguration.
97  	 * </p>
98  	 * 
99  	 * @param context
100 	 *            a {@link fr.ifremer.quadrige3.synchro.service.data.DataSynchroContext} object.
101 	 * @param settings
102 	 *            a {@link java.util.Properties} object.
103 	 * @param isTarget
104 	 *            a boolean.
105 	 */
106 	public DataSynchroDatabaseConfiguration(DataSynchroContext context, Properties settings, boolean isTarget) {
107 		super(settings, isTarget);
108 		Assert.notNull(context);
109 		this.context = context;
110 	}
111 
112 	@Override
113 	protected void reloadCachedFields() {
114 		super.reloadCachedFields();
115 
116 		String dbPhotoDirectory = ConfigurationHelper.getString(DB_PHOTO_DIRECTORY, getProperties(), null);
117 		if (dbPhotoDirectory != null) {
118 			this.dbPhotoDirectory = new File(dbPhotoDirectory);
119 		}
120 
121 	}
122 
123 	/**
124 	 * <p>
125 	 * Getter for the field <code>columnRemoteId</code>.
126 	 * </p>
127 	 * 
128 	 * @return a {@link java.lang.String} object.
129 	 */
130 	public String getColumnRemoteId() {
131 		return columnRemoteId;
132 	}
133 
134 	/**
135 	 * <p>
136 	 * Setter for the field <code>columnRemoteId</code>.
137 	 * </p>
138 	 * 
139 	 * @param columnName
140 	 *            a {@link java.lang.String} object.
141 	 * @return a {@link fr.ifremer.common.synchro.service.SynchroDatabaseConfiguration} object.
142 	 */
143 	public SynchroDatabaseConfiguration setColumnRemoteId(String columnName) {
144 		this.columnRemoteId = columnName;
145 		setProperty(COLUMN_REMOTE_ID, columnName);
146 		return this;
147 	}
148 
149 	/**
150 	 * <p>
151 	 * Getter for the field <code>columnSynchronizationStatus</code>.
152 	 * </p>
153 	 * 
154 	 * @return a {@link java.lang.String} object.
155 	 */
156 	public String getColumnSynchronizationStatus() {
157 		return columnSynchronizationStatus;
158 	}
159 
160 	/**
161 	 * <p>
162 	 * Setter for the field <code>columnSynchronizationStatus</code>.
163 	 * </p>
164 	 * 
165 	 * @param columnName
166 	 *            a {@link java.lang.String} object.
167 	 * @return a {@link fr.ifremer.common.synchro.service.SynchroDatabaseConfiguration} object.
168 	 */
169 	public SynchroDatabaseConfiguration setColumnSynchronizationStatus(String columnName) {
170 		this.columnSynchronizationStatus = columnName;
171 		setProperty(COLUMN_SYNCHRONIZATION_STATUS, columnName);
172 		return this;
173 	}
174 
175 	public File getDbPhotoDirectory() {
176 		return dbPhotoDirectory;
177 	}
178 
179 	public SynchroDatabaseConfiguration setDbPhotoDirectory(File dbPhotoDirectory) {
180 		this.dbPhotoDirectory = dbPhotoDirectory;
181 		setProperty(DB_PHOTO_DIRECTORY, dbPhotoDirectory.getAbsolutePath());
182 		return this;
183 	}
184 
185 	public boolean isEnablePhoto() {
186 		return context.isEnablePhoto();
187 	}
188 
189 	/**
190 	 * <p>
191 	 * getUserId.
192 	 * </p>
193 	 * 
194 	 * @return a {@link java.lang.Integer} object.
195 	 */
196 	public Integer getUserId() {
197 		return context.getUserId();
198 	}
199 
200 	/**
201 	 * <p>
202 	 * getProgramCodes.
203 	 * </p>
204 	 * 
205 	 * @return a {@link java.util.Set} object.
206 	 */
207 	public Set<String> getProgramCodes() {
208 		return context.getProgramCodes();
209 	}
210 
211 	/**
212 	 * <p>
213 	 * setIsTemporary.
214 	 * </p>
215 	 * 
216 	 * @param isTemporaryDatabase
217 	 *            a boolean.
218 	 */
219 	public void setIsTemporary(boolean isTemporaryDatabase) {
220 		setProperty(IS_TEMPORARY_DATABASE, String.valueOf(isTemporaryDatabase));
221 	}
222 
223 	/**
224 	 * <p>
225 	 * getDataStartDate.
226 	 * </p>
227 	 * 
228 	 * @return a {@link java.util.Date} object.
229 	 */
230 	public Date getDataStartDate() {
231 		return context.getDataStartDate();
232 	}
233 
234 	/**
235 	 * <p>
236 	 * getDataEndDate.
237 	 * </p>
238 	 * 
239 	 * @return a {@link java.util.Date} object.
240 	 */
241 	public Date getDataEndDate() {
242 		return context.getDataEndDate();
243 	}
244 
245 	/**
246 	 * <p>
247 	 * getDateOperator.
248 	 * </p>
249 	 * 
250 	 * @return a {@link fr.ifremer.quadrige3.synchro.vo.SynchroDateOperatorVO} object.
251 	 */
252 	public SynchroDateOperatorVO getDateOperator() {
253 		return context.getDateOperator();
254 	}
255 
256 	/**
257 	 * <p>
258 	 * isDirtyOnly.
259 	 * </p>
260 	 * 
261 	 * @return a boolean.
262 	 */
263 	public boolean isDirtyOnly() {
264 		return context.isDirtyOnly();
265 	}
266 
267 	/**
268 	 * <p>
269 	 * getPkIncludes.
270 	 * </p>
271 	 * 
272 	 * @return a {@link com.google.common.collect.Multimap} object.
273 	 */
274 	public Multimap<String, String> getPkIncludes() {
275 		return context.getPkIncludes();
276 	}
277 
278 	/**
279 	 * <p>
280 	 * getDirection.
281 	 * </p>
282 	 * 
283 	 * @return a {@link fr.ifremer.quadrige3.synchro.service.SynchroDirection} object.
284 	 */
285 	public SynchroDirection getDirection() {
286 		return context.getDirection();
287 	}
288 
289 	/**
290 	 * <p>
291 	 * isForceEditedRowOverride.
292 	 * </p>
293 	 * 
294 	 * @return a boolean.
295 	 */
296 	public boolean isForceEditedRowOverride() {
297 		return context.isForceEditedRowOverride();
298 	}
299 
300 	/**
301 	 * <p>
302 	 * getChangeLogFile.
303 	 * </p>
304 	 * 
305 	 * @return a {@link java.io.File} object.
306 	 */
307 	public File getChangeLogFile() {
308 		return context.getChangeLogFile();
309 	}
310 
311 	/**
312 	 * <p>
313 	 * getRemapValues.
314 	 * </p>
315 	 * 
316 	 * @return a {@link java.util.Map} object.
317 	 */
318 	public Map<String, Map<String, Map<String, Object>>> getRemapValues() {
319 		return context.getRemapValues();
320 	}
321 
322 	/**
323 	 * <p>
324 	 * isForceDuplication.
325 	 * </p>
326 	 * 
327 	 * @return a boolean.
328 	 */
329 	public boolean isForceDuplication() {
330 		return context.isForceDuplication();
331 	}
332 
333 	/**
334 	 * <p>
335 	 * Ignore some not used columns
336 	 * </p>
337 	 *
338 	 */
339 	public void excludeUnusedColumns() {
340 		// Ignore some not used columns
341 		addColumnExclude(getColumnSynchronizationStatus());
342 		addColumnExclude(getColumnRemoteId());
343 	}
344 
345 	/**
346 	 * <p>
347 	 * excludeMeasurementUnusedColumns.
348 	 * </p>
349 	 *
350 	 */
351 	public void excludeMeasurementUnusedColumns() {
352 		// MEASUREMENT
353 		addColumnExclude(DataSynchroTables.MEASUREMENT.name(), DatabaseColumns.PAR_CD.name());
354 		addColumnExclude(DataSynchroTables.MEASUREMENT.name(), DatabaseColumns.FRACTION_ID.name());
355 		addColumnExclude(DataSynchroTables.MEASUREMENT.name(), DatabaseColumns.METHOD_ID.name());
356 		addColumnExclude(DataSynchroTables.MEASUREMENT.name(), DatabaseColumns.MATRIX_ID.name());
357 
358 		// TAXON_MEASUREMENT
359 		addColumnExclude(DataSynchroTables.TAXON_MEASUREMENT.name(), DatabaseColumns.PAR_CD.name());
360 		addColumnExclude(DataSynchroTables.TAXON_MEASUREMENT.name(), DatabaseColumns.FRACTION_ID.name());
361 		addColumnExclude(DataSynchroTables.TAXON_MEASUREMENT.name(), DatabaseColumns.METHOD_ID.name());
362 		addColumnExclude(DataSynchroTables.TAXON_MEASUREMENT.name(), DatabaseColumns.MATRIX_ID.name());
363 
364 		// MEASUREMENT_FILE
365 		addColumnExclude(DataSynchroTables.MEASUREMENT_FILE.name(), DatabaseColumns.PAR_CD.name());
366 		addColumnExclude(DataSynchroTables.MEASUREMENT_FILE.name(), DatabaseColumns.FRACTION_ID.name());
367 		addColumnExclude(DataSynchroTables.MEASUREMENT_FILE.name(), DatabaseColumns.METHOD_ID.name());
368 		addColumnExclude(DataSynchroTables.MEASUREMENT_FILE.name(), DatabaseColumns.MATRIX_ID.name());
369 	}
370 
371 	public DataSynchroDatabaseConfiguration getSource() {
372 		return context.getSource();
373 	}
374 
375 	public DataSynchroDatabaseConfiguration getTarget() {
376 		return context.getTarget();
377 	}
378 
379 	/** {@inheritDoc} */
380 	@Override
381 	public String toString() {
382 		StringBuilder sb = new StringBuilder(super.toString());
383 
384 		sb.append("\n    direction : ").append(getDirection().name());
385 		sb.append("\n    start date: ").append(getDataStartDate());
386 		sb.append("\n    end date: ").append(getDataEndDate());
387 		sb.append("\n    programs: ").append(getProgramCodes());
388 		sb.append("\n    user: ").append(getUserId());
389 		sb.append("\n    change log file: ").append(getChangeLogFile() == null ? "disable" : getChangeLogFile());
390 		sb.append("\n    force duplication: ").append(isForceDuplication());
391 
392 		return sb.toString();
393 	}
394 }