Author: [log in to unmask]
Date: Wed Aug 26 19:32:50 2015
New Revision: 3412
Log:
Current working version of new datacat API.
Added:
java/trunk/record-util/src/main/java/org/hps/datacat/DatacatFactory.java
java/trunk/record-util/src/main/java/org/hps/datacat/Dataset.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetDataType.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetFileFormat.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetImpl.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocation.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocationImpl.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetMetadata.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetSite.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatasetUtilities.java
java/trunk/record-util/src/main/java/org/hps/datacat/HttpUtilities.java
java/trunk/record-util/src/main/java/org/hps/datacat/JSONUtilities.java
java/trunk/record-util/src/main/java/org/hps/datacat/ScanStatus.java
Removed:
java/trunk/record-util/src/main/java/org/hps/datacat/DatacatUtilities.java
Modified:
java/trunk/record-util/pom.xml
java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClient.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClientImpl.java
java/trunk/record-util/src/main/java/org/hps/datacat/DatacatConstants.java
Modified: java/trunk/record-util/pom.xml
=============================================================================
--- java/trunk/record-util/pom.xml (original)
+++ java/trunk/record-util/pom.xml Wed Aug 26 19:32:50 2015
@@ -45,5 +45,15 @@
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.4.1</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.4</version>
+ </dependency>
</dependencies>
</project>
Modified: java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClient.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClient.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClient.java Wed Aug 26 19:32:50 2015
@@ -1,6 +1,6 @@
package org.hps.datacat;
-import java.net.URL;
+import java.util.List;
import java.util.Map;
/**
@@ -9,24 +9,78 @@
* @author Jeremy McCormick, SLAC
*/
public interface DatacatClient {
-
- int addDataset(String folder, Map<String, Object> parameters);
-
+
+ /**
+ * Add a dataset to the data catalog.
+ *
+ * @param folder the folder which must already exist
+ * @param dataType the data type
+ * @param resource the resource (path)
+ * @param site the site of the file
+ * @param fileFormat the file format
+ * @param name the name of the dataset
+ * @return the HTTP status code from the request
+ */
+ int addDataset(String folder, DatasetDataType dataType, String resource, DatasetSite site, DatasetFileFormat fileFormat, String name);
+
+ /**
+ * Create a folder in the data catalog.
+ *
+ * @param folder the folder's path
+ * @return the HTTP status code from the request
+ */
int makeFolder(String folder);
- int patchDataset(String folder, String datasetName, Map<String, Object> metaData);
+ /**
+ * Add metadata to an existing dataset.
+ *
+ * @param folder the folder
+ * @param datasetName the name of the dataset
+ * @param metaData the map of metadata where values can be <code>String</code>, <code>Integer</code> or <code>Float</code>
+ * @return the HTTP status code from the request
+ */
+ int addMetadata(String folder, String datasetName, Map<String, Object> metaData);
+ /**
+ * Remove a folder from the catalog.
+ * <p>
+ * It must be empty or an error will occur.
+ *
+ * @param folder the folder path
+ * @return the HHTP status code from the request
+ */
int removeFolder(String folder);
+ /**
+ * Delete a dataset from the catalog.
+ * <p>
+ * This has no affect on the underlying resource (file).
+ *
+ * @param path the path of the dataset
+ * @return the HTTP status code from the reqest
+ */
int deleteDataset(String path);
+
+ /**
+ * Find datasets in the catalog.
+ * <p>
+ * See <a href="http://docs.datacatalog.apiary.io/#search">Search Doc</a> for more details.
+ *
+ * @param folder the folder path
+ * @param query the query to execute
+ * @return the HTTP status code from the request
+ */
+ List<Dataset> findDatasets(String folder, String query);
- // TODO: get full info on dataset
+ // TODO: method to get dataset from path
+ // to get all metadata need site
+ // http://localhost:8080/datacat-v0.4-SNAPSHOT/r/path.json/HPS/derp/herp01;s=SLAC
+ // use HTTP GET
+ // Dataset getDataSet(String path);
- // TODO: query for datasets on meta data or other info
-
- String getRootDir();
-
- URL getBaseUrl();
-
- String getSite();
+ // TODO: method to determine if folder or dataset exists
+ // http://localhost:8080/datacat-v0.4-SNAPSHOT/r/path.json/HPS/derp/derp
+ // will return
+ // {"message":"File doesn't exist","type":"NoSuchFileException","cause":"Unable to resolve /HPS/derp/derp in parent Name: derp\tPath: /HPS/derp\t"}
+ // boolean exists(String path);
}
Modified: java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClientImpl.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClientImpl.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatacatClientImpl.java Wed Aug 26 19:32:50 2015
@@ -1,36 +1,43 @@
package org.hps.datacat;
import java.io.File;
+import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
+import java.net.URLEncoder;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.json.JSONObject;
-
-public class DatacatClientImpl implements DatacatClient {
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class DatacatClientImpl implements DatacatClient {
private URL url;
- private String site;
+ private DatasetSite site;
private String rootDir;
/**
* Create client with default parameters.
*/
DatacatClientImpl() {
- this(DatacatConstants.BASE_URL, DatacatConstants.SLAC_SITE, DatacatConstants.ROOT_DIR);
+ this(DatacatConstants.BASE_URL, DatasetSite.SLAC, DatacatConstants.ROOT_DIR);
}
/**
* Create client.
+ *
* @param baseUrl
* @param site
* @param rootDir
*/
- DatacatClientImpl(String baseUrl, String site, String rootDir) {
+ DatacatClientImpl(String url, DatasetSite site, String rootDir) {
try {
- url = new URL(baseUrl);
+ this.url = new URL(url);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("The URL is bad.", e);
}
@@ -42,7 +49,7 @@
throw new IllegalArgumentException("The root dir argument is null.");
}
this.rootDir = rootDir;
- System.out.println("rootUrl: " + baseUrl);
+ System.out.println("url: " + url);
System.out.println("site: " + site);
System.out.println("rootDir: " + rootDir);
}
@@ -50,19 +57,13 @@
@Override
public int removeFolder(String folder) {
String fullUrl = url.toString() + "/r/folders.json/" + this.rootDir + folder;
- return DatacatUtilities.doDelete(fullUrl);
+ return HttpUtilities.doDelete(fullUrl);
}
@Override
public int deleteDataset(String path) {
String fullUrl = url.toString() + "/r/datasets.json/" + this.rootDir + path;
- return DatacatUtilities.doDelete(fullUrl);
- }
-
- @Override
- public int addDataset(String folder, Map<String, Object> parameters) {
- JSONObject dataset = DatacatUtilities.createJSONDataset(parameters);
- return DatacatUtilities.doPost(url + "/r/datasets.json/" + this.rootDir + "/" + folder, dataset.toString());
+ return HttpUtilities.doDelete(fullUrl);
}
@Override
@@ -72,26 +73,57 @@
String name = new File(path).getName();
parameters.put("name", name);
parameters.put("_type", "folder");
- JSONObject object = DatacatUtilities.createJSONFromMap(parameters);
- return DatacatUtilities.doPost(url + "/r/folders.json/" + this.rootDir, object.toString());
- }
-
- @Override
- public int patchDataset(String folder, String name, Map<String, Object> metaData) {
- JSONObject object = DatacatUtilities.createJSONMetaData(metaData);
- String patchUrl = this.url.toString() + "/r/datasets.json/" + this.rootDir + "/" + folder + "/" + name + ";v=current;s=" + this.site;
- return DatacatUtilities.doPost(patchUrl, object.toString());
- }
-
- public String getRootDir() {
- return this.rootDir;
+ JSONObject object = JSONUtilities.createJSONFromMap(parameters);
+ return HttpUtilities.doPost(url + "/r/folders.json/" + this.rootDir, object.toString());
}
- public URL getBaseUrl() {
- return this.url;
- }
+ @Override
+ public int addMetadata(String folder, String name, Map<String, Object> metaData) {
+ JSONObject object = JSONUtilities.createJSONMetaData(metaData);
+ String patchUrl = this.url.toString() + "/r/datasets.json/" + this.rootDir + "/" + folder + "/" + name + ";v=current;s=" + this.site;
+
+ return HttpUtilities.doPatch(patchUrl, object.toString());
+ }
+
+ // example
+ // http://localhost:8080/datacat-v0.4-SNAPSHOT/r/search.json/HPS/derp?filter=run+%3E+1000
+ @Override
+ public List<Dataset> findDatasets(String directory, String query) {
+
+ String fullUrl = this.url.toString() + "/r/search.json/" + this.rootDir + "/";
+ if (directory != null) {
+ fullUrl += directory;
+ }
+ fullUrl += ";s=" + this.site.name();
+ if (query != null) {
+ String encoded = null;
+ try {
+ encoded = URLEncoder.encode(query, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ fullUrl += "?filter=" + encoded;
+ }
+ System.out.println("query: " + fullUrl);
+ StringBuffer outputBuffer = new StringBuffer();
+ int response = HttpUtilities.doGet(fullUrl, outputBuffer);
+ System.out.println("response: " + response);
+ System.out.println("output: " + outputBuffer.toString());
+
+ // Build and return dataset list
+ JSONObject searchResults = new JSONObject(outputBuffer.toString());
+ return DatasetUtilities.getDatasetsFromSearch(searchResults);
+ }
- public String getSite() {
- return this.site;
+ @Override
+ public int addDataset(String folder, DatasetDataType dataType, String resource, DatasetSite site, DatasetFileFormat fileFormat, String name) {
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put("dataType", dataType.toString());
+ parameters.put("resource", resource);
+ parameters.put("site", DatasetSite.SLAC.name());
+ parameters.put("fileFormat", fileFormat.toString());
+ parameters.put("name", name);
+ JSONObject dataset = JSONUtilities.createJSONDataset(parameters);
+ return HttpUtilities.doPost(url + "/r/datasets.json/" + this.rootDir + "/" + folder, dataset.toString());
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/datacat/DatacatConstants.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatacatConstants.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatacatConstants.java Wed Aug 26 19:32:50 2015
@@ -1,29 +1,20 @@
package org.hps.datacat;
+/**
+ * Constants for the HPS datacat.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class DatacatConstants {
-public class DatacatConstants {
-
+ /**
+ * The root directory in the catalog for HPS folders.
+ */
public static final String ROOT_DIR = "HPS";
- public static final String BASE_URL = "http://localhost:8080/datacat-v0.4-SNAPSHOT";
-
- public static final String SLAC_SITE = "SLAC";
-
- public static final String JLAB_SITE = "JLAB";
-
- public static final String EVIO_FORMAT = "EVIO";
-
- public static final String LCIO_FORMAT = "LCIO";
-
- public static final String ROOT_FORMAT = "ROOT";
-
- public static final String AIDA_FORMAT = "AIDA";
-
- public static final String DQM_TYPE = "DQM";
-
- public static final String RAW_TYPE = "RAW";
-
- public static final String RECON_TYPE = "RECON";
-
- public static final String DST_TYPE = "DST";
+ /**
+ * The base URL of the datacat server.
+ */
+ // FIXME: This needs to be more easily configurable and not hard-coded.
+ public static final String BASE_URL = "http://localhost:8080/datacat-v0.4-SNAPSHOT";
}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatacatFactory.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatacatFactory.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatacatFactory.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,18 @@
+package org.hps.datacat;
+
+/**
+ * Factory class for providing user access to interfaces with protected implementation classes.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+public class DatacatFactory {
+
+ /**
+ * Create a datacat client.
+ *
+ * @return the datacat client
+ */
+ public DatacatClient createClient() {
+ return new DatacatClientImpl();
+ }
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/Dataset.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/Dataset.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/Dataset.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,26 @@
+package org.hps.datacat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public interface Dataset {
+
+ String getName();
+
+ String getPath();
+
+ List<DatasetLocation> getLocations();
+
+ DatasetFileFormat getFileFormat();
+
+ DatasetDataType getDataType();
+
+ Date getCreated();
+
+ //DatasetMetadata getMetadata();
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetDataType.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetDataType.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetDataType.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,14 @@
+package org.hps.datacat;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public enum DatasetDataType {
+ DQM,
+ RAW,
+ RECON,
+ DST,
+ TEST;
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetFileFormat.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetFileFormat.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetFileFormat.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,14 @@
+package org.hps.datacat;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public enum DatasetFileFormat {
+ EVIO,
+ LCIO,
+ ROOT,
+ AIDA,
+ TEST;
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetImpl.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetImpl.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetImpl.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,81 @@
+package org.hps.datacat;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+final class DatasetImpl implements Dataset {
+
+ private String name;
+ private String path;
+ private DatasetDataType dataType;
+ private DatasetFileFormat fileFormat;
+ private List<DatasetLocation> locations = new ArrayList<DatasetLocation>();
+ private Date created;
+
+ private static final SimpleDateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+
+ DatasetImpl(JSONObject jsonObject) {
+ parse(jsonObject);
+ }
+
+ private void parse(JSONObject jsonObject) {
+ if (!jsonObject.getString("_type").equals("dataset#full")) {
+ throw new IllegalArgumentException("Wrong _type in JSON data: " + jsonObject.getString("_type"));
+ }
+ name = jsonObject.getString("name");
+ path = jsonObject.getString("path");
+ dataType = DatasetDataType.valueOf(jsonObject.getString("dataType"));
+ fileFormat = DatasetFileFormat.valueOf(jsonObject.getString("fileFormat"));
+ try {
+ created = DATE_PARSER.parse(jsonObject.getString("created"));
+ } catch (ParseException e) {
+ throw new IllegalArgumentException("Bad created value: " + jsonObject.getString("created"), e);
+ }
+ JSONArray locationsArray = jsonObject.getJSONArray("locations");
+ for (int i = 0; i < locationsArray.length(); i++) {
+ this.locations.add(new DatasetLocationImpl(locationsArray.getJSONObject(i)));
+ }
+ }
+
+ @Override
+ public String getName() {
+ return this.name;
+ }
+
+ @Override
+ public String getPath() {
+ return this.path;
+ }
+
+ @Override
+ public List<DatasetLocation> getLocations() {
+ return Collections.unmodifiableList(this.locations);
+ }
+
+ @Override
+ public DatasetFileFormat getFileFormat() {
+ return this.fileFormat;
+ }
+
+ @Override
+ public DatasetDataType getDataType() {
+ return this.dataType;
+ }
+
+ @Override
+ public Date getCreated() {
+ return this.created;
+ }
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocation.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocation.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocation.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,23 @@
+package org.hps.datacat;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public interface DatasetLocation {
+
+ DatasetSite getSite();
+
+ String getResource();
+
+ ScanStatus getScanStatus();
+
+ long getSize();
+
+ int getRunMin();
+
+ int getRunMax();
+
+ int getEventCount();
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocationImpl.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocationImpl.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetLocationImpl.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,73 @@
+package org.hps.datacat;
+
+import org.json.JSONObject;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class DatasetLocationImpl implements DatasetLocation {
+
+ private DatasetSite site;
+ private String resource;
+ private ScanStatus scanStatus = ScanStatus.UNKNOWN;
+ private long size;
+ private int runMin;
+ private int runMax;
+ private int eventCount;
+
+ DatasetLocationImpl(JSONObject jsonObject) {
+ parse(jsonObject);
+ }
+
+ private void parse(JSONObject jsonObject) {
+ if (!jsonObject.getString("_type").equals("location")) {
+ throw new IllegalArgumentException("Wrong _type in JSON data: " + jsonObject.getString("_type"));
+ }
+ this.site = DatasetSite.valueOf(jsonObject.getString("name"));
+ this.resource = jsonObject.getString("resource");
+ this.size = jsonObject.getLong("size");
+ if (!jsonObject.get("scanStatus").equals(JSONObject.NULL)) {
+ this.scanStatus = ScanStatus.valueOf(jsonObject.getString("scanStatus"));
+ }
+ this.runMin = jsonObject.getInt("runMin");
+ this.runMax = jsonObject.getInt("runMax");
+ this.eventCount = jsonObject.getInt("eventCount");
+ }
+
+ @Override
+ public DatasetSite getSite() {
+ return this.site;
+ }
+
+ @Override
+ public String getResource() {
+ return resource;
+ }
+
+ @Override
+ public ScanStatus getScanStatus() {
+ return scanStatus;
+ }
+
+ @Override
+ public long getSize() {
+ return this.size;
+ }
+
+ @Override
+ public int getRunMin() {
+ return this.runMin;
+ }
+
+ @Override
+ public int getRunMax() {
+ return this.runMax;
+ }
+
+ @Override
+ public int getEventCount() {
+ return this.eventCount;
+ }
+
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetMetadata.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetMetadata.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetMetadata.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,17 @@
+package org.hps.datacat;
+
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+public interface DatasetMetadata {
+
+ float getFloat(String key);
+
+ int getInt(String key);
+
+ String getString(String key);
+
+ boolean hasKey(String key);
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetSite.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetSite.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetSite.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,11 @@
+package org.hps.datacat;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public enum DatasetSite {
+ SLAC,
+ JLAB;
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/DatasetUtilities.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/DatasetUtilities.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/DatasetUtilities.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,23 @@
+package org.hps.datacat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class DatasetUtilities {
+
+ static List<Dataset> getDatasetsFromSearch(JSONObject searchResults) {
+ List<Dataset> datasets = new ArrayList<Dataset>();
+ JSONArray resultsArray = searchResults.getJSONArray("results");
+ for (int i = 0; i < resultsArray.length(); i++) {
+ datasets.add(new DatasetImpl(resultsArray.getJSONObject(i)));
+ }
+ return datasets;
+ }
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/HttpUtilities.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/HttpUtilities.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/HttpUtilities.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,141 @@
+package org.hps.datacat;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class HttpUtilities {
+
+ static int doPost(String urlLocation, String data) {
+ int responseCode = 0;
+ try {
+ URL url = new URL(urlLocation);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("POST");
+ connection.setRequestProperty("Content-Type", "application/json");
+ connection.setDoOutput(true);
+ if (data != null) {
+ OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
+ out.write(data);
+ out.close();
+ }
+ System.out.println("url: " + urlLocation);
+ System.out.println("data: " + data);
+ System.out.println("response: " + connection.getResponseCode());
+ System.out.println("message: " + connection.getResponseMessage());
+ responseCode = connection.getResponseCode();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return responseCode;
+ }
+
+ static int doGet(String urlLocation, StringBuffer stringBuffer) {
+ HttpURLConnection connection = null;
+ int response = 0;
+ try {
+ //System.out.println("doGet: " + urlLocation);
+ connection = (HttpURLConnection) new URL(urlLocation).openConnection();
+ connection.setRequestMethod("GET");
+ connection.setRequestProperty("Content-Type", "application/json");
+ connection.setRequestProperty("Accept", "application/json");
+ connection.setDoInput(true);
+ connection.connect();
+ if (stringBuffer != null) {
+ String output = IOUtils.toString(connection.getInputStream(), "UTF-8");
+ stringBuffer.append(output);
+ }
+ response = connection.getResponseCode();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ connection.disconnect();
+ }
+ return response;
+ }
+
+
+ static int doPatch(String urlLocation, String data) {
+ int responseCode = 0;
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ HttpPatch httpPatch = null;
+ try {
+ httpPatch = new HttpPatch(new URI(urlLocation));
+ InputStreamEntity entity =
+ new InputStreamEntity(
+ new ByteArrayInputStream(
+ data.getBytes("UTF-8")),
+ -1,
+ ContentType.APPLICATION_JSON);
+ httpPatch.setEntity(entity);
+ CloseableHttpResponse response = httpClient.execute(httpPatch);
+ System.out.println("status: " + response.getStatusLine());
+ try {
+ EntityUtils.consume(response.getEntity());
+ } finally {
+ response.close();
+ }
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException(e);
+ } catch(IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ httpClient.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return responseCode;
+ }
+
+
+ static int doDelete(String fullUrl) {
+ int responseCode = 0;
+ try {
+ URL url = new URL(fullUrl);
+ System.out.println("deleting url: " + fullUrl);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setDoOutput(true);
+ connection.setRequestMethod("DELETE");
+ connection.connect();
+ responseCode = connection.getResponseCode();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return responseCode;
+ }
+
+ static URL createURL(String... chunks) {
+ if (chunks.length == 0) {
+ throw new IllegalArgumentException("No arguments provided.");
+ }
+ String urlString = "";
+ for (String chunk : chunks) {
+ urlString += chunk;
+ }
+ try {
+ return new URL(urlString);
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException("Bad URL string: " + urlString);
+ }
+ }
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/JSONUtilities.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/JSONUtilities.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/JSONUtilities.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,48 @@
+package org.hps.datacat;
+
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class JSONUtilities {
+
+ static JSONObject createJSONDataset(Map<String, Object> parameters) {
+ JSONObject dataset = new JSONObject();
+ dataset.put("dataType", parameters.get("dataType"));
+ dataset.put("versionId", "new");
+ JSONObject location = new JSONObject();
+ location.put("resource", parameters.get("resource"));
+ location.put("site", parameters.get("site"));
+ JSONArray array = new JSONArray();
+ array.put(location);
+ dataset.put("locations", array);
+ dataset.put("fileFormat", parameters.get("fileFormat"));
+ dataset.put("name", parameters.get("name"));
+ return dataset;
+ }
+
+ static JSONObject createJSONFromMap(Map<String, Object> parameters) {
+ JSONObject object = new JSONObject();
+ for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+ object.put(entry.getKey(), entry.getValue());
+ }
+ return object;
+ }
+
+ static JSONObject createJSONMetaData(Map<String, Object> metaData) {
+ JSONObject object = new JSONObject();
+ JSONArray array = new JSONArray();
+ for (Map.Entry<String, Object> entry : metaData.entrySet()) {
+ JSONObject value = new JSONObject();
+ value.put(entry.getKey(), entry.getValue());
+ array.put(value);
+ }
+ object.put("versionMetadata", array);
+ return object;
+ }
+}
Added: java/trunk/record-util/src/main/java/org/hps/datacat/ScanStatus.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/datacat/ScanStatus.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/datacat/ScanStatus.java Wed Aug 26 19:32:50 2015
@@ -0,0 +1,8 @@
+package org.hps.datacat;
+
+
+public enum ScanStatus {
+ UNKNOWN,
+ UNSCANNED,
+ OK
+}
|