package fi.otavanopisto.muikku.plugins.hsqldb;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.ejb.Stateful;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.hsqldb.cmdline.SqlToolError;
import fi.otavanopisto.muikku.plugins.data.DataPluginScriptHandler;
@Dependent
@Stateful
public class HSQLDBDataPluginScriptHandler implements DataPluginScriptHandler {
@Inject
private HSQLDBPluginController hsqldbPluginController;
@Override
public String getName() {
return "HSQLDB";
}
@Override
public void executeScript(String uri, Map<String, String> parameters) throws IOException, SQLException {
URL url = new URL(uri);
URLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream inputStream = connection.getInputStream();
try {
executeScript(inputStream, parameters);
} finally {
inputStream.close();
}
}
@Override
public void executeScript(InputStream inputStream, Map<String, String> parameters) throws IOException, SQLException {
String database = parameters.get("database");
if (StringUtils.isBlank(database)) {
// TODO Proper error handling
throw new RuntimeException("Database parameter is required");
}
File tempFile = File.createTempFile("muikku-sqldb-plugin", ".sql");
try {
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
try {
IOUtils.copy(inputStream, fileOutputStream);
} finally {
fileOutputStream.flush();
fileOutputStream.close();
}
hsqldbPluginController.executeScript(hsqldbPluginController.getConnection(database), tempFile);
} catch (SqlToolError e) {
throw new SQLException(e);
} finally {
tempFile.delete();
}
}
@Override
public Connection getConnection(Map<String, String> parameters) throws SQLException {
String database = parameters.get("database");
if (StringUtils.isBlank(database)) {
// TODO Proper error handling
throw new RuntimeException("Database parameter is required");
}
return hsqldbPluginController.getConnection(database);
}
}