Replacing simple REST return types by model objects

This commit is contained in:
Martin Stockhammer 2020-06-30 21:19:55 +02:00
parent b4c86e98c8
commit fdb48a6024
33 changed files with 999 additions and 199 deletions

42
pom.xml
View File

@ -582,6 +582,48 @@
<version>${cxf.version}</version> <version>${cxf.version}</version>
</dependency> </dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-core</artifactId>
<scope>compile</scope>
<version>${io.swagger.version}</version>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2</artifactId>
<version>${io.swagger.version}</version>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${io.swagger.version}</version>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>javax.mail</groupId> <groupId>javax.mail</groupId>
<artifactId>mail</artifactId> <artifactId>mail</artifactId>

View File

@ -71,8 +71,29 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<configuration>
<excludes>
<exclude>target/generated</exclude>
<exclude>src/main/resources/templates/*</exclude>
<exclude>src/main/resources/openapi-codegen-ignore</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<!-- <!--
The jaxb dependency is needed by the enunciate plugin starting with JDK9. The jaxb dependency is needed by the enunciate plugin starting with JDK9.
Adding to the plugin dependency is not sufficient, so I have to add it as project dependency. Adding to the plugin dependency is not sufficient, so I have to add it as project dependency.

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ 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
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ 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.
-->
<enunciate
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://enunciate.webcohesion.com/schemas/enunciate-2.12.0.xsd">
<title>Apache Archiva Redback REST API</title>
<modules>
<jaxrs>
<application path="redbackServices" />
</jaxrs>
<cxf disabled="false"/>
<jersey disabled="true"/>
<c disabled="true"/>
<csharp disabled="true"/>
<obj-c disabled="true"/>
<jaxws-ri disabled="true"/>
<jaxws-support disabled="true"/>
<jaxon1 disabled="true"/>
<jackson1 disabled="true"/>
<java-json-client disabled="true"/>
<docs disabled="false"
docsSubdir="" freemarkerTemplate="${project.basedir}/src/enunciate/archiva.fmt" css="${project.basedir}/src/enunciate/archiva.css">
<!-- <war docsDir="apidocs" /> -->
</docs>
</modules>
</enunciate>

View File

@ -0,0 +1,76 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@XmlRootElement(name = "actionStatus")
public class ActionStatus
{
private boolean success = false;
private int modifiedNumber = 0;
public static final ActionStatus SUCCESS = new ActionStatus( true );
public static final ActionStatus FAIL = new ActionStatus( false );
public static ActionStatus FROM(boolean status) {
return status ? SUCCESS : FAIL;
}
public ActionStatus() {
}
public ActionStatus( boolean success) {
this.success = success;
}
public ActionStatus(boolean success, int modifiedNumber) {
this.success = success;
this.modifiedNumber = modifiedNumber;
}
public boolean isSuccess( )
{
return success;
}
public void setSuccess( boolean success )
{
this.success = success;
}
public int getModifiedNumber( )
{
return modifiedNumber;
}
public void setModifiedNumber( int modifiedNumber )
{
this.modifiedNumber = modifiedNumber;
}
@Override
public String toString( )
{
return Boolean.toString( success );
}
}

View File

@ -0,0 +1,50 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
import org.apache.archiva.redback.keys.AuthenticationKey;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@XmlRootElement(name = "authenticationKeyResult")
public class AuthenticationKeyResult
{
String key = "";
public AuthenticationKeyResult() {
}
public AuthenticationKeyResult(String key) {
this.key = key;
}
public String getKey( )
{
return key;
}
public void setKey( String key )
{
this.key = key;
}
}

View File

@ -0,0 +1,48 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@XmlRootElement(name="availabilityStatus")
public class AvailabilityStatus
{
boolean exists = false;
public AvailabilityStatus() {
}
public AvailabilityStatus(boolean exists) {
this.exists = exists;
}
public boolean isExists( )
{
return exists;
}
public void setExists( boolean exists )
{
this.exists = exists;
}
}

View File

@ -0,0 +1,45 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
public class PasswordStatus
{
boolean changeRequired = false;
public PasswordStatus() {
}
public PasswordStatus(boolean changeRequired) {
this.changeRequired = changeRequired;
}
public boolean isChangeRequired( )
{
return changeRequired;
}
public void setChangeRequired( boolean changeRequired )
{
this.changeRequired = changeRequired;
}
}

View File

@ -0,0 +1,48 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@XmlRootElement(name="pingResult")
public class PingResult
{
boolean success;
public PingResult() {
}
public PingResult( boolean success ) {
this.success = success;
}
public boolean isSuccess( )
{
return success;
}
public void setSuccess( boolean success )
{
this.success = success;
}
}

View File

@ -0,0 +1,48 @@
package org.apache.archiva.redback.rest.api.model;
/*
* 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
*
* http://www.apache.org/licenses/LICENSE-2.0
* 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.
*/
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@XmlRootElement(name="verificationStatus")
public class VerificationStatus
{
boolean success = false;
public VerificationStatus() {
}
public VerificationStatus(boolean success ) {
this.success = success;
}
public boolean isSuccess( )
{
return success;
}
public void setSuccess( boolean success )
{
this.success = success;
}
}

View File

@ -18,8 +18,10 @@
* under the License. * under the License.
*/ */
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.archiva.redback.authorization.RedbackAuthorization; import org.apache.archiva.redback.authorization.RedbackAuthorization;
import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants; import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.LdapGroupMapping; import org.apache.archiva.redback.rest.api.model.LdapGroupMapping;
import org.apache.archiva.redback.rest.api.model.LdapGroupMappingUpdateRequest; import org.apache.archiva.redback.rest.api.model.LdapGroupMappingUpdateRequest;
import org.apache.archiva.redback.rest.api.model.StringList; import org.apache.archiva.redback.rest.api.model.StringList;
@ -40,6 +42,7 @@
* @since 2.1 * @since 2.1
*/ */
@Path("/ldapGroupMappingService/") @Path("/ldapGroupMappingService/")
@Tag( name = "LDAP", description = "LDAP Service" )
public interface LdapGroupMappingService public interface LdapGroupMappingService
{ {
@Path("ldapGroups") @Path("ldapGroups")
@ -61,7 +64,7 @@ List<LdapGroupMapping> getLdapGroupMappings()
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION) @RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION)
Boolean addLdapGroupMapping( LdapGroupMapping ldapGroupMapping ) ActionStatus addLdapGroupMapping( LdapGroupMapping ldapGroupMapping )
throws RedbackServiceException; throws RedbackServiceException;
@DELETE @DELETE
@ -69,14 +72,14 @@ Boolean addLdapGroupMapping( LdapGroupMapping ldapGroupMapping )
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION) @RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION)
Boolean removeLdapGroupMapping( @PathParam("group") String group ) ActionStatus removeLdapGroupMapping( @PathParam("group") String group )
throws RedbackServiceException; throws RedbackServiceException;
@POST @POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION) @RedbackAuthorization(permissions = RedbackRoleConstants.CONFIGURATION_EDIT_OPERATION)
Boolean updateLdapGroupMapping( LdapGroupMappingUpdateRequest ldapGroupMappingUpdateRequest ) ActionStatus updateLdapGroupMapping( LdapGroupMappingUpdateRequest ldapGroupMappingUpdateRequest )
throws RedbackServiceException; throws RedbackServiceException;
} }

View File

@ -20,7 +20,11 @@
*/ */
import org.apache.archiva.redback.authorization.RedbackAuthorization; import org.apache.archiva.redback.authorization.RedbackAuthorization;
import org.apache.archiva.redback.keys.AuthenticationKey;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.AuthenticationKeyResult;
import org.apache.archiva.redback.rest.api.model.LoginRequest; import org.apache.archiva.redback.rest.api.model.LoginRequest;
import org.apache.archiva.redback.rest.api.model.PingResult;
import org.apache.archiva.redback.rest.api.model.User; import org.apache.archiva.redback.rest.api.model.User;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@ -38,9 +42,9 @@ public interface LoginService
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true ) @RedbackAuthorization( noRestriction = true )
String addAuthenticationKey( @QueryParam( "providerKey" ) String providedKey, AuthenticationKeyResult addAuthenticationKey( @QueryParam( "providerKey" ) String providedKey,
@QueryParam( "principal" ) String principal, @QueryParam( "purpose" ) String purpose, @QueryParam( "principal" ) String principal, @QueryParam( "purpose" ) String purpose,
@QueryParam( "expirationMinutes" ) int expirationMinutes ) @QueryParam( "expirationMinutes" ) int expirationMinutes )
throws RedbackServiceException; throws RedbackServiceException;
@ -48,7 +52,7 @@ String addAuthenticationKey( @QueryParam( "providerKey" ) String providedKey,
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true ) @RedbackAuthorization( noRestriction = true )
Boolean ping() PingResult ping()
throws RedbackServiceException; throws RedbackServiceException;
@ -56,7 +60,7 @@ Boolean ping()
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = false, noPermission = true ) @RedbackAuthorization( noRestriction = false, noPermission = true )
Boolean pingWithAutz() PingResult pingWithAutz()
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -89,6 +93,6 @@ User isLogged()
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true, noPermission = true ) @RedbackAuthorization( noRestriction = true, noPermission = true )
Boolean logout() ActionStatus logout()
throws RedbackServiceException; throws RedbackServiceException;
} }

View File

@ -20,10 +20,13 @@
import org.apache.archiva.redback.authorization.RedbackAuthorization; import org.apache.archiva.redback.authorization.RedbackAuthorization;
import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants; import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.Application; import org.apache.archiva.redback.rest.api.model.Application;
import org.apache.archiva.redback.rest.api.model.ApplicationRoles; import org.apache.archiva.redback.rest.api.model.ApplicationRoles;
import org.apache.archiva.redback.rest.api.model.AvailabilityStatus;
import org.apache.archiva.redback.rest.api.model.Role; import org.apache.archiva.redback.rest.api.model.Role;
import org.apache.archiva.redback.rest.api.model.User; import org.apache.archiva.redback.rest.api.model.User;
import org.apache.archiva.redback.rest.api.model.VerificationStatus;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@ -46,8 +49,8 @@ public interface RoleManagementService
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean createTemplatedRole( @QueryParam( "templateId" ) String templateId, ActionStatus createTemplatedRole( @QueryParam( "templateId" ) String templateId,
@QueryParam( "resource" ) String resource ) @QueryParam( "resource" ) String resource )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -62,7 +65,7 @@ Boolean createTemplatedRole( @QueryParam( "templateId" ) String templateId,
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean removeTemplatedRole( @QueryParam( "templateId" ) String templateId, ActionStatus removeTemplatedRole( @QueryParam( "templateId" ) String templateId,
@QueryParam( "resource" ) String resource ) @QueryParam( "resource" ) String resource )
throws RedbackServiceException; throws RedbackServiceException;
@ -81,7 +84,7 @@ Boolean removeTemplatedRole( @QueryParam( "templateId" ) String templateId,
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean updateRole( @QueryParam( "templateId" ) String templateId, @QueryParam( "oldResource" ) String oldResource, ActionStatus updateRole( @QueryParam( "templateId" ) String templateId, @QueryParam( "oldResource" ) String oldResource,
@QueryParam( "newResource" ) String newResource ) @QueryParam( "newResource" ) String newResource )
throws RedbackServiceException; throws RedbackServiceException;
@ -96,7 +99,7 @@ Boolean updateRole( @QueryParam( "templateId" ) String templateId, @QueryParam(
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean assignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "principal" ) String principal ) ActionStatus assignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "principal" ) String principal )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -110,7 +113,7 @@ Boolean assignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "princip
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean assignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryParam( "principal" ) String principal ) ActionStatus assignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryParam( "principal" ) String principal )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -126,7 +129,7 @@ Boolean assignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryParam
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean assignTemplatedRole( @QueryParam( "templateId" ) String templateId, ActionStatus assignTemplatedRole( @QueryParam( "templateId" ) String templateId,
@QueryParam( "resource" ) String resource, @QueryParam( "resource" ) String resource,
@QueryParam( "principal" ) String principal ) @QueryParam( "principal" ) String principal )
throws RedbackServiceException; throws RedbackServiceException;
@ -142,7 +145,7 @@ Boolean assignTemplatedRole( @QueryParam( "templateId" ) String templateId,
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean unassignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "principal" ) String principal ) ActionStatus unassignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "principal" ) String principal )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -156,7 +159,7 @@ Boolean unassignRole( @QueryParam( "roleId" ) String roleId, @QueryParam( "princ
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean unassignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryParam( "principal" ) String principal ) ActionStatus unassignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryParam( "principal" ) String principal )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -170,7 +173,7 @@ Boolean unassignRoleByName( @QueryParam( "roleName" ) String roleName, @QueryPar
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean roleExists( @QueryParam( "roleId" ) String roleId ) AvailabilityStatus roleExists( @QueryParam( "roleId" ) String roleId )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -185,7 +188,7 @@ Boolean roleExists( @QueryParam( "roleId" ) String roleId )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean templatedRoleExists( @QueryParam( "templateId" ) String templateId, AvailabilityStatus templatedRoleExists( @QueryParam( "templateId" ) String templateId,
@QueryParam( "resource" ) String resource ) @QueryParam( "resource" ) String resource )
throws RedbackServiceException; throws RedbackServiceException;
@ -201,8 +204,8 @@ Boolean templatedRoleExists( @QueryParam( "templateId" ) String templateId,
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean verifyTemplatedRole( @QueryParam( "templateId" ) String templateId, VerificationStatus verifyTemplatedRole( @QueryParam( "templateId" ) String templateId,
@QueryParam( "resource" ) String resource ) @QueryParam( "resource" ) String resource )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -265,7 +268,7 @@ Role getRole( @PathParam( "roleName" ) String roleName )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean updateRoleDescription( @QueryParam( "roleName" ) String roleName, ActionStatus updateRoleDescription( @QueryParam( "roleName" ) String roleName,
@QueryParam( "roleDescription" ) String description ) @QueryParam( "roleDescription" ) String description )
throws RedbackServiceException; throws RedbackServiceException;
@ -278,7 +281,7 @@ Boolean updateRoleDescription( @QueryParam( "roleName" ) String roleName,
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean updateRoleUsers( Role role ) ActionStatus updateRoleUsers( Role role )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -300,7 +303,7 @@ List<ApplicationRoles> getApplicationRoles( @PathParam( "username" ) String user
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
Boolean updateUserRoles( User user ) ActionStatus updateUserRoles( User user )
throws RedbackServiceException; throws RedbackServiceException;
} }

View File

@ -21,13 +21,19 @@
import org.apache.archiva.redback.authorization.RedbackAuthorization; import org.apache.archiva.redback.authorization.RedbackAuthorization;
import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants; import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.AvailabilityStatus;
import org.apache.archiva.redback.rest.api.model.Operation; import org.apache.archiva.redback.rest.api.model.Operation;
import org.apache.archiva.redback.rest.api.model.PasswordStatus;
import org.apache.archiva.redback.rest.api.model.Permission; import org.apache.archiva.redback.rest.api.model.Permission;
import org.apache.archiva.redback.rest.api.model.PingResult;
import org.apache.archiva.redback.rest.api.model.RegistrationKey; import org.apache.archiva.redback.rest.api.model.RegistrationKey;
import org.apache.archiva.redback.rest.api.model.ResetPasswordRequest; import org.apache.archiva.redback.rest.api.model.ResetPasswordRequest;
import org.apache.archiva.redback.rest.api.model.User; import org.apache.archiva.redback.rest.api.model.User;
import org.apache.archiva.redback.rest.api.model.UserRegistrationRequest; import org.apache.archiva.redback.rest.api.model.UserRegistrationRequest;
import org.apache.archiva.redback.rest.api.model.VerificationStatus;
import javax.swing.*;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
@ -61,7 +67,7 @@ List<User> getUsers()
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_CREATE_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_CREATE_OPERATION )
Boolean createUser( User user ) ActionStatus createUser( User user )
throws RedbackServiceException; throws RedbackServiceException;
@ -73,14 +79,14 @@ Boolean createUser( User user )
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( noRestriction = true ) @RedbackAuthorization( noRestriction = true )
Boolean createAdminUser( User user ) ActionStatus createAdminUser( User user )
throws RedbackServiceException; throws RedbackServiceException;
@Path( "isAdminUserExists" ) @Path( "isAdminUserExists" )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true ) @RedbackAuthorization( noRestriction = true )
Boolean isAdminUserExists() AvailabilityStatus isAdminUserExists()
throws RedbackServiceException; throws RedbackServiceException;
@ -88,14 +94,14 @@ Boolean isAdminUserExists()
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_DELETE_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_DELETE_OPERATION )
Boolean deleteUser( @PathParam( "userName" ) String username ) ActionStatus deleteUser( @PathParam( "userName" ) String username )
throws RedbackServiceException; throws RedbackServiceException;
@Path( "updateUser" ) @Path( "updateUser" )
@POST @POST
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
Boolean updateUser( User user ) ActionStatus updateUser( User user )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -105,7 +111,7 @@ Boolean updateUser( User user )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
Boolean lockUser( @PathParam( "username" ) String username ) ActionStatus lockUser( @PathParam( "username" ) String username )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -115,7 +121,7 @@ Boolean lockUser( @PathParam( "username" ) String username )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
Boolean unlockUser( @PathParam( "username" ) String username ) ActionStatus unlockUser( @PathParam( "username" ) String username )
throws RedbackServiceException; throws RedbackServiceException;
@ -126,20 +132,9 @@ Boolean unlockUser( @PathParam( "username" ) String username )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
Boolean passwordChangeRequired( @PathParam( "username" ) String username ) PasswordStatus passwordChangeRequired( @PathParam( "username" ) String username )
throws RedbackServiceException; throws RedbackServiceException;
/**
* @since 2.0
*/
@Path( "passwordChangeNotRequired/{username}" )
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
Boolean passwordChangeNotRequired( @PathParam( "username" ) String username )
throws RedbackServiceException;
/** /**
* update only the current user and this fields: fullname, email, password. * update only the current user and this fields: fullname, email, password.
* the service verify the curent logged user with the one passed in the method * the service verify the curent logged user with the one passed in the method
@ -149,21 +144,21 @@ Boolean passwordChangeNotRequired( @PathParam( "username" ) String username )
@POST @POST
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = false, noPermission = true ) @RedbackAuthorization( noRestriction = false, noPermission = true )
Boolean updateMe( User user ) ActionStatus updateMe( User user )
throws RedbackServiceException; throws RedbackServiceException;
@Path( "ping" ) @Path( "ping" )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true ) @RedbackAuthorization( noRestriction = true )
Boolean ping() PingResult ping()
throws RedbackServiceException; throws RedbackServiceException;
@Path( "removeFromCache/{userName}" ) @Path( "removeFromCache/{userName}" )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION ) @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
int removeFromCache( @PathParam( "userName" ) String username ) ActionStatus removeFromCache( @PathParam( "userName" ) String username )
throws RedbackServiceException; throws RedbackServiceException;
@Path( "getGuestUser" ) @Path( "getGuestUser" )
@ -202,7 +197,7 @@ RegistrationKey registerUser( UserRegistrationRequest userRegistrationRequest )
@GET @GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noRestriction = true, noPermission = true ) @RedbackAuthorization( noRestriction = true, noPermission = true )
Boolean validateUserFromKey( @PathParam( "key" ) String key ) VerificationStatus validateUserFromKey( @PathParam( "key" ) String key )
throws RedbackServiceException; throws RedbackServiceException;
/** /**
@ -215,7 +210,7 @@ Boolean validateUserFromKey( @PathParam( "key" ) String key )
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
@RedbackAuthorization( noRestriction = true, noPermission = true ) @RedbackAuthorization( noRestriction = true, noPermission = true )
Boolean resetPassword( ResetPasswordRequest resetPasswordRequest ) ActionStatus resetPassword( ResetPasswordRequest resetPasswordRequest )
throws RedbackServiceException; throws RedbackServiceException;
/** /**

View File

@ -0,0 +1,16 @@
resourcePackages:
- org.apache.archiva.redback.rest.api
prettyPrint: true
cacheTTL: 0
openAPI:
info:
version: '3.0'
title: Apache Archiva Redback REST API
description: 'This is the Apache Archiva Redback REST API documentation'
termsOfService: https://archiva.apache.org
contact:
email: dev@archiva.apache.org
url: https://archiva.apache.org/index.html
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html

View File

@ -0,0 +1,4 @@
{{#is this 'body-param'}}<div class="param">{{baseName}} {{#baseType}}<a href="#{{baseType}}">{{baseType}}</a>{{/baseType}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
<div class="param-desc"><span class="param-type">Body Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}</div>{{/is}}
{{#example}}<div class="param-desc"><span class="param-type">example: <code>{{example}}</code></span></div>{{/example}}

View File

@ -0,0 +1,3 @@
{{#is this 'form-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
<div class="param-desc"><span class="param-type">Form Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}

View File

@ -0,0 +1,3 @@
{{#is this 'header-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
<div class="param-desc"><span class="param-type">Header Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}

View File

@ -0,0 +1,213 @@
<!doctype html>
<html>
<head>
<title>{{{appName}}}</title>
<style type="text/css">
{{>style.css}}
</style>
</head>
<body>
<h1>{{{appName}}}</h1>
<div class="app-desc">{{{appDescription}}}</div>
{{#infoUrl}}<div class="app-desc">More information: <a href="{{{infoUrl}}}">{{{infoUrl}}}</a></div>{{/infoUrl}}
{{#infoEmail}}<div class="app-desc">Contact Info: <a href="{{{infoEmail}}}">{{{infoEmail}}}</a></div>{{/infoEmail}}
{{#version}}<div class="app-desc">Version: {{{version}}}</div>{{/version}}
{{#basePathWithoutHost}}<div class="app-desc">BasePath:{{basePathWithoutHost}}</div>{{/basePathWithoutHost}}
<div class="license-info">{{{licenseInfo}}}</div>
<div class="license-url">{{{licenseUrl}}}</div>
<h2>Access</h2>
{{#hasAuthMethods}}
<ol>
{{#authMethods}}
<li>{{#is this 'basic'}}HTTP Basic Authentication{{/is}}{{#is this 'oauth'}}OAuth AuthorizationUrl:{{authorizationUrl}}TokenUrl:{{tokenUrl}}{{/is}}{{#is this 'api-key'}}APIKey KeyParamName:{{keyParamName}} KeyInQuery:{{isKeyInQuery}} KeyInHeader:{{isKeyInHeader}}{{/is}}</li>
{{/authMethods}}
</ol>
{{/hasAuthMethods}}
<h2><a name="__Methods">Methods</a></h2>
[ Jump to <a href="#__Models">Models</a> ]
{{! for the tables of content, I cheat and don't use CSS styles.... }}
<h3>Table of Contents </h3>
<div class="method-summary">{{access}}</div>
{{#apiInfo}}
{{#apis}}
{{#operations}}
<h4><a href="#{{baseName}}">{{baseName}}</a></h4>
<ul>
{{#operation}}
<li><a href="#{{nickname}}"><code><span class="http-method">{{httpMethod}}</span> {{path}}</code></a></li>
{{/operation}}
</ul>
{{/operations}}
{{/apis}}
{{/apiInfo}}
{{#apiInfo}}
{{#apis}}
{{#operations}}
<h1><a name="{{baseName}}">{{baseName}}</a></h1>
{{#operation}}
<div class="method"><a name="{{nickname}}"></a>
<div class="method-path">
<a class="up" href="#__Methods">Up</a>
<pre class="{{httpMethod}}"><code class="huge"><span class="http-method">{{httpMethod}}</span> {{path}}</code></pre></div>
<div class="method-summary">{{summary}} (<span class="nickname">{{nickname}}</span>)</div>
{{! notes is operation.description. So why rename it and make it super confusing???? }}
<div class="method-notes">{{notes}}</div>
{{#hasPathParams}}
<h3 class="field-label">Path parameters</h3>
<div class="field-items">
{{#pathParams}}{{>pathParam}}{{/pathParams}}
</div> <!-- field-items -->
{{/hasPathParams}}
{{#has this 'consumes'}}
<h3 class="field-label">Consumes</h3>
This API call consumes the following media types via the <span class="header">Content-Type</span> request header:
<ul>
{{#consumes}}
<li><code>{{{mediaType}}}</code></li>
{{/consumes}}
</ul>
{{/has}}
{{#hasBodyParam}}
<h3 class="field-label">Request body</h3>
<div class="field-items">
{{#bodyParams}}{{>bodyParam}}{{/bodyParams}}
</div> <!-- field-items -->
{{/hasBodyParam}}
{{#hasHeaderParams}}
<h3 class="field-label">Request headers</h3>
<div class="field-items">
{{#headerParam}}{{>headerParam}}{{/headerParam}}
</div> <!-- field-items -->
{{/hasHeaderParams}}
{{#hasQueryParams}}
<h3 class="field-label">Query parameters</h3>
<div class="field-items">
{{#queryParams}}{{>queryParam}}{{/queryParams}}
</div> <!-- field-items -->
{{/hasQueryParams}}
{{#hasFormParams}}
<h3 class="field-label">Form parameters</h3>
<div class="field-items">
{{#formParams}}{{>formParam}}{{/formParams}}
</div> <!-- field-items -->
{{/hasFormParams}}
{{#returnType}}
<h3 class="field-label">Return type</h3>
<div class="return-type">
{{#hasReference}}{{^returnSimpleType}}{{returnContainer}}[{{/returnSimpleType}}<a href="#{{returnBaseType}}">{{returnBaseType}}</a>{{^returnSimpleType}}]{{/returnSimpleType}}{{/hasReference}}
{{^hasReference}}{{returnType}}{{/hasReference}}
</div>
{{/returnType}}
<!--Todo: process Response Object and its headers, schema, examples -->
{{#hasExamples}}
{{#examples}}
<h3 class="field-label">Example data</h3>
<div class="example-data-content-type">Content-Type: {{{contentType}}}</div>
<pre class="example"><code>{{{example}}}</code></pre>
{{/examples}}
{{/hasExamples}}
{{#has this 'produces'}}
<h3 class="field-label">Produces</h3>
This API call produces the following media types according to the <span class="header">Accept</span> request header;
the media type will be conveyed by the <span class="header">Content-Type</span> response header.
<ul>
{{#produces}}
<li><code>{{{mediaType}}}</code></li>
{{/produces}}
</ul>
{{/has}}
<h3 class="field-label">Responses</h3>
{{#responses}}
<h4 class="field-label">{{code}}</h4>
{{message}}
{{#simpleType}}<a href="#{{dataType}}">{{dataType}}</a>{{/simpleType}}
{{#examples}}
<h3 class="field-label">Example data</h3>
<div class="example-data-content-type">Content-Type: {{{contentType}}}</div>
<pre class="example"><code>{{example}}</code></pre>
{{/examples}}
{{/responses}}
</div> <!-- method -->
<hr/>
{{/operation}}
{{/operations}}
{{/apis}}
{{/apiInfo}}
<h2><a name="__Models">Models</a></h2>
[ Jump to <a href="#__Methods">Methods</a> ]
<h3>Table of Contents</h3>
<ol>
{{#models}}
{{#model}}
<li><a href="#{{name}}"><code>{{name}}</code>{{#title}} - {{title}}{{/title}}</a></li>
{{/model}}
{{/models}}
</ol>
{{#models}}
{{#model}}
<div class="model">
<h3><a name="{{name}}"><code>{{name}}</code>{{#title}} - {{title}}{{/title}}</a> <a class="up" href="#__Models">Up</a></h3>
{{#unescapedDescription}}<div class='model-description'>{{unescapedDescription}}</div>{{/unescapedDescription}}
<div class="field-items">
{{#vars}}<div class="param">{{name}} {{^required}}(optional){{/required}}</div><div class="param-desc"><span class="param-type">{{#isNot this 'primitive-type'}}<a href="#{{complexType}}">{{datatype}}</a>{{/isNot}}</span> {{unescapedDescription}} {{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>
{{#is this 'enum'}}
<div class="param-enum-header">Enum:</div>
{{#_enum}}<div class="param-enum">{{this}}</div>{{/_enum}}
{{/is}}
{{#example}}
<div class="param-desc"><span class="param-type">example: {{example}}</span></div>
{{/example}}
{{#vendorExtensions.oneOf-model}}
<div class="param-desc"><span class="param-type">oneOf:</span>
{{#vendorExtensions.x-model-names}}
<a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
{{/vendorExtensions.x-model-names}}
</div>
{{/vendorExtensions.oneOf-model}}
{{#vendorExtensions.anyOf-model}}
<div class="param-desc"><span class="param-type">anyOf:</span>
{{#vendorExtensions.x-model-names}}
<a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
{{/vendorExtensions.x-model-names}}
</div>
{{/vendorExtensions.anyOf-model}}
{{#items}}
{{#vendorExtensions.oneOf-model}}
<div class="param-desc"><span class="param-type">items oneOf:</span>
{{#vendorExtensions.x-model-names}}
<a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
{{/vendorExtensions.x-model-names}}
</div>
{{/vendorExtensions.oneOf-model}}
{{#vendorExtensions.anyOf-model}}
<div class="param-desc"><span class="param-type">items anyOf:</span>
{{#vendorExtensions.x-model-names}}
<a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
{{/vendorExtensions.x-model-names}}
</div>
{{/vendorExtensions.anyOf-model}}
{{/items}}
{{/vars}}
</div> <!-- field-items -->
</div>
{{/model}}
{{/models}}
</body>
</html>

View File

@ -0,0 +1,3 @@
{{#is this 'path-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
<div class="param-desc"><span class="param-type">Path Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}

View File

@ -0,0 +1,3 @@
{{#is this 'query-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
<div class="param-desc"><span class="param-type">Query Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}

View File

@ -0,0 +1,172 @@
body {
font-family: Trebuchet MS, sans-serif;
font-size: 15px;
color: #444;
margin-right: 24px;
}
h1 {
font-size: 25px;
}
h2 {
font-size: 20px;
}
h3 {
font-size: 16px;
font-weight: bold;
}
hr {
height: 1px;
border: 0;
color: #ddd;
background-color: #ddd;
}
.app-desc {
clear: both;
margin-left: 20px;
}
.param-name {
width: 100%;
}
.license-info {
margin-left: 20px;
}
.license-url {
margin-left: 20px;
}
.model {
margin: 0 0 0px 20px;
}
.method {
margin-left: 20px;
}
.method-notes {
margin: 10px 0 20px 0;
font-size: 90%;
color: #555;
}
pre {
padding: 10px;
margin-bottom: 2px;
}
.http-method {
text-transform: uppercase;
}
pre.get {
background-color: #0f6ab4;
}
pre.post {
background-color: #10a54a;
}
pre.put {
background-color: #c5862b;
}
pre.delete {
background-color: #a41e22;
}
.huge {
color: #fff;
}
pre.example {
background-color: #f3f3f3;
padding: 10px;
border: 1px solid #ddd;
}
code {
white-space: pre;
}
.nickname {
font-weight: bold;
}
.method-path {
font-size: 1.5em;
background-color: #0f6ab4;
}
.up {
float:right;
}
.parameter {
width: 500px;
}
.param {
width: 500px;
padding: 10px 0 0 20px;
font-weight: bold;
}
.param-desc {
width: 700px;
padding: 0 0 0 20px;
color: #777;
}
.param-type {
font-style: italic;
}
.param-enum-header {
width: 700px;
padding: 0 0 0 60px;
color: #777;
font-weight: bold;
}
.param-enum {
width: 700px;
padding: 0 0 0 80px;
color: #777;
font-style: italic;
}
.field-label {
padding: 0;
margin: 0;
clear: both;
}
.field-items {
padding: 0 0 15px 0;
margin-bottom: 15px;
}
.return-type {
clear: both;
padding-bottom: 10px;
}
.param-header {
font-weight: bold;
}
.method-tags {
text-align: right;
}
.method-tag {
background: none repeat scroll 0% 0% #24A600;
border-radius: 3px;
padding: 2px 10px;
margin: 2px;
color: #FFF;
display: inline-block;
text-decoration: none;
}

View File

@ -186,6 +186,11 @@
<artifactId>jackson-jaxrs-xml-provider</artifactId> <artifactId>jackson-jaxrs-xml-provider</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.cxf</groupId> <groupId>org.apache.cxf</groupId>
@ -327,6 +332,15 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<configuration>
<excludes>
<exclude>src/main/resources/META-INF/cxf/org.apache.cxf.Logger</exclude>
</excludes>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>

View File

@ -24,6 +24,7 @@
import org.apache.archiva.redback.common.ldap.connection.LdapException; import org.apache.archiva.redback.common.ldap.connection.LdapException;
import org.apache.archiva.redback.common.ldap.role.LdapRoleMapper; import org.apache.archiva.redback.common.ldap.role.LdapRoleMapper;
import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration; import org.apache.archiva.redback.common.ldap.role.LdapRoleMapperConfiguration;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.LdapGroupMapping; import org.apache.archiva.redback.rest.api.model.LdapGroupMapping;
import org.apache.archiva.redback.rest.api.model.LdapGroupMappingUpdateRequest; import org.apache.archiva.redback.rest.api.model.LdapGroupMappingUpdateRequest;
import org.apache.archiva.redback.rest.api.model.StringList; import org.apache.archiva.redback.rest.api.model.StringList;
@ -111,7 +112,7 @@ public List<LdapGroupMapping> getLdapGroupMappings()
} }
} }
public Boolean addLdapGroupMapping( LdapGroupMapping ldapGroupMapping ) public ActionStatus addLdapGroupMapping( LdapGroupMapping ldapGroupMapping )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -124,10 +125,10 @@ public Boolean addLdapGroupMapping( LdapGroupMapping ldapGroupMapping )
log.error( e.getMessage(), e ); log.error( e.getMessage(), e );
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean removeLdapGroupMapping( String group ) public ActionStatus removeLdapGroupMapping( String group )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -139,10 +140,10 @@ public Boolean removeLdapGroupMapping( String group )
log.error( e.getMessage(), e ); log.error( e.getMessage(), e );
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean updateLdapGroupMapping( LdapGroupMappingUpdateRequest ldapGroupMappingUpdateRequest ) public ActionStatus updateLdapGroupMapping( LdapGroupMappingUpdateRequest ldapGroupMappingUpdateRequest )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -158,7 +159,7 @@ public Boolean updateLdapGroupMapping( LdapGroupMappingUpdateRequest ldapGroupMa
log.error( e.getMessage(), e ); log.error( e.getMessage(), e );
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
//------------------ //------------------

View File

@ -32,8 +32,11 @@
import org.apache.archiva.redback.keys.memory.MemoryKeyManager; import org.apache.archiva.redback.keys.memory.MemoryKeyManager;
import org.apache.archiva.redback.policy.AccountLockedException; import org.apache.archiva.redback.policy.AccountLockedException;
import org.apache.archiva.redback.policy.MustChangePasswordException; import org.apache.archiva.redback.policy.MustChangePasswordException;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.AuthenticationKeyResult;
import org.apache.archiva.redback.rest.api.model.ErrorMessage; import org.apache.archiva.redback.rest.api.model.ErrorMessage;
import org.apache.archiva.redback.rest.api.model.LoginRequest; import org.apache.archiva.redback.rest.api.model.LoginRequest;
import org.apache.archiva.redback.rest.api.model.PingResult;
import org.apache.archiva.redback.rest.api.model.User; import org.apache.archiva.redback.rest.api.model.User;
import org.apache.archiva.redback.rest.api.services.LoginService; import org.apache.archiva.redback.rest.api.services.LoginService;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException; import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
@ -87,7 +90,7 @@ public DefaultLoginService( SecuritySystem securitySystem,
} }
public String addAuthenticationKey( String providedKey, String principal, String purpose, int expirationMinutes ) public AuthenticationKeyResult addAuthenticationKey( String providedKey, String principal, String purpose, int expirationMinutes )
throws RedbackServiceException throws RedbackServiceException
{ {
KeyManager keyManager = securitySystem.getKeyManager(); KeyManager keyManager = securitySystem.getKeyManager();
@ -118,19 +121,19 @@ public String addAuthenticationKey( String providedKey, String principal, String
keyManager.addKey( key ); keyManager.addKey( key );
return key.getKey(); return new AuthenticationKeyResult( key.getKey( ) );
} }
public Boolean ping() public PingResult ping()
throws RedbackServiceException throws RedbackServiceException
{ {
return Boolean.TRUE; return new PingResult( true);
} }
public Boolean pingWithAutz() public PingResult pingWithAutz()
throws RedbackServiceException throws RedbackServiceException
{ {
return Boolean.TRUE; return new PingResult( true );
} }
public User logIn( LoginRequest loginRequest ) public User logIn( LoginRequest loginRequest )
@ -220,7 +223,7 @@ public User isLogged()
return isLogged && securitySession.getUser() != null ? buildRestUser( securitySession.getUser() ) : null; return isLogged && securitySession.getUser() != null ? buildRestUser( securitySession.getUser() ) : null;
} }
public Boolean logout() public ActionStatus logout()
throws RedbackServiceException throws RedbackServiceException
{ {
HttpSession httpSession = httpServletRequest.getSession(); HttpSession httpSession = httpServletRequest.getSession();
@ -228,7 +231,7 @@ public Boolean logout()
{ {
httpSession.invalidate(); httpSession.invalidate();
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
private Calendar getNowGMT() private Calendar getNowGMT()

View File

@ -26,11 +26,14 @@
import org.apache.archiva.redback.rbac.RbacManagerException; import org.apache.archiva.redback.rbac.RbacManagerException;
import org.apache.archiva.redback.rbac.Resource; import org.apache.archiva.redback.rbac.Resource;
import org.apache.archiva.redback.rbac.UserAssignment; import org.apache.archiva.redback.rbac.UserAssignment;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.Application; import org.apache.archiva.redback.rest.api.model.Application;
import org.apache.archiva.redback.rest.api.model.ApplicationRoles; import org.apache.archiva.redback.rest.api.model.ApplicationRoles;
import org.apache.archiva.redback.rest.api.model.AvailabilityStatus;
import org.apache.archiva.redback.rest.api.model.ErrorMessage; import org.apache.archiva.redback.rest.api.model.ErrorMessage;
import org.apache.archiva.redback.rest.api.model.Role; import org.apache.archiva.redback.rest.api.model.Role;
import org.apache.archiva.redback.rest.api.model.RoleTemplate; import org.apache.archiva.redback.rest.api.model.RoleTemplate;
import org.apache.archiva.redback.rest.api.model.VerificationStatus;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException; import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
import org.apache.archiva.redback.rest.api.services.RoleManagementService; import org.apache.archiva.redback.rest.api.services.RoleManagementService;
import org.apache.archiva.redback.role.RoleManager; import org.apache.archiva.redback.role.RoleManager;
@ -90,7 +93,7 @@ public DefaultRoleManagementService( RoleManager roleManager,
log.debug( "use userManager impl: {}", userManager.getClass().getName() ); log.debug( "use userManager impl: {}", userManager.getClass().getName() );
} }
public Boolean createTemplatedRole( String templateId, String resource ) public ActionStatus createTemplatedRole( String templateId, String resource )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -101,10 +104,10 @@ public Boolean createTemplatedRole( String templateId, String resource )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean removeTemplatedRole( String templateId, String resource ) public ActionStatus removeTemplatedRole( String templateId, String resource )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -116,10 +119,10 @@ public Boolean removeTemplatedRole( String templateId, String resource )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean updateRole( String templateId, String oldResource, String newResource ) public ActionStatus updateRole( String templateId, String oldResource, String newResource )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -130,10 +133,10 @@ public Boolean updateRole( String templateId, String oldResource, String newReso
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean assignRole( String roleId, String principal ) public ActionStatus assignRole( String roleId, String principal )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -144,10 +147,10 @@ public Boolean assignRole( String roleId, String principal )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean assignRoleByName( String roleName, String principal ) public ActionStatus assignRoleByName( String roleName, String principal )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -158,10 +161,10 @@ public Boolean assignRoleByName( String roleName, String principal )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean assignTemplatedRole( String templateId, String resource, String principal ) public ActionStatus assignTemplatedRole( String templateId, String resource, String principal )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -172,10 +175,10 @@ public Boolean assignTemplatedRole( String templateId, String resource, String p
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean unassignRole( String roleId, String principal ) public ActionStatus unassignRole( String roleId, String principal )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -186,10 +189,10 @@ public Boolean unassignRole( String roleId, String principal )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean unassignRoleByName( String roleName, String principal ) public ActionStatus unassignRoleByName( String roleName, String principal )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -200,15 +203,15 @@ public Boolean unassignRoleByName( String roleName, String principal )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean roleExists( String roleId ) public AvailabilityStatus roleExists( String roleId )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
{ {
return roleManager.roleExists( roleId ); return new AvailabilityStatus( roleManager.roleExists( roleId ) );
} }
catch ( RoleManagerException e ) catch ( RoleManagerException e )
{ {
@ -216,12 +219,12 @@ public Boolean roleExists( String roleId )
} }
} }
public Boolean templatedRoleExists( String templateId, String resource ) public AvailabilityStatus templatedRoleExists( String templateId, String resource )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
{ {
return roleManager.templatedRoleExists( templateId, resource ); return new AvailabilityStatus( roleManager.templatedRoleExists( templateId, resource ) );
} }
catch ( RoleManagerException e ) catch ( RoleManagerException e )
{ {
@ -230,7 +233,7 @@ public Boolean templatedRoleExists( String templateId, String resource )
} }
public Boolean verifyTemplatedRole( String templateId, String resource ) public VerificationStatus verifyTemplatedRole( String templateId, String resource )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -241,7 +244,7 @@ public Boolean verifyTemplatedRole( String templateId, String resource )
{ {
throw new RedbackServiceException( e.getMessage() ); throw new RedbackServiceException( e.getMessage() );
} }
return Boolean.TRUE; return new VerificationStatus( true );
} }
public List<Role> getEffectivelyAssignedRoles( String username ) public List<Role> getEffectivelyAssignedRoles( String username )
@ -460,7 +463,7 @@ public Role getRole( String roleName )
} }
} }
public Boolean updateRoleDescription( String roleName, String description ) public ActionStatus updateRoleDescription( String roleName, String description )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -473,10 +476,10 @@ public Boolean updateRoleDescription( String roleName, String description )
{ {
throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) ); throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean updateRoleUsers( Role role ) public ActionStatus updateRoleUsers( Role role )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -562,7 +565,7 @@ public Boolean updateRoleUsers( Role role )
} }
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public List<ApplicationRoles> getApplicationRoles( String username ) public List<ApplicationRoles> getApplicationRoles( String username )
@ -671,7 +674,7 @@ public List<ApplicationRoles> getApplicationRoles( String username )
} }
} }
public Boolean updateUserRoles( org.apache.archiva.redback.rest.api.model.User user ) public ActionStatus updateUserRoles( org.apache.archiva.redback.rest.api.model.User user )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -736,7 +739,7 @@ public Boolean updateUserRoles( org.apache.archiva.redback.rest.api.model.User u
throw redbackServiceException; throw redbackServiceException;
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }

View File

@ -39,14 +39,19 @@
import org.apache.archiva.redback.rbac.RBACManager; import org.apache.archiva.redback.rbac.RBACManager;
import org.apache.archiva.redback.rbac.RbacManagerException; import org.apache.archiva.redback.rbac.RbacManagerException;
import org.apache.archiva.redback.rbac.UserAssignment; import org.apache.archiva.redback.rbac.UserAssignment;
import org.apache.archiva.redback.rest.api.model.ActionStatus;
import org.apache.archiva.redback.rest.api.model.AvailabilityStatus;
import org.apache.archiva.redback.rest.api.model.ErrorMessage; import org.apache.archiva.redback.rest.api.model.ErrorMessage;
import org.apache.archiva.redback.rest.api.model.Operation; import org.apache.archiva.redback.rest.api.model.Operation;
import org.apache.archiva.redback.rest.api.model.PasswordStatus;
import org.apache.archiva.redback.rest.api.model.Permission; import org.apache.archiva.redback.rest.api.model.Permission;
import org.apache.archiva.redback.rest.api.model.PingResult;
import org.apache.archiva.redback.rest.api.model.RegistrationKey; import org.apache.archiva.redback.rest.api.model.RegistrationKey;
import org.apache.archiva.redback.rest.api.model.ResetPasswordRequest; import org.apache.archiva.redback.rest.api.model.ResetPasswordRequest;
import org.apache.archiva.redback.rest.api.model.Resource; import org.apache.archiva.redback.rest.api.model.Resource;
import org.apache.archiva.redback.rest.api.model.User; import org.apache.archiva.redback.rest.api.model.User;
import org.apache.archiva.redback.rest.api.model.UserRegistrationRequest; import org.apache.archiva.redback.rest.api.model.UserRegistrationRequest;
import org.apache.archiva.redback.rest.api.model.VerificationStatus;
import org.apache.archiva.redback.rest.api.services.RedbackServiceException; import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
import org.apache.archiva.redback.rest.api.services.UserService; import org.apache.archiva.redback.rest.api.services.UserService;
import org.apache.archiva.redback.rest.services.utils.PasswordValidator; import org.apache.archiva.redback.rest.services.utils.PasswordValidator;
@ -141,7 +146,8 @@ public DefaultUserService( @Named( value = "userManager#default" ) UserManager u
} }
public Boolean createUser( User user ) @Override
public ActionStatus createUser( User user )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -216,10 +222,11 @@ public Boolean createUser( User user )
{ {
throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) ); throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean deleteUser( String username ) @Override
public ActionStatus deleteUser( String username )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -241,7 +248,7 @@ public Boolean deleteUser( String username )
try try
{ {
userManager.deleteUser( username ); userManager.deleteUser( username );
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
catch ( UserNotFoundException e ) catch ( UserNotFoundException e )
{ {
@ -259,6 +266,7 @@ public Boolean deleteUser( String username )
} }
@Override
public User getUser( String username ) public User getUser( String username )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -277,6 +285,7 @@ public User getUser( String username )
} }
} }
@Override
public List<User> getUsers() public List<User> getUsers()
throws RedbackServiceException throws RedbackServiceException
{ {
@ -298,7 +307,8 @@ public List<User> getUsers()
} }
} }
public Boolean updateMe( User user ) @Override
public ActionStatus updateMe( User user )
throws RedbackServiceException throws RedbackServiceException
{ {
// check username == one in the session // check username == one in the session
@ -365,10 +375,11 @@ public Boolean updateMe( User user )
updateUser( realUser ); updateUser( realUser );
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean updateUser( User user ) @Override
public ActionStatus updateUser( User user )
throws RedbackServiceException throws RedbackServiceException
{ {
try try
@ -383,7 +394,7 @@ public Boolean updateUser( User user )
rawUser.setPermanent( user.isPermanent() ); rawUser.setPermanent( user.isPermanent() );
userManager.updateUser( rawUser ); userManager.updateUser( rawUser );
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
catch ( UserNotFoundException e ) catch ( UserNotFoundException e )
{ {
@ -395,7 +406,8 @@ public Boolean updateUser( User user )
} }
} }
public int removeFromCache( String userName ) @Override
public ActionStatus removeFromCache( String userName )
throws RedbackServiceException throws RedbackServiceException
{ {
if ( userAssignmentsCache != null ) if ( userAssignmentsCache != null )
@ -421,9 +433,10 @@ public int removeFromCache( String userName )
} }
} }
return 0; return ActionStatus.SUCCESS;
} }
@Override
public User getGuestUser() public User getGuestUser()
throws RedbackServiceException throws RedbackServiceException
{ {
@ -438,6 +451,7 @@ public User getGuestUser()
} }
} }
@Override
public User createGuestUser() public User createGuestUser()
throws RedbackServiceException throws RedbackServiceException
{ {
@ -475,10 +489,11 @@ public User createGuestUser()
} }
} }
public Boolean ping() @Override
public PingResult ping()
throws RedbackServiceException throws RedbackServiceException
{ {
return Boolean.TRUE; return new PingResult( true );
} }
private User getSimpleUser( org.apache.archiva.redback.users.User user ) private User getSimpleUser( org.apache.archiva.redback.users.User user )
@ -490,12 +505,13 @@ private User getSimpleUser( org.apache.archiva.redback.users.User user )
return new User( user ); return new User( user );
} }
public Boolean createAdminUser( User adminUser ) @Override
public ActionStatus createAdminUser( User adminUser )
throws RedbackServiceException throws RedbackServiceException
{ {
if ( isAdminUserExists() ) if ( isAdminUserExists().isExists() )
{ {
return Boolean.FALSE; return ActionStatus.FAIL;
} }
log.debug("Creating admin admin user '{}'", adminUser.getUsername()); log.debug("Creating admin admin user '{}'", adminUser.getUsername());
if (!RedbackRoleConstants.ADMINISTRATOR_ACCOUNT_NAME.equals(adminUser.getUsername())) { if (!RedbackRoleConstants.ADMINISTRATOR_ACCOUNT_NAME.equals(adminUser.getUsername())) {
@ -526,16 +542,17 @@ public Boolean createAdminUser( User adminUser )
{ {
throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) ); throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
public Boolean isAdminUserExists() @Override
public AvailabilityStatus isAdminUserExists()
throws RedbackServiceException throws RedbackServiceException
{ {
try try
{ {
userManager.findUser( config.getString( UserConfigurationKeys.DEFAULT_ADMIN ) ); userManager.findUser( config.getString( UserConfigurationKeys.DEFAULT_ADMIN ) );
return Boolean.TRUE; return new AvailabilityStatus( true );
} }
catch ( UserNotFoundException e ) catch ( UserNotFoundException e )
{ {
@ -547,14 +564,15 @@ public Boolean isAdminUserExists()
if ( cause != null && cause instanceof UserNotFoundException ) if ( cause != null && cause instanceof UserNotFoundException )
{ {
return Boolean.FALSE; return new AvailabilityStatus( false );
} }
throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) ); throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) );
} }
return Boolean.FALSE; return new AvailabilityStatus( false );
} }
public Boolean resetPassword( ResetPasswordRequest resetPasswordRequest ) @Override
public ActionStatus resetPassword( ResetPasswordRequest resetPasswordRequest )
throws RedbackServiceException throws RedbackServiceException
{ {
String username = resetPasswordRequest.getUsername(); String username = resetPasswordRequest.getUsername();
@ -598,9 +616,10 @@ public Boolean resetPassword( ResetPasswordRequest resetPasswordRequest )
throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) ); throw new RedbackServiceException( new ErrorMessage( e.getMessage() ) );
} }
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
@Override
public RegistrationKey registerUser( UserRegistrationRequest userRegistrationRequest ) public RegistrationKey registerUser( UserRegistrationRequest userRegistrationRequest )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -715,7 +734,8 @@ public RegistrationKey registerUser( UserRegistrationRequest userRegistrationReq
} }
public Boolean validateUserFromKey( String key ) @Override
public VerificationStatus validateUserFromKey( String key )
throws RedbackServiceException throws RedbackServiceException
{ {
String principal = null; String principal = null;
@ -744,7 +764,7 @@ public Boolean validateUserFromKey( String key )
log.info( "account validated for user {}", user.getUsername() ); log.info( "account validated for user {}", user.getUsername() );
return Boolean.TRUE; return new VerificationStatus( true );
} }
catch ( MustChangePasswordException | AccountLockedException | AuthenticationException e ) catch ( MustChangePasswordException | AccountLockedException | AuthenticationException e )
{ {
@ -771,6 +791,7 @@ public Boolean validateUserFromKey( String key )
} }
} }
@Override
public Collection<Permission> getCurrentUserPermissions() public Collection<Permission> getCurrentUserPermissions()
throws RedbackServiceException throws RedbackServiceException
{ {
@ -788,6 +809,7 @@ public Collection<Permission> getCurrentUserPermissions()
return getUserPermissions( userName ); return getUserPermissions( userName );
} }
@Override
public Collection<Operation> getCurrentUserOperations() public Collection<Operation> getCurrentUserOperations()
throws RedbackServiceException throws RedbackServiceException
{ {
@ -805,6 +827,7 @@ public Collection<Operation> getCurrentUserOperations()
return getUserOperations( userName ); return getUserOperations( userName );
} }
@Override
public Collection<Operation> getUserOperations( String userName ) public Collection<Operation> getUserOperations( String userName )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -822,6 +845,7 @@ public Collection<Operation> getUserOperations( String userName )
return operations; return operations;
} }
@Override
public Collection<Permission> getUserPermissions( String userName ) public Collection<Permission> getUserPermissions( String userName )
throws RedbackServiceException throws RedbackServiceException
{ {
@ -950,7 +974,8 @@ private String getBaseUrl()
return null; return null;
} }
public Boolean unlockUser( String username ) @Override
public ActionStatus unlockUser( String username )
throws RedbackServiceException throws RedbackServiceException
{ {
User user = getUser( username ); User user = getUser( username );
@ -958,12 +983,13 @@ public Boolean unlockUser( String username )
{ {
user.setLocked( false ); user.setLocked( false );
updateUser( user ); updateUser( user );
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
return Boolean.FALSE; return ActionStatus.FAIL;
} }
public Boolean lockUser( String username ) @Override
public ActionStatus lockUser( String username )
throws RedbackServiceException throws RedbackServiceException
{ {
User user = getUser( username ); User user = getUser( username );
@ -971,12 +997,13 @@ public Boolean lockUser( String username )
{ {
user.setLocked( true ); user.setLocked( true );
updateUser( user ); updateUser( user );
return Boolean.TRUE; return ActionStatus.SUCCESS;
} }
return Boolean.FALSE; return ActionStatus.FAIL;
} }
public Boolean passwordChangeRequired( String username ) @Override
public PasswordStatus passwordChangeRequired( String username )
throws RedbackServiceException throws RedbackServiceException
{ {
User user = getUser( username ); User user = getUser( username );
@ -984,21 +1011,9 @@ public Boolean passwordChangeRequired( String username )
{ {
user.setPasswordChangeRequired( true ); user.setPasswordChangeRequired( true );
updateUser( user ); updateUser( user );
return Boolean.TRUE; return new PasswordStatus( true );
} }
return Boolean.FALSE; return new PasswordStatus( false );
} }
public Boolean passwordChangeNotRequired( String username )
throws RedbackServiceException
{
User user = getUser( username );
if ( user == null )
{
user.setPasswordChangeRequired( false );
updateUser( user );
return Boolean.TRUE;
}
return Boolean.FALSE;
}
} }

View File

@ -20,11 +20,14 @@
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.eclipse.jetty.util.annotation.Name;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
/** /**
* to setup some ObjectMapper configuration * to setup some ObjectMapper configuration
@ -38,10 +41,12 @@ public class JacksonJsonConfigurator
private Logger log = LoggerFactory.getLogger( getClass() ); private Logger log = LoggerFactory.getLogger( getClass() );
@Inject @Inject
public JacksonJsonConfigurator( ObjectMapper objectMapper ) public JacksonJsonConfigurator( @Named("redbackJacksonJsonMapper") ObjectMapper objectMapper,
@Name( "redbackJacksonXMLMapper" ) XmlMapper xmlMapper)
{ {
log.info( "configure jackson ObjectMapper" ); log.info( "configure jackson ObjectMapper" );
objectMapper.disable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES ); objectMapper.disable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES );
xmlMapper.disable( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES );
} }
} }

View File

@ -0,0 +1 @@
org.apache.cxf.common.logging.Slf4jLogger

View File

@ -40,12 +40,17 @@
base-package="org.apache.archiva.redback.rest.services"/> base-package="org.apache.archiva.redback.rest.services"/>
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"> <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
<property name="mapper" ref="redbackJacksonMapper"/> <property name="mapper" ref="redbackJacksonJsonMapper"/>
</bean> </bean>
<bean id="redbackJacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> <bean id="xmlProvider" class="com.fasterxml.jackson.jaxrs.xml.JacksonJaxbXMLProvider">
<property name="mapper" ref="redbackJacksonXMLMapper"/>
</bean> </bean>
<bean id="redbackJacksonJsonMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />
<bean id="redbackJacksonXMLMapper" class="com.fasterxml.jackson.dataformat.xml.XmlMapper" />
<jaxrs:server id="redbackServices" address="/redbackServices"> <jaxrs:server id="redbackServices" address="/redbackServices">
<jaxrs:serviceBeans> <jaxrs:serviceBeans>
@ -59,6 +64,7 @@
<jaxrs:providers> <jaxrs:providers>
<ref bean="jsonProvider"/> <ref bean="jsonProvider"/>
<ref bean="xmlProvider"/>
<ref bean="authenticationInterceptor#rest"/> <ref bean="authenticationInterceptor#rest"/>
<ref bean="permissionInterceptor#rest"/> <ref bean="permissionInterceptor#rest"/>
<ref bean="redbackServiceExceptionMapper"/> <ref bean="redbackServiceExceptionMapper"/>

View File

@ -161,7 +161,7 @@ public void startServer()
adminUser.setPassword( FakeCreateAdminServiceImpl.ADMIN_TEST_PWD ); adminUser.setPassword( FakeCreateAdminServiceImpl.ADMIN_TEST_PWD );
adminUser.setFullName( "the admin user" ); adminUser.setFullName( "the admin user" );
adminUser.setEmail( "toto@toto.fr" ); adminUser.setEmail( "toto@toto.fr" );
Boolean res = userService.createAdminUser( adminUser ); Boolean res = userService.createAdminUser( adminUser ).isSuccess();
FakeCreateAdminService fakeCreateAdminService = getFakeCreateAdminService(); FakeCreateAdminService fakeCreateAdminService = getFakeCreateAdminService();
//assertTrue( res.booleanValue() ); //assertTrue( res.booleanValue() );

View File

@ -49,8 +49,8 @@ public class RoleManagementServiceTest
public void roleExist() public void roleExist()
throws Exception throws Exception
{ {
assertTrue( getRoleManagementService( authorizationHeader ).roleExists( "guest" ) ); assertTrue( getRoleManagementService( authorizationHeader ).roleExists( "guest" ).isExists() );
assertFalse( getRoleManagementService( authorizationHeader ).roleExists( "foo" ) ); assertFalse( getRoleManagementService( authorizationHeader ).roleExists( "foo" ).isExists() );
} }
@Test( expected = ForbiddenException.class ) @Test( expected = ForbiddenException.class )
@ -59,7 +59,7 @@ public void roleExistBadAuthz()
{ {
try try
{ {
assertTrue( getRoleManagementService( null ).roleExists( "guest" ) ); assertTrue( getRoleManagementService( null ).roleExists( "guest" ).isExists() );
} }
catch ( ForbiddenException e ) catch ( ForbiddenException e )
{ {

View File

@ -59,7 +59,7 @@ public class UserServiceTest
public void ping() public void ping()
throws Exception throws Exception
{ {
Boolean res = getUserService().ping(); Boolean res = getUserService().ping().isSuccess();
assertTrue( res.booleanValue() ); assertTrue( res.booleanValue() );
} }
@ -167,7 +167,7 @@ public void register()
assertThat( messageContent ).contains( "Use the following URL to validate your account." ).contains( assertThat( messageContent ).contains( "Use the following URL to validate your account." ).contains(
"http://wine.fr/bordeaux" ).containsIgnoringCase( "toto" ); "http://wine.fr/bordeaux" ).containsIgnoringCase( "toto" );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
service = getUserService( authorizationHeader ); service = getUserService( authorizationHeader );
@ -177,7 +177,7 @@ public void register()
assertTrue( u.isValidated() ); assertTrue( u.isValidated() );
assertTrue( u.isPasswordChangeRequired() ); assertTrue( u.isPasswordChangeRequired() );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
} }
catch ( Exception e ) catch ( Exception e )
@ -226,7 +226,7 @@ public void registerNoUrl()
assertThat( messageContent ).contains( "Use the following URL to validate your account." ).contains( assertThat( messageContent ).contains( "Use the following URL to validate your account." ).contains(
"http://localhost:" + getServerPort() ).containsIgnoringCase( "toto" ); "http://localhost:" + getServerPort() ).containsIgnoringCase( "toto" );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
service = getUserService( authorizationHeader ); service = getUserService( authorizationHeader );
@ -236,7 +236,7 @@ public void registerNoUrl()
assertTrue( u.isValidated() ); assertTrue( u.isValidated() );
assertTrue( u.isPasswordChangeRequired() ); assertTrue( u.isPasswordChangeRequired() );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
} }
catch ( Exception e ) catch ( Exception e )
@ -284,7 +284,7 @@ public void resetPassword()
assertTrue( assertTrue(
emailMessages.get( 0 ).getText().contains( "Use the following URL to validate your account." ) ); emailMessages.get( 0 ).getText().contains( "Use the following URL to validate your account." ) );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
service = getUserService( authorizationHeader ); service = getUserService( authorizationHeader );
@ -294,9 +294,9 @@ public void resetPassword()
assertTrue( u.isValidated() ); assertTrue( u.isValidated() );
assertTrue( u.isPasswordChangeRequired() ); assertTrue( u.isPasswordChangeRequired() );
assertTrue( service.validateUserFromKey( key ) ); assertTrue( service.validateUserFromKey( key ).isSuccess() );
assertTrue( service.resetPassword( new ResetPasswordRequest( "toto", "http://foo.fr/bar" ) ) ); assertTrue( service.resetPassword( new ResetPasswordRequest( "toto", "http://foo.fr/bar" ) ).isSuccess() );
emailMessages = assertService.getEmailMessageSended(); emailMessages = assertService.getEmailMessageSended();
assertEquals( 2, emailMessages.size() ); assertEquals( 2, emailMessages.size() );