/* (c) 2014 - 2015 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.rest.converters;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import org.geoserver.catalog.StoreInfo;
import org.geoserver.importer.Directory;
import org.geoserver.importer.ImportContext;
import org.geoserver.importer.ImportTask;
import org.geoserver.importer.ImporterTestSupport;
import org.geoserver.importer.RemoteData;
import org.geoserver.importer.rest.TransformTestSupport;
import org.geoserver.importer.rest.converters.ImportJSONWriter.FlushableJSONBuilder;
import org.geoserver.importer.transform.DateFormatTransform;
import org.geoserver.importer.transform.TransformChain;
import org.geoserver.rest.RequestInfo;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
*
* @author Ian Schneider <ischneider@opengeo.org>
*/
public class ImportJSONIOTest extends ImporterTestSupport {
private ImportJSONWriter writer;
FlushableJSONBuilder builder;
private ImportJSONReader reader;
private ByteArrayOutputStream outputStream;
private RequestAttributes oldAttributes;
@Before
public void prepareData() throws Exception {
File dir = unpack("shape/archsites_epsg_prj.zip");
importer.createContext(new Directory(dir));
RequestInfo info = new RequestInfo();
info.setServletPath("servletPath");
info.setBaseURL("baseURL");
info.setPagePath("pagePath");
newOutputStreamAndBuilder();
writer = new ImportJSONWriter(importer);
reader = new ImportJSONReader(importer);
oldAttributes = RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(new TransformTestSupport.MapRequestAttributes());
RequestInfo.set(info);
}
@After
public void cleanUp() {
RequestContextHolder.setRequestAttributes(oldAttributes);
}
private void newOutputStreamAndBuilder() {
outputStream = new ByteArrayOutputStream();
builder = new FlushableJSONBuilder(outputStream);
}
/**
* Parse json from {@link #outputStream}.
* @return json representation of text
*/
private JSONObject parseJson(ByteArrayOutputStream buffer) {
String text = new String(buffer.toByteArray());
return JSONObject.fromObject(text);
}
@Test
public void testSettingTargetStore() throws IOException {
ImportTask task = importer.getContext(0).getTasks().get(0);
writer.task(builder,task, true, 1);
// update with new target
JSONObject target = new JSONObject();
JSONObject dataStore = new JSONObject();
JSONObject workspace = new JSONObject();
dataStore.put("name", "foobar");
workspace.put("name", getCatalog().getDefaultWorkspace().getName());
dataStore.put("workspace", workspace);
target.put("dataStore", dataStore);
JSONObject json = parseJson( outputStream );
json.getJSONObject("task").put("target", target);
ImportTask parsed = reader.task(json);
StoreInfo store = parsed.getStore();
Assert.assertNotNull(store);
Assert.assertEquals("foobar", store.getName());
Assert.assertEquals(getCatalog().getDefaultWorkspace().getName(), store.getWorkspace().getName());
}
@Test
public void testAddingDateTransform() throws IOException {
ImportTask task = importer.getContext(0).getTasks().get(0);
writer.task(builder,task, true, 1);
// update with transform
JSONObject json = parseJson(outputStream);
JSONArray transforms =
json.getJSONObject("task").getJSONObject("transformChain").getJSONArray("transforms");
JSONObject dateTransform = new JSONObject();
dateTransform.put("type", "dateFormatTransform");
dateTransform.put("field", "foobar");
dateTransform.put("format", "yyyy-MM-dd");
transforms.add(dateTransform);
//hack, remove href
json.getJSONObject("task").getJSONObject("target").remove("href");
ImportJSONReader reader = new ImportJSONReader(importer);
task = reader.task(json);
Assert.assertNotNull(task);
TransformChain<?> chain = task.getTransform();
Assert.assertNotNull(chain);
Assert.assertEquals(1, chain.getTransforms().size());
DateFormatTransform dft = (DateFormatTransform) chain.getTransforms().get(0);
Assert.assertEquals("foobar",dft.getField());
Assert.assertEquals("yyyy-MM-dd",dft.getDatePattern().dateFormat().toPattern());
}
@Test
public void testRemoteDataFreeAccess() throws IOException {
ImportContext context = importer.registerContext(null);
context.setData(new RemoteData("http://www.geoserver.org/data"));
writer.context(builder,context, true, 3);
JSONObject json = parseJson(outputStream);
ImportContext readBack = reader.context(json);
Assert.assertEquals(context.getData(), readBack.getData());
}
@Test
public void testRemoteDataFullDataAccess() throws IOException {
ImportContext context = importer.registerContext(null);
RemoteData data = new RemoteData("http://www.geoserver.org/data");
data.setUsername("foo");
data.setPassword("bar");
data.setDomain("myDomain");
context.setData(data);
writer.context(builder, context, true, 3);
ByteArrayInputStream inbuf = new ByteArrayInputStream(outputStream.toByteArray());
ImportContext readBack = reader.context( reader.parse(inbuf));
Assert.assertEquals(context.getData(), readBack.getData());
}
}