mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
bug 8529: propagated to master. Added junit test support to ant
This commit is contained in:
parent
6b0d4947ed
commit
c6efb2b09d
24
server/src/com/cloud/upgrade/dao/VersionDao.java
Normal file
24
server/src/com/cloud/upgrade/dao/VersionDao.java
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.upgrade.dao;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface VersionDao extends GenericDao<VersionVO, String> {
|
||||
|
||||
}
|
||||
86
server/src/com/cloud/upgrade/dao/VersionDaoImpl.java
Normal file
86
server/src/com/cloud/upgrade/dao/VersionDaoImpl.java
Normal file
@ -0,0 +1,86 @@
|
||||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.upgrade.dao;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.upgrade.dao.VersionVO.Step;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.GenericSearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.SearchCriteria.Func;
|
||||
import com.cloud.utils.db.SearchCriteria.Op;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
@Local(value=VersionDao.class)
|
||||
public class VersionDaoImpl extends GenericDaoBase<VersionVO, String> implements VersionDao {
|
||||
final GenericSearchBuilder<VersionVO, String> CurrentVersionSearch;
|
||||
protected VersionDaoImpl() {
|
||||
super();
|
||||
|
||||
CurrentVersionSearch = createSearchBuilder(String.class);
|
||||
CurrentVersionSearch.select(null, Func.FIRST, CurrentVersionSearch.entity().getVersion());
|
||||
CurrentVersionSearch.and("step", CurrentVersionSearch.entity().getStep(), Op.EQ);
|
||||
|
||||
}
|
||||
|
||||
@DB
|
||||
protected String getCurrentVersion() {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
try {
|
||||
Connection conn = txn.getConnection();
|
||||
|
||||
PreparedStatement pstmt = conn.prepareStatement("SHOW TABLES LIKE 'VERSION'");
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
if (rs.getRow() == 0) {
|
||||
return "2.1.7";
|
||||
}
|
||||
pstmt.close();
|
||||
rs.close();
|
||||
} catch (SQLException e) {
|
||||
throw new CloudRuntimeException("Unable to get the current version", e);
|
||||
}
|
||||
SearchCriteria<String> sc = CurrentVersionSearch.create();
|
||||
|
||||
sc.setParameters("step", Step.Complete);
|
||||
Filter filter = new Filter(VersionVO.class, "updated", true, 0l, 1l);
|
||||
|
||||
List<String> vers = customSearch(sc, filter);
|
||||
return vers.get(0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
super.configure(name, params);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
81
server/src/com/cloud/upgrade/dao/VersionVO.java
Normal file
81
server/src/com/cloud/upgrade/dao/VersionVO.java
Normal file
@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.upgrade.dao;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Temporal;
|
||||
import javax.persistence.TemporalType;
|
||||
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
@Entity
|
||||
@Table(name="version")
|
||||
public class VersionVO {
|
||||
public enum Step {
|
||||
Dump,
|
||||
Upgrade,
|
||||
Cleanup,
|
||||
Complete
|
||||
};
|
||||
|
||||
@Column(name="id")
|
||||
long id;
|
||||
|
||||
@Column(name="version")
|
||||
String version;
|
||||
|
||||
@Temporal(TemporalType.TIMESTAMP)
|
||||
@Column(name="updated")
|
||||
Date updated;
|
||||
|
||||
@Enumerated(value=EnumType.STRING)
|
||||
@Column(name="")
|
||||
Step step;
|
||||
|
||||
public VersionVO() {
|
||||
version = ComponentLocator.class.getPackage().getImplementationVersion();
|
||||
if (version == null) {
|
||||
throw new CloudRuntimeException("Uanble to get the implementation version of the package");
|
||||
}
|
||||
updated = new Date();
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public Date getUpdated() {
|
||||
return updated;
|
||||
}
|
||||
|
||||
public Step getStep() {
|
||||
return step;
|
||||
}
|
||||
|
||||
}
|
||||
54
server/test/com/cloud/upgrade/dao/VersionDaoImplTest.java
Normal file
54
server/test/com/cloud/upgrade/dao/VersionDaoImplTest.java
Normal file
@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.cloud.upgrade.dao;
|
||||
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
import com.cloud.utils.component.ComponentLocator;
|
||||
|
||||
public class VersionDaoImplTest extends TestCase {
|
||||
|
||||
VersionDaoImpl _dao;
|
||||
|
||||
/**
|
||||
* @throws java.lang.Exception
|
||||
*/
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
_dao = ComponentLocator.inject(VersionDaoImpl.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws java.lang.Exception
|
||||
*/
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
_dao = null;
|
||||
}
|
||||
|
||||
public void testGetCurrentVersion() {
|
||||
String version = _dao.getCurrentVersion();
|
||||
|
||||
assert (version.equals("2.1.7"));
|
||||
}
|
||||
|
||||
}
|
||||
BIN
tools/junit/junit-4.8.1.jar
Normal file
BIN
tools/junit/junit-4.8.1.jar
Normal file
Binary file not shown.
243
utils/src/com/cloud/utils/db/ScriptRunner.java
Normal file
243
utils/src/com/cloud/utils/db/ScriptRunner.java
Normal file
@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Slightly modified version of the com.ibatis.common.jdbc.ScriptRunner class
|
||||
* from the iBATIS Apache project. Only removed dependency on Resource class
|
||||
* and a constructor
|
||||
*/
|
||||
/*
|
||||
* Copyright 2004 Clinton Begin
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.cloud.utils.db;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.LineNumberReader;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.Reader;
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
|
||||
/**
|
||||
* Tool to run database scripts
|
||||
*/
|
||||
public class ScriptRunner {
|
||||
|
||||
private static final String DEFAULT_DELIMITER = ";";
|
||||
|
||||
private Connection connection;
|
||||
|
||||
private boolean stopOnError;
|
||||
private boolean autoCommit;
|
||||
|
||||
private PrintWriter logWriter = new PrintWriter(System.out);
|
||||
private PrintWriter errorLogWriter = new PrintWriter(System.err);
|
||||
|
||||
private String delimiter = DEFAULT_DELIMITER;
|
||||
private boolean fullLineDelimiter = false;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*/
|
||||
public ScriptRunner(Connection connection, boolean autoCommit, boolean stopOnError) {
|
||||
this.connection = connection;
|
||||
this.autoCommit = autoCommit;
|
||||
this.stopOnError = stopOnError;
|
||||
}
|
||||
|
||||
public void setDelimiter(String delimiter, boolean fullLineDelimiter) {
|
||||
this.delimiter = delimiter;
|
||||
this.fullLineDelimiter = fullLineDelimiter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for logWriter property
|
||||
*
|
||||
* @param logWriter
|
||||
* - the new value of the logWriter property
|
||||
*/
|
||||
public void setLogWriter(PrintWriter logWriter) {
|
||||
this.logWriter = logWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for errorLogWriter property
|
||||
*
|
||||
* @param errorLogWriter
|
||||
* - the new value of the errorLogWriter property
|
||||
*/
|
||||
public void setErrorLogWriter(PrintWriter errorLogWriter) {
|
||||
this.errorLogWriter = errorLogWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an SQL script (read in using the Reader parameter)
|
||||
*
|
||||
* @param reader
|
||||
* - the source of the script
|
||||
*/
|
||||
public void runScript(Reader reader) throws IOException, SQLException {
|
||||
try {
|
||||
boolean originalAutoCommit = connection.getAutoCommit();
|
||||
try {
|
||||
if (originalAutoCommit != this.autoCommit) {
|
||||
connection.setAutoCommit(this.autoCommit);
|
||||
}
|
||||
runScript(connection, reader);
|
||||
} finally {
|
||||
connection.setAutoCommit(originalAutoCommit);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error running script. Cause: " + e, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an SQL script (read in using the Reader parameter) using the
|
||||
* connection passed in
|
||||
*
|
||||
* @param conn
|
||||
* - the connection to use for the script
|
||||
* @param reader
|
||||
* - the source of the script
|
||||
* @throws SQLException
|
||||
* if any SQL errors occur
|
||||
* @throws IOException
|
||||
* if there is an error reading from the Reader
|
||||
*/
|
||||
private void runScript(Connection conn, Reader reader) throws IOException, SQLException {
|
||||
StringBuffer command = null;
|
||||
try {
|
||||
LineNumberReader lineReader = new LineNumberReader(reader);
|
||||
String line = null;
|
||||
while ((line = lineReader.readLine()) != null) {
|
||||
if (command == null) {
|
||||
command = new StringBuffer();
|
||||
}
|
||||
String trimmedLine = line.trim();
|
||||
if (trimmedLine.startsWith("--")) {
|
||||
println(trimmedLine);
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("//")) {
|
||||
// Do nothing
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("--")) {
|
||||
// Do nothing
|
||||
} else if (!fullLineDelimiter && trimmedLine.endsWith(getDelimiter()) || fullLineDelimiter && trimmedLine.equals(getDelimiter())) {
|
||||
command.append(line.substring(0, line.lastIndexOf(getDelimiter())));
|
||||
command.append(" ");
|
||||
Statement statement = conn.createStatement();
|
||||
|
||||
println(command);
|
||||
|
||||
boolean hasResults = false;
|
||||
if (stopOnError) {
|
||||
hasResults = statement.execute(command.toString());
|
||||
} else {
|
||||
try {
|
||||
statement.execute(command.toString());
|
||||
} catch (SQLException e) {
|
||||
e.fillInStackTrace();
|
||||
printlnError("Error executing: " + command);
|
||||
printlnError(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (autoCommit && !conn.getAutoCommit()) {
|
||||
conn.commit();
|
||||
}
|
||||
|
||||
ResultSet rs = statement.getResultSet();
|
||||
if (hasResults && rs != null) {
|
||||
ResultSetMetaData md = rs.getMetaData();
|
||||
int cols = md.getColumnCount();
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String name = md.getColumnLabel(i);
|
||||
print(name + "\t");
|
||||
}
|
||||
println("");
|
||||
while (rs.next()) {
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String value = rs.getString(i);
|
||||
print(value + "\t");
|
||||
}
|
||||
println("");
|
||||
}
|
||||
}
|
||||
|
||||
command = null;
|
||||
try {
|
||||
statement.close();
|
||||
} catch (Exception e) {
|
||||
// Ignore to workaround a bug in Jakarta DBCP
|
||||
}
|
||||
Thread.yield();
|
||||
} else {
|
||||
command.append(line);
|
||||
command.append(" ");
|
||||
}
|
||||
}
|
||||
if (!autoCommit) {
|
||||
conn.commit();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.fillInStackTrace();
|
||||
printlnError("Error executing: " + command);
|
||||
printlnError(e);
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
e.fillInStackTrace();
|
||||
printlnError("Error executing: " + command);
|
||||
printlnError(e);
|
||||
throw e;
|
||||
} finally {
|
||||
conn.rollback();
|
||||
flush();
|
||||
}
|
||||
}
|
||||
|
||||
private String getDelimiter() {
|
||||
return delimiter;
|
||||
}
|
||||
|
||||
private void print(Object o) {
|
||||
if (logWriter != null) {
|
||||
System.out.print(o);
|
||||
}
|
||||
}
|
||||
|
||||
private void println(Object o) {
|
||||
if (logWriter != null) {
|
||||
logWriter.println(o);
|
||||
}
|
||||
}
|
||||
|
||||
private void printlnError(Object o) {
|
||||
if (errorLogWriter != null) {
|
||||
errorLogWriter.println(o);
|
||||
}
|
||||
}
|
||||
|
||||
private void flush() {
|
||||
if (logWriter != null) {
|
||||
logWriter.flush();
|
||||
}
|
||||
if (errorLogWriter != null) {
|
||||
errorLogWriter.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user