Jaspersoft / jrs-rest-java-client

Java Rest Client for JasperReports Server
GNU Lesser General Public License v3.0
100 stars 101 forks source link

value for roleSet invalid when passing two valid roles on user update #13

Closed frandevel closed 10 years ago

frandevel commented 10 years ago

Hi Borys, I'm trying to update a user assigning a second new role. When I try to update the user, even when I'm passing in two valid ClientRole objects, I get an IllegalParameterValueException with the message "The value "" for parameter "roleSet" is invalid"

Here is my code:

@Override
    public ClientUser updateUser(ClientUser user) {
        boolean userExists = findUser(user.getUsername(), user.getTenantId()) != null;
        OperationResult<ClientUser> updateResult;
        if (userExists) {
            updateResult = openAdminSession()
                    .usersService()
                    .organization(user.getTenantId())
                    .username(user.getUsername())
                    .createOrUpdate(user);

            return updateResult.getEntity();
        }

        return null;

And the values that are passed in:

ClientRole{name='ROLE_MYROLE_ONE', externallyDefined=false, tenantId='COMPANY_ONE'}
ClientRole{name='ROLE_USER', externallyDefined=false, tenantId='null'}

The second one was already assigned as I created the user and before assigning the role I retrieved it from the server

And the error for the ".createOrUpdate(user)" operation:

com.jaspersoft.jasperserver.jaxrs.client.core.exceptions.IllegalParameterValueException: The value "" for parameter "roleSet" is invalid.

User's TenantId is set and available.

Thanks in advance,

Fran

frandevel commented 10 years ago

It was due to trying to create a role that was already existing on the server. Weird. Now it's solved Thanks anyway!

boryskolesnykov commented 10 years ago

Hi frandevel, Sorry for that long is not answered. I tried to reproduce your error but have no succes. Could you tell me version of JasperReports server you are using?

frandevel commented 10 years ago

No worries at all! It was not a long wait anyway. I'm using version 5.5 with Multi-tenancy license ServerVersionInfo.getEditionName returns "Professional" ;O)

boryskolesnykov commented 10 years ago

Ok, I'm executing following sample code, where I'm firstly creating new user and new role, then I'm getting them from server, then granting user with TEST_ROLE and then update user. That's work for me.

Try to execute this code and if you will get an error please provide me with full stack trace.

        RestClientConfiguration configuration1 = new RestClientConfiguration("http://localhost:8081/jasperserver-pro");
        JasperserverRestClient client = new JasperserverRestClient(configuration1);

        Session session = client.authenticate("jasperadmin|organization_1", "jasperadmin");

        //role creation
        ClientRole role = new ClientRole();
        OperationResult<RolesListWrapper> result = session
                .rolesService()
                .organization("organization_1")
                .rolename("TEST_ROLE")
                .createOrUpdate(role);

        System.out.println("Create role: " + result.getEntity());

        //user creation
        ClientUser newUser = new ClientUser();
        newUser.setFullName("Test User");
        newUser.setPassword("password");

        OperationResult<ClientUser> result1 = session
                .usersService()
                .organization("organization_1")
                .username("testUser")
                .createOrUpdate(newUser);

        System.out.println("Create user: " + result1.getEntity());

        //getting created user
        OperationResult<ClientUser> result2 = session
                .usersService()
                .organization("organization_1")
                .username("testUser")
                .get();

        System.out.println("Get user: " + result2.getEntity());

        ClientUser user = result2.getEntity();

        //getting created role
        OperationResult<ClientRole> result3 = session
                .rolesService()
                .organization("organization_1")
                .rolename("TEST_ROLE")
                .get();

        System.out.println("Get role: " + result3.getEntity());

        //setting user's roles
        HashSet<ClientRole> roleSet = new HashSet<ClientRole>(user.getRoleSet());
        roleSet.add(result3.getEntity());
        user.setRoleSet(roleSet);

        //updating user
        OperationResult<ClientUser> result4 = session
                .usersService()
                .organization(user.getTenantId())
                .username(user.getUsername())
                .createOrUpdate(user);

        System.out.println("Update user with new role: " + result4.getEntity());
frandevel commented 10 years ago

Thanks Borys, it was now working. I guess I have to keep in mind that to modify entities it's probably better to create the entity, send it to the server to be persisted and updated with the correct field values (some of them set on the server on creation) and then update the entities after grabing latest changes from server and send them back again.