/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2014 Geomatys.
*
* Licensed 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 org.constellation.wfs;
import org.constellation.business.IDataBusiness;
import org.constellation.business.ILayerBusiness;
import org.constellation.business.IProviderBusiness;
import org.constellation.business.IServiceBusiness;
import org.constellation.configuration.ConfigDirectory;
import org.constellation.admin.SpringHelper;
import org.constellation.api.ProviderType;
import org.constellation.configuration.LayerContext;
import org.constellation.provider.DataProviders;
import org.constellation.provider.ProviderFactory;
import org.constellation.test.utils.BasicMultiValueMap;
import org.constellation.test.utils.BasicUriInfo;
import org.constellation.test.utils.SpringTestRunner;
import org.constellation.util.Util;
import org.constellation.wfs.ws.rs.FeatureCollectionWrapper;
import org.constellation.wfs.ws.rs.WFSService;
import org.constellation.ws.rs.AbstractWebService;
import org.geotoolkit.data.FeatureCollection;
import org.geotoolkit.internal.sql.DefaultDataSource;
import org.geotoolkit.util.FileUtilities;
import org.geotoolkit.util.sql.DerbySqlScriptRunner;
import org.junit.AfterClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opengis.parameter.ParameterValueGroup;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.xml.namespace.QName;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.logging.Level;
import org.apache.sis.util.logging.Logging;
import static org.geotoolkit.utility.parameter.ParametersExt.getOrCreateGroup;
import static org.geotoolkit.utility.parameter.ParametersExt.getOrCreateValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.BeforeClass;
import org.springframework.test.context.ActiveProfiles;
// JUnit dependencies
/**
*
* @author Guilhem Legal (Geomatys)
*/
@RunWith(SpringTestRunner.class)
@ContextConfiguration("classpath:/cstl/spring/test-context.xml")
@ActiveProfiles({"standard"})
public class WFSServiceTest implements ApplicationContextAware {
protected ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Inject
private IServiceBusiness serviceBusiness;
@Inject
protected ILayerBusiness layerBusiness;
@Inject
protected IProviderBusiness providerBusiness;
@Inject
protected IDataBusiness dataBusiness;
private static WFSService service;
private static final BasicUriInfo info = new BasicUriInfo(null, null);
private static final MultivaluedMap<String,String> queryParameters = new BasicMultiValueMap<>();
private static final MultivaluedMap<String,String> pathParameters = new BasicMultiValueMap<>();
private static boolean initialized = false;
@BeforeClass
public static void initTestDir() {
ConfigDirectory.setupTestEnvironement("WFSServiceTest");
}
@PostConstruct
public void setUpClass() {
SpringHelper.setApplicationContext(applicationContext);
if (!initialized) {
try {
layerBusiness.removeAll();
serviceBusiness.deleteAll();
dataBusiness.deleteAll();
providerBusiness.removeAll();
final ProviderFactory featfactory = DataProviders.getInstance().getFactory("feature-store");
final String url = "jdbc:derby:memory:TestWFSServiceOM";
final DefaultDataSource ds = new DefaultDataSource(url + ";create=true");
Connection con = ds.getConnection();
DerbySqlScriptRunner sr = new DerbySqlScriptRunner(con);
String sql = FileUtilities.getStringFromStream(Util.getResourceAsStream("org/constellation/om2/structure_observations.sql"));
sql = sql.replace("$SCHEMA", "");
sr.run(sql);
sr.run(Util.getResourceAsStream("org/constellation/sql/sos-data-om2.sql"));
con.close();
ds.shutdown();
final ParameterValueGroup sourceOM = featfactory.getProviderDescriptor().createValue();
getOrCreateValue(sourceOM, "id").setValue("omSrc");
getOrCreateValue(sourceOM, "load_all").setValue(true);
final ParameterValueGroup choiceOM = getOrCreateGroup(sourceOM, "choice");
final ParameterValueGroup omconfig = getOrCreateGroup(choiceOM, " SOSDBParameters");
getOrCreateValue(omconfig, "sgbdtype").setValue("derby");
getOrCreateValue(omconfig, "derbyurl").setValue(url);
providerBusiness.storeProvider("omSrc", null, ProviderType.LAYER, "feature-store", sourceOM);
dataBusiness.create(new QName("http://www.opengis.net/sampling/1.0", "SamplingPoint"), "omSrc", "VECTOR", false, true, null, null);
final LayerContext config = new LayerContext();
config.getCustomParameters().put("shiroAccessible", "false");
config.getCustomParameters().put("transactionSecurized", "false");
config.getCustomParameters().put("transactionnal", "true");
serviceBusiness.create("wfs", "default", config, null);
layerBusiness.add("SamplingPoint", "http://www.opengis.net/sampling/1.0", "omSrc", null, "default", "wfs", null);
DataProviders.getInstance().reload();
service = new WFSService();
Field privateStringField = AbstractWebService.class.getDeclaredField("uriContext");
privateStringField.setAccessible(true);
privateStringField.set(service, info);
pathParameters.add("serviceId", "default");
queryParameters.add("serviceId", "default");
info.setPathParameters(pathParameters);
info.setQueryParameters(queryParameters);
initialized = true;
} catch (Exception ex) {
Logging.getLogger("org.constellation.wfs").log(Level.SEVERE, null, ex);
}
}
}
@AfterClass
public static void tearDownClass() throws Exception {
ConfigDirectory.shutdownTestEnvironement("WFSServiceTest");
if (service != null) {
service.destroy();
}
File derbyLog = new File("derby.log");
if (derbyLog.exists()) {
derbyLog.delete();
}
}
@Test
public void transactionInsertTest() throws Exception {
/*
* we verify that the number of features before insert
*/
InputStream is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.GetFeature.xml"));
Response result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
assertTrue(result.getEntity() instanceof FeatureCollectionWrapper);
FeatureCollection collection = ((FeatureCollectionWrapper) result.getEntity()).getFeatureCollection();
assertEquals(6, collection.size());
/*
* we insert the feature
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.InsertFeature.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
/*
* we verify that the features has been inserted
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.GetFeature.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
assertTrue(result.getEntity() instanceof FeatureCollectionWrapper);
collection = ((FeatureCollectionWrapper) result.getEntity()).getFeatureCollection();
assertEquals(8, collection.size());
/*
* we delete the features
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.DeleteFeature.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
/*
* we verify that the features has been deleted
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.GetFeature.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
assertTrue(result.getEntity() instanceof FeatureCollectionWrapper);
collection = ((FeatureCollectionWrapper) result.getEntity()).getFeatureCollection();
assertEquals(6, collection.size());
/*
* we insert the feature with another request
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.InsertFeature2.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
/*
* we verify that the features has been inserted
*/
is = new FileInputStream(FileUtilities.getFileFromResource("org.constellation.wfs.request.xml.GetFeature.xml"));
result = service.doPOSTXml(is);
assertEquals(Response.Status.OK.getStatusCode(), result.getStatus());
assertTrue(result.getEntity() instanceof FeatureCollectionWrapper);
collection = ((FeatureCollectionWrapper) result.getEntity()).getFeatureCollection();
assertEquals(8, collection.size());
}
}