package org.gcube.gcat.persistence.ckan; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.ws.rs.WebApplicationException; import org.gcube.com.fasterxml.jackson.databind.ObjectMapper; import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.gcat.api.configuration.CKANDB; import org.gcube.gcat.api.configuration.CatalogueConfiguration; import org.gcube.gcat.api.roles.Role; import org.gcube.gcat.configuration.CatalogueConfigurationFactory; import org.postgresql.core.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CKANPackageTrash { protected static final Logger logger = LoggerFactory.getLogger(CKANPackageTrash.class); private static final String GROUP_TABLE_KEY = "group"; private static final String GROUP_ID_KEY = "id"; private static final String GROUP_NAME_KEY = "name"; private static final String PACKAGE_TABLE_KEY = "package"; private static final String PACKAGE_NAME_KEY = "name"; private static final String PACKAGE_TYPE_KEY = "type"; private static final String PACKAGE_TYPE_VALUE = "dataset"; private static final String PACKAGE_STATE_KEY = "state"; private static final String PACKAGE_STATE_VALUE = "deleted"; private static final String PACKAGE_OWNER_ORG_KEY = "owner_org"; protected ObjectMapper mapper; protected final CKANUser ckanUser; protected final CatalogueConfiguration configuration; protected final Set supportedOrganizations; protected boolean ownOnly; public CKANPackageTrash() { mapper = new ObjectMapper(); ckanUser = CKANUserCache.getCurrrentCKANUser(); configuration = CatalogueConfigurationFactory.getInstance(); supportedOrganizations = configuration.getSupportedOrganizations(); for(String supportedOrganization : supportedOrganizations) { ckanUser.addUserToOrganization(supportedOrganization); } ownOnly = true; } public void setOwnOnly(boolean ownOnly) { this.ownOnly = ownOnly; } protected Connection getConnection() throws Exception { Class.forName("org.postgresql.Driver"); CKANDB ckanDB = configuration.getCkanDB(); String url = ckanDB.getUrl(); String username = ckanDB.getUsername(); String password = ckanDB.getPassword(); Connection connection = DriverManager.getConnection(url, username, password); logger.trace("Database {} opened successfully", url); connection.setAutoCommit(false); return connection; } protected String getQuotedString(String string) throws SQLException { StringBuilder builder = new StringBuilder(); builder.append("'"); Utils.escapeLiteral(builder, string, false); builder.append("'"); return builder.toString(); } protected ArrayNode getItems() throws WebApplicationException { Connection connection = null; try { StringBuffer stringBufferOrg = new StringBuffer(); stringBufferOrg.append("SELECT "); stringBufferOrg.append(GROUP_ID_KEY); stringBufferOrg.append(" FROM \""); stringBufferOrg.append(GROUP_TABLE_KEY); stringBufferOrg.append("\" WHERE "); stringBufferOrg.append(GROUP_NAME_KEY); stringBufferOrg.append(" IN "); stringBufferOrg.append("("); boolean first = true; for(String organizationName : supportedOrganizations) { if(first) { first = false; }else { stringBufferOrg.append(","); } stringBufferOrg.append(getQuotedString(organizationName)); } stringBufferOrg.append(")"); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("SELECT "); stringBuffer.append(PACKAGE_NAME_KEY); stringBuffer.append(" FROM "); stringBuffer.append(PACKAGE_TABLE_KEY); stringBuffer.append(" WHERE "); stringBuffer.append(PACKAGE_TYPE_KEY); stringBuffer.append("="); stringBuffer.append(getQuotedString(PACKAGE_TYPE_VALUE)); stringBuffer.append(" AND "); stringBuffer.append(PACKAGE_STATE_KEY); stringBuffer.append("="); stringBuffer.append(getQuotedString(PACKAGE_STATE_VALUE)); if(ownOnly || ckanUser.getRole()!=Role.ADMIN) { // add only own items stringBuffer.append(" AND "); stringBuffer.append(CKANPackage.AUTHOR_EMAIL_KEY); stringBuffer.append("="); stringBuffer.append(getQuotedString(ckanUser.getEMail())); } stringBuffer.append(" AND "); stringBuffer.append(PACKAGE_OWNER_ORG_KEY); stringBuffer.append(" IN ("); stringBuffer.append(stringBufferOrg); stringBuffer.append(")"); ArrayNode items = mapper.createArrayNode(); connection = getConnection(); Statement statement = connection.createStatement(); String sql = stringBuffer.toString(); logger.trace("Going to request the following query: {}", sql); ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { String id = resultSet.getString(PACKAGE_NAME_KEY); items.add(id); } return items; } catch (WebApplicationException e) { throw e; } catch (Exception e) { throw new WebApplicationException(e); }finally { if(connection!=null) { try { connection.close(); } catch (SQLException e) { } } } } public String list() throws WebApplicationException { try { return mapper.writeValueAsString(getItems()); } catch (WebApplicationException e) { throw e; } catch (Exception e) { throw new WebApplicationException(e); } } public ObjectNode removeAll() throws WebApplicationException { ObjectNode objectNode = mapper.createObjectNode(); ArrayNode deleted = mapper.createArrayNode(); ArrayNode notDeleted = mapper.createArrayNode(); ArrayNode itemNames = getItems(); CKANPackage ckanPackage = new CKANPackage(); for(int i=0; i