Project

General

Profile

Download (6.93 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.database.update;
10

    
11
import java.sql.ResultSet;
12
import java.sql.SQLException;
13
import java.util.ArrayList;
14
import java.util.List;
15

    
16
import org.apache.log4j.Logger;
17

    
18
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
19
import eu.etaxonomy.cdm.database.ICdmDataSource;
20

    
21
/**
22
 * Removes a given term if it is not in use.
23
 * TODO does not yet check all DefinedTermBase_XXX tables except for representations.
24
 * Does also not handle AUD tables => should probably be handled as DeleteEvent, not simply delete the record;
25
 * There is now a factory method for handling AUDs.
26
 *
27
 * @author a.mueller
28
 * @since 06.09.2013
29
  */
30
public class SingleTermRemover
31
        extends SchemaUpdaterStepBase{
32

    
33
    @SuppressWarnings("unused")
34
	private static final Logger logger = Logger.getLogger(SingleTermRemover.class);
35

    
36
// **************************** FACTORY METHODS ********************************/
37

    
38
	public static final SingleTermRemover NewInstance(List<ISchemaUpdaterStep> stepList, String stepName,
39
	        String uuidTerm, List<String> checkUsedQueries, int adapt){
40
		return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, false);
41
	}
42

    
43
	/**
44
	 * @param firstCheckUsedQuery The first query to check if this term is used. Must return a single int value > 0
45
	 * if this term is used at the given place.
46
	 * @return
47
	 */
48
	public static final SingleTermRemover NewInstance(List<ISchemaUpdaterStep> stepList, String stepName,
49
	        String uuidTerm, String firstCheckUsedQuery, int adapt){
50
		List<String> checkUsedQueries = new ArrayList<>();
51
		checkUsedQueries.add(firstCheckUsedQuery);
52
		return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, false);
53
	}
54

    
55
	/**
56
     * @param firstCheckUsedQuery The first query to check if this term is used. Must return a single int value > 0
57
     * if this term is used at the given place.
58
     * @return
59
     */
60
    public static final SingleTermRemover NewAudInstance(List<ISchemaUpdaterStep> stepList, String stepName,
61
            String uuidTerm, String firstCheckUsedQuery, int adapt){
62
        List<String> checkUsedQueries = new ArrayList<>();
63
        checkUsedQueries.add(firstCheckUsedQuery);
64
        return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, true);
65
    }
66

    
67
// *************************** VARIABLES *****************************************/
68

    
69
    private String uuidTerm ;
70
    private List<String> checkUsedQueries = new ArrayList<>();
71
    private boolean isAudit = false;
72

    
73
// ***************************** CONSTRUCTOR ***************************************/
74

    
75
	private SingleTermRemover(List<ISchemaUpdaterStep> stepList, String stepName, String uuidTerm,
76
	        List<String> checkUsedQueries, boolean isAudit) {
77
		super(stepList, stepName);
78
		this.uuidTerm = uuidTerm;
79
		this.checkUsedQueries = checkUsedQueries;
80
		this.isAudit = isAudit;
81
	}
82

    
83
// ******************************* METHODS *************************************************/
84

    
85
    @Override
86
    public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,
87
            CaseType caseType, SchemaUpdateResult result) throws SQLException {
88

    
89
        //get term id
90
		String sql = " SELECT id FROM %s WHERE uuid = '%s'";
91
		String tableName = isAudit ? "DefinedTermBase_AUD" : "DefinedTermBase";
92
		Integer id = (Integer)datasource.getSingleValue(String.format(sql,
93
				caseType.transformTo(tableName), this.uuidTerm));
94
		if (id == null || id == 0){
95
			return;
96
		}
97

    
98
		//check if in use
99
		if (checkTermInUse(datasource, monitor, id, caseType)){
100
			return;
101
		}
102

    
103
		//if not ... remove
104
		removeTerm(datasource, monitor, id, caseType, result);
105

    
106
		return;
107
	}
108

    
109
	private void removeTerm(ICdmDataSource datasource, IProgressMonitor monitor, int id,
110
	        CaseType caseType, SchemaUpdateResult result) {
111

    
112
		try {
113
            //get representation ids
114
            List<Integer> repIDs = new ArrayList<>();
115
            String tableName = isAudit ? "DefinedTermBase_Representation_AUD" : "DefinedTermBase_Representation";
116
            String inverseTableName = isAudit ? "DefinedTermBase_InverseRepresentation_AUD" : "DefinedTermBase_InverseRepresentation";
117
            getRepIds(datasource, id, repIDs, "representations_id", tableName, caseType );
118
            getRepIds(datasource, id, repIDs, "inverserepresentations_id", inverseTableName, caseType);
119

    
120
            //remove from MN table
121
            String sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
122
            sql = String.format(sql, caseType.transformTo(tableName), id);
123
            datasource.executeUpdate(sql);
124
            sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
125
            sql = String.format(sql, caseType.transformTo(inverseTableName), id);
126
            datasource.executeUpdate(sql);
127

    
128
            //remove representations
129
            tableName = isAudit ? "Representation_AUD" : "Representation";
130
            for (Integer repId : repIDs){
131
            	sql = " DELETE FROM %s WHERE id = %d ";
132
            	sql = String.format(sql,
133
            			caseType.transformTo(tableName),
134
            			repId);
135
            	datasource.executeUpdate(sql);
136
            }
137

    
138
            //remove term
139
            tableName = isAudit ? "DefinedTermBase_AUD" : "DefinedTermBase";
140
            sql = " DELETE FROM %s WHERE id = %d";
141
            sql = String.format(sql,
142
            		caseType.transformTo(tableName),
143
            		id);
144
            datasource.executeUpdate(sql);
145
        } catch (SQLException e) {
146
            String message = e.getMessage();
147
            monitor.warning(message, e);
148
            result.addException(e, message, this, "removeTerm");
149
        }
150
	}
151

    
152
	private void getRepIds(ICdmDataSource datasource, int id,
153
			List<Integer> repIDs, String mnRepresentationIdAttr, String mnTableName, CaseType caseType) throws SQLException {
154
		String sql = " SELECT DISTINCT %s as repId FROM %s WHERE DefinedTermBase_id = %d";
155
		sql = String.format(sql, mnRepresentationIdAttr, caseType.transformTo(mnTableName), id);
156
		ResultSet rs = datasource.executeQuery(sql);
157
		while (rs.next()){
158
			int repId = rs.getInt("repId");  //TODO nullSafe, but should not happen
159
			repIDs.add(repId);
160
		}
161
	}
162

    
163
	private boolean checkTermInUse(ICdmDataSource datasource, IProgressMonitor monitor, int id, CaseType caseType) throws SQLException {
164
		for (String query : checkUsedQueries){
165
			query = String.format(caseType.replaceTableNames(query), id);
166
			Number i = (Number)datasource.getSingleValue(query);
167
			if (i != null && (Long)i > 0.0){
168
				return true;
169
			}
170
		}
171
		return false;
172
	}
173

    
174
	public SingleTermRemover addCheckUsedQuery(String query, int adapt){
175
		this.checkUsedQueries.add(query);
176
		return this;
177
	}
178
}
(29-29/41)