View Javadoc
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 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.synchro.meta.DatabaseColumns;
30  import fr.ifremer.quadrige3.synchro.meta.administration.MetaProgramSynchroTables;
31  import fr.ifremer.quadrige3.synchro.meta.administration.MoratoriumSynchroTables;
32  import fr.ifremer.quadrige3.synchro.meta.administration.ProgramStrategySynchroTables;
33  import fr.ifremer.quadrige3.synchro.meta.referential.ReferentialSynchroTables;
34  import fr.ifremer.quadrige3.synchro.meta.system.RuleSynchroTables;
35  import fr.ifremer.quadrige3.synchro.service.AbstractSynchroDatabaseConfiguration;
36  import fr.ifremer.quadrige3.synchro.service.SynchroDirection;
37  
38  import java.io.File;
39  import java.util.Properties;
40  import java.util.Set;
41  
42  /**
43   * <p>
44   * ReferentialSynchroDatabaseConfiguration class.
45   * </p>
46   * 
47   */
48  public class ReferentialSynchroDatabaseConfiguration extends AbstractSynchroDatabaseConfiguration {
49  
50  	/**
51  	 * Temporary database
52  	 */
53  	private static final String IS_TEMPORARY_DATABASE = "quadrige3.synchro.database.isTemporary";
54  
55  	private final ReferentialSynchroContext context;
56  
57  	/**
58  	 * <p>
59  	 * Constructor for ReferentialSynchroDatabaseConfiguration.
60  	 * </p>
61  	 * 
62  	 * @param context
63  	 *            a {@link fr.ifremer.quadrige3.synchro.service.referential.ReferentialSynchroContext} object.
64  	 * @param otherBean
65  	 *            a {@link fr.ifremer.common.synchro.service.SynchroDatabaseConfiguration} object.
66  	 */
67  	public ReferentialSynchroDatabaseConfiguration(ReferentialSynchroContext context, SynchroDatabaseConfiguration otherBean) {
68  		copy(otherBean);
69  		Assert.notNull(context);
70  		this.context = context;
71  	}
72  
73  	/**
74  	 * <p>
75  	 * Constructor for ReferentialSynchroDatabaseConfiguration.
76  	 * </p>
77  	 * 
78  	 * @param context
79  	 *            a {@link fr.ifremer.quadrige3.synchro.service.referential.ReferentialSynchroContext} object.
80  	 * @param settings
81  	 *            a {@link java.util.Properties} object.
82  	 * @param isTarget
83  	 *            a boolean.
84  	 */
85  	public ReferentialSynchroDatabaseConfiguration(ReferentialSynchroContext context, Properties settings, boolean isTarget) {
86  		super(settings, isTarget);
87  		Assert.notNull(context);
88  		this.context = context;
89  	}
90  
91  	/**
92  	 * <p>
93  	 * getUserId.
94  	 * </p>
95  	 * 
96  	 * @return a {@link java.lang.Integer} object.
97  	 */
98  	public Integer getUserId() {
99  		return context.getUserId();
100 	}
101 
102 	/**
103 	 * <p>
104 	 * setIsTemporary.
105 	 * </p>
106 	 * 
107 	 * @param isTemporayDatabase
108 	 *            a boolean.
109 	 */
110 	public void setIsTemporary(boolean isTemporayDatabase) {
111 		setProperty(IS_TEMPORARY_DATABASE, String.valueOf(isTemporayDatabase));
112 	}
113 
114 	/**
115 	 * <p>
116 	 * getPkIncludes.
117 	 * </p>
118 	 * 
119 	 * @return a {@link com.google.common.collect.Multimap} object.
120 	 */
121 	public Multimap<String, String> getPkIncludes() {
122 		return context.getPkIncludes();
123 	}
124 
125 	/**
126 	 * <p>
127 	 * getDirection.
128 	 * </p>
129 	 * 
130 	 * @return a {@link fr.ifremer.quadrige3.synchro.service.SynchroDirection} object.
131 	 */
132 	public SynchroDirection getDirection() {
133 		return context.getDirection();
134 	}
135 
136 	/**
137 	 * <p>
138 	 * isIntegrityConstraintEnable.
139 	 * </p>
140 	 * 
141 	 * @return a boolean.
142 	 */
143 	public boolean isIntegrityConstraintEnable() {
144 		return !isMirrorDatabase();
145 	}
146 
147 	/**
148 	 * <p>
149 	 * getStatusCodeIncludes.
150 	 * </p>
151 	 * 
152 	 * @return a {@link java.util.Set} object.
153 	 */
154 	public Set<String> getStatusCodeIncludes() {
155 		return context.getStatusCodeIncludes();
156 	}
157 
158 	/**
159 	 * <p>
160 	 * getChangeLogFile.
161 	 * </p>
162 	 * 
163 	 * @return a {@link java.io.File} object.
164 	 */
165 	public File getChangeLogFile() {
166 		return context.getChangeLogFile();
167 	}
168 
169 	/**
170 	 * <p>
171 	 * getProgramCodes.
172 	 * </p>
173 	 * 
174 	 * @return a {@link java.util.Set} object.
175 	 */
176 	public Set<String> getProgramCodes() {
177 		return context.getProgramCodes();
178 	}
179 
180 	/**
181 	 * <p>
182 	 * getTableNamesForced.
183 	 * </p>
184 	 * 
185 	 * @return a {@link java.util.Set} object.
186 	 */
187 	public Set<String> getTableNamesForced() {
188 		return context.getTableNamesForced();
189 	}
190 
191 	public void excludeUnusedColumns() {
192 		addColumnExclude(ReferentialSynchroTables.MON_LOC_ORDER_ITEM.name(), DatabaseColumns.UPDATE_DT.name());
193 		addColumnExclude(ReferentialSynchroTables.PMFM_QUAL_VALUE.name(), DatabaseColumns.UPDATE_DT.name());
194 		addColumnExclude(ProgramStrategySynchroTables.MON_LOC_PROG.name(), DatabaseColumns.UPDATE_DT.name());
195 		addColumnExclude(ReferentialSynchroTables.TAXON_INFORMATION.name(), DatabaseColumns.UPDATE_DT.name());
196 		addColumnExclude(ReferentialSynchroTables.TAXON_INFORMATION_HISTORY.name(), DatabaseColumns.UPDATE_DT.name());
197 		addColumnExclude(ReferentialSynchroTables.TAXON_GROUP_HISTORICAL_RECORD.name(), DatabaseColumns.UPDATE_DT.name());
198 		addColumnExclude(ReferentialSynchroTables.TAXON_GROUP_INFORMATION.name(), DatabaseColumns.UPDATE_DT.name());
199 		addColumnExclude(ReferentialSynchroTables.TAXON_GROUP_POSITION.name(), DatabaseColumns.UPDATE_DT.name());
200 		addColumnExclude(ReferentialSynchroTables.PRIVILEGE_TRANSFER.name(), DatabaseColumns.UPDATE_DT.name());
201 		addColumnExclude(ReferentialSynchroTables.TAXON_POSITION.name(), DatabaseColumns.UPDATE_DT.name());
202 
203 		// Metaprogramme
204 		addColumnExclude(MetaProgramSynchroTables.PMFM_MET.name(), DatabaseColumns.UPDATE_DT.name());
205 		addColumnExclude(MetaProgramSynchroTables.MON_LOC_MET.name(), DatabaseColumns.UPDATE_DT.name());
206 
207 		// Moratorium
208 		addColumnExclude(MoratoriumSynchroTables.PMFM_MOR.name(), DatabaseColumns.UPDATE_DT.name());
209 //		addColumnExclude(MoratoriumSynchroTables.MOR_MON_LOC_PROG.name(), DatabaseColumns.UPDATE_DT.name()); FIXME ? NO UPDATE_DT column
210 //		addColumnExclude(MoratoriumSynchroTables.MOR_PERIOD.name(), DatabaseColumns.UPDATE_DT.name()); TODO ???????
211 
212 		// Import program privileges as child of PROGRAMME table (Fix mantis #26923)
213 		addColumnExclude(ProgramStrategySynchroTables.PROG_QUSER_PROG_PRIV.name(), DatabaseColumns.UPDATE_DT.name());
214 		addColumnExclude(ProgramStrategySynchroTables.PROG_DEP_PROG_PRIV.name(), DatabaseColumns.UPDATE_DT.name());
215 
216 		// Do not override the local crypt_password
217 		// (otherwise we could not re-authenticate the user after the synchro)
218 		addColumnExclude(ReferentialSynchroTables.QUSER.name(), DatabaseColumns.QUSER_CRYPT_PASSWORD.name());
219 	}
220 
221 	public void excludeUnusedColumnsForFileImport() {
222 		// Import strategy / periods / pmfm strategy as child of PROGRAMME (Fis Mantis #29640)
223 		addColumnExclude(ProgramStrategySynchroTables.STRATEGY.name(), DatabaseColumns.UPDATE_DT.name());
224 		addColumnExclude(ProgramStrategySynchroTables.APPLIED_STRATEGY.name(), DatabaseColumns.UPDATE_DT.name());
225 		addColumnExclude(ProgramStrategySynchroTables.APPLIED_PERIOD.name(), DatabaseColumns.UPDATE_DT.name());
226 		addColumnExclude(ProgramStrategySynchroTables.PMFM_APPLIED_STRATEGY.name(), DatabaseColumns.UPDATE_DT.name());
227 		addColumnExclude(ProgramStrategySynchroTables.PMFM_STRATEGY.name(), DatabaseColumns.UPDATE_DT.name());
228 
229 		addColumnExclude(MoratoriumSynchroTables.MORATORIUM.name(), DatabaseColumns.UPDATE_DT.name());
230 
231 		// Rule list child table (mantis #29428)
232 		addColumnExclude(RuleSynchroTables.RULE.name(), DatabaseColumns.UPDATE_DT.name());
233 		addColumnExclude(RuleSynchroTables.RULE_PARAMETER.name(), DatabaseColumns.UPDATE_DT.name());
234 		addColumnExclude(RuleSynchroTables.RULE_PMFM.name(), DatabaseColumns.UPDATE_DT.name());
235 		addColumnExclude(RuleSynchroTables.RULE_PRECONDITION.name(), DatabaseColumns.UPDATE_DT.name());
236 		addColumnExclude(RuleSynchroTables.RULE_GROUP.name(), DatabaseColumns.UPDATE_DT.name());
237 	}
238 
239 	public ReferentialSynchroDatabaseConfiguration getSource() {
240 		return context.getSource();
241 	}
242 
243 	public ReferentialSynchroDatabaseConfiguration getTarget() {
244 		return context.getTarget();
245 	}
246 
247 	/** {@inheritDoc} */
248 	@Override
249 	public String toString() {
250 		StringBuilder sb = new StringBuilder(super.toString());
251 
252 		sb.append("\n    user: ").append(getUserId());
253 		sb.append("\n    pk includes: ").append(getPkIncludes());
254 		sb.append("\n    programs: ").append(getProgramCodes());
255 
256 		return sb.toString();
257 	}
258 
259 	@Override
260 	public void copy(SynchroDatabaseConfiguration otherBean) {
261 		super.copy(otherBean);
262 
263 		if (otherBean instanceof ReferentialSynchroDatabaseConfiguration) {
264 			ReferentialSynchroDatabaseConfiguration otherConfiguration = (ReferentialSynchroDatabaseConfiguration) otherBean;
265 			this.context.copy(otherConfiguration.context);
266 		}
267 	}
268 }