dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #20799
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 9670: FRED-API: support sending ETag when doing PUT, this is used to check that there have been no modi...
------------------------------------------------------------
revno: 9670
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Thu 2013-01-31 11:12:32 +0700
message:
FRED-API: support sending ETag when doing PUT, this is used to check that there have been no modification since the client last got the facility
modified:
dhis-2/dhis-web/dhis-web-api-fred/src/main/java/org/hisp/dhis/web/webapi/v1/controller/FacilityController.java
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-web/dhis-web-api-fred/src/main/java/org/hisp/dhis/web/webapi/v1/controller/FacilityController.java'
--- dhis-2/dhis-web/dhis-web-api-fred/src/main/java/org/hisp/dhis/web/webapi/v1/controller/FacilityController.java 2013-01-31 03:22:50 +0000
+++ dhis-2/dhis-web/dhis-web-api-fred/src/main/java/org/hisp/dhis/web/webapi/v1/controller/FacilityController.java 2013-01-31 04:12:32 +0000
@@ -28,6 +28,7 @@
*/
import org.apache.commons.lang3.StringEscapeUtils;
+import org.codehaus.jackson.map.ObjectMapper;
import org.hisp.dhis.api.controller.organisationunit.OrganisationUnitLevelController;
import org.hisp.dhis.common.DeleteNotAllowedException;
import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator;
@@ -42,6 +43,7 @@
import org.hisp.dhis.web.webapi.v1.domain.Facility;
import org.hisp.dhis.web.webapi.v1.utils.ContextUtils;
import org.hisp.dhis.web.webapi.v1.utils.MessageResponseUtils;
+import org.hisp.dhis.web.webapi.v1.utils.ObjectMapperFactoryBean;
import org.hisp.dhis.web.webapi.v1.utils.ValidationUtils;
import org.hisp.dhis.web.webapi.v1.validation.group.Create;
import org.hisp.dhis.web.webapi.v1.validation.group.Update;
@@ -54,6 +56,7 @@
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
+import org.springframework.util.DigestUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
@@ -444,9 +447,17 @@
// PUT JSON
//--------------------------------------------------------------------------
+ protected String generateETagHeaderValue( byte[] bytes )
+ {
+ StringBuilder builder = new StringBuilder( "\"0" );
+ DigestUtils.appendMd5DigestAsHex( bytes, builder );
+ builder.append( '"' );
+ return builder.toString();
+ }
+
@RequestMapping( value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE )
@PreAuthorize( "hasRole('F_FRED_UPDATE') or hasRole('ALL')" )
- public ResponseEntity<String> updateFacility( @PathVariable String id, @RequestBody Facility facility ) throws IOException
+ public ResponseEntity<String> updateFacility( @PathVariable String id, @RequestBody Facility facility, HttpServletRequest request ) throws Exception
{
facility.setId( id );
Set<ConstraintViolation<Facility>> constraintViolations = validator.validate( facility, Default.class, Update.class );
@@ -459,18 +470,35 @@
if ( constraintViolations.isEmpty() )
{
OrganisationUnit organisationUnit = conversionService.convert( facility, OrganisationUnit.class );
- OrganisationUnit ou = organisationUnitService.getOrganisationUnit( facility.getId() );
-
- if ( ou == null )
+ OrganisationUnit old_organisationUnit = organisationUnitService.getOrganisationUnit( facility.getId() );
+
+ if ( request.getHeader( "ETag" ) != null )
+ {
+ Facility old_facility = conversionService.convert( old_organisationUnit, Facility.class );
+ List<OrganisationUnitLevel> organisationUnitLevels = organisationUnitService.getOrganisationUnitLevels();
+ addHierarchyPropertyToFacility( organisationUnitLevels, organisationUnit, old_facility );
+ ObjectMapper objectMapper = new ObjectMapperFactoryBean().getObject();
+ String body = objectMapper.writeValueAsString( old_facility );
+
+ String ETag = generateETagHeaderValue( body.getBytes() );
+
+ if ( !ETag.equals( request.getHeader( "ETag" ) ) )
+ {
+ return new ResponseEntity<String>( MessageResponseUtils.jsonMessage( "ETag provided does not match current ETag of facility" ),
+ headers, HttpStatus.PRECONDITION_FAILED );
+ }
+ }
+
+ if ( old_organisationUnit == null )
{
return new ResponseEntity<String>( MessageResponseUtils.jsonMessage( "No object with that identifier exists." ),
headers, HttpStatus.NOT_FOUND );
}
- else if ( !ou.getName().equals( organisationUnit.getName() ) )
+ else if ( !old_organisationUnit.getName().equals( organisationUnit.getName() ) )
{
OrganisationUnit ouByName = organisationUnitService.getOrganisationUnitByName( organisationUnit.getName() );
- if ( ouByName != null && !ou.getUid().equals( ouByName.getUid() ) )
+ if ( ouByName != null && !old_organisationUnit.getUid().equals( ouByName.getUid() ) )
{
return new ResponseEntity<String>( MessageResponseUtils.jsonMessage( "Another object with the same name already exists." ),
headers, HttpStatus.CONFLICT );
@@ -480,27 +508,27 @@
{
OrganisationUnit ouByCode = organisationUnitService.getOrganisationUnitByCode( organisationUnit.getCode() );
- if ( ouByCode != null && !ou.getUid().equals( ouByCode.getUid() ) )
+ if ( ouByCode != null && !old_organisationUnit.getUid().equals( ouByCode.getUid() ) )
{
return new ResponseEntity<String>( MessageResponseUtils.jsonMessage( "Another object with the same code already exists." ),
headers, HttpStatus.CONFLICT );
}
}
- ou.setName( organisationUnit.getName() );
- ou.setShortName( organisationUnit.getShortName() );
- ou.setCode( organisationUnit.getCode() );
- ou.setFeatureType( organisationUnit.getFeatureType() );
- ou.setCoordinates( organisationUnit.getCoordinates() );
- ou.setParent( organisationUnit.getParent() );
- ou.setActive( organisationUnit.isActive() );
+ old_organisationUnit.setName( organisationUnit.getName() );
+ old_organisationUnit.setShortName( organisationUnit.getShortName() );
+ old_organisationUnit.setCode( organisationUnit.getCode() );
+ old_organisationUnit.setFeatureType( organisationUnit.getFeatureType() );
+ old_organisationUnit.setCoordinates( organisationUnit.getCoordinates() );
+ old_organisationUnit.setParent( organisationUnit.getParent() );
+ old_organisationUnit.setActive( organisationUnit.isActive() );
- ou.removeAllDataSets();
- organisationUnitService.updateOrganisationUnit( ou );
+ old_organisationUnit.removeAllDataSets();
+ organisationUnitService.updateOrganisationUnit( old_organisationUnit );
for ( DataSet dataSet : organisationUnit.getDataSets() )
{
- dataSet.addOrganisationUnit( ou );
+ dataSet.addOrganisationUnit( old_organisationUnit );
dataSetService.updateDataSet( dataSet );
}