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);
+ }
}