package edu.mayo.cts2.framework.webapp.rest.controller; import javax.annotation.Resource; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import edu.mayo.cts2.framework.core.constants.URIHelperInterface; import edu.mayo.cts2.framework.model.core.ChangeableElementGroup; import edu.mayo.cts2.framework.model.core.IsChangeable; import edu.mayo.cts2.framework.model.core.types.ChangeType; import edu.mayo.cts2.framework.model.service.exception.UnknownChangeSet; import edu.mayo.cts2.framework.service.profile.BaseMaintenanceService; @Component public class CreateHandler extends AbstractMainenanceHandler { @Resource private UrlTemplateBindingCreator urlTemplateBindingCreator; protected <T extends IsChangeable,R extends IsChangeable> T create( R resource, String changeSetUri, String urlTemplate, UrlTemplateBinder<T> template, BaseMaintenanceService<T,R,?> service){ ChangeableElementGroup group = resource.getChangeableElementGroup(); if(group == null){ group = this.createChangeableElementGroup(changeSetUri, ChangeType.CREATE); resource.setChangeableElementGroup(group); } else if(group.getChangeDescription() == null){ group.setChangeDescription(this.createChangeDescription(changeSetUri, ChangeType.CREATE)); } if(StringUtils.isBlank(group.getChangeDescription().getContainingChangeSet())){ throw new UnknownChangeSet(); } T returnedResource = service.createResource(resource); return returnedResource; } protected <R> ResponseEntity<Void> createResponseEntity( R returnedResource, String changeSetUri, String urlTemplate, UrlTemplateBinder<R> template){ String location = this.urlTemplateBindingCreator.bindResourceToUrlTemplate( template, returnedResource, urlTemplate); if(StringUtils.isNotBlank(changeSetUri)){ location = location + ("?" + URIHelperInterface.PARAM_CHANGESETCONTEXT + "=" + changeSetUri); } return this.createResponseEntity(location); } protected <R> ResponseEntity<Void> createResponseEntity( String location){ HttpHeaders responseHeaders = new HttpHeaders(); location = StringUtils.removeStart(location, "/"); responseHeaders.set("Location", location); return new ResponseEntity<Void>(responseHeaders, HttpStatus.CREATED); } }