From 096426f327ae90d3f885c33196ad1da254205cbd Mon Sep 17 00:00:00 2001
From: Sara Bertocco <bertocco@oats.inaf.it>
Date: Mon, 27 Feb 2017 19:30:10 +0100
Subject: [PATCH] Groups list support added

---
 .../web/groups/GetGroupsListAction.java       | 53 +++++++++++++++++++
 .../web/groups/GroupsActionFactory.java       | 10 ++--
 .../java/ca/nrc/cadc/ac/client/GMSClient.java | 50 ++++++++++++++++-
 .../main/java/ca/nrc/cadc/ac/client/Main.java | 14 +++++
 4 files changed, 122 insertions(+), 5 deletions(-)
 create mode 100644 cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java

diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java
new file mode 100644
index 00000000..66eaaa4c
--- /dev/null
+++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GetGroupsListAction.java
@@ -0,0 +1,53 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package ca.nrc.cadc.ac.server.web.groups;
+
+import ca.nrc.cadc.ac.Group;
+import ca.nrc.cadc.ac.xml.GroupListWriter;
+import ca.nrc.cadc.ac.xml.GroupWriter;
+import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.log4j.Logger;
+
+/**
+ *
+ * @author bertocco
+ */
+public class GetGroupsListAction  extends AbstractGroupAction {
+    
+
+    private static final Logger log = Logger.getLogger(GetGroupsListAction.class);
+
+    GetGroupsListAction()
+    {
+        super();
+    }
+
+    public void doAction() throws Exception
+    {
+     
+        Collection<String> groupNames = groupPersistence.getGroupNames();
+        Collection<Group> groups = new ArrayList<Group>();
+        log.debug("Found " + groupNames.size() + " group names");
+
+        Group group = new Group();
+        syncOut.setHeader("Content-Type", "application/xml");
+        GroupListWriter groupListWriter = new GroupListWriter();
+        for (final String currentGroup : groupNames)
+        {
+            try {
+                group = groupPersistence.getGroup(currentGroup);
+                groups.add(group);
+            } catch (AccessControlException ace) {
+                // The user can read only groups of which is member or owner
+                log.info("User can not read group " + currentGroup);
+            }
+        }
+        groupListWriter.write(groups, syncOut.getWriter());
+    }
+    
+}
diff --git a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java
index 4c3bef61..241f25bb 100755
--- a/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java
+++ b/cadc-access-control-server/src/main/java/ca/nrc/cadc/ac/server/web/groups/GroupsActionFactory.java
@@ -109,12 +109,16 @@ public abstract class GroupsActionFactory
                 {
                     action = new GetGroupNamesAction();
                 }
-                else if (segments.length == 1)
+                else if ((segments.length == 1) && (segments[0].equals("list")))
+                {
+                    action = new GetGroupsListAction();
+                }
+                else if ((segments.length == 1) && (!segments[0].equals("list")))
                 {
                     String groupName = segments[0];
-                    action = new GetGroupAction(groupName);
+                    action = new GetGroupAction(groupName);                
                 }
-
+                        
                 if (action != null)
                 {
                     log.debug("Returning action: " + action.getClass());
diff --git a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java
index bc5bd3df..5b5f03be 100755
--- a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java
+++ b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/GMSClient.java
@@ -165,9 +165,55 @@ public class GMSClient implements TransferListener
      *
      * @return The list of groups.
      */
-    public List<Group> getGroups()
+    public List<Group> getGroups() throws GroupNotFoundException, IOException
     {
-        throw new UnsupportedOperationException("Not yet implemented");
+        
+        URL groupsURL = lookupServiceURL(Standards.GMS_GROUPS_01);
+        URL getGroupListURL = new URL(groupsURL.toExternalForm() + "/list");
+        log.debug("getGroup request to " + getGroupListURL.toString());
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        HttpDownload transfer = new HttpDownload(getGroupListURL, out);
+        transfer.setSSLSocketFactory(getSSLSocketFactory());
+        transfer.run();
+
+        Throwable error = transfer.getThrowable();
+        if (error != null)
+        {
+            log.debug("getGroup throwable (" + transfer.getResponseCode() + ")", error);
+            // transfer returns a -1 code for anonymous access.
+            if ((transfer.getResponseCode() == -1) ||
+                (transfer.getResponseCode() == 401) ||
+                (transfer.getResponseCode() == 403))
+            {
+                throw new AccessControlException(error.getMessage());
+            }
+            if (transfer.getResponseCode() == 400)
+            {
+                throw new IllegalArgumentException(error.getMessage());
+            }
+            if (transfer.getResponseCode() == 404)
+            {
+                throw new GroupNotFoundException(error.getMessage());
+            }
+            throw new IOException(error);
+        }
+
+        try
+        {
+            String groupsXML = new String(out.toByteArray(), "UTF-8");
+            log.debug("getGroups returned: " + groupsXML);
+            GroupListReader groupListReader = new GroupListReader();
+            List<Group> groupsList = groupListReader.read(groupsXML);
+            
+            return groupListReader.read(groupsXML);
+        }
+        catch (Exception bug)
+        {
+            log.error("Unexpected exception", bug);
+            throw new RuntimeException(bug);
+        }
+        
     }
 
     /**
diff --git a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java
index 87bfca84..d90fece2 100644
--- a/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java
+++ b/cadc-access-control/src/main/java/ca/nrc/cadc/ac/client/Main.java
@@ -112,6 +112,8 @@ public class Main implements PrivilegedAction<Object>
     public static final String ARG_USERID = "userid";
     public static final String ARG_GROUP = "group";
 
+    public static final String ARG_LIST = "list";
+    
     public static final String ARG_HELP = "help";
     public static final String ARG_VERBOSE = "verbose";
     public static final String ARG_DEBUG = "debug";
@@ -186,6 +188,9 @@ public class Main implements PrivilegedAction<Object>
         if (argMap.isSet(ARG_DEL_ADMIN))
             return ARG_DEL_ADMIN;
 
+        if (argMap.isSet(ARG_LIST))
+            return ARG_LIST;
+        
         throw new IllegalArgumentException("No valid commands");
     }
 
@@ -195,6 +200,8 @@ public class Main implements PrivilegedAction<Object>
         System.out.println("--get --group=<uri>");
         System.out.println("--delete --group=<uri>");
         System.out.println();
+        System.out.println("--list --group=<uri>");
+        System.out.println();
         System.out.println("--add-member --group=<uri> --userid=<u>");
         System.out.println("--remove-member --group=<uri> --userid=<u>");
         System.out.println();
@@ -362,6 +369,13 @@ public class Main implements PrivilegedAction<Object>
 
                 client.deleteGroup(group);
             }
+            else if (command.equals(ARG_LIST))
+            {
+                if (group == null)
+                    throw new IllegalArgumentException("No group specified");
+                
+                return client.getGroups();
+            }
 
             return null;
         }
-- 
GitLab