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; /** * @author Luca Frosini (ISTI - CNR) */ 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().ordinal()