package com.sixsq.slipstream.ui;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sixsq.slipstream.exceptions.ValidationException;
import com.sixsq.slipstream.persistence.Module;
import com.sixsq.slipstream.persistence.ModuleCategory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
/**
* Java structure sent to PRS-lib (thanks to asMap method).
* <p>
* Responsible to load module object from given URI.
*
* @see UIPlacementResource
*/
public class PlacementRequest {
private static Logger logger = Logger.getLogger(PlacementRequest.class.getName());
private String moduleUri;
protected void setModule(Module module) {
this.module = module;
}
public Module getModule() throws ValidationException {
if (module == null) {
if (moduleUri == null) {
throw (new ValidationException("moduleUri should be set."));
} else {
module = Module.load(moduleUri);
}
}
if (module == null) {
throw (new ValidationException("Failed to load module: " +
moduleUri));
}
if (module.getCategory() != ModuleCategory.Deployment &&
module.getCategory() != ModuleCategory.Image) {
throw (new ValidationException("Provided module " + moduleUri +
" should be either Component or Application."));
}
logger.fine("Loaded module " + module);
return module;
}
private Module module;
private Map<Object, Object> placementParams;
private List<Map<String, String>> orchestratorComponents;
private List<String> userConnectors;
private boolean isScalable;
public Map<String, Object> asMap() throws ValidationException {
Map<String, Object> result = new HashMap<>();
Module module = getModule();
result.put("module", module);
result.put("orchestratorComponents", orchestratorComponents);
result.put("user-connectors", userConnectors);
result.put("isScalable", isScalable);
result.put("placement-params", module.placementPoliciesPerComponent());
logger.info("asMap = " + result);
return result;
}
public static PlacementRequest fromJson(String json) throws ValidationException {
Gson gson = new GsonBuilder().create();
PlacementRequest placementRequest = gson.fromJson(json, PlacementRequest.class);
validateFromJSON(placementRequest);
logger.fine("Placement Request " + placementRequest);
return placementRequest;
}
public String toString() {
return "moduleURI=" + moduleUri + ", userConnectors="
+ userConnectors + ", placementParams=" + placementParams +
", isScalable=" + isScalable;
}
public static void validateFromJSON(PlacementRequest pr) throws
ValidationException {
if (null == pr.moduleUri) {
throw (new ValidationException("moduleUri should be set."));
}
}
}