/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.esri.gpt.catalog.harvest.repository;
import com.esri.gpt.catalog.arcims.ImsMetadataAdminDao;
import com.esri.gpt.catalog.context.CatalogIndexException;
import com.esri.gpt.framework.context.RequestContext;
import com.esri.gpt.framework.sql.ManagedConnection;
import com.esri.gpt.framework.util.UuidUtil;
import com.esri.gpt.framework.util.Val;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
/**
* Repository delete request.
*/
public class HrDeleteRequest extends HrRequest {
// class variables =============================================================
// instance variables ==========================================================
/** Array of uids of harvest repositories to delete. */
private String[] _uuids = new String[]{};
// constructors ================================================================
/**
* Create instance of the request.
* @param requestContext request context
* @param uuids uuids of records to delete
*/
public HrDeleteRequest(RequestContext requestContext, String[] uuids) {
super(requestContext, new HrCriteria(), new HrResult());
setUuids(uuids);
}
// properties ==================================================================
/**
* Gets uuids of records to delete.
* @return uuids of records to delete
*/
public String[] getUuids() {
return _uuids;
}
/**
* Sets uuids of records to delete.
* @param uuids uuids of records to delete
*/
public void setUuids(String[] uuids) {
ArrayList<String> validUuids = new ArrayList<String>();
if (uuids != null) {
for (String uuid: uuids) {
uuid = Val.chkStr(uuid);
if (UuidUtil.isUuid(uuid)) {
validUuids.add(uuid);
}
}
}
_uuids = validUuids.toArray(new String[validUuids.size()]);
}
// methods =====================================================================
/**
* Executes request.
* @throws java.sql.SQLException if request execution fails
*/
public void execute() throws SQLException {
Connection con = null;
boolean autoCommit = true;
if (getUuids().length > 0) {
// intitalize
PreparedStatement stJobsDelete = null;
PreparedStatement stCompletedJobsDelete = null;
PreparedStatement stHistoryDelete = null;
ImsMetadataAdminDao adminDao = new ImsMetadataAdminDao(getRequestContext());
try {
StringBuffer sbJobsDeleteSql = new StringBuffer();
StringBuffer sbCompletedJobsDeleteSql = new StringBuffer();
StringBuffer sbHistoryDeleteSql = new StringBuffer();
StringBuilder sbUuids = new StringBuilder();
for (String uuid: getUuids()) {
if (sbUuids.length() > 0) {
sbUuids.append(",");
}
sbUuids.append("'" + uuid + "'");
}
sbJobsDeleteSql.append("delete from " +
getHarvestingJobTableName() + " ");
sbJobsDeleteSql.append("where HARVEST_ID = ?");
sbCompletedJobsDeleteSql.append("delete from " +
getHarvestingJobsCompletedTableName() + " ");
sbCompletedJobsDeleteSql.append("where HARVEST_ID = ?");
sbHistoryDeleteSql.append("delete from " +
getHarvestingHistoryTableName() + " ");
sbHistoryDeleteSql.append("where HARVEST_ID = ?");
// establish the connection
ManagedConnection mc = returnConnection();
con = mc.getJdbcConnection();
autoCommit = con.getAutoCommit();
con.setAutoCommit(false);
stJobsDelete = con.prepareStatement(sbJobsDeleteSql.toString());
stCompletedJobsDelete = con.prepareStatement(sbCompletedJobsDeleteSql.
toString());
stHistoryDelete = con.prepareStatement(sbHistoryDeleteSql.toString());
PreparedStatement[] stmts = new PreparedStatement[]{
stJobsDelete,
stCompletedJobsDelete,
stHistoryDelete,
};
logExpression(stJobsDelete.toString());
logExpression(stCompletedJobsDelete.toString());
logExpression(stHistoryDelete.toString());
int nRowCount = 0;
for (String uuid: getUuids()) {
nRowCount += executeForOne(adminDao, stmts, uuid);
}
getActionResult().setNumberOfRecordsModified(nRowCount);
con.commit();
} catch (SQLException ex) {
if (con!=null) {
con.rollback();
}
throw ex;
} catch (Exception ex) {
if (con!=null) {
con.rollback();
}
throw new SQLException("Error deleting record.");
} finally {
closeStatement(stJobsDelete);
closeStatement(stHistoryDelete);
closeStatement(stCompletedJobsDelete);
if (con!=null) {
con.setAutoCommit(autoCommit);
}
}
}
}
/**
* Executes all prepared statements for one UUID.
* @param adminDao admin dao
* @param stmts array of statements
* @param uuid UUID
* @return number of records affected
* @throws java.sql.SQLException if statement can not be executed
*/
private int executeForOne(ImsMetadataAdminDao adminDao, PreparedStatement[] stmts, String uuid) throws
SQLException, CatalogIndexException {
int nRowCount = 0;
for (PreparedStatement st: stmts) {
st.setString(1, uuid);
nRowCount = st.executeUpdate();
}
adminDao.deleteRecord(uuid);
return nRowCount;
}
/**
* Reads all records designated to be deleted.
* @return array of records to delete.
* @throws SQLException if reading records fails
*/
private Map<String,HrRecord> readRecords() throws SQLException {
TreeMap<String,HrRecord> records = new TreeMap<String,HrRecord>();
for (String uuid: getUuids()) {
HrSelectRequest request = new HrSelectRequest(getRequestContext(), uuid);
request.execute();
for (HrRecord hrRecord : request.getQueryResult().getRecords()) {
records.put(hrRecord.getUuid(),hrRecord);
}
}
return records;
}
}