[NO ISSUE][OTH] Add Creation Time to Client Request

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
- Add creation time to ClientRequest to identify when the
  request was acknowledged by the CC.
- Allow Receptionist extensions to throw exceptions as
  specified by the IReceptionist API.
- Allow extensions to set non-json request optional parameters.
- Add convention method in ResourceReference to get the
  resource's fully qualified dataset name.
- Fix typo in metadata provider method name.

Change-Id: Ib45b5bec8bb2f127aa1263d4f7ac4f8e2e368208
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3217
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ClientRequest.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ClientRequest.java
index 155b817..c19bb02 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ClientRequest.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ClientRequest.java
@@ -28,6 +28,7 @@
 
 public class ClientRequest extends BaseClientRequest {
 
+    protected final long creationTime = System.nanoTime();
     protected final Thread executor;
     protected final String statement;
     protected final String clientContextId;
@@ -70,6 +71,10 @@
         }
     }
 
+    public long getCreationTime() {
+        return creationTime;
+    }
+
     @Override
     protected ObjectNode asJson() {
         ObjectNode json = super.asJson();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/Receptionist.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/Receptionist.java
index 52aab20..ec4fb6f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/Receptionist.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/Receptionist.java
@@ -27,6 +27,7 @@
 import org.apache.asterix.common.api.ISchedulableClientRequest;
 import org.apache.asterix.common.api.RequestReference;
 import org.apache.http.HttpHeaders;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.util.NetworkUtil;
 
@@ -48,12 +49,12 @@
     }
 
     @Override
-    public IClientRequest requestReceived(ICommonRequestParameters requestParameters) {
+    public IClientRequest requestReceived(ICommonRequestParameters requestParameters) throws HyracksDataException {
         return new ClientRequest(requestParameters);
     }
 
     @Override
-    public void ensureSchedulable(ISchedulableClientRequest schedulableRequest) {
+    public void ensureSchedulable(ISchedulableClientRequest schedulableRequest) throws HyracksDataException {
         // currently we don't have any restrictions
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index ffbb614..b4513ec 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
@@ -424,7 +424,7 @@
                 GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
             }
         } else {
-            setParamFromRequest(request, param);
+            setParamFromRequest(request, param, optionalParams);
         }
     }
 
@@ -456,7 +456,8 @@
         // allows extensions to set extra parameters
     }
 
-    private void setParamFromRequest(IServletRequest request, QueryServiceRequestParameters param) throws IOException {
+    private void setParamFromRequest(IServletRequest request, QueryServiceRequestParameters param,
+            Map<String, String> optionalParameters) throws IOException {
         param.setStatement(getParameter(request, Parameter.STATEMENT));
         if (param.getStatement() == null) {
             param.setStatement(HttpUtil.getRequestBody(request));
@@ -476,6 +477,11 @@
         } catch (JsonParseException | JsonMappingException e) {
             GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
         }
+        setOptionalParameters(request, optionalParameters);
+    }
+
+    protected void setOptionalParameters(IServletRequest request, Map<String, String> optionalParameters) {
+        // allows extensions to set extra parameters
     }
 
     private void setAccessControlHeaders(IServletRequest request, IServletResponse response) throws IOException {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
index a24bf72..ae949fe 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
@@ -105,6 +105,10 @@
         return Integer.parseInt(partition.substring(StorageConstants.PARTITION_DIR_PREFIX.length()));
     }
 
+    public String getDatasetFullyQualifiedName() {
+        return dataverse + '.' + dataset;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
index adfaa89..7b93b6b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
@@ -1632,7 +1632,7 @@
         txnAccessedDatasets.add(dataset);
     }
 
-    public Set<Dataset> getAccssedDatasets() {
+    public Set<Dataset> getAccessedDatasets() {
         return Collections.unmodifiableSet(txnAccessedDatasets);
     }
 }