/* 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.arcims; import com.esri.gpt.framework.security.credentials.UsernamePasswordCredentials; import com.esri.gpt.framework.util.Val; import com.esri.gpt.framework.xml.DomUtil; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; import java.util.TreeSet; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * Query request. */ public class QueryRequest extends HarvestRequest { // class variables ============================================================= /** date format */ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); // instance variables ========================================================== /** maximum records to query; 0 - no limit. */ private int _maxRec; /** Update date 'after' */ private Date _updatedAfterDate; /** Update date 'before' */ private Date _updatedBeforeDate; /** selected uuids */ private Set<String> _uuids = new TreeSet<String>(); // constructors ================================================================ /** * Creates instance of the request. */ public QueryRequest() { super(); } /** * Creates instance of the request. * @param credentials credentials */ public QueryRequest(UsernamePasswordCredentials credentials) { super(credentials); } // properties ================================================================== /** * Gets maximum number of records to query. * @return maximum number of records to query, or <code>0</code> if no such a * limit */ public int getMaxRec() { return _maxRec; } /** * Sets maximum number of records to query. * @param maxRec maximum number of records to query, or <code>0</code> if no * such a limit */ public void setMaxRec(int maxRec) { _maxRec = Math.max(0, maxRec); } /** * Gets update date 'after'. * @return date or <code>null</code> if no limit set */ public Date getUpdatedAfterDate() { return _updatedAfterDate; } /** * Sets update date 'after'. * @param updatedAfterDate date or <code>null</code> if no limit */ public void setUpdatedAfterDate(Date updatedAfterDate) { _updatedAfterDate = updatedAfterDate; } /** * Gets update date 'before'. * @return date or <code>null</code> if no limit set */ public Date getUpdatedBeforeDate() { return _updatedBeforeDate; } /** * Sets update date 'before'. * @param updatedBeforeDate date or <code>null</code> if no limit */ public void setUpdatedBeforeDate(Date updatedBeforeDate) { _updatedBeforeDate = updatedBeforeDate; } /** * Gets selected uuids. * @return collection of uuids */ public Set<String> getUuids() { return _uuids; } // methods ===================================================================== /** * Executes query. * @throws ImsServiceException if error executing query */ public void execute() throws ImsServiceException { _uuids.clear(); StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); sb.append("\r\n<ARCXML version=\"1.1\">"); sb.append("\r\n<REQUEST>"); sb.append("\r\n<GET_METADATA>"); sb.append("\r\n<SEARCH_METADATA fulloutput=\"false\""); if (getMaxRec() > 0) { sb.append(" maxresults=\""); sb.append(Integer.toString(getMaxRec())); sb.append("\""); } sb.append(">"); if (getUpdatedAfterDate() != null || getUpdatedAfterDate() != null) { sb.append("\r\n<SEARCH_METADATA"); if (getUpdatedAfterDate() != null) { sb.append(" after=\""); sb.append(DATE_FORMAT.format(getUpdatedAfterDate())); sb.append("\""); } if (getUpdatedBeforeDate() != null) { sb.append(" before=\""); sb.append(DATE_FORMAT.format(getUpdatedBeforeDate())); sb.append("\""); } sb.append("/>"); } sb.append("\r\n</SEARCH_METADATA>"); sb.append("\r\n</GET_METADATA>"); sb.append("\r\n</REQUEST>"); sb.append("\r\n</ARCXML>"); setAxlRequest(sb.toString()); executeRequest(); if (wasActionOK()) { try { Document document = DomUtil.makeDomFromString(getAxlResponse(), false); XPath xPath = XPathFactory.newInstance().newXPath(); NodeList nodeList = (NodeList) xPath.evaluate( "ARCXML/RESPONSE/METADATA/METADATA_DATASET/@docid", document, XPathConstants.NODESET); for (int i=0; i<nodeList.getLength(); i++) { Node node = nodeList.item(i); String docid = Val.chkStr(node.getNodeValue()); if (docid.length() > 0) { _uuids.add(docid); } } } catch (XPathExpressionException ex) { throw new ImsResponseException("Response parse error.", ex); } catch (ParserConfigurationException ex) { throw new ImsResponseException("Response parse error.", ex); } catch (SAXException ex) { throw new ImsResponseException("Response parse error.", ex); } catch (IOException ex) { throw new ImsResponseException("Response parse error.", ex); } } } }