package org.panlab.software.fstoolkit.localprovisioningengine;
import org.eclipse.emf.ecore.util.EcoreUtil;
import FederationOffice.Office;
import FederationOffice.experimentRuntime.ExperimentRuntimeFactory;
import FederationOffice.experimentRuntime.RuntimeElement;
import FederationOffice.experimentRuntime.RuntimeElementStatus;
import FederationOffice.extensionInterfaces.IProvisionResource;
import FederationOffice.federationscenarios.FederationscenariosFactory;
import FederationOffice.federationscenarios.RequestedFederationScenario;
import FederationOffice.federationscenarios.ResourceRequest;
import FederationOffice.federationscenarios.ResourceSettingInstance;
import FederationOffice.federationscenarios.SettingInstance;
public class ScenarioSolver {
public ScenarioSolver() {
super();
}
/**
* It will create a new scenario based on the given one, if the given one is not already saved.
* The returned scenario will have some
* (or all if possible) assignments on resource settings resolved.
* The method calls internally {@link #resolveAssignments(RequestedFederationScenario)}
*
* @param The requested scenario
* @return a new scenario based on the requested, with resolved dependencies (if possible at first pass)
*/
public RequestedFederationScenario prepareScenarioRequest(
RequestedFederationScenario scenario) {
RequestedFederationScenario newScenario;
if (scenario.getRuntimeInfo()==null){
newScenario = FederationscenariosFactory.eINSTANCE.createRequestedFederationScenario();
newScenario = (RequestedFederationScenario)EcoreUtil.copy(scenario);
RuntimeElement rtinfo = ExperimentRuntimeFactory.eINSTANCE.createRuntimeElement();
rtinfo.setDescription("Scenario is based on request by:"+ scenario.eResource().getURI().path());
newScenario.setRuntimeInfo(rtinfo );
for (ResourceRequest resReq : newScenario.getInfrastructureRequest().getReqOfferedResources()) {
RuntimeElement rtInfo = ExperimentRuntimeFactory.eINSTANCE.createRuntimeElement();
resReq.setRuntimeInfo(rtInfo);
rtInfo.setStatus(RuntimeElementStatus.NOT_EXISTS );
}
}else{
newScenario = scenario;
}
resolveAssignments(newScenario);
return newScenario;
}
/**
* Tries to resolve resource setting assignments of a given scenario
* @param scenario
* @return true if everything is resolved. false if there are assignments on resources that cannot be resolved yet
*/
public boolean resolveAssignments( RequestedFederationScenario scenario) {
//solve assignments with no constraints
//SolveAssignmentsWithStaticValues(scenario);
return true;
}
public boolean resourceRequestHasAllAssignementsResolved(
RequestedFederationScenario scenario, ResourceRequest resReq) {
for (ResourceSettingInstance s : resReq.getReqResourceSettings() ) {
if (s.getAssignSetting().size()>0){
String value = null;
for (SettingInstance assignedSetting : s.getAssignSetting()) {
ResourceRequest assignedResource = (ResourceRequest)((ResourceSettingInstance)assignedSetting).eContainer();
value = getStaticValueOfAssignedSetting(scenario, assignedResource, (ResourceSettingInstance)assignedSetting);
if ((value==null)){
System.out.println("Setting:"+s.getName()+" of resource "+resReq.getName()+
" has assigned value to:"+assignedSetting.getName()+
" which cannot be resolved yet!");
return false;//exit immediately. We currently cannot resolve this
}
value = value +",";
}
value = value.substring(0, value.length()-1);//to cut the last comma
s.setStaticValue(value);
s.getAssignSetting().clear();//if came here then it is ok and everything assigned
}
}
//check now if everything is OK to go
for (ResourceSettingInstance s : resReq.getReqResourceSettings() ){
if (s.getRefResourceSetting().isWritable() )
if ((s.getStaticValue() == null) || (s.getAssignSetting().size() > 0)) {
System.out.println("Setting:" + s.getName() + " of resource " + resReq.getName()
+ " cannot be resolved yet!");
return false;
}
}
return true; //everything is resolved..so go
}
private String getStaticValueOfAssignedSetting( RequestedFederationScenario scenario, ResourceRequest resReq, ResourceSettingInstance assignedSetting) {
if (( assignedSetting.getStaticValue()!=null ) &&
assignedSetting.getAssignSetting().size()==0 ) //if there is available only the static value
return assignedSetting.getStaticValue(); //we currently search only for the next assigned resource
else if ( (resReq.getRuntimeInfo()!=null) &&
(resReq.getRuntimeInfo().getStatus()==RuntimeElementStatus.ONLINE)){
//ask resource proxy, if it is possible to update its values and then return the value!
String officeName = ((Office)resReq.getRefOfferedResource().getImplOfferedService().eContainer()).getName() ;
for (IProvisionResource p : Activator.getDefault().getProvisionPlugins()) {
if (p.supportsOffice(officeName) ){
String val = p.readResource(officeName, scenario, resReq, assignedSetting, true);
assignedSetting.setStaticValue(val);
return val;
}
}
}
// else { //else dig further to the next setting
// for (SettingInstance s : assignedSetting.getAssignSetting() ) {
// return getStaticValueOfAssignedSetting(s);
// }
// }
return null;
}
// private void SolveAssignmentsWithStaticValues(RequestedFederationScenario scenario) {
// for (ResourceRequest resReq : scenario.getInfrastructureRequest().getReqOfferedResources()) {
// for (ResourceSettingInstance s : resReq.getReqResourceSettings() ) {
// for (SettingInstance assignedSetting : s.getAssignSetting()) {
// String value = getStaticValueOfAssignedSetting(assignedSetting);
//
//
// }
//
// }
// }
//
// }
//
}