Skip to content

Commit

Permalink
Merge pull request #23 from indigo-dc/spring-boot
Browse files Browse the repository at this point in the history
small fixes
  • Loading branch information
bertl4398 authored Jun 21, 2016
2 parents 4e24383 + 43a63ea commit efc5b0d
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 107 deletions.
Binary file modified libs/cdmi-spi-0.0.1-SNAPSHOT.jar
Binary file not shown.
238 changes: 139 additions & 99 deletions src/main/java/edu/kit/scc/CdmiRestController.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import edu.kit.scc.http.HttpResponse;

import org.apache.commons.codec.binary.Base64;
import org.indigo.cdmi.BackEndException;
import org.indigo.cdmi.CdmiObjectStatus;
import org.indigo.cdmi.ConfigurableStorageBackend;
import org.indigo.cdmi.spi.StorageBackend;
Expand Down Expand Up @@ -47,6 +46,7 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.HandlerMapping;

import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
Expand Down Expand Up @@ -114,8 +114,7 @@ void init() {
* @param request the {@link HttpServletRequest}
* @return a JSON serialized {@link Domain} object
*/
@RequestMapping(path = "/cdmi_domains/**", method = RequestMethod.GET,
produces = {"application/cdmi-domain"})
@RequestMapping(path = "/cdmi_domains/**", method = RequestMethod.GET)
public ResponseEntity<?> getDomains(@RequestHeader("Authorization") String authorizationHeader,
HttpServletRequest request) {

Expand Down Expand Up @@ -143,8 +142,7 @@ public ResponseEntity<?> getDomains(@RequestHeader("Authorization") String autho
* @param request the {@link HttpServletRequest}
* @return a JSON serialized {@link Capability} object
*/
@RequestMapping(path = "/cdmi_capabilities/**", method = RequestMethod.GET,
produces = {"application/cdmi-capability"})
@RequestMapping(path = "/cdmi_capabilities/**", method = RequestMethod.GET)
public ResponseEntity<?> getCapabilities(
@RequestHeader("Authorization") String authorizationHeader, HttpServletRequest request) {

Expand Down Expand Up @@ -187,9 +185,7 @@ public ResponseEntity<?> getCapabilities(
* @param request the {@link HttpServletRequest}
* @return a JSON serialized {@link CdmiObject}
*/
@RequestMapping(path = "/cdmi_objectid/{objectId}", method = RequestMethod.GET,
produces = {"application/cdmi-object", "application/cdmi-container",
"application/cdmi-domain", "application/cdmi-capability"})
@RequestMapping(path = "/cdmi_objectid/{objectId}", method = RequestMethod.GET)
public ResponseEntity<?> getCdmiObjectById(
@RequestHeader("Authorization") String authorizationHeader, @PathVariable String objectId,
HttpServletRequest request) {
Expand All @@ -214,6 +210,10 @@ public ResponseEntity<?> getCdmiObjectById(
if (cdmiObject instanceof Container) {
responseHeaders.setContentType(new MediaType("application", "cdmi-container"));
Container container = (Container) cdmiObject;

// storage back-end integration
getCurrentStatusFromStorageBackend(container);

if (query != null) {
objectString = filterQueryFields(container.toJson(), query).toString();
} else {
Expand All @@ -222,6 +222,10 @@ public ResponseEntity<?> getCdmiObjectById(
} else if (cdmiObject instanceof DataObject) {
responseHeaders.setContentType(new MediaType("application", "cdmi-object"));
DataObject dataObject = (DataObject) cdmiObject;

// storage back-end integration
getCurrentStatusFromStorageBackend(dataObject);

if (query != null) {
objectString = filterQueryFields(dataObject.toJson(), query).toString();
} else {
Expand Down Expand Up @@ -255,8 +259,7 @@ public ResponseEntity<?> getCdmiObjectById(
* @param request the {@link HttpServletRequest}
* @return a JSON serialized {@link Container} or {@link DataObject}
*/
@RequestMapping(path = "/**", method = RequestMethod.GET,
produces = {"application/cdmi-object", "application/cdmi-container"})
@RequestMapping(path = "/**", method = RequestMethod.GET)
public ResponseEntity<?> getCdmiObjectByPath(
@RequestHeader("Authorization") String authorizationHeader, HttpServletRequest request) {

Expand All @@ -283,13 +286,10 @@ public ResponseEntity<?> getCdmiObjectByPath(
if (cdmiObject instanceof Container) {
responseHeaders.setContentType(new MediaType("application", "cdmi-container"));
Container container = (Container) cdmiObject;
// add information from storage back-end
if (storageBackend != null) {
CdmiObjectStatus status = storageBackend.getCurrentStatus(path);
for (Entry<String, String> entry : status.getMonitoredAttributes().entrySet()) {
container.getMetadata().put(entry.getKey(), entry.getValue());
}
}

// storage back-end integration
getCurrentStatusFromStorageBackend(container);

if (query != null) {
objectString = filterQueryFields(container.toJson(), query).toString();
} else {
Expand All @@ -298,13 +298,10 @@ public ResponseEntity<?> getCdmiObjectByPath(
} else if (cdmiObject instanceof DataObject) {
responseHeaders.setContentType(new MediaType("application", "cdmi-object"));
DataObject dataObject = (DataObject) cdmiObject;
// add information from storage back-end
if (storageBackend != null) {
CdmiObjectStatus status = storageBackend.getCurrentStatus(path);
for (Entry<String, String> entry : status.getMonitoredAttributes().entrySet()) {
dataObject.getMetadata().put(entry.getKey(), entry.getValue());
}
}

// storage back-end integration
getCurrentStatusFromStorageBackend(dataObject);

if (query != null) {
objectString = filterQueryFields(dataObject.toJson(), query).toString();
} else {
Expand Down Expand Up @@ -339,8 +336,7 @@ public ResponseEntity<?> getCdmiObjectByPath(
* @return a JSON serialized {@link Container} or {@link DataObject}
*/
@RequestMapping(path = "/**", method = RequestMethod.PUT,
consumes = {"application/cdmi-object", "application/cdmi-container", "application/json"},
produces = {"application/cdmi-object", "application/cdmi-container"})
consumes = {"application/cdmi-object", "application/cdmi-container", "application/json"})
public ResponseEntity<?> putCdmiObject(@RequestHeader("Authorization") String authorizationHeader,
@RequestHeader("Content-Type") String contentType, @RequestBody String body,
HttpServletRequest request) {
Expand All @@ -360,6 +356,81 @@ public ResponseEntity<?> putCdmiObject(@RequestHeader("Authorization") String au

CdmiObject cdmiObject = cdmiObjectDao.getCdmiObjectByPath(path);

CdmiObject newCdmiObject = updateOrCreate(cdmiObject, path, body, contentType);

if (newCdmiObject instanceof Container) {
if (cdmiObject instanceof Container) {
return new ResponseEntity<String>(((Container) newCdmiObject).toJson().toString(),
responseHeaders, HttpStatus.ACCEPTED);
}
return new ResponseEntity<String>(((Container) newCdmiObject).toJson().toString(),
responseHeaders, HttpStatus.CREATED);
} else if (newCdmiObject instanceof DataObject) {
if (cdmiObject instanceof DataObject) {
return new ResponseEntity<String>(((DataObject) newCdmiObject).toJson().toString(),
responseHeaders, HttpStatus.ACCEPTED);
}
return new ResponseEntity<String>(((DataObject) newCdmiObject).toJson().toString(),
responseHeaders, HttpStatus.CREATED);
}
if (newCdmiObject == null) {
return new ResponseEntity<String>("Object could not be created", responseHeaders,
HttpStatus.CONFLICT);
}
return new ResponseEntity<String>("Bad request", responseHeaders, HttpStatus.BAD_REQUEST);
}

/**
* Delete path endpoint.
*
* @param request the {@link HttpServletRequest}
* @return a {@link ResponseEntity}
*/
@RequestMapping(path = "/**", method = RequestMethod.DELETE)
public ResponseEntity<?> deleteCdmiObject(
@RequestHeader("Authorization") String authorizationHeader, HttpServletRequest request) {

HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("X-CDMI-Specification-Version", "1.1.1");

if (!verifyAuthorization(authorizationHeader)) {
return new ResponseEntity<>(responseHeaders, HttpStatus.UNAUTHORIZED);
}

String path =
(String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);

log.debug("Delete path {}", path);

CdmiObject cdmiObject = cdmiObjectDao.getCdmiObjectByPath(path);

if (cdmiObject != null) {
if (cdmiObject instanceof Container) {
Container container = containerDao.deleteByPath(path);
if (container != null) {
return new ResponseEntity<String>("Container deleted", responseHeaders,
HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<String>("Container could not be deleted", responseHeaders,
HttpStatus.CONFLICT);
}
} else if (cdmiObject instanceof DataObject) {
DataObject dataObject = dataObjectDao.deleteByPath(path);
if (dataObject != null) {
return new ResponseEntity<String>("Data object deleted", responseHeaders,
HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<String>("Data object could not be deleted", responseHeaders,
HttpStatus.CONFLICT);
}
}
}
return new ResponseEntity<String>("Not found", responseHeaders, HttpStatus.NOT_FOUND);
}

private CdmiObject updateOrCreate(CdmiObject cdmiObject, String path, String body,
String contentType) {
// create or update container
if (contentType.contains(MediaTypes.CONTAINER)) {
if (cdmiObject != null && (cdmiObject instanceof Container)) {
log.debug("Update container...");
Expand All @@ -372,33 +443,25 @@ public ResponseEntity<?> putCdmiObject(@RequestHeader("Authorization") String au
if (updateJson.has("capabilitiesURI")) {
// Change of QoS
try {
storageBackend.updateCdmiObject(path, updateJson.getString("capabilitiesURI"));
existingContainer.getMetadata().put("cdmi_capabilities_target",
storageBackend.updateCdmiObject(path, existingContainer.getCapabilitiesUri(),
updateJson.getString("capabilitiesURI"));
} catch (JSONException ex) {
ex.printStackTrace();
} catch (BackEndException ex) {
ex.printStackTrace();
existingContainer.setCapabilitiesUri(updateJson.getString("capabilitiesURI"));
} catch (Exception ex) {
ex.printStackTrace();
log.warn("WARNING: could not trigger QoS change for configured storage back-end {}",
backendType);
}
}
Container updatedContainer = (Container) cdmiObjectDao.updateCdmiObject(existingContainer);
return new ResponseEntity<String>(updatedContainer.toJson().toString(), responseHeaders,
HttpStatus.ACCEPTED);
return updatedContainer;
} else {
log.debug("Create container...");
Container containerRequest = Container.fromJson(new JSONObject(body));
Container createdContainer = containerDao.createByPath(path, containerRequest);
if (createdContainer != null) {
return new ResponseEntity<String>(createdContainer.toJson().toString(), responseHeaders,
HttpStatus.CREATED);
} else {
return new ResponseEntity<String>("Container could not be created", responseHeaders,
HttpStatus.CONFLICT);
}
return createdContainer;
}
}
// create or update data object
if (contentType.contains(MediaTypes.DATA_OBJECT)) {
if (cdmiObject != null && (cdmiObject instanceof DataObject)) {
log.debug("Update data object...");
Expand All @@ -411,15 +474,13 @@ public ResponseEntity<?> putCdmiObject(@RequestHeader("Authorization") String au
if (updateJson.has("capabilitiesURI")) {
// Change of QoS
try {
storageBackend.updateCdmiObject(path, updateJson.getString("capabilitiesURI"));
existingDataObject.getMetadata().put("cdmi_capabilities_target",
storageBackend.updateCdmiObject(path, existingDataObject.getCapabilitiesUri(),
updateJson.getString("capabilitiesURI"));
} catch (JSONException ex) {
ex.printStackTrace();
} catch (BackEndException ex) {
ex.printStackTrace();
existingDataObject.setCapabilitiesUri(updateJson.getString("capabilitiesURI"));
} catch (Exception ex) {
ex.printStackTrace();
log.warn("WARNING: could not trigger QoS change for configured storage back-end {}",
backendType);
}
}
if (updateJson.has("value")) {
Expand All @@ -428,70 +489,49 @@ public ResponseEntity<?> putCdmiObject(@RequestHeader("Authorization") String au
}
DataObject updatedDataObject =
(DataObject) cdmiObjectDao.updateCdmiObject(existingDataObject);
return new ResponseEntity<String>(updatedDataObject.toJson().toString(), responseHeaders,
HttpStatus.ACCEPTED);
return updatedDataObject;
} else {
log.debug("Create data object...");
DataObject dataObjectRequest = DataObject.fromJson(new JSONObject(body));
DataObject createdObject = dataObjectDao.createByPath(path, dataObjectRequest);
if (createdObject != null) {
return new ResponseEntity<String>(createdObject.toJson().toString(), responseHeaders,
HttpStatus.CREATED);
} else {
return new ResponseEntity<String>("Data object could not be created", responseHeaders,
HttpStatus.CONFLICT);
}
return createdObject;
}
}
return new ResponseEntity<String>("Bad request", responseHeaders, HttpStatus.BAD_REQUEST);
return null;
}

/**
* Delete path endpoint.
*
* @param request the {@link HttpServletRequest}
* @return a {@link ResponseEntity}
*/
@RequestMapping(path = "/**", method = RequestMethod.DELETE)
public ResponseEntity<?> deleteCdmiObject(
@RequestHeader("Authorization") String authorizationHeader, HttpServletRequest request) {

HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("X-CDMI-Specification-Version", "1.1.1");

if (!verifyAuthorization(authorizationHeader)) {
return new ResponseEntity<>(responseHeaders, HttpStatus.UNAUTHORIZED);
private void getCurrentStatusFromStorageBackend(DataObject dataObject) {
// add information from storage back-end
if (storageBackend != null) {
String path = Paths.get(dataObject.getParentUri(), dataObject.getObjectName()).toString();
CdmiObjectStatus status = storageBackend.getCurrentStatus(path);
// update monitored attributes
for (Entry<String, String> entry : status.getMonitoredAttributes().entrySet()) {
dataObject.getMetadata().put(entry.getKey(), entry.getValue());
}
// update QoS transition information
if (status.getStatus().equals(org.indigo.cdmi.Status.TRANSITION)) {
dataObject.getMetadata().put("cdmi_capabilities_target", status.getTargetCapabilitiesUri());
dataObject.setCapabilitiesUri(status.getCurrentCapabilitiesUri());
}
}
}

String path =
(String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);

log.debug("Delete path {}", path);

CdmiObject cdmiObject = cdmiObjectDao.getCdmiObjectByPath(path);

if (cdmiObject != null) {
if (cdmiObject instanceof Container) {
Container container = containerDao.deleteByPath(path);
if (container != null) {
return new ResponseEntity<String>("Container deleted", responseHeaders,
HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<String>("Container could not be deleted", responseHeaders,
HttpStatus.CONFLICT);
}
} else if (cdmiObject instanceof DataObject) {
DataObject dataObject = dataObjectDao.deleteByPath(path);
if (dataObject != null) {
return new ResponseEntity<String>("Data object deleted", responseHeaders,
HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<String>("Data object could not be deleted", responseHeaders,
HttpStatus.CONFLICT);
}
private void getCurrentStatusFromStorageBackend(Container container) {
// add information from storage back-end
if (storageBackend != null) {
String path = Paths.get(container.getParentUri(), container.getObjectName()).toString();
CdmiObjectStatus status = storageBackend.getCurrentStatus(path);
// update monitored attributes
for (Entry<String, String> entry : status.getMonitoredAttributes().entrySet()) {
container.getMetadata().put(entry.getKey(), entry.getValue());
}
// update QoS transition information
if (status.getStatus().equals(org.indigo.cdmi.Status.TRANSITION)) {
container.getMetadata().put("cdmi_capabilities_target", status.getTargetCapabilitiesUri());
container.setCapabilitiesUri(status.getCurrentCapabilitiesUri());
}
}
return new ResponseEntity<String>("Not found", responseHeaders, HttpStatus.NOT_FOUND);
}

/**
Expand Down
Loading

0 comments on commit efc5b0d

Please sign in to comment.