Project

General

Profile

Download (5.84 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.List;
14
import java.util.UUID;
15

    
16
import org.apache.log4j.Logger;
17

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

    
22
/**
23
 * Class for adding a term representations.
24
 *
25
 * Untested!!
26
 *
27
 * @author a.mueller
28
 * @since 11.05.2018
29
 *
30
 */
31
public class TermRepresentationAdder
32
            extends SchemaUpdaterStepBase {
33

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

    
37
	public static final TermRepresentationAdder NewInstance(List<ISchemaUpdaterStep> stepList, String stepName, UUID uuidTerm, String description,  String label, String abbrev, UUID uuidLanguage){
38
		return new TermRepresentationAdder(stepList, stepName, uuidTerm, description, label, abbrev, uuidLanguage, false);
39
	}
40

    
41
	public static final TermRepresentationAdder NewReverseInstance(List<ISchemaUpdaterStep> stepList, String stepName, UUID uuidTerm, String description,  String label, String abbrev, UUID uuidLanguage){
42
		return new TermRepresentationAdder(stepList, stepName, uuidTerm, description, label, abbrev, uuidLanguage, true);
43
	}
44

    
45
	private UUID uuidTerm ;
46
	private String description;
47
	private String label;
48
	private String abbrev;
49
	private UUID uuidLanguage;
50
	private boolean isReverse = false;
51

    
52
	private TermRepresentationAdder(List<ISchemaUpdaterStep> stepList, String stepName, UUID uuidTerm, String description, String label, String abbrev, UUID uuidLanguage, boolean isReverse) {
53
		super(stepList, stepName);
54
		this.abbrev = abbrev;
55
		this.description = description;
56
		this.label = label;
57
		this.uuidTerm = uuidTerm;
58
		this.uuidLanguage = uuidLanguage;
59
		this.isReverse = isReverse;
60
	}
61

    
62

    
63

    
64
	@Override
65
    public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,
66
            CaseType caseType, SchemaUpdateResult result) throws SQLException{
67

    
68
	    Integer termId;
69
	    String sqlCheckTermExists = " SELECT id FROM @@DefinedTermBase@@ WHERE uuid = '" + uuidTerm + "'";
70
		ResultSet rs = datasource.executeQuery(caseType.replaceTableNames(sqlCheckTermExists));
71
		if (rs.next() == false){
72
			String name = label != null ? label : abbrev != null ? abbrev : description;
73
			String message = "Term for representations update does not exist. Term not updated: " + CdmUtils.Nz(name) + "(" + uuidTerm + ")";
74
			monitor.warning(message);
75
			result.addError(message, this, "invoke");
76
			return;
77
		}else{
78
		    termId = rs.getInt("id");
79
		}
80

    
81
		//language id
82
		Integer langId = null;
83
		if (uuidLanguage != null){
84
			langId = getLanguageId(uuidLanguage, datasource, monitor, caseType);
85
			if (langId == null){
86
				String message = "Language for language uuid (%s) could not be found. Term representations not updated.";
87
				message = String.format(message, uuidLanguage.toString());
88
				monitor.warning(message);
89
	            result.addError(message, this, "invoke");
90
	            return;
91
			}
92
		}
93

    
94
		Integer repId = getRepresentationId(datasource, monitor, langId, caseType);
95
		if (repId != null){
96
            String message = "Representation for language uuid (%s) already exists. Did not add term representation.";
97
            message = String.format(message, uuidLanguage.toString());
98
            monitor.warning(message);
99
            result.addError(message, this, "invoke");
100
            return;
101
		}
102

    
103
		String query = " SELECT max(id) id FROM @@Representation@@ ";
104
		query = caseType.replaceTableNames(query);
105
        repId = (Integer)datasource.getSingleValue(query) + 1;
106

    
107
        query = " INSERT INTO @@Representation@@(id, uuid, created, label, text, abbreviatedLabel, language_id) "
108
                + " VALUES (%d, '%s', '%s', '%s', '%s', '%s', %d ) ";
109
        //TODO created
110
        query = String.format(query, repId, UUID.randomUUID(), getNowString(), label, description, abbrev, langId);
111
        query = caseType.replaceTableNames(query);
112
        datasource.executeUpdate(query);
113

    
114
        String tableName = isReverse ? "TermBase_inverseRepresentation" : "DefinedTermBase_Representation" ;
115
        String repIdCol = isReverse ? "inverserepresentations_id" : "representations_id";
116
        String termCol = isReverse ? "term_id" : "DefinedTermBase_id";
117
        query = " INSERT INTO %s (%s, %s) "
118
                + " VALUES (%d, %d) ";
119
        tableName = caseType.transformTo(tableName);
120
        query = String.format(query, tableName, termCol, repIdCol, termId, repId);
121
        datasource.executeQuery(query);
122

    
123
		return;
124
	}
125

    
126
	/**
127
	 * @param datasource
128
	 * @param monitor
129
	 * @param langId
130
	 * @param caseType
131
	 * @return
132
	 * @throws SQLException
133
	 */
134
	private Integer getRepresentationId(ICdmDataSource datasource,
135
			IProgressMonitor monitor, Integer langId, CaseType caseType) throws SQLException {
136
		//representation
137

    
138
		String tableName = isReverse ? "RelationshipTermBase_inverseRepresentation" : "DefinedTermBase_Representation" ;
139
		String repIdFkCol = isReverse ? "inverserepresentations_id" : "representations_id";
140
		String sqlId = " SELECT rep.id " +
141
			" FROM @@Representation@@ rep INNER JOIN %s MN ON MN.%s = rep.id " +
142
			" INNER JOIN @@DefinedTermBase@@ dtb ON MN.DefinedTermBase_id = dtb.id " +
143
			" WHERE dtb.uuid = '%s' ";
144
		tableName = caseType.transformTo(tableName);
145
		sqlId = String.format(sqlId, tableName, repIdFkCol, uuidTerm.toString());
146
		sqlId = caseType.replaceTableNames(sqlId);
147
		if (uuidLanguage != null){
148
			sqlId += " AND rep.language_id = " + langId;
149
		}
150
		ResultSet rs = datasource.executeQuery(sqlId);
151
		Integer repId;
152
		if (rs.next()){
153
			repId = rs.getInt("id");
154
		}else{
155
			repId = null;
156
		}
157
		return repId;
158
	}
159

    
160
}
(36-36/41)