diff --git a/src/main/java/it/inaf/oats/vospacebackend/implementation/VOSpaceBackendMetadata.java b/src/main/java/it/inaf/oats/vospacebackend/implementation/VOSpaceBackendMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..42ce624b53313a2ec43a6bc38bf85743d8bcee06 --- /dev/null +++ b/src/main/java/it/inaf/oats/vospacebackend/implementation/VOSpaceBackendMetadata.java @@ -0,0 +1,295 @@ +/**_____________________________________________________________________________ + * + * OATS - INAF + * Osservatorio Astronomico di Tireste - Istituto Nazionale di Astrofisica + * Astronomical Observatory of Trieste - National Institute for Astrophysics + * ____________________________________________________________________________ + * + * Copyright (C) 20016 Istituto Nazionale di Astrofisica + * + * This program 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 2 + * of the License, or (at your option) 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * _____________________________________________________________________________ + **/ + +package it.inaf.oats.vospacebackend.implementation; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.ResultSet; +import org.apache.log4j.Logger; + +import it.inaf.oats.vospacebackend.exceptions.ExceptionMessage; +import it.inaf.oats.vospacebackend.exceptions.VOSpaceBackendException; + +/* + * FileRecord myParams is used as input record + * HashMap myResult is used as output record + * @author bertocco + */ +public class VOSpaceBackendMetadata { + + /** + * This class has two attributes: + * <p> + * Logger to perform logging operations + * <p> + * HashMap which will contain the metadata set identifying a stored/to store file + * This hashmap fields will are: + * boolean ifSuccessfull if db query is successful or not + * String "original_file_name" + * String "stored_file_name" + * String "md5_checksum" + * String "relative_path" + */ + + protected Logger log; + + protected FileRecord myResult; + + /** + * Create the log and the HashMap that will be used to store the database + * query result to return. The field "ifSuccessful" will contain a boolean + * value true if operation successfully executed and false if not. + * Other fields will be added containing the query result set fields, + * depending on the executed query. + */ + public VOSpaceBackendMetadata() { + + log = Logger.getLogger(VOSpaceBackendMetadata.class); + myResult = new FileRecord(); + myResult.setIfOperationSuccessful(false); + + } + /** + * + * @param fileName Original file name (provided by the client) of the file to store + * @param stored_f_name name used to store the file in the file system + * @param md5Checksum MD5 checksum of the file to store + * @param relativePath relative path (after the root) of the file to store + * @return boolean true if operation successful false if not + * @throws VOSpaceBackendException + */ + public FileRecord setFile(String stored_f_name, String md5Checksum, + String relativePath) + throws VOSpaceBackendException, SQLException { + + String myOp = "SET"; + String myQuery = "INSERT INTO cadctest.StoredFiles " + + "(stored_file_name, md5_checksum, relative_path)" + + " VALUES (?, ?, ?);"; + FileRecord myParams = new FileRecord(); + + myParams.setStoredfileName(stored_f_name); + myParams.setMD5Checksum(md5Checksum); + myParams.setRelativePath(relativePath); + + return excuteQuery(myOp, myQuery, myParams); + + } + + public FileRecord getFile(String orig_f_name) + throws VOSpaceBackendException, SQLException { + + String myOp = "GET"; + + String myQuery = "SELECT * FROM cadctest.StoredFiles " + + "WHERE original_file_name=?"; + // Da rifare: ricevo o il nodeid e con questo devo beccarmi il file + // prima becco lo storage fname nella tabella node-storage e con quello + // becco il file nella tabella storedFiles + FileRecord myParams = new FileRecord(); + myParams.setStoredfileName(orig_f_name); + + return excuteQuery(myOp, myQuery, myParams); + + } + + + public FileRecord getRequest(String nodeID) + throws VOSpaceBackendException, SQLException { + + String myOp = "GET_REQ"; + + String myQuery = "SELECT * FROM cadctest.StoredFileAndNode " + + "WHERE nodeID=?"; + // Da risistemare, non so neanche piu` se la uso ancora + FileRecord myParams = new FileRecord(); + myParams.setNodeId(nodeID); + + return excuteQuery(myOp, myQuery, myParams); + + } + + + public FileRecord setRequest(String stored_f_name, String nodeID) + throws VOSpaceBackendException, SQLException { + + String myOp = "SET_REQ"; + String myQuery = "INSERT INTO cadctest.StoredFileAndNode " + + "(nodeID, storedFileID)" + + " VALUES (?, ?);"; + log.debug("query : " + myQuery); + log.debug("parameters: nodeID = " + nodeID + " storedFileID = " + stored_f_name); + FileRecord myParams = new FileRecord(); + log.debug("File record created. Its value is:"); + log.debug(myParams); + myParams.setStoredfileName(stored_f_name); + myParams.setNodeId(nodeID); + log.debug("Going to execute query with FileRecord = " + myParams.toString()); + + return excuteQuery(myOp, myQuery, myParams); + + } + + private FileRecord excuteQuery(String operation, String query, FileRecord fileToManage) + throws VOSpaceBackendException, SQLException { + + PreparedStatement preparedStatementInsert = null; + + Connection dbConnection = null; + + try { + dbConnection = DBConnectionMng.getDBConnection(); + log.debug("Database connection get"); + } catch (SQLException e) { + log.fatal(e); + ExceptionMessage exMsg = new ExceptionMessage(); + throw new VOSpaceBackendException(ExceptionMessage.getMessage("UNABLE_TO_GET_DB_CONNECTION")); + } + + try { + dbConnection.setAutoCommit(false); + log.debug("Autocommit set false"); + } catch (SQLException e) { + log.fatal(e); + ExceptionMessage exMsg = new ExceptionMessage(); + throw new VOSpaceBackendException(ExceptionMessage.getMessage("ERROR_DISABLING_DB_AUTOCOMMIT")); + } + + // Starts JDBC Transaction + PreparedStatement preparedQuery = null; + // boolean query result (success or not) + log.debug("Input file record: " + fileToManage.toString()); + boolean ifQuerySuccessful = false; + try { + + //HashMap fileToManageFields = fileToManage.getFileRecord(); + ResultSet rs = null; + int rowCounter = 0; + switch (operation) { + case "SET": + log.debug("Going to prepare query for SET operation"); + preparedQuery = dbConnection.prepareStatement(query); + preparedQuery.setString(1, fileToManage.getStoredfileName()); + preparedQuery.setString(2, fileToManage.getMD5Checksum()); + preparedQuery.setString(3, fileToManage.getRelativePath()); + log.debug("Going to execute query"); + preparedQuery.executeUpdate(); + log.debug("Query executed"); + dbConnection.commit(); + log.debug("Query committed"); + ifQuerySuccessful = true; + break; + case "GET": + preparedQuery = dbConnection.prepareStatement(query); + preparedQuery.setString(1, (String)fileToManage.getNodeId()); + rs = preparedQuery.executeQuery(); + rowCounter = 0; + while (rs.next()) { + rowCounter = rowCounter +1; + myResult.setStoredfileName(rs.getString("stored_file_name")); + myResult.setMD5Checksum(rs.getString("md5_checksum")); + // Sistemare questa faccenda del nome file originale + // myResult.put("original_file_name", rs.getString("original_file_name")); + myResult.setRelativePath(rs.getString("relative_path")); + } + if (rowCounter == 0) { + log.debug("GET: query successfully executed. File not found"); + ifQuerySuccessful = false; + } else { + log.debug("GET: query successfully executed. File found"); + ifQuerySuccessful = true; + } + break; + case "GET_REQ": + preparedQuery = dbConnection.prepareStatement(query); + preparedQuery.setString(1, fileToManage.getNodeId()); + rs = preparedQuery.executeQuery(); + rowCounter = 0; + while (rs.next()) { + rowCounter = rowCounter +1; + myResult.setStoredfileName(rs.getString("stored_file_name")); + myResult.setNodeId(rs.getString("nodeID")); + } + if (rowCounter == 0) { + log.debug("GET_REQ: query NOT executed. File metadata not found in backend"); + ifQuerySuccessful = false; + } else { + log.debug("GET_REQ: query successfully executed. File found in the backend"); + ifQuerySuccessful = true; + } + break; + case "SET_REQ": + log.debug("Going to prepare query for SET operation"); + preparedQuery = dbConnection.prepareStatement(query); + preparedQuery.setString(1, fileToManage.getNodeId()); + preparedQuery.setString(2, fileToManage.getStoredfileName()); + log.debug("Parameters : nodeID = " + fileToManage.getNodeId() + " StoredfileName = " +fileToManage.getStoredfileName()); + log.debug("Going to execute query"); + preparedQuery.executeUpdate(); + log.debug("Query executed"); + dbConnection.commit(); + log.debug("Query committed"); + ifQuerySuccessful = true; + break; + + default: + ifQuerySuccessful = false; + ExceptionMessage exMsg = new ExceptionMessage(); + log.fatal(ExceptionMessage.getMessage("DB_OPERATION_NOT_RECOGNIZED")); + throw new VOSpaceBackendException(ExceptionMessage.getMessage("DB_OPERATION_NOT_RECOGNIZED")); + } + + dbConnection.setAutoCommit(true); + + dbConnection.close(); + + } catch (SQLException e) { + + log.error("SQLException exception executing SET file" + e.getMessage()); + dbConnection.rollback(); + + } finally { + + if (preparedQuery != null) { + preparedQuery.close(); + } + + if (dbConnection != null) { + dbConnection.close(); + } + + } + + myResult.setIfOperationSuccessful(ifQuerySuccessful); + + log.debug("Returning " + operation + " result:\n" + myResult.toString()); + + return myResult; + + } + +}