/* 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.publication; import com.esri.gpt.catalog.arcims.DeleteMetadataRequest; import com.esri.gpt.catalog.arcims.ImsMetadataAdminDao; import com.esri.gpt.catalog.arcims.ImsServiceException; import com.esri.gpt.catalog.context.CatalogIndexException; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.security.principal.Publisher; import com.esri.gpt.framework.sql.BaseDao; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; /** * Database access object associated with the metadata catalog. */ class CatalogDao extends BaseDao { /** class variables ========================================================= */ /** Logger */ private static Logger LOGGER = Logger.getLogger(CatalogDao.class.getName()); /** constructors =========================================================== */ /** * Constructs with an associated request context. * @param requestContext the request context */ public CatalogDao(RequestContext requestContext) { super(requestContext); } /** properties ============================================================= */ /** * Gets the primary catalog table name. * @return the primary catalog table name */ private String getResourceTableName() { return getRequestContext().getCatalogConfiguration().getResourceTableName(); } /** methods ================================================================= */ /** * Deletes catalog documents that are no longer referenced by a parent resource. * @param context the processing context * @param sourceURIs the collection of source URIs to delete (key is SOURCEURI value is DOCUUID) * @throws SQLException if an exception occurs while communicating with the database * @throws ImsServiceException if an exception occurs during delete * @throws CatalogIndexException if an exception occurs during delete * @throws IOException if accessing index fails */ protected void deleteSourceURIs(final ProcessingContext context, Map<String,String> sourceURIs) throws SQLException, ImsServiceException, CatalogIndexException, IOException { this.deleteSourceURIs(context.getPublisher(), sourceURIs.entrySet(), new CatalogRecordListener() { @Override public void onRecord(String sourceUri, String uuid) { context.incrementNumberDeleted(); ProcessedRecord record = new ProcessedRecord(); record.setSourceUri(sourceUri); record.setStatusType(ProcessedRecord.StatusType.DELETED); context.getProcessedRecords().add(record); } }); } /** * Deletes catalog documents that are no longer referenced by a parent resource. * @param publisher publisher * @param sourceURIs the collection of source URIs to delete (key is SOURCEURI value is DOCUUID) * @param listener listener called upon deleting a single document * @throws SQLException if an exception occurs while communicating with the database * @throws ImsServiceException if an exception occurs during delete * @throws CatalogIndexException if an exception occurs during delete * @throws IOException if accessing index fails */ protected void deleteSourceURIs(Publisher publisher, Iterable<Map.Entry<String,String>> sourceURIs, CatalogRecordListener listener) throws ImsServiceException, SQLException, CatalogIndexException, IOException { ImsMetadataAdminDao adminDao = new ImsMetadataAdminDao(getRequestContext()); DeleteMetadataRequest delRequest = new DeleteMetadataRequest( this.getRequestContext(),publisher); for (Map.Entry<String,String> entry: sourceURIs) { if (Thread.currentThread().isInterrupted()) break; String uri = entry.getKey(); String uuid = entry.getValue(); LOGGER.finest("Deleting uuid="+uuid+", sourceuri="+uri); boolean bOk = delRequest.executeDelete(uuid); if (bOk) { listener.onRecord(uri, uuid); } } } /** * Queries document source URIs associated with a parent resource (SQL LIKE). * @param pattern the source URI pattern of the parent resource * @param pattern2 optional secondary source URI pattern of the parent resource * @return the collection of associated source URIs (key is SOURCEURI value is DOCUUID) * @throws SQLException if an exception occurs while communicating with the database */ protected Map<String,String> querySourceURIs(String pattern, String pattern2) throws SQLException { PreparedStatement st = null; Map<String,String> uris = new HashMap<String,String>(); try { String table = this.getResourceTableName(); String sql = "SELECT SOURCEURI,DOCUUID FROM "+table+" WHERE SOURCEURI LIKE ?"; if ((pattern2 != null) && (pattern2.length() > 0)) { sql += " OR SOURCEURI LIKE ?"; } this.logExpression(sql); Connection con = this.returnConnection().getJdbcConnection(); st = con.prepareStatement(sql); st.setString(1,pattern+"%"); if ((pattern2 != null) && (pattern2.length() > 0)) { st.setString(2,pattern2+"%"); } ResultSet rs = st.executeQuery(); int numFound = 0; while (rs.next()) { if (Thread.currentThread().isInterrupted()) return null; numFound++; String uri = rs.getString(1); String uuid = rs.getString(2); uris.put(uri,uuid); } } finally { CatalogDao.closeStatement(st); } return uris; } /** * Queries document source URIs associated with the harvesting site. * @param siteUuid site UUID * @param listener source URI listener * @throws SQLException if an exception occurs while communicating with the database * @throws IOException if accessing index fails */ protected void querySourceURIs(String siteUuid, CatalogRecordListener listener) throws SQLException, IOException { PreparedStatement st = null; try { String table = this.getResourceTableName(); String sql = "SELECT SOURCEURI,DOCUUID FROM "+table+" WHERE SITEUUID = ?"; this.logExpression(sql); Connection con = this.returnConnection().getJdbcConnection(); st = con.prepareStatement(sql); st.setString(1,siteUuid); ResultSet rs = st.executeQuery(); int numFound = 0; while (rs.next()) { if (Thread.currentThread().isInterrupted()) return; numFound++; String uri = rs.getString(1); String uuid = rs.getString(2); listener.onRecord(uri, uuid); } } finally { CatalogDao.closeStatement(st); } } protected static interface CatalogRecordListener { void onRecord(String sourceUri, String uuid) throws IOException; } }