Commit c67052b0 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Added endpoint for retrieving member email addresses; CLI improvements

parent 909daf60
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
        </dependency>
    </dependencies>
    <build>
        <finalName>gms-cli</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
+152 −33
Original line number Diff line number Diff line
package it.inaf.ia2.gms.cli;

import it.inaf.ia2.gms.client.GmsClient;
import it.inaf.ia2.gms.client.GmsClientBuilder;
import it.inaf.ia2.gms.client.model.Permission;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.List;
import java.util.Properties;

public class CLI {

    private final GmsClient client;

    public static void main(String[] args) throws Exception {
        new CLI().run(args);
        new CLI(args).run();
    }

    private final String args[];
    private int argIndex;

    private String gmsBaseUrl;
    private String rapBaseUrl;
    private String clientId;
    private String clientSecret;
    private String token;

    private GmsClient client;

    private CLI(String... args) {
        this.args = args;
    }

    private void run() throws Exception {
        if (args.length < 2) {
            displayUsage();
        }

        boolean commandParsed = false;
        while (argIndex < args.length && !commandParsed) {
            switch (args[argIndex]) {
                case "--config-file":
                    loadConfigFromFile(new File(getNextArg()));
                    break;
                case "--token-file":
                    loadTokenFromFile(new File(getNextArg()));
                    break;
                case "--gms-url":
                    gmsBaseUrl = getNextArg();
                    break;
                case "--rap-url":
                    rapBaseUrl = getNextArg();
                    break;
                case "--client-id":
                    clientId = getNextArg();
                    break;
                case "--client-secret":
                    clientSecret = getNextArg();
                    break;
                default:
                    verifyConfigLoaded();
                    createClient();
                    parseCommand();
                    commandParsed = true;
                    break;
            }
            argIndex++;
        }
    }

    private String getNextArg() {
        if (argIndex + 1 == args.length) {
            System.err.println("Missing value for option " + args[argIndex]);
            System.exit(1);
        }
        return args[++argIndex];
    }

    private void verifyConfigLoaded() {

        if (gmsBaseUrl == null) {
            // Attempt reading gms.properties in current directory
            loadConfigFromFile(new File("gms.properties"));
        }

        if (clientId == null && token == null) {
            // Attempt loading token.txt in current directory
            loadTokenFromFile(new File("token.txt"));
        }

        if (token != null && (clientSecret == null || rapBaseUrl == null)) {
            System.err.println("Client secret and RAP base URL not configured");
            System.exit(1);
        }
    }

    private void createClient() {
        GmsClientBuilder clientBuilder = new GmsClientBuilder()
                .setGmsBaseUrl(gmsBaseUrl);

        if (token != null) {
            client = clientBuilder.build();
            client.setAccessToken(token);
        } else {
            client = clientBuilder.setClientId(clientId)
                    .setClientSecret(clientSecret)
                    .setRapBaseUrl(rapBaseUrl)
                    .build();
        }
    }

    private CLI() throws IOException {
    private void loadConfigFromFile(File config) {

        File config = new File("gms.properties");
        if (!config.exists()) {
            System.err.println("Unable to find the file gms.properties");
            System.err.println("Config file " + config.getAbsolutePath() + " doesn't exist");
            System.exit(1);
        }

        Properties properties = new Properties();
        try (InputStream in = new FileInputStream(config)) {
            properties.load(in);
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }

        String baseUrl = (String) properties.get("base_url");
        if (baseUrl == null) {
            System.err.println("Missing base_url in gms.properties");
        gmsBaseUrl = properties.getProperty("gms_url");
        if (gmsBaseUrl == null) {
            System.err.println("Missing gms_url in gms.properties");
            System.exit(1);
        }
        rapBaseUrl = properties.getProperty("rap_url");
        clientId = properties.getProperty("client_id");
        clientSecret = properties.getProperty("client_secret");
    }

    private void loadTokenFromFile(File tokenFile) {

        String token = (String) properties.get("token");
        if (token == null) {
            System.err.println("Missing token in gms.properties");
        if (!tokenFile.exists()) {
            System.err.println("Token file " + tokenFile.getAbsolutePath() + " doesn't exist");
            System.exit(1);
        }

        client = new GmsClient(baseUrl).setAccessToken(token);
        try (InputStream in = new FileInputStream(tokenFile)) {
            java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A");
            token = s.next().trim();
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }

    public void run(String... args) throws Exception {
        if (args.length < 2) {
            displayUsage();
    }

        switch (args[0]) {
    private void parseCommand() {

        switch (args[argIndex]) {
            case "create-group":
                boolean leaf = false;
                if (args.length > 1) {
                    leaf = Boolean.parseBoolean(args[2]);
                if (argIndex + 2 < args.length) {
                    leaf = Boolean.parseBoolean(args[argIndex + 2]);
                }
                client.createGroup(args[1], leaf);
                client.createGroup(args[argIndex + 1], leaf);
                System.out.println("Group created");
                break;
            case "delete-group":
                client.deleteGroup(args[1]);
                client.deleteGroup(args[argIndex + 1]);
                System.out.println("Group deleted");
                break;
            case "add-member":
                if (args.length < 3) {
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.addMember(args[1], args[2]);
                client.addMember(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Member added");
                break;
            case "remove-member":
                if (args.length < 3) {
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.removeMember(args[1], args[2]);
                client.removeMember(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Member removed");
                break;
            case "add-permission":
                if (args.length < 4) {
                if (argIndex + 3 >= args.length) {
                    displayUsage();
                }
                client.addPermission(args[1], args[2], Permission.valueOf(args[3]));
                client.addPermission(args[argIndex + 1], args[argIndex + 2], Permission.valueOf(args[argIndex + 3]));
                System.out.println("Permission added");
                break;
            case "delete-permission":
                if (args.length < 4) {
                if (argIndex + 2 >= args.length) {
                    displayUsage();
                }
                client.removePermission(args[1], args[2]);
                client.removePermission(args[argIndex + 1], args[argIndex + 2]);
                System.out.println("Permission removed");
                break;
            case "get-member-email-addresses":
                Permission permission = null;
                if (argIndex + 2 < args.length) {
                    permission = Permission.valueOf(args[argIndex + 2]);
                }
                List<String> addresses = client.getMemberEmailAddresses(args[argIndex + 1], permission);
                for (String address : addresses) {
                    System.out.println(address);
                }
                break;
            default:
                displayUsage();
                break;
@@ -97,13 +209,20 @@ public class CLI {
    }

    private void displayUsage() {
        System.out.println("java -jar gms-client.jar\n"
                + "    create-group <name1.name2.name3> <leaf>\n"
        System.out.println("gms-client\n"
                + "    [--config-file <file>]\n"
                + "    [--token-file <file>]\n"
                + "    [--gms-url <url>]\n"
                + "    [--rap-url <url>]\n"
                + "    [--client-id <id>]\n"
                + "    [--client-secret <secret>]\n"
                + "    create-group <name1.name2.name3> [<leaf>]\n"
                + "    delete-group <name1.name2.name3>\n"
                + "    add-member <name1.name2.name3> <user_id>\n"
                + "    remove-member <name1.name2.name3> <user_id>\n"
                + "    add-permission <name1.name2.name3> <user_id> <permission>\n"
                + "    delete-permission <name1.name2.name3> <user_id>");
                + "    delete-permission <name1.name2.name3> <user_id>\n"
                + "    get-member-email-addresses <name1.name2.name3> [<permission>]");
        System.exit(0);
    }
}
+8 −8
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ import it.inaf.ia2.gms.client.call.AddPermissionCall;
import it.inaf.ia2.gms.client.call.CreateGroupCall;
import it.inaf.ia2.gms.client.call.DeleteGroupCall;
import it.inaf.ia2.gms.client.call.GetGroupPermissionsCall;
import it.inaf.ia2.gms.client.call.GetMemberEmailAddresses;
import it.inaf.ia2.gms.client.call.GetUserGroupsCall;
import it.inaf.ia2.gms.client.call.GetUserPermissionsCall;
import it.inaf.ia2.gms.client.call.ListGroupsCall;
@@ -20,15 +21,10 @@ import java.util.Map;

public class GmsClient {

    HttpClientWrapper httpClientWrapper;
    private final HttpClientWrapper httpClientWrapper;

    public GmsClient(String baseUrl) {

        if (!baseUrl.endsWith("/")) {
            baseUrl += "/";
        }

        httpClientWrapper = new HttpClientWrapper(baseUrl);
    GmsClient(HttpClientWrapper httpClientWrapper) {
        this.httpClientWrapper = httpClientWrapper;
    }

    public GmsClient setAccessToken(String accessToken) {
@@ -83,4 +79,8 @@ public class GmsClient {
    public void addInvitedRegistration(String token, String email, Map<String, Permission> groupsPermissions) {
        new AddInvitedRegistrationCall(httpClientWrapper).addInvitedRegistration(token, email, groupsPermissions);
    }

    public List<String> getMemberEmailAddresses(String groupId, Permission permission) {
        return new GetMemberEmailAddresses(httpClientWrapper).getMemberEmailAddresses(groupId, permission);
    }
}
+40 −0
Original line number Diff line number Diff line
package it.inaf.ia2.gms.client;

import it.inaf.ia2.gms.client.call.HttpClientWrapper;

public class GmsClientBuilder {

    private String gmsBaseUrl;
    private String rapBaseUrl;
    private String clientId;
    private String clientSecret;

    public GmsClientBuilder setGmsBaseUrl(String gmsBaseUrl) {
        this.gmsBaseUrl = gmsBaseUrl;
        return this;
    }

    public GmsClientBuilder setRapBaseUrl(String rapBaseUrl) {
        this.rapBaseUrl = rapBaseUrl;
        return this;
    }

    public GmsClientBuilder setClientId(String clientId) {
        this.clientId = clientId;
        return this;
    }

    public GmsClientBuilder setClientSecret(String clientSecret) {
        this.clientSecret = clientSecret;
        return this;
    }

    public GmsClient build() {
        HttpClientWrapper clientWrapper = new HttpClientWrapper(gmsBaseUrl);
        if (rapBaseUrl != null && clientId != null && clientSecret != null) {
            clientWrapper.setRapBaseUrl(rapBaseUrl)
                    .setClientId(clientId).setClientSecret(clientSecret);
        }
        return new GmsClient(clientWrapper);
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -27,13 +27,13 @@ public abstract class BaseGmsCall {
        return clientWrapper.newHttpRequest(endpoint);
    }

    protected void logServerError(HttpRequest request, HttpResponse<String> response) {
    protected static void logServerError(HttpRequest request, HttpResponse<String> response) {
        LOGGER.log(Level.SEVERE, () -> "Error while reading " + request.uri()
                + "\nServer response status code is " + response.statusCode()
                + "\nAServer response text is " + response.body());
                + "\nServer response text is " + response.body());
    }

    protected void logServerErrorInputStream(HttpRequest request, HttpResponse<InputStream> response) {
    protected static void logServerErrorInputStream(HttpRequest request, HttpResponse<InputStream> response) {
        LOGGER.log(Level.SEVERE, () -> {
            Scanner s = new Scanner(response.body()).useDelimiter("\\A");
            String responseBody = s.hasNext() ? s.next() : "";
Loading