package mil.nga.giat.geowave.service.client; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Map; import java.util.Map.Entry; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import mil.nga.giat.geowave.service.GeoserverService; import net.sf.json.JSONObject; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.glassfish.jersey.client.proxy.WebResourceFactory; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; public class GeoserverServiceClient { private final GeoserverService geoserverService; public GeoserverServiceClient( final String baseUrl ) { this( baseUrl, null, null); } public GeoserverServiceClient( final String baseUrl, String user, String password ) { ClientBuilder bldr = ClientBuilder.newBuilder(); if (user != null && password != null) { HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic( user, password); bldr.register(feature); } geoserverService = WebResourceFactory.newResource( GeoserverService.class, bldr.register( MultiPartFeature.class).build().target( baseUrl)); } public JSONObject getWorkspaces() { final Response resp = geoserverService.getWorkspaces(); resp.bufferEntity(); return JSONObject.fromObject(resp.readEntity(String.class)); } public boolean createWorkspace( final String workspace ) { final FormDataMultiPart multiPart = new FormDataMultiPart(); multiPart.field( "workspace", workspace); final Response resp = geoserverService.createWorkspace(multiPart); return resp.getStatus() == Status.CREATED.getStatusCode(); } public boolean deleteWorkspace( final String workspace ) { final Response resp = geoserverService.deleteWorkspace(workspace); return resp.getStatus() == Status.OK.getStatusCode(); } public JSONObject getStyles() { final Response resp = geoserverService.getStyles(); resp.bufferEntity(); return JSONObject.fromObject(resp.readEntity(String.class)); } public InputStream getStyle( final String styleName ) { return (InputStream) geoserverService.getStyle( styleName).getEntity(); } public boolean publishStyle( final File[] styleFiles ) throws FileNotFoundException { final FormDataMultiPart multiPart = new FormDataMultiPart(); for (final File styleFile : styleFiles) { multiPart.bodyPart(new FileDataBodyPart( "file", styleFile)); } final Response resp = geoserverService.publishStyle(multiPart); return resp.getStatus() == Status.OK.getStatusCode(); } public boolean deleteStyle( final String styleName ) { final Response resp = geoserverService.deleteStyle(styleName); return resp.getStatus() == Status.OK.getStatusCode(); } public JSONObject getDatastores() { return getDatastores(""); } public JSONObject getDatastores( final String workspace ) { final Response resp = geoserverService.getDatastores(workspace); return JSONObject.fromObject(resp.readEntity(String.class)); } public JSONObject getDatastore( final String datastoreName ) { return getDatastore( datastoreName, ""); } public JSONObject getDatastore( final String datastoreName, final String workspace ) { return JSONObject.fromObject(geoserverService.getDatastore( datastoreName, workspace).readEntity( String.class)); } public boolean publishDatastore( final String geowaveStoreType, final Map<String, String> dataStoreConfig, final String name ) { return publishDatastore( geowaveStoreType, dataStoreConfig, name, null, null, null, null, null); } public boolean publishDatastore( final String geowaveStoreType, final Map<String, String> dataStoreConfig, final String name, final String lockMgmt, final String authMgmtProvider, final String authDataUrl, final String queryIndexStrategy, final String workspace ) { final FormDataMultiPart multiPart = new FormDataMultiPart(); multiPart.field( "geowaveStoreType", geowaveStoreType); multiPart.field( "name", name); if (lockMgmt != null) { multiPart.field( "lockMgmt", lockMgmt); } if (queryIndexStrategy != null) { multiPart.field( "queryIndexStrategy", queryIndexStrategy); } if (authMgmtProvider != null) { multiPart.field( "authMgmtPrvdr", authMgmtProvider); if (authDataUrl != null) { multiPart.field( "authDataUrl", authDataUrl); } } if (workspace != null) { multiPart.field( "workspace", workspace); } for (final Entry<String, String> e : dataStoreConfig.entrySet()) { multiPart.field( e.getKey(), e.getValue()); } final Response resp = geoserverService.publishDatastore(multiPart); return resp.getStatus() == Status.OK.getStatusCode(); } public boolean deleteDatastore( final String datastore ) { final Response resp = geoserverService.deleteDatastore( datastore, ""); return resp.getStatus() == Status.OK.getStatusCode(); } public boolean deleteDatastore( final String datastore, final String workspace ) { final Response resp = geoserverService.deleteDatastore( datastore, workspace); return resp.getStatus() == Status.OK.getStatusCode(); } public JSONObject getLayers() { final Response resp = geoserverService.getLayers(); return JSONObject.fromObject(resp.readEntity(String.class)); } public JSONObject getLayer( final String layerName ) { return JSONObject.fromObject(geoserverService.getLayer( layerName).readEntity( String.class)); } public boolean publishLayer( final String datastore, final String defaultStyle, final String featureTypeName ) { return publishLayer( datastore, defaultStyle, featureTypeName, null); } public boolean publishLayer( final String datastore, final String defaultStyle, final String featureTypeName, final String workspace ) { final FormDataMultiPart multiPart = new FormDataMultiPart(); multiPart.field( "datastore", datastore); multiPart.field( "defaultStyle", defaultStyle); if (workspace != null) { multiPart.field( "workspace", workspace); } final String json = createFeatureTypeJson(featureTypeName); multiPart.field( "featureType", json); final Response resp = geoserverService.publishLayer(multiPart); return resp.getStatus() == Status.OK.getStatusCode(); } public boolean deleteLayer( final String layerName ) { final Response resp = geoserverService.deleteLayer(layerName); return resp.getStatus() == Status.OK.getStatusCode(); } private String createFeatureTypeJson( final String featureTypeName ) { final JSONObject featTypeJson = new JSONObject(); featTypeJson.put( "name", featureTypeName); final JSONObject jsonObj = new JSONObject(); jsonObj.put( "featureType", featTypeJson); return jsonObj.toString(); } }