Project

General

Profile

Download (6.99 KB) Statistics
| Branch: | Tag: | Revision:
1 90b75b52 Andreas Müller
/**
2
* Copyright (C) 2009 EDIT
3 d2b68476 Andreas M��ller
* European Distributed Institute of Taxonomy
4 90b75b52 Andreas Müller
* http://www.e-taxonomy.eu
5 d2b68476 Andreas M��ller
*
6 90b75b52 Andreas Müller
* 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 6d4b8d16 Andreas Müller
import java.sql.ResultSet;
12 b50514ac Andreas Müller
import java.sql.SQLException;
13 1d36aa54 Andreas Müller
import java.util.ArrayList;
14
import java.util.List;
15 6d4b8d16 Andreas Müller
import java.util.UUID;
16 b50514ac Andreas Müller
17 1d36aa54 Andreas Müller
import org.apache.commons.lang.StringUtils;
18 90b75b52 Andreas Müller
import org.apache.log4j.Logger;
19 648a8e05 Andreas Müller
import org.joda.time.DateTime;
20 90b75b52 Andreas Müller
21 bd1d3bee Andreas Müller
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
22 08ff3a4a Andreas Müller
import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
23 90b75b52 Andreas Müller
import eu.etaxonomy.cdm.database.ICdmDataSource;
24 6d4b8d16 Andreas Müller
import eu.etaxonomy.cdm.model.common.Language;
25 90b75b52 Andreas Müller
26
/**
27
 * @author a.mueller
28 53db84af Andreas Müller
 * @since 13.09.2010
29 90b75b52 Andreas Müller
 */
30 2668abef Andreas Müller
public abstract class SchemaUpdaterStepBase implements ISchemaUpdaterStep {
31 90b75b52 Andreas Müller
	private static final Logger logger = Logger.getLogger(SchemaUpdaterStepBase.class);
32 d2b68476 Andreas M��ller
33 1d36aa54 Andreas Müller
	protected String stepName;
34 9692864e Andreas Müller
35
	private boolean ignoreErrors;
36 d2b68476 Andreas M��ller
37 90b75b52 Andreas Müller
//************************ CONSTRUCTOR ***********************************/
38 9692864e Andreas Müller
39 99e01f35 Andreas Müller
	protected <T extends ISchemaUpdaterStep> SchemaUpdaterStepBase(List<T> stepList, String stepName){
40 90b75b52 Andreas Müller
		this.setStepName(stepName);
41 99e01f35 Andreas Müller
		if (stepList != null){
42
		    stepList.add((T)this);
43
		}
44 90b75b52 Andreas Müller
	}
45 d2b68476 Andreas M��ller
46 7747019c Andreas Müller
	@Override
47 ba35e2f8 Andreas Müller
	public abstract void invoke (ICdmDataSource datasource, IProgressMonitor monitor,
48
	        CaseType caseType, SchemaUpdateResult result) throws SQLException;
49 7747019c Andreas Müller
50
	@Override
51 90b75b52 Andreas Müller
	public void setStepName(String stepName) {
52
		this.stepName = stepName;
53
	}
54
55 7747019c Andreas Müller
	@Override
56 90b75b52 Andreas Müller
	public String getStepName() {
57
		return stepName;
58
	}
59 d2b68476 Andreas M��ller
60 08ff3a4a Andreas Müller
	protected String getBoolean(boolean value, ICdmDataSource datasource) {
61 d2b68476 Andreas M��ller
62 08ff3a4a Andreas Müller
		String result;
63
		DatabaseTypeEnum type = datasource.getDatabaseType();
64 a9fb2e4d Andreas Müller
		//TODO use
65
//		type.getHibernateDialect().toBooleanValueString(bool);
66 08ff3a4a Andreas Müller
		int intValue = value == true? 1 : 0;
67
		if (type.equals(DatabaseTypeEnum.MySQL)){
68
			result = "b'"+intValue+"'";
69
		}else if (type.equals(DatabaseTypeEnum.PostgreSQL)){
70
			result = "'"+intValue+"'";
71
		}else if (type.equals(DatabaseTypeEnum.H2)){
72 33a09cbc Andreas Müller
			result = value == true ? "TRUE" : "FALSE";
73 08ff3a4a Andreas Müller
		}else if (type.equals(DatabaseTypeEnum.SqlServer2005)){
74
			logger.warn("SQLServer boolean not tested yet");
75
			result = "b'"+intValue+"'";
76
		}else{
77
			throw new RuntimeException("Database type not supported for boolean" + type.getName());
78
		}
79
		return result;
80
	}
81 d2b68476 Andreas M��ller
82 7747019c Andreas Müller
	protected Integer getEnglishLanguageId(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException {
83
		return getLanguageId(Language.uuidEnglish, datasource, monitor, caseType);
84 6d4b8d16 Andreas Müller
	}
85
86 86e5e961 Andreas Müller
	protected Integer getLanguageId(UUID uuidLanguage, ICdmDataSource datasource,
87
	        IProgressMonitor monitor, CaseType caseType) throws SQLException {
88 d2b68476 Andreas M��ller
89 6d4b8d16 Andreas Müller
		ResultSet rs;
90
		Integer langId = null;
91 7747019c Andreas Müller
		String sqlLangId = " SELECT id FROM %s WHERE uuid = '%s'";
92
		sqlLangId = String.format(sqlLangId, caseType.transformTo("DefinedTermBase"), uuidLanguage.toString() );
93 6d4b8d16 Andreas Müller
		rs = datasource.executeQuery(sqlLangId);
94
		if (rs.next()){
95
			langId = rs.getInt("id");
96
		}else{
97
			String warning = "Term for language (" +  uuidLanguage + ") does not exist!";
98
			monitor.warning(warning);
99
		}
100
		return langId;
101
	}
102
103 1f1f7ea1 Andreas Müller
    /**
104 cb45d97c Andreas Müller
     * Returns the smallest next free id, if includeAudit is <code>true</code> the audit
105
     * table is also considered in computation
106 1f1f7ea1 Andreas Müller
     * @throws NumberFormatException
107
     * @throws SQLException
108
     */
109
    protected int getMaxId1(ICdmDataSource datasource, String tableName, boolean includeAudit, IProgressMonitor monitor, CaseType caseType,
110
            SchemaUpdateResult result) throws SQLException {
111 149ff443 Andreas Müller
112 cb45d97c Andreas Müller
        return getMaxIdentifier(datasource, tableName, "id", includeAudit, monitor, caseType, result);
113
    }
114
115
    protected int getMaxIdentifier(ICdmDataSource datasource, String tableName, String idAttrName, boolean includeAudit, IProgressMonitor monitor, CaseType caseType,
116
            SchemaUpdateResult result) throws SQLException {
117
118
        String sql = "SELECT max("+idAttrName+") FROM " +caseType.transformTo(tableName);
119 149ff443 Andreas Müller
        Integer maxId = getInteger(datasource, sql, 0);
120
121 1f1f7ea1 Andreas Müller
        Integer maxIdAud = -1;
122
        if(includeAudit){
123 cb45d97c Andreas Müller
            sql = "SELECT max("+idAttrName+") FROM " +caseType.transformTo(tableName + "_AUD");
124 149ff443 Andreas Müller
            maxIdAud = getInteger(datasource, sql, 0);
125 1f1f7ea1 Andreas Müller
        }
126
        return Math.max(maxId, maxIdAud) + 1;
127
    }
128
129 cb45d97c Andreas Müller
130
    /**
131
     * Creates a new entry in the AuditEvent table
132
     * @return the revision number of the the new audit event
133
     */
134
    protected long createAuditEvent(ICdmDataSource datasource, CaseType caseType, IProgressMonitor monitor,
135
            SchemaUpdateResult result) throws SQLException {
136
        String sql;
137
        long rev;
138
        sql = "INSERT INTO @@AuditEvent@@ (revisionnumber, date, timestamp, uuid) "
139
                + " VALUES (%d, '%s', %d, '%s') ";
140
        int newId = this.getMaxIdentifier(datasource, "AuditEvent", "revisionNumber", false, monitor, caseType, result);
141
        long timeStamp = System.currentTimeMillis();
142
        sql = caseType.replaceTableNames(String.format(sql, newId, this.getNowString(), timeStamp, UUID.randomUUID()));
143
        datasource.executeUpdate(sql);
144
        rev =  newId;
145
        return rev;
146
    }
147
148 149ff443 Andreas Müller
    private Integer getInteger(ICdmDataSource datasource, String sql, int nullReplace) throws SQLException {
149
        Object value = datasource.getSingleValue(sql);
150
        if (value == null){
151
            return nullReplace;
152
        }else{
153
            return Integer.valueOf(value.toString());
154
        }
155
    }
156
157
    @Override
158 1d36aa54 Andreas Müller
	public List<ISchemaUpdaterStep> getInnerSteps(){
159 d621df66 Andreas Müller
		return new ArrayList<>();
160 1d36aa54 Andreas Müller
	}
161 d2b68476 Andreas M��ller
162 9692864e Andreas Müller
	@Override
163
	public boolean isIgnoreErrors() {
164
		return ignoreErrors;
165
	}
166
	@Override
167
	public void setIgnoreErrors(boolean ignoreErrors) {
168
		this.ignoreErrors = ignoreErrors;
169
	}
170 d2b68476 Andreas M��ller
171 648a8e05 Andreas Müller
172
	/**
173 d2b68476 Andreas M��ller
	 * Returns a time string with date and time (without millis) that
174 648a8e05 Andreas Müller
	 * can be used as a time string for database insert and update
175
	 * @return
176
	 */
177
	protected String getNowString() {
178
		return DateTime.now().toString("YYYY-MM-dd HH:mm:ss");
179
	}
180 1d36aa54 Andreas Müller
181 1f1f7ea1 Andreas Müller
    protected String nullSafeParam(String param) {
182 c754177e Andreas Müller
        return param == null ? "NULL" : "'" + param.replace("'", "''") + "'";
183 1f1f7ea1 Andreas Müller
    }
184
185 f800c017 Andreas Müller
    protected Integer nullSafeInt(ResultSet rs, String columnName) throws SQLException {
186
        Object intObject = rs.getObject(columnName);
187
        if (intObject == null){
188
            return null;
189
        }else{
190
            return Integer.valueOf(intObject.toString());
191
        }
192
    }
193
194 4ecba1cb Andreas Müller
    protected String escapeSingleQuote(String str) {
195
        return str == null? null : str.replace("'", "''");
196
    }
197
198 f800c017 Andreas Müller
    protected boolean isNotBlank(String str) {
199
        return StringUtils.isNotBlank(str);
200
    }
201
202
    protected boolean isBlank(String str) {
203
        return StringUtils.isBlank(str);
204
    }
205
206 1d36aa54 Andreas Müller
	@Override
207
	public String toString(){
208
		if (StringUtils.isNotBlank(stepName)){
209
			return stepName;
210
		}else{
211
			return super.toString();
212
		}
213
	}
214 d2b68476 Andreas M��ller
215 90b75b52 Andreas Müller
}