Author: [log in to unmask]
Date: Mon Aug 31 15:38:12 2015
New Revision: 3475
Log:
Allow metadata to be given when adding datasets; implement DatasetMetadata; add doc.
Added:
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadataImpl.java
java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatClientTest.java
- copied, changed from r3470, java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatTest.java
Removed:
java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatTest.java
Modified:
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClient.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClientImpl.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/Dataset.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetImpl.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadata.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetSite.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetUtilities.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/HttpUtilities.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/JSONUtilities.java
java/trunk/datacat-client/src/main/java/org/hps/datacat/client/ScanStatus.java
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClient.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClient.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClient.java Mon Aug 31 15:38:12 2015
@@ -2,6 +2,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Interface to the SLAC SRS datacat system via HTTP/REST calls.
@@ -19,9 +20,16 @@
* @param site the site of the file
* @param fileFormat the file format
* @param name the name of the dataset
+ * @param metadata metadata to assign to the dataset
* @return the HTTP status code from the request
*/
- int addDataset(String folder, DatasetDataType dataType, String resource, DatasetSite site, DatasetFileFormat fileFormat, String name);
+ int addDataset(String folder,
+ DatasetDataType dataType,
+ String resource,
+ DatasetSite site,
+ DatasetFileFormat fileFormat,
+ String name,
+ Map<String, Object> metadata);
/**
* Create a folder in the data catalog.
@@ -70,10 +78,10 @@
* @param query the query to execute
* @return the HTTP status code from the request
*/
- List<Dataset> findDatasets(String folder, String query);
+ List<Dataset> findDatasets(String folder, String query, Set<String> showMetadata);
// TODO: method to get dataset from path
- // to get all metadata need site
+ // to get all metadata need the site in query
// http://localhost:8080/datacat-v0.4-SNAPSHOT/r/path.json/HPS/derp/herp01;s=SLAC
// use HTTP GET
// Dataset getDataSet(String path);
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClientImpl.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClientImpl.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatacatClientImpl.java Mon Aug 31 15:38:12 2015
@@ -8,17 +8,39 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.json.JSONObject;
+import org.lcsim.util.log.LogUtil;
+import org.lcsim.util.log.MessageOnlyLogFormatter;
/**
+ * Implementation of {@link DatacatClient} interface for working with SRS datacat REST API.
*
* @author Jeremy McCormick, SLAC
*/
final class DatacatClientImpl implements DatacatClient {
-
+
+ /**
+ * Setup class logging.
+ */
+ private static Logger LOGGER = LogUtil.create(DatacatClientImpl.class, new MessageOnlyLogFormatter(), Level.ALL);
+
+ /**
+ * The base URL of the datacat server.
+ */
private URL url;
+
+ /**
+ * The site (SLAC or JLAB).
+ */
private DatasetSite site;
+
+ /**
+ * The root directory (e.g. should be 'HPS').
+ */
private String rootDir;
/**
@@ -49,23 +71,47 @@
throw new IllegalArgumentException("The root dir argument is null.");
}
this.rootDir = rootDir;
- System.out.println("url: " + url);
- System.out.println("site: " + site);
- System.out.println("rootDir: " + rootDir);
- }
-
+ LOGGER.config("url: " + url);
+ LOGGER.config("site: " + site);
+ LOGGER.config("rootDir: " + rootDir);
+ }
+
+ /**
+ * 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
+ */
@Override
public int removeFolder(String folder) {
String fullUrl = url.toString() + "/r/folders.json/" + this.rootDir + folder;
+ LOGGER.info("removing folder: " + fullUrl);
return HttpUtilities.doDelete(fullUrl);
}
+ /**
+ * 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
+ */
@Override
public int deleteDataset(String path) {
- String fullUrl = url.toString() + "/r/datasets.json/" + this.rootDir + path;
- return HttpUtilities.doDelete(fullUrl);
- }
-
+ String urlLocation = url.toString() + "/r/datasets.json/" + this.rootDir + path;
+ LOGGER.info("deleting dataset: " + urlLocation);
+ return HttpUtilities.doDelete(urlLocation);
+ }
+
+ /**
+ * Create a folder in the data catalog.
+ *
+ * @param folder the folder's path
+ * @return the HTTP status code from the request
+ */
@Override
public int makeFolder(String path) {
Map<String, Object> parameters = new HashMap<String, Object>();
@@ -73,28 +119,47 @@
String name = new File(path).getName();
parameters.put("name", name);
parameters.put("_type", "folder");
- JSONObject object = JSONUtilities.createJSONFromMap(parameters);
- return HttpUtilities.doPost(url + "/r/folders.json/" + this.rootDir, object.toString());
- }
-
+ JSONObject object = JSONUtilities.createJSONFromMap(parameters);
+ String urlLocation = url + "/r/folders.json/" + this.rootDir;
+ LOGGER.info("making folder: " + urlLocation);
+ LOGGER.info("folder JSON: " + object.toString());
+ return HttpUtilities.doPost(urlLocation, object.toString());
+ }
+
+ /**
+ * 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
+ */
@Override
public int addMetadata(String folder, String name, Map<String, Object> metaData) {
- JSONObject object = JSONUtilities.createJSONMetaData(metaData);
+ JSONObject object = new JSONObject();
+ object.put("versionMetadata", JSONUtilities.createJSONMetadataArray(metaData));
String patchUrl = this.url.toString() + "/r/datasets.json/" + this.rootDir + "/" + folder + "/" + name + ";v=current;s=" + this.site;
-
+ LOGGER.info("addMetadata: " + patchUrl);
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) {
+ /**
+ * 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
+ */
+ @Override
+ public List<Dataset> findDatasets(String directory, String query, Set<String> showMetadata) {
- String fullUrl = this.url.toString() + "/r/search.json/" + this.rootDir + "/";
+ String urlLocation = this.url.toString() + "/r/search.json/" + this.rootDir + "/";
if (directory != null) {
- fullUrl += directory;
- }
- fullUrl += ";s=" + this.site.name();
+ urlLocation += directory;
+ }
+ urlLocation += ";s=" + this.site.name() + "?";
if (query != null) {
String encoded = null;
try {
@@ -102,28 +167,51 @@
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
- fullUrl += "?filter=" + encoded;
- }
- System.out.println("query: " + fullUrl);
+ urlLocation += "filter=" + encoded;
+ }
+ if (showMetadata != null) {
+ for (String metadataField : showMetadata) {
+ urlLocation += "&show=" + metadataField;
+ }
+ }
+ LOGGER.info("findDatasets: " + urlLocation);
StringBuffer outputBuffer = new StringBuffer();
- int response = HttpUtilities.doGet(fullUrl, outputBuffer);
- System.out.println("response: " + response);
- System.out.println("output: " + outputBuffer.toString());
+ int response = HttpUtilities.doGet(urlLocation, outputBuffer);
+ if (response >= 400) {
+ throw new RuntimeException("HTTP GET failed with code: " + response);
+ }
// Build and return dataset list
JSONObject searchResults = new JSONObject(outputBuffer.toString());
+ LOGGER.info("returning search results: " + searchResults.toString());
return DatasetUtilities.getDatasetsFromSearch(searchResults);
}
-
- @Override
- public int addDataset(String folder, DatasetDataType dataType, String resource, DatasetSite site, DatasetFileFormat fileFormat, String name) {
+
+ /**
+ * 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
+ * @param metadata metadata to assign to the dataset
+ * @return the HTTP status code from the request
+ */
+ @Override
+ public int addDataset(String folder, DatasetDataType dataType, String resource, DatasetSite site,
+ DatasetFileFormat fileFormat, String name, Map<String, Object> metadata) {
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());
+ parameters.put("name", name);
+ JSONObject jsonDataset = JSONUtilities.createJSONDataset(parameters, metadata);
+ String urlLocation = url + "/r/datasets.json/" + this.rootDir + "/" + folder;
+ LOGGER.info("addDataset: " + urlLocation);
+ LOGGER.info("dataset JSON: " + jsonDataset.toString());
+ return HttpUtilities.doPost(urlLocation, jsonDataset.toString());
}
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/Dataset.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/Dataset.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/Dataset.java Mon Aug 31 15:38:12 2015
@@ -10,17 +10,52 @@
*/
public interface Dataset {
+ /**
+ * Get the name of the dataset without the path component e.g. "dataset01".
+ *
+ * @return the name of the dataset
+ */
String getName();
+ /**
+ * Get the path of the dataset e.g. "/HPS/folder/dataset01".
+ *
+ * @return the path of the dataset
+ */
String getPath();
+ /**
+ * Get the dataset locations.
+ *
+ * @return the dataset locations
+ */
List<DatasetLocation> getLocations();
+ /**
+ * Get the file format e.g. EVIO, LCIO, etc.
+ *
+ * @return the dataset file format
+ */
DatasetFileFormat getFileFormat();
+ /**
+ * Get the data type e.g. RAW, RECON, etc.
+ *
+ * @return the data type
+ */
DatasetDataType getDataType();
+ /**
+ * Get the creation date.
+ *
+ * @return the creation date
+ */
Date getCreated();
- //DatasetMetadata getMetadata();
+ /**
+ * Get the dataset's metadata.
+ *
+ * @return the dataset's metadata
+ */
+ DatasetMetadata getMetadata();
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetImpl.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetImpl.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetImpl.java Mon Aug 31 15:38:12 2015
@@ -23,6 +23,7 @@
private DatasetFileFormat fileFormat;
private List<DatasetLocation> locations = new ArrayList<DatasetLocation>();
private Date created;
+ private DatasetMetadata metadata;
private static final SimpleDateFormat DATE_PARSER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@@ -46,7 +47,10 @@
JSONArray locationsArray = jsonObject.getJSONArray("locations");
for (int i = 0; i < locationsArray.length(); i++) {
this.locations.add(new DatasetLocationImpl(locationsArray.getJSONObject(i)));
- }
+ }
+ if (jsonObject.has("metadata")) {
+ metadata = new DatasetMetadataImpl(jsonObject.getJSONArray("metadata"));
+ }
}
@Override
@@ -78,4 +82,13 @@
public Date getCreated() {
return this.created;
}
+
+ @Override
+ public DatasetMetadata getMetadata() {
+ return this.metadata;
+ }
+
+ public String toString() {
+ return "Dataset { name: " + name + ", path:" + path + ", " + "dataType: " + dataType.name() + "fileFormat: " + fileFormat.name() + ", created: " + created + " }";
+ }
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadata.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadata.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadata.java Mon Aug 31 15:38:12 2015
@@ -2,16 +2,41 @@
/**
+ * Dataset metadata which is keys and values that are double, integer or string.
*
* @author Jeremy McCormick, SLAC
*/
public interface DatasetMetadata {
-
- float getFloat(String key);
- int getInt(String key);
+ /**
+ * Get a double value.
+ *
+ * @param key the key name
+ * @return the double value
+ */
+ double getDouble(String key);
+
+ /**
+ * Get an integer value.
+ *
+ * @param key the key name
+ * @return the integer value
+ */
+ int getInteger(String key);
+ /**
+ * Get a string value.
+ *
+ * @param key the key name
+ * @return the
+ */
String getString(String key);
+ /**
+ * Return <code>true</code> if key exists in metadata.
+ *
+ * @param key the key name
+ * @return <code>true</code> if key exists in metadata
+ */
boolean hasKey(String key);
}
Added: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadataImpl.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadataImpl.java (added)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetMetadataImpl.java Mon Aug 31 15:38:12 2015
@@ -0,0 +1,115 @@
+package org.hps.datacat.client;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+/**
+ * Implementation of {@link DatasetMetadata).
+ *
+ * @author Jeremy McCormick, SLAC
+ */
+final class DatasetMetadataImpl implements DatasetMetadata {
+
+ /**
+ * The mapping of keys to values.
+ */
+ private final Map<String, Object> metadataMap = new HashMap<String, Object>();
+
+ /**
+ * Create a new metadata object.
+ *
+ * @param jsonArray the JSON array with the metadata
+ */
+ DatasetMetadataImpl(JSONArray jsonArray) {
+ parse(jsonArray);
+ }
+
+ /**
+ * Parse metadata from JSON array.
+ *
+ * @param jsonArray the JSON array
+ */
+ private void parse(JSONArray jsonArray) {
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject jsonObject = jsonArray.getJSONObject(i);
+ String type = jsonObject.getString("type");
+ Object value = null;
+ if (type.equals("string")) {
+ value = jsonObject.getString("value");
+ } else if (type.equals("decimal")) {
+ value = jsonObject.getDouble("value");
+ } else if (type.equals("integer")) {
+ value = jsonObject.getInt("value");
+ } else {
+ throw new IllegalArgumentException("Unknown type: " + type);
+ }
+ String key = jsonObject.getString("key");
+ metadataMap.put(key, value);
+ }
+ }
+
+ /**
+ * Get a double value.
+ *
+ * @param key the key name
+ * @return the double value
+ */
+ @Override
+ public double getDouble(String key) {
+ return Double.class.cast(metadataMap.get(key));
+ }
+
+ /**
+ * Get an integer value.
+ *
+ * @param key the key name
+ * @return the integer value
+ */
+ @Override
+ public int getInteger(String key) {
+ return Integer.class.cast(metadataMap.get(key));
+ }
+
+ /**
+ * Get a string value.
+ *
+ * @param key the key name
+ * @return the
+ */
+ @Override
+ public String getString(String key) {
+ return String.class.cast(metadataMap.get(key));
+ }
+
+ /**
+ * Return <code>true</code> if key exists in metadata.
+ *
+ * @param key the key name
+ * @return <code>true</code> if key exists in metadata
+ */
+ @Override
+ public boolean hasKey(String key) {
+ return metadataMap.containsKey(key);
+ }
+
+ /**
+ * Convert this object to a string.
+ *
+ * @return this object converted to a string
+ */
+ @Override
+ public String toString() {
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append(" DatasetMetadata { ");
+ for (Entry<String, Object> entry : metadataMap.entrySet()) {
+ stringBuffer.append(entry.getKey() + ": " + entry.getValue() + ", ");
+ }
+ stringBuffer.setLength(stringBuffer.length() - 2);
+ stringBuffer.append(" }");
+ return stringBuffer.toString();
+ }
+}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetSite.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetSite.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetSite.java Mon Aug 31 15:38:12 2015
@@ -6,6 +6,12 @@
*
*/
public enum DatasetSite {
+ /**
+ * SLAC site.
+ */
SLAC,
+ /**
+ * JLAB site.
+ */
JLAB;
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetUtilities.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetUtilities.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/DatasetUtilities.java Mon Aug 31 15:38:12 2015
@@ -7,11 +7,18 @@
import org.json.JSONObject;
/**
+ * Dataset utilities.
*
* @author Jeremy McCormick, SLAC
*/
final class DatasetUtilities {
+ /**
+ * Create {@link Dataset} objects from JSON search results.
+ *
+ * @param searchResults the JSON search results
+ * @return the list of {@link Dataset} objects
+ */
static List<Dataset> getDatasetsFromSearch(JSONObject searchResults) {
List<Dataset> datasets = new ArrayList<Dataset>();
JSONArray resultsArray = searchResults.getJSONArray("results");
@@ -20,4 +27,11 @@
}
return datasets;
}
+
+ /**
+ * No class instantiation.
+ */
+ private DatasetUtilities() {
+ throw new RuntimeException("Do not instantiate this class.");
+ }
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/HttpUtilities.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/HttpUtilities.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/HttpUtilities.java Mon Aug 31 15:38:12 2015
@@ -24,6 +24,13 @@
*/
final class HttpUtilities {
+ /**
+ * Do an HTTP POST.
+ *
+ * @param urlLocation the URL location
+ * @param data the data to stream to the server
+ * @return the HTTP response code
+ */
static int doPost(String urlLocation, String data) {
int responseCode = 0;
try {
@@ -48,11 +55,17 @@
return responseCode;
}
+ /**
+ * Do an HTTP get and return the output from the server in a <code>StringBuffer</code>.
+ *
+ * @param urlLocation the URL location
+ * @param stringBuffer the string buffer with the server output
+ * @return the HTTP response
+ */
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");
@@ -72,7 +85,13 @@
return response;
}
-
+ /**
+ * Do an HTTP patch.
+ *
+ * @param urlLocation the URL location
+ * @param data the data to stream to the server
+ * @return the HTTP response code
+ */
static int doPatch(String urlLocation, String data) {
int responseCode = 0;
CloseableHttpClient httpClient = HttpClients.createDefault();
@@ -87,12 +106,12 @@
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();
- }
+ }
+ responseCode = response.getStatusLine().getStatusCode();
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
} catch(IOException e) {
@@ -107,12 +126,16 @@
return responseCode;
}
-
- static int doDelete(String fullUrl) {
+ /**
+ * Do an HTTP DELETE.
+ *
+ * @param urlLocation the URL location
+ * @return the HTTP response code
+ */
+ static int doDelete(String urlLocation) {
int responseCode = 0;
try {
- URL url = new URL(fullUrl);
- System.out.println("deleting url: " + fullUrl);
+ URL url = new URL(urlLocation);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("DELETE");
@@ -124,6 +147,7 @@
return responseCode;
}
+ /*
static URL createURL(String... chunks) {
if (chunks.length == 0) {
throw new IllegalArgumentException("No arguments provided.");
@@ -138,4 +162,5 @@
throw new IllegalArgumentException("Bad URL string: " + urlString);
}
}
+ */
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/JSONUtilities.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/JSONUtilities.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/JSONUtilities.java Mon Aug 31 15:38:12 2015
@@ -6,12 +6,20 @@
import org.json.JSONObject;
/**
- *
+ * JSON datacat utilities.
+ *
* @author Jeremy McCormick, SLAC
*/
final class JSONUtilities {
- static JSONObject createJSONDataset(Map<String, Object> parameters) {
+ /**
+ * Create a full JSON dataset object.
+ *
+ * @param parameters the parameters of the object as a map
+ * @param metadata the metadata of the object as a map
+ * @return the created JSON dataset object
+ */
+ static JSONObject createJSONDataset(Map<String, Object> parameters, Map<String, Object> metadata) {
JSONObject dataset = new JSONObject();
dataset.put("dataType", parameters.get("dataType"));
dataset.put("versionId", "new");
@@ -23,9 +31,19 @@
dataset.put("locations", array);
dataset.put("fileFormat", parameters.get("fileFormat"));
dataset.put("name", parameters.get("name"));
+ if (metadata != null) {
+ JSONArray jsonMetadata = createJSONMetadataArray(metadata);
+ dataset.put("versionMetadata", jsonMetadata);
+ }
return dataset;
}
+ /**
+ * Create a flat JSON object from a map of keys and values.
+ *
+ * @param parameters the parameter map
+ * @return the JSON object
+ */
static JSONObject createJSONFromMap(Map<String, Object> parameters) {
JSONObject object = new JSONObject();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
@@ -34,15 +52,31 @@
return object;
}
- static JSONObject createJSONMetaData(Map<String, Object> metaData) {
- JSONObject object = new JSONObject();
+ /**
+ * Create a JSON array of metadata from the map of keys and values.
+ *
+ * @param metadata the metadata map
+ * @return the JSON array
+ */
+ static JSONArray createJSONMetadataArray(Map<String, Object> metadata) {
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);
+ for (Map.Entry<String, Object> entry : metadata.entrySet()) {
+ JSONObject metadataObject = new JSONObject();
+ metadataObject.put(entry.getKey(), entry.getValue());
+ metadataObject.put("key", entry.getKey());
+ Object rawValue = entry.getValue();
+ if (rawValue instanceof String) {
+ metadataObject.put("type", "string");
+ } else if (rawValue instanceof Integer | rawValue instanceof Long) {
+ metadataObject.put("type", "integer");
+ } else if (rawValue instanceof Float | rawValue instanceof Double) {
+ metadataObject.put("type", "decimal");
+ } else {
+ throw new IllegalArgumentException("Do not know how to handle type: " + rawValue.getClass().getName());
+ }
+ metadataObject.put("value", entry.getValue());
+ array.put(metadataObject);
}
- object.put("versionMetadata", array);
- return object;
+ return array;
}
}
Modified: java/trunk/datacat-client/src/main/java/org/hps/datacat/client/ScanStatus.java
=============================================================================
--- java/trunk/datacat-client/src/main/java/org/hps/datacat/client/ScanStatus.java (original)
+++ java/trunk/datacat-client/src/main/java/org/hps/datacat/client/ScanStatus.java Mon Aug 31 15:38:12 2015
@@ -1,8 +1,21 @@
package org.hps.datacat.client;
-
+/**
+ * The scan status of {@link Dataset}.
+ *
+ * @author Jeremy McCormick, SLAC
+ */
public enum ScanStatus {
+ /**
+ * Scan status is not known.
+ */
UNKNOWN,
+ /**
+ * Dataset has not been scanned.
+ */
UNSCANNED,
+ /**
+ * Dataset has been scanned.
+ */
OK
}
Copied: java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatClientTest.java (from r3470, java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatTest.java)
=============================================================================
--- java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatTest.java (original)
+++ java/trunk/datacat-client/src/test/java/org/hps/datacat/client/DatacatClientTest.java Mon Aug 31 15:38:12 2015
@@ -1,19 +1,19 @@
package org.hps.datacat.client;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
-
-import org.hps.datacat.client.DatacatClient;
-import org.hps.datacat.client.DatacatClientImpl;
-import org.hps.datacat.client.Dataset;
-import org.hps.datacat.client.DatasetDataType;
-import org.hps.datacat.client.DatasetFileFormat;
-import org.hps.datacat.client.DatasetSite;
+import java.util.Set;
import junit.framework.TestCase;
-public class DatacatTest extends TestCase {
+/**
+ *
+ * @author Jeremy McCormick, SLAC
+ *
+ */
+public class DatacatClientTest extends TestCase {
private static final String DATASET_NAME = "dummyDataset";
private static final String FOLDER = "dummyFolder";
@@ -21,31 +21,27 @@
public void testDatacat() throws Exception {
- // Datacat client with default parameters
+ // Datacat client with default parameters.
DatacatClient client = new DatacatClientImpl();
// Stores response from HTTP operations
int response = -1;
- // Create dummy folder
+ // Create dummy folder.
response = client.makeFolder("dummyFolder");
- System.out.println("makeFolder: " + response);
- System.out.println();
- // Add dummy dataset
- // TODO: should add some meta data here too
- response = client.addDataset(FOLDER, DatasetDataType.TEST, RESOURCE, DatasetSite.SLAC, DatasetFileFormat.TEST, DATASET_NAME);
- System.out.println("addDataset: " + response);
- System.out.println();
+ // Add dummy dataset.
+ Map<String, Object> dsMetadata = new HashMap<String, Object>();
+ dsMetadata.put("testInt", 1);
+ dsMetadata.put("testFloat", 1.1f);
+ dsMetadata.put("testDouble", 1.2d);
+ dsMetadata.put("testString", "herpderp");
+ response = client.addDataset(FOLDER, DatasetDataType.TEST, RESOURCE, DatasetSite.SLAC, DatasetFileFormat.TEST, DATASET_NAME, dsMetadata);
- // Patch the dataset with some meta data
+ // Patch the dataset with some meta data.
Map<String, Object> metaData = new HashMap<String, Object>();
- //metaData.put("someStringVar", "aStringValue");
- metaData.put("someIntVar", 1234);
- //metaData.put("someFloatVar", 1.234);
+ metaData.put("testInt2", 1234);
response = client.addMetadata(FOLDER, DATASET_NAME, metaData);
- System.out.println("patchDataset: " + response);
- System.out.println();
// TODO: check that folder exists
@@ -53,20 +49,26 @@
// TODO: get the full folder info
- // TODO: get the full dataset info
+ // TODO: get the full dataset info
- // Find the dataset with a simple query
- List<Dataset> datasets = client.findDatasets(FOLDER, "someIntVar == 1234");
+ // Find the dataset with a simple query.
+ Set<String> metadataFields = new HashSet<String>();
+ metadataFields.add("testInt");
+ metadataFields.add("testFloat");
+ metadataFields.add("testDouble");
+ metadataFields.add("testString");
+ List<Dataset> datasets = client.findDatasets(FOLDER, "testInt == 1", metadataFields);
for (Dataset dataset : datasets) {
System.out.println("found dataset: " + dataset.getName());
+ System.out.println("metadata: " + dataset.getMetadata());
}
- // Delete the dataset
+ // Delete the dataset.
response = client.deleteDataset("/" + FOLDER + "/" + DATASET_NAME);
System.out.println("deleteDataset: " + response);
System.out.println();
- // Remove the folder
+ // Remove the folder.
client.removeFolder("/" + FOLDER);
System.out.println("removeFolder: " + response);
System.out.println();
|