Project

General

Profile

Download (5.78 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.logging.log4j.LogManager;import org.apache.logging.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 = LogManager.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
	@Override
63
    public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,
64
            CaseType caseType, SchemaUpdateResult result) throws SQLException{
65

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

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

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

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

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

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

    
121
		return;
122
	}
123

    
124
	private Integer getRepresentationId(ICdmDataSource datasource,
125
			IProgressMonitor monitor, Integer langId, CaseType caseType) throws SQLException {
126
		//representation
127

    
128
		String tableName = isReverse ? "RelationshipTermBase_inverseRepresentation" : "DefinedTermBase_Representation" ;
129
		String repIdFkCol = isReverse ? "inverserepresentations_id" : "representations_id";
130
		String sqlId = " SELECT rep.id " +
131
			" FROM @@Representation@@ rep INNER JOIN %s MN ON MN.%s = rep.id " +
132
			" INNER JOIN @@DefinedTermBase@@ dtb ON MN.DefinedTermBase_id = dtb.id " +
133
			" WHERE dtb.uuid = '%s' ";
134
		tableName = caseType.transformTo(tableName);
135
		sqlId = String.format(sqlId, tableName, repIdFkCol, uuidTerm.toString());
136
		sqlId = caseType.replaceTableNames(sqlId);
137
		if (uuidLanguage != null){
138
			sqlId += " AND rep.language_id = " + langId;
139
		}
140
		ResultSet rs = datasource.executeQuery(sqlId);
141
		Integer repId;
142
		if (rs.next()){
143
			repId = rs.getInt("id");
144
		}else{
145
			repId = null;
146
		}
147
		return repId;
148
	}
149
}
(36-36/41)