/* 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.server.csw.provider.local;
import com.esri.gpt.catalog.discovery.Discoverable;
import com.esri.gpt.framework.util.Val;
import com.esri.gpt.server.csw.provider.components.OperationContext;
import com.esri.gpt.server.csw.provider.components.OwsException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import org.w3c.dom.Node;
/**
* Super-class for adapting CSW operation components to the local discovery model.
*/
public class DiscoveryAdapter {
/** instance variables ====================================================== */
private DiscoveryContext discoveryContext;
/** constructors ============================================================ */
/**
* Constructs with a supplied operation context
* @param context the operation context
*/
public DiscoveryAdapter(OperationContext context) {
String key = "DiscoveryAdapter.DiscoveryContext";
DiscoveryContext dCtx = (DiscoveryContext)context.getAdditionalProperties().get(key);
if (dCtx == null) {
dCtx = new DiscoveryContext(context);
context.getAdditionalProperties().put(key,dCtx);
}
this.discoveryContext = dCtx;
}
/** properties ============================================================== */
/**
* Gets the active discovery context.
* @return the active discovery context
*/
public DiscoveryContext getDiscoveryContext() {
return this.discoveryContext;
}
/** methods ================================================================= */
/**
* Parses a parent node for an associated property name (ogc:PropertyName).
* @param parent the parent of the property to locate
* @param xpath an XPath to enable queries (properly configured with name spaces)
* @return a discoverable associated with the property name
* @throws OwsException if validation fails
* @throws XPathExpressionException if an XPath related exception occurs
*/
public Discoverable parsePropertyName(Node parent, XPath xpath)
throws OwsException, XPathExpressionException {
// parse the property name
String locator = "PropertyName";
Node ndPropName = (Node)xpath.evaluate("ogc:PropertyName",parent,XPathConstants.NODE);
if (ndPropName == null) {
String msg = "The parameter was not found";
throw new OwsException(OwsException.OWSCODE_MissingParameterValue,locator,msg);
}
String sPropName = Val.chkStr(ndPropName.getTextContent());
if (sPropName.length() == 0) {
String msg = "The parameter value was empty.";
throw new OwsException(OwsException.OWSCODE_InvalidParameterValue,locator,msg);
}
// find the discoverable
Discoverable discoverable = this.getDiscoveryContext().findDiscoverable(sPropName);
if (discoverable == null) {
String msg = sPropName+" is not a supported queryable.";
throw new OwsException(OwsException.OWSCODE_InvalidParameterValue,locator,msg);
}
return discoverable;
}
}