LENS-1257: Serverside changes for getting session list
diff --git a/lens-api/src/main/java/org/apache/lens/api/session/UserSessionInfo.java b/lens-api/src/main/java/org/apache/lens/api/session/UserSessionInfo.java
new file mode 100644
index 0000000..f2f0760
--- /dev/null
+++ b/lens-api/src/main/java/org/apache/lens/api/session/UserSessionInfo.java
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.lens.api.session;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.lens.api.query.QueryHandle;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@XmlRootElement
+@AllArgsConstructor
+@NoArgsConstructor
+@XmlAccessorType(XmlAccessType.FIELD)
+public class UserSessionInfo {
+  @XmlElement
+  private String handle;
+  @XmlElement
+  private String userName;
+  @XmlElement
+  private List<QueryHandle> activeQueries;
+  @XmlElement
+  private long creationTime;
+  @XmlElement
+  private long lastAccessTime;
+
+  @Override
+  public String toString() {
+    return handle + " " + userName + " " + creationTime + " " + activeQueries + " " + lastAccessTime;
+  }
+}
diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/session/SessionService.java b/lens-server-api/src/main/java/org/apache/lens/server/api/session/SessionService.java
index 027a32b..80ce030 100644
--- a/lens-server-api/src/main/java/org/apache/lens/server/api/session/SessionService.java
+++ b/lens-server-api/src/main/java/org/apache/lens/server/api/session/SessionService.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import org.apache.lens.api.LensSessionHandle;
+import org.apache.lens.api.session.UserSessionInfo;
 import org.apache.lens.server.api.error.LensException;
 
 public interface SessionService {
@@ -121,4 +122,10 @@
    * Returns true if the session is open
    */
   boolean isOpen(LensSessionHandle sessionHandle);
+
+  /**
+   *
+   * @return a list of all sessions
+   */
+  List<UserSessionInfo> getSessionInfo();
 }
diff --git a/lens-server/src/main/java/org/apache/lens/server/BaseLensService.java b/lens-server/src/main/java/org/apache/lens/server/BaseLensService.java
index 19a86c6..e0e4bf8 100644
--- a/lens-server/src/main/java/org/apache/lens/server/BaseLensService.java
+++ b/lens-server/src/main/java/org/apache/lens/server/BaseLensService.java
@@ -22,7 +22,9 @@
 import static org.apache.lens.server.error.LensServerErrorCode.SESSION_ID_NOT_PROVIDED;
 
 import java.io.*;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -34,6 +36,7 @@
 
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
+import org.apache.lens.api.session.UserSessionInfo;
 import org.apache.lens.api.util.PathValidator;
 import org.apache.lens.server.api.LensConfConstants;
 import org.apache.lens.server.api.LensService;
@@ -561,5 +564,20 @@
       release(sessionHandle);
     }
   }
+
+  public List<UserSessionInfo> getSessionInfo() {
+    List<UserSessionInfo> userSessionInfoList = new ArrayList<>();
+    for (LensSessionHandle handle : SESSION_MAP.values()) {
+      LensSessionImpl session = getSession(handle);
+      UserSessionInfo sessionInfo = new UserSessionInfo();
+      sessionInfo.setHandle(handle.getPublicId().toString());
+      sessionInfo.setUserName(session.getLoggedInUser());
+      sessionInfo.setActiveQueries(session.getActiveQueries());
+      sessionInfo.setCreationTime(session.getCreationTime());
+      sessionInfo.setLastAccessTime(session.getLastAccessTime());
+      userSessionInfoList.add(sessionInfo);
+    }
+    return userSessionInfoList;
+  }
 }
 
diff --git a/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java b/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
index fdfd09c..a4e61c4 100644
--- a/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
+++ b/lens-server/src/main/java/org/apache/lens/server/session/SessionResource.java
@@ -30,6 +30,7 @@
 import org.apache.lens.api.LensConf;
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.StringList;
+import org.apache.lens.api.session.UserSessionInfo;
 import org.apache.lens.server.LensServices;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.session.SessionService;
@@ -260,4 +261,15 @@
     return new APIResult(Status.SUCCEEDED, "Set param succeeded");
   }
 
+  /**
+   * Returns a list of all sessions
+   * @return
+   */
+  @GET
+  @Path("sessions")
+  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN })
+  public List<UserSessionInfo> getSession() {
+    List<UserSessionInfo> l = sessionService.getSessionInfo();
+    return l;
+  }
 }
diff --git a/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java b/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
index 9ebe17c..3aa3163 100644
--- a/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
+++ b/lens-server/src/test/java/org/apache/lens/server/session/TestSessionResource.java
@@ -22,17 +22,14 @@
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
+import java.util.*;
 
 import javax.ws.rs.ClientErrorException;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Application;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
@@ -42,7 +39,8 @@
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.StringList;
 import org.apache.lens.api.jaxb.LensJAXBContextResolver;
-import org.apache.lens.api.query.*;
+import org.apache.lens.api.query.QueryHandle;
+import org.apache.lens.api.session.UserSessionInfo;
 import org.apache.lens.server.LensJerseyTest;
 import org.apache.lens.server.LensServerConf;
 import org.apache.lens.server.LensServices;
@@ -57,7 +55,6 @@
 import org.apache.lens.server.error.GenericExceptionMapper;
 
 import org.apache.commons.io.FileUtils;
-
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.ql.metadata.Hive;
@@ -579,4 +576,22 @@
     result = target.queryParam("sessionid", lensSessionHandle1).request(mt).delete(APIResult.class);
     Assert.assertTrue(metricsSvc.getTotalClosedSessions() >= 2);
   }
+
+  @Test(dataProvider = "mediaTypeData")
+  public void testSessionList(MediaType mt) {
+    final WebTarget target = target().path("session").path("sessions");
+    Response res = target.request().get(Response.class);
+    List<UserSessionInfo> sessionsList = res.readEntity(new GenericType<List<UserSessionInfo>>() {
+    });
+    int size = sessionsList.size();
+    //Create a new session
+    FormDataMultiPart mp = getMultiFormData("foo", "bar", mt);
+    LensSessionHandle lensSessionHandle = target().path("session").request(mt)
+      .post(Entity.entity(mp, MediaType.MULTIPART_FORM_DATA_TYPE), LensSessionHandle.class);
+    res = target.request().get(Response.class);
+    sessionsList = res.readEntity(new GenericType<List<UserSessionInfo>>() {
+    });
+    Assert.assertEquals(sessionsList.size(), size + 1);
+    target().path("session").queryParam("sessionid", lensSessionHandle).request(mt).delete(APIResult.class);
+  }
 }