View Javadoc
1   package fr.ifremer.quadrige3.synchro.intercept.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.eventbus.Subscribe;
27  import fr.ifremer.common.synchro.meta.event.CreateQueryEvent;
28  import fr.ifremer.common.synchro.query.SynchroQueryBuilder;
29  import fr.ifremer.common.synchro.query.SynchroQueryOperator;
30  import fr.ifremer.quadrige3.core.config.QuadrigeConfiguration;
31  import fr.ifremer.quadrige3.core.dao.technical.Beans;
32  import fr.ifremer.quadrige3.core.dao.technical.Daos;
33  import fr.ifremer.quadrige3.synchro.meta.DatabaseColumns;
34  import fr.ifremer.quadrige3.synchro.meta.referential.ReferentialSynchroTables;
35  import fr.ifremer.quadrige3.synchro.service.SynchroDirection;
36  import org.apache.commons.lang3.StringUtils;
37  
38  import java.util.ArrayList;
39  import java.util.List;
40  
41  /**
42   * Interceptor use to limit imported transcribing items, filter on transcribing item type
43   */
44  public class TranscribingItemInterceptor extends AbstractReferentialInterceptor {
45  
46      /**
47       * <p>
48       * Constructor for TranscribingItemInterceptor.
49       * </p>
50       */
51      public TranscribingItemInterceptor() {
52          super(ReferentialSynchroTables.TRANSCRIBING_ITEM.name(),
53              SynchroDirection.IMPORT_SERVER2TEMP);
54      }
55  
56      /**
57       * <p>
58       * handleCreateQuery.
59       * </p>
60       *
61       * @param e a {@link fr.ifremer.common.synchro.meta.event.CreateQueryEvent} object.
62       */
63      @Subscribe
64      public void handleCreateQuery(CreateQueryEvent e) {
65  
66          String transcribingTypeLbIncludes = QuadrigeConfiguration.getInstance().getImportTranscribingItemTypeLbIncludes();
67          List<String> protectedLabels = new ArrayList<>();
68          List<String> unprotectedLabels = new ArrayList<>();
69          if (StringUtils.isNotBlank(transcribingTypeLbIncludes)) {
70  
71              // get all labels and find (un)protected labels
72              List<String> labels = Beans.split(transcribingTypeLbIncludes, ",");
73              labels.forEach(label -> {
74                  if (label.contains("%"))
75                      unprotectedLabels.add(label);
76                  else
77                      protectedLabels.add(label);
78              });
79  
80          }
81  
82          switch (e.queryName) {
83              case count:
84              case countFromUpdateDate:
85              case select:
86              case selectFromUpdateDate:
87  
88                  // Add restriction on transcribing item type
89                  if (!protectedLabels.isEmpty() || !unprotectedLabels.isEmpty()) {
90                      SynchroQueryBuilder queryBuilder = SynchroQueryBuilder.newBuilder(e.sql)
91                          .addJoin(String.format("INNER JOIN %s tit ON t.%s = tit.%s",
92                              ReferentialSynchroTables.TRANSCRIBING_ITEM_TYPE,
93                              DatabaseColumns.TRANSC_ITEM_TYPE_ID,
94                              DatabaseColumns.TRANSC_ITEM_TYPE_ID));
95                      StringBuilder whereClauseBuilder = new StringBuilder("1=2"); // starting with a disjunction
96                      if (!protectedLabels.isEmpty()) {
97                          whereClauseBuilder.append(
98                              String.format(" OR tit.%s IN (%s)", DatabaseColumns.TRANSC_ITEM_TYPE_LB, Daos.getInStatementFromStringCollection(protectedLabels))
99                          );
100                     }
101                     if (!unprotectedLabels.isEmpty()) {
102                         unprotectedLabels.forEach(s -> whereClauseBuilder.append(
103                                 String.format(" OR tit.%s LIKE '%s'", DatabaseColumns.TRANSC_ITEM_TYPE_LB, s)
104                             )
105                         );
106                     }
107                     queryBuilder.addWhere(SynchroQueryOperator.AND, String.format("(%s)", whereClauseBuilder));
108                     e.sql = queryBuilder.build();
109                 }
110                 break;
111 
112             case selectMaxUpdateDate:
113 
114                 // Add specific query to determine the max update date.
115                 // It return the min update date against the max update date of each type, or 1970-01-01 if an item has not
116                 // been found
117                 if (!protectedLabels.isEmpty() || !unprotectedLabels.isEmpty()) {
118 
119                     // Add restriction on included ids
120                     StringBuilder query = new StringBuilder();
121                     query.append("SELECT MIN(COALESCE(UPDATE_DT, TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD'))) FROM (");
122                     query.append(" SELECT TIT.TRANSC_ITEM_TYPE_ID, MAX(TI.UPDATE_DT) AS UPDATE_DT FROM TRANSCRIBING_ITEM_TYPE TIT");
123                     query.append(" LEFT OUTER JOIN TRANSCRIBING_ITEM TI ON TI.TRANSC_ITEM_TYPE_ID=TIT.TRANSC_ITEM_TYPE_ID");
124                     query.append(" WHERE 1=2");
125                     if (!protectedLabels.isEmpty()) {
126                         query.append(" OR TIT.TRANSC_ITEM_TYPE_LB IN (").append(Daos.getInStatementFromStringCollection(protectedLabels)).append(")");
127                     }
128                     if (!unprotectedLabels.isEmpty()) {
129                         unprotectedLabels.forEach(s -> query.append(" OR TIT.TRANSC_ITEM_TYPE_LB LIKE '").append(s).append("'"));
130                     }
131                     query.append(" GROUP BY TIT.TRANSC_ITEM_TYPE_ID");
132                     query.append(")");
133                     e.sql = query.toString();
134                 }
135                 break;
136 
137             default:
138                 break;
139         }
140     }
141 }