/** * */ package org.gcube.documentstore.persistence; import java.io.Serializable; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; import org.gcube.accounting.utility.postgresql.RecordToDBMapping; import org.gcube.documentstore.records.AggregatedRecord; import org.gcube.documentstore.records.Record; import org.gcube.documentstore.records.RecordUtility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class PersistencePostgreSQL extends PersistenceBackend { protected static final Logger logger = LoggerFactory.getLogger(PersistencePostgreSQL.class); public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS Z"; public static final String URL_PROPERTY_KEY = "URL"; public static final String USERNAME_PROPERTY_KEY = "username"; public static final String PASSWORD_PROPERTY_KEY = "password"; protected StatementMap statementMap; @Override protected void prepareConnection(PersistenceBackendConfiguration configuration) throws Exception { statementMap = new StatementMap(configuration); Map>> aggregatedRecords = RecordUtility.getAggregatedRecordClassesFound(); for(String typeName : aggregatedRecords.keySet()) { try { Class> clz = aggregatedRecords.get(typeName); RecordToDBMapping.getRecordToDB(clz); } catch (Exception e) { new RuntimeException(e); } } } @Override protected void openConnection() throws Exception { } protected void appendString(StringBuffer values, String string) { values.append("'"); values.append(string); values.append("'"); } protected void appendValue(StringBuffer values, Serializable serializable) { if(serializable instanceof Number) { values.append(serializable.toString()); return; } if(serializable instanceof Calendar) { Calendar calendar = (Calendar) serializable; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATETIME_PATTERN); String date = simpleDateFormat.format(calendar.getTime()); appendString(values, date); return; } if(serializable instanceof Enum) { Enum e = (Enum) serializable; appendString(values, e.name()); return; } // String, URI etc appendString(values, serializable.toString()); } protected void appendKey(StringBuffer sql, String key) { int lenght = key.length(); boolean lastLowerCase = true; for (int i=0; i keys = new TreeSet<>(record.getRequiredFields()); StringBuffer values = new StringBuffer(); for(String key : keys) { if(first) { sql.append(" ("); values.append(" ("); first = false; }else { sql.append(","); values.append(","); } appendKey(sql, key); switch (key) { case "creationTime": case "startTime": case "endTime": Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis((long) record.getResourceProperty(key)); appendValue(values, calendar); break; default: appendValue(values, record.getResourceProperty(key)); break; } } sql.append(") VALUES"); sql.append(values); sql.append(");"); return sql.toString(); } @Override protected void reallyAccount(Record record) throws Exception { Statement statement = statementMap.getStatement(record); String sqlCommand = getSQLInsertCommand(record); statement.executeUpdate(sqlCommand); } public void insert(Record record) throws Exception { reallyAccount(record); } @Override protected void clean() throws Exception { statementMap.close(); } @Override protected void closeConnection() throws Exception { statementMap.close(); } public void commitAndClose() throws Exception { statementMap.close(); } @Override public boolean isConnectionActive() throws Exception { return true; }; }