From 106599b52c7fe9f8f94c8aa83ed4cd8e36247877 Mon Sep 17 00:00:00 2001 From: Marko Strukelj Date: Wed, 29 Nov 2017 16:48:37 +0100 Subject: [PATCH] KEYCLOAK-5742 [Admin CLI] Output filtering for nested attributes doesn't work --- .../client/admin/cli/commands/CreateCmd.java | 3 ++- .../client/admin/cli/commands/DeleteCmd.java | 3 ++- .../keycloak/client/admin/cli/commands/GetCmd.java | 14 +++++++++++++- .../client/admin/cli/commands/GetRolesCmd.java | 9 ++++++++- .../client/admin/cli/commands/UpdateCmd.java | 3 ++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/CreateCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/CreateCmd.java index 49b27395314..6bdc7eca577 100644 --- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/CreateCmd.java +++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/CreateCmd.java @@ -91,7 +91,7 @@ public class CreateCmd extends AbstractRequestCmd { out.println(); out.println("Command to create new resources on the server."); out.println(); - out.println("Use `" + CMD + " config credentials` to establish an authenticated sessions, or use --no-config with "); + out.println("Use '" + CMD + " config credentials' to establish an authenticated sessions, or use --no-config with "); out.println("CREDENTIALS OPTIONS to perform one time authentication."); out.println(); out.println("Arguments:"); @@ -122,6 +122,7 @@ public class CreateCmd extends AbstractRequestCmd { out.println(" -o, --output After creation output the new resource to standard output"); out.println(" -i, --id After creation only print id of the new resource to standard output"); out.println(" -F, --fields FILTER A filter pattern to specify which fields of a JSON response to output"); + out.println(" Use '" + CMD + " get --help' for more info on FILTER syntax."); out.println(" -c, --compressed Don't pretty print the output"); out.println(" -a, --admin-root URL URL of Admin REST endpoint root if not default - e.g. http://localhost:8080/auth/admin"); out.println(); diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/DeleteCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/DeleteCmd.java index 47a26f64956..1b434897946 100644 --- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/DeleteCmd.java +++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/DeleteCmd.java @@ -58,7 +58,7 @@ public class DeleteCmd extends CreateCmd { out.println(); out.println("Command to delete resources on the server."); out.println(); - out.println("Use `" + CMD + " config credentials` to establish an authenticated sessions, or use CREDENTIALS OPTIONS"); + out.println("Use '" + CMD + " config credentials' to establish an authenticated sessions, or use CREDENTIALS OPTIONS"); out.println("to perform one time authentication."); out.println(); out.println("Arguments:"); @@ -88,6 +88,7 @@ public class DeleteCmd extends CreateCmd { out.println(" -H, --print-headers Print response headers"); out.println(" -o, --output After delete output any response to standard output"); out.println(" -F, --fields FILTER A filter pattern to specify which fields of a JSON response to output"); + out.println(" Use '" + CMD + " get --help' for more info on FILTER syntax."); out.println(" -c, --compressed Don't pretty print the output"); out.println(" -a, --admin-root URL URL of Admin REST endpoint root if not default - e.g. http://localhost:8080/auth/admin"); out.println(); diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetCmd.java index 3910b994e3f..4667db0216d 100644 --- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetCmd.java +++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetCmd.java @@ -90,7 +90,7 @@ public class GetCmd extends AbstractRequestCmd { out.println(); out.println("Command to retrieve existing resources from the server."); out.println(); - out.println("Use `" + CMD + " config credentials` to establish an authenticated session, or use CREDENTIALS OPTIONS"); + out.println("Use '" + CMD + " config credentials' to establish an authenticated session, or use CREDENTIALS OPTIONS"); out.println("to perform one time authentication."); out.println(); out.println("Arguments:"); @@ -123,6 +123,18 @@ public class GetCmd extends AbstractRequestCmd { out.println(" --noquotes Don't quote strings when output format is 'csv'"); out.println(" -a, --admin-root URL URL of Admin REST endpoint root if not default - e.g. http://localhost:8080/auth/admin"); out.println(); + out.println("Output results can be filtered by using '--fields' and a filter pattern. Filtering is performed by processing each item in a result set"); + out.println("and applying filter on it. A pattern is defined as a comma separated list of attribute specifiers. Use '*' in a specifier to include all "); + out.println("attributes. Use attribute name, to include individual attributes. Use '-' prefix to exclude individual attributes."); + out.println("Use brackets after attribute specifier to specify a pattern for child attributes. For example: "); + out.println(); + out.println(" 'protocolMappers(id,config)' only return attributes 'id' and 'config' of protocolMapper top level attribute"); + out.println(" '*(*(*))' return all attributes three levels deep"); + out.println(" '*(*),-id,-protocolMappers' return all attributes two levels deep, excluding 'id', and 'protocolMappers' top level attributes"); + out.println(); + out.println("If attribute of object type is included, but its children are not specified by using brackets, then an empty object will be returned - '{}'."); + out.println("Usually you will want to specify object attributes with brackets to display them fully - e.g. 'protocolMappers(*(*))'"); + out.println(); out.println("Examples:"); out.println(); out.println("Get all realms, displaying only some of the attributes:"); diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetRolesCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetRolesCmd.java index 23cc591471d..96f79c47146 100644 --- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetRolesCmd.java +++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/GetRolesCmd.java @@ -323,7 +323,7 @@ public class GetRolesCmd extends GetCmd { out.println(); out.println("Command to list realm or client roles of a realm, a user, a group or a composite role."); out.println(); - out.println("Use `" + CMD + " config credentials` to establish an authenticated session, or use CREDENTIALS OPTIONS"); + out.println("Use '" + CMD + " config credentials' to establish an authenticated session, or use CREDENTIALS OPTIONS"); out.println("to perform one time authentication."); out.println(); out.println("If client is specified using --cclientid or --cid then client roles are listed, otherwise realm roles are listed."); @@ -366,6 +366,13 @@ public class GetRolesCmd extends GetCmd { out.println(" --available Return available roles - those that can still be added"); out.println(" --effective Return effective roles - transitively taking composite roles into account"); out.println(" --all Return all client roles in addition to realm roles"); + out.println(); + out.println(" -H, --print-headers Print response headers"); + out.println(" -F, --fields FILTER A filter pattern to specify which fields of a JSON response to output"); + out.println(" Use '" + CMD + " get --help' for more info on FILTER syntax."); + out.println(" -c, --compressed Don't pretty print the output"); + out.println(" --format FORMAT Set output format to comma-separated-values by using 'csv'. Default format is 'json'"); + out.println(" --noquotes Don't quote strings when output format is 'csv'"); out.println(" -a, --admin-root URL URL of Admin REST endpoint root if not default - e.g. http://localhost:8080/auth/admin"); out.println(" -r, --target-realm REALM Target realm to issue requests against if not the one authenticated against"); out.println(); diff --git a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/UpdateCmd.java b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/UpdateCmd.java index 086985b7650..2c0f404cf19 100644 --- a/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/UpdateCmd.java +++ b/integration/client-cli/admin-cli/src/main/java/org/keycloak/client/admin/cli/commands/UpdateCmd.java @@ -99,7 +99,7 @@ public class UpdateCmd extends AbstractRequestCmd { out.println(); out.println("Command to update existing resources on the server."); out.println(); - out.println("Use `" + CMD + " config credentials` to establish an authenticated sessions, or use CREDENTIALS OPTIONS"); + out.println("Use '" + CMD + " config credentials' to establish an authenticated sessions, or use CREDENTIALS OPTIONS"); out.println("to perform one time authentication."); out.println(); out.println("Arguments:"); @@ -133,6 +133,7 @@ public class UpdateCmd extends AbstractRequestCmd { out.println(" -H, --print-headers Print response headers"); out.println(" -o, --output After update output the new resource to standard output"); out.println(" -F, --fields FILTER A filter pattern to specify which fields of a JSON response to output"); + out.println(" Use '" + CMD + " get --help' for more info on FILTER syntax."); out.println(" -c, --compressed Don't pretty print the output"); out.println(" -a, --admin-root URL URL of Admin REST endpoint root if not default - e.g. http://localhost:8080/auth/admin"); out.println();