/**
* Copyright (c) Codice Foundation
* <p>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
**/
package org.codice.ddf.itests.common.csw;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.codice.ddf.itests.common.AbstractIntegrationTest.CSW_REQUEST_RESOURCE_PATH;
import static org.codice.ddf.itests.common.AbstractIntegrationTest.getFileContent;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.codice.ddf.itests.common.ServiceManager;
import org.xml.sax.InputSource;
import com.google.common.collect.ImmutableMap;
import com.jayway.restassured.response.Response;
public class CswTestCommons {
public static final String CSW_SOURCE_SYMBOLIC_NAME = "spatial-csw-source";
public static final String CSW_FEDERATED_SOURCE_FACTORY_PID = "Csw_Federated_Source";
public static final String CSW_CONNECTED_SOURCE_FACTORY_PID = "Csw_Connected_Source";
public static final String CSW_REGISTRY_STORE_SYMBOLIC_NAME = "catalog-registry-api-impl";
public static final String CSW_REGISTRY_STORE_FACTORY_PID = "Csw_Registry_Store";
public static final String GMD_CSW_FEDERATED_SOURCE_FACTORY_PID = "Gmd_Csw_Federated_Source";
public static Map<String, Object> getCswSourceProperties(String sourceId, String cswUrl,
ServiceManager serviceManager) {
return getCswSourceProperties(sourceId, CSW_FEDERATED_SOURCE_FACTORY_PID, cswUrl, serviceManager);
}
public static Map<String, Object> getCswConnectedSourceProperties(String sourceId,
String cswUrl, ServiceManager serviceManager) {
return getCswSourceProperties(sourceId, CSW_CONNECTED_SOURCE_FACTORY_PID, cswUrl, serviceManager);
}
public static Map<String, Object> getCswSourceProperties(String sourceId, String factoryPid,
String cswUrl, ServiceManager serviceManager) {
Map<String, Object> cswSourceProperties = new HashMap<>();
cswSourceProperties.putAll(serviceManager.getMetatypeDefaults(CSW_SOURCE_SYMBOLIC_NAME, factoryPid));
cswSourceProperties.put("id", sourceId);
cswSourceProperties.put("cswUrl", cswUrl);
cswSourceProperties.put("pollInterval", 1);
return cswSourceProperties;
}
public static Map<String, Object> getCswRegistryStoreProperties(String sourceId, String cswUrl,
ServiceManager serviceManager) {
Map<String, Object> cswSourceProperties = new HashMap<>();
cswSourceProperties.putAll(serviceManager.getMetatypeDefaults(CSW_REGISTRY_STORE_SYMBOLIC_NAME, CSW_REGISTRY_STORE_FACTORY_PID));
cswSourceProperties.put("id", sourceId);
cswSourceProperties.put("registryUrl", cswUrl);
return cswSourceProperties;
}
public static String getCswQuery(String propertyName, String literalValue, String outputFormat,
String outputSchema) {
String schema = "";
if (StringUtils.isNotBlank(outputSchema)) {
schema = "outputSchema=\"" + outputSchema + "\" ";
}
return getFileContent("/csw-query.xml",
ImmutableMap.of("propertyName",
propertyName,
"literal",
literalValue,
"outputFormat",
outputFormat,
"outputSchema",
schema));
}
public static String getCswSubscription(String propertyName, String literalValue,
String responseHandler) {
return getCswSubscription(propertyName,
literalValue,
"application/xml",
"http://www.opengis.net/cat/csw/2.0.2",
responseHandler);
}
public static String getCswSubscription(String propertyName, String literalValue,
String ouputFormat, String outputSchema, String responseHandler) {
String schema = "";
if (StringUtils.isNotBlank(outputSchema)) {
schema = "outputSchema=\"" + outputSchema + "\" ";
}
return "<csw:GetRecords resultType=\"results\" outputFormat=\"" + ouputFormat + "\" "
+ schema
+ "startPosition=\"1\" maxRecords=\"10\" service=\"CSW\" version=\"2.0.2\" xmlns:ns2=\"http://www.opengis.net/ogc\" xmlns:csw=\"http://www.opengis.net/cat/csw/2.0.2\" xmlns:ns4=\"http://www.w3.org/1999/xlink\" xmlns:ns3=\"http://www.opengis.net/gml\" xmlns:ns9=\"http://www.w3.org/2001/SMIL20/Language\" xmlns:ns5=\"http://www.opengis.net/ows\" xmlns:ns6=\"http://purl.org/dc/elements/1.1/\" xmlns:ns7=\"http://purl.org/dc/terms/\" xmlns:ns8=\"http://www.w3.org/2001/SMIL20/\">"
+ " <csw:ResponseHandler>" + responseHandler + "</csw:ResponseHandler>"
+ " <ns10:Query typeNames=\"csw:Record\" xmlns=\"\" xmlns:ns10=\"http://www.opengis.net/cat/csw/2.0.2\">"
+ " <ns10:ElementSetName>full</ns10:ElementSetName>"
+ " <ns10:Constraint version=\"1.1.0\">" + " <ns2:Filter>"
+ " <ns2:PropertyIsLike wildCard=\"*\" singleChar=\"#\" escapeChar=\"!\">"
+ " <ns2:PropertyName>" + propertyName + "</ns2:PropertyName>"
+ " <ns2:Literal>" + literalValue + "</ns2:Literal>"
+ " </ns2:PropertyIsLike>" + " </ns2:Filter>"
+ " </ns10:Constraint>" + " </ns10:Query>" + "</csw:GetRecords>";
}
public static String getCswInsertRequest(String typeName, String record) {
return getFileContent(CSW_REQUEST_RESOURCE_PATH + "/CswInsertRequest",
ImmutableMap.of("typeName", typeName, "record", record));
}
public static String getMetacardIdFromCswInsertResponse(Response response)
throws IOException, XPathExpressionException {
XPath xPath = XPathFactory.newInstance()
.newXPath();
String idPath = "//*[local-name()='identifier']/text()";
InputSource xml = new InputSource(IOUtils.toInputStream(response.getBody()
.asString(), UTF_8.name()));
return xPath.compile(idPath)
.evaluate(xml);
}
}