package gr.upatras.ece.nam.fstoolkit.utils;
import java.util.Iterator;
import java.util.Random;
import java.util.Vector;
import brokermodel.Broker;
import brokermodel.availabilityContract.ResourceServiceContract;
import brokermodel.federationscenarios.InfrastructureRequest;
import brokermodel.federationscenarios.RequestedFederationScenario;
import brokermodel.federationscenarios.ResourceGroup;
import brokermodel.federationscenarios.ResourceRequest;
import brokermodel.federationscenarios.ResourceSettingInstance;
import brokermodel.federationscenarios.ScheduledPlan;
import brokermodel.federationscenarios.ServiceRequest;
import brokermodel.federationscenarios.ServiceSettingInstance;
import brokermodel.federationscenarios.SettingInstance;
import brokermodel.providersite.Site;
import brokermodel.resources.OfferedResource;
import brokermodel.resources.Resource;
import brokermodel.resources.ResourceSetting;
import brokermodel.services.AbstractSetting;
import brokermodel.services.Service;
import brokermodel.users.ResourcesProvider;
public class OfferedPlan{
private Vector<AdvicedOffer> advicedOffers;
private RequestedFederationScenario proposedScenario = null ;
private RequestedFederationScenario sourceFedScenario = null ;
private int injectedVar = 1;
public OfferedPlan(RequestedFederationScenario srcFedScenario) {
super();
this.advicedOffers = new Vector<AdvicedOffer>();
this.sourceFedScenario = srcFedScenario;
this.createProposedScenario();
}
public Vector<AdvicedOffer> getAdvicedOffers() {
return advicedOffers;
}
public boolean ContractOffered(ResourceServiceContract rs) {
for (Iterator<AdvicedOffer> iterator = advicedOffers.iterator(); iterator.hasNext();) {
AdvicedOffer aoff = (AdvicedOffer) iterator.next();
if (aoff.getAdvicedRSContract().equals(rs))
return true;
}
return false;
}
public void createProposedScenario() {
this.proposedScenario =
brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createRequestedFederationScenario();
this.proposedScenario.setName( sourceFedScenario.getName());
InfrastructureRequest infReq = brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createInfrastructureRequest();
this.proposedScenario.setInfrastructureRequest(infReq );
for (Iterator<brokermodel.federationscenarios.Import> iterator = sourceFedScenario.getImports().iterator(); iterator.hasNext();) {
brokermodel.federationscenarios.Import imp = (brokermodel.federationscenarios.Import) iterator.next();
brokermodel.federationscenarios.Import importval = brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createImport();
importval.setImportURI( imp.getImportURI());
this.proposedScenario.getImports().add(importval);
}
//now create a sched plan
if ( sourceFedScenario.getScheduledPlan()!=null ){
ScheduledPlan splan = brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createScheduledPlan() ;
this.proposedScenario.setScheduledPlan(splan );
splan.setValidFrom( sourceFedScenario.getScheduledPlan().getValidFrom() );
splan.setValidUntil( sourceFedScenario.getScheduledPlan().getValidUntil() );
}
for (Iterator< ServiceRequest > iterator = sourceFedScenario.getServicesRequest().getServiceRequestList().iterator(); iterator.hasNext();) {
ServiceRequest servReq = (ServiceRequest) iterator.next();
if (servReq instanceof ServiceRequest) {
ServiceRequest serviceRequest = (ServiceRequest) servReq;
if (servReq.getNumOfServices()>0 ){
ResourceGroup resGroup =
brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createResourceGroup() ;
resGroup.setName(serviceRequest.getName());
infReq.getResourceGroups().add(resGroup );
for(int i=0; i<servReq.getNumOfServices(); i++){
ResourceRequest reqResource = addResourceForService(serviceRequest, serviceRequest.getName()+"ixix"+ (i+1));
if (reqResource!=null)
resGroup.getGroupedResources().add(reqResource );
}
}else{
addResourceForService(serviceRequest, serviceRequest.getName());
}
}
}
restoreSettingsAndAssignedLinksToResources();
while (MoreRequiredResources() );
}
private ResourceRequest addResourceForService(ServiceRequest serviceReq, String proposedResourceName) {
Broker tempoffice = (brokermodel.Broker) serviceReq.getRefService().eContainer();
Service refService = serviceReq.getRefService();
if (refService==null){
System.out.println("addResourceForService refService=NULL !!!!!!!!!!!!!!!");
return null;
}
if (tempoffice==null){
System.out.println("addResourceForService tempoffice=NULL !!!!!!!!!!!!!!!");
return null;
}
Vector<ResourceServiceContract> candidateContracts = new Vector<ResourceServiceContract>();
for (int j = 0; j < tempoffice.getResourceServiceContracts().size(); j++) {
ResourceServiceContract rs = tempoffice.getResourceServiceContracts().get(j);
if (rs.getForOfferedService().equals(refService) && offeredByRuleIsTrue(rs, serviceReq)){
System.out.println("Possible Contract found=" + rs.getName() );
if ( (!this.ContractOffered(rs)) || ( (rs.getForOfferedResource()!=null) && (rs.getForOfferedResource().getMultitonMaxOccur()>0)) ){
System.out.println("Contract advised=" + rs.getName() );
if (rs.getForOfferedResource().getMultitonMaxOccur()>0 ){ //add it so many times
for (int i=0; i<rs.getForOfferedResource().getMultitonMaxOccur();i++)
candidateContracts.add(rs);//
}else
candidateContracts.add(rs);
}
}
}
System.out.println("AddOfferedResourceForService refService=" +
refService.getName() +"("+serviceReq.getName() +")"+
"for office"+tempoffice.getName() +
" candidateContracts: "+ candidateContracts.size());
Random generator = new Random();
if (candidateContracts.size()>0){
int ix ;
int safeguard = 0;
int countContracts =0 ;
int maximumResourcesToOffer =0;
do{
ix = generator.nextInt( candidateContracts.size() ) ; //for now just get a random one.
countContracts = CountProposedContract( candidateContracts.get(ix)) ;
maximumResourcesToOffer = candidateContracts.get(ix).getForOfferedResource().getMultitonMaxOccur() ;
safeguard++;
}while ( (countContracts >= maximumResourcesToOffer) && (safeguard<10000) && (maximumResourcesToOffer!=-1) );
// while ( (countContracts > maximumResourcesToOffer) && (safeguard<1000) ){
// ix = generator.nextInt( candidateContracts.size() );
// countContracts = CountProposedContract( candidateContracts.get(ix)) ;
// maximumResourcesToOffer = candidateContracts.get(ix).getForOfferedResource().getMultitonMaxOccur();
// safeguard++;
// }
if ( (countContracts< maximumResourcesToOffer) || (maximumResourcesToOffer==-1) ){
AdvicedOffer offer = AddOfferForContract(tempoffice, serviceReq, candidateContracts.get(ix),proposedResourceName );
return offer.getResourceRequest();
}
}
return null;
}
private int CountProposedContract(ResourceServiceContract resourceServiceContract) {
int offerscnt = 0;
for (ResourceRequest resReq : this.proposedScenario.getInfrastructureRequest().getReqOfferedResources()) {
if (resReq.getRefOfferedResource().getUniqueID().equals( resourceServiceContract.getForOfferedResource().getUniqueID() ) ){
offerscnt ++;
}
}
return offerscnt;
}
private boolean offeredByRuleIsTrue(ResourceServiceContract rs, ServiceRequest serviceReq) {
if (serviceReq.getOfferedByProviders()==null )
return true; //if the offeredby Rule is null, return true
ResourcesProvider requestedProvider = serviceReq.getOfferedByProviders();
if (rs.getForOfferedResource().eContainer().eContainer() instanceof ResourcesProvider ){
ResourcesProvider contractProvider = (ResourcesProvider)rs.getForOfferedResource().eContainer().eContainer();
return requestedProvider.equals(contractProvider);
}
return false;
}
private AdvicedOffer AddOfferForContract( Broker tempoffice,
ServiceRequest serviceReq, ResourceServiceContract resourceServiceContract, String resourceReqProposedName) {
AdvicedOffer arg0 = new AdvicedOffer() ;
this.getAdvicedOffers().add(arg0); //pros8ese ena offer gia auto to plan
arg0.setId(20000 + this.getAdvicedOffers().size() );
arg0.setAdvicedRSContract( resourceServiceContract );
arg0.setServiceReq(serviceReq);
arg0.setForBroker(tempoffice.getName());
System.out.println("Advice add=" + arg0.getId() +" for office "+tempoffice.getName() );
//create a resourceRequest
ResourceRequest reqResource = brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createResourceRequest();
reqResource.setRefOfferedResource( arg0.getOfferedResource() );
reqResource.setName( resourceReqProposedName );
arg0.setResourceRequest(reqResource);
// if (serviceReq!=null)
// AddAssignmentLinks(serviceReq);
this.proposedScenario.getInfrastructureRequest().getReqOfferedResources().add(reqResource);
return arg0;
}
// private void AddAssignmentLinks(ServiceRequest sr) {
// for (int i = 0; i < sr.getReqServiceSettings().size(); i++) {
// ServiceSettingInstance setting = sr.getReqServiceSettings().get(i);
// for (SettingInstance settingInstance : setting.getAssignSetting() ) {
// AssignmentLink link = new AssignmentLink(setting ,settingInstance);
// assignmentLinks.add(link);
// }
// }
// }
private void restoreSettingsAndAssignedLinksToResources() {
for (AdvicedOffer offer : this.advicedOffers) {
addSettingsToResourceRequest(offer.getResourceRequest(), offer.getServiceRequest());
}
}
public void addSettingsToResourceRequest(ResourceRequest resourceRequest, ServiceRequest serviceRequest){
OfferedResource offeredResource = resourceRequest.getRefOfferedResource() ;
for (int j = 0; j < offeredResource.getResourceSettings().size() ; j++) {
ResourceSetting rs = offeredResource.getResourceSettings().get(j);
//create a resourceSetting instance
ResourceSettingInstance resSetInst = brokermodel.federationscenarios.FederationscenariosFactory.eINSTANCE.createResourceSettingInstance() ;
resSetInst.setName( rs.getName().toLowerCase().replace(' ', '_') );
//resSetInst.setName( advoffer.getServiceAlias() );
resSetInst.setRefResourceSetting(rs);
resourceRequest.getReqResourceSettings().add( resSetInst );
if (serviceRequest!=null)
restoreSettingValuesFromService( resSetInst, serviceRequest );
}
}
public void restoreSettingValuesFromService(
ResourceSettingInstance resSetInst, ServiceRequest serviceReq) {
// = \"value\" or assign "refSetting"
ServiceRequest sr = null;
for (int i = 0; i < sourceFedScenario.getServicesRequest().getServiceRequestList().size(); i++) {
// Service refServ =sourceFedScenario.getServicesRequest().getServiceRequestList().get(i).getRefService();
ServiceRequest servReq = sourceFedScenario.getServicesRequest().getServiceRequestList().get(i);// if (refServ.getName().equals(service.getName()) ){
if (serviceReq.getName().equals(servReq.getName())) {
sr = sourceFedScenario.getServicesRequest().getServiceRequestList().get(i);
}
}
if (sr != null) {
for (int i = 0; i < sr.getReqServiceSettings().size(); i++) {
ServiceSettingInstance setting = sr.getReqServiceSettings().get(i);
if ( (resSetInst.getRefResourceSetting().getImplServiceSetting()!=null)
&&(setting.getRefServiceSetting().getName().equals(resSetInst.getRefResourceSetting().getImplServiceSetting().getName())) ) {
if (sr.getReqServiceSettings().get(i).getAssignSetting().size() > 0) {
for (int ixAssignedSettings = 0; ixAssignedSettings < sr.getReqServiceSettings().get(i).getAssignSetting().size(); ixAssignedSettings++) {
ServiceSettingInstance assignedSetting = (ServiceSettingInstance)sr.getReqServiceSettings().get(i).getAssignSetting().get(ixAssignedSettings);
ResourceSettingInstance toBeAssigned = findResourceSettingByEquivalentServiceReq( assignedSetting );
if (resSetInst.getRefResourceSetting().getRequiresParams().size()>0){
for (AbstractSetting s : resSetInst.getRefResourceSetting().getRequiresParams()) {
ResourceSetting requiredResourceSetting = (ResourceSetting)s;
if (toBeAssigned!=null)
if (toBeAssigned.getRefResourceSetting().equals(requiredResourceSetting)){
resSetInst.getAssignSetting().add(toBeAssigned);
}
}
}else{
if (toBeAssigned!=null)
resSetInst.getAssignSetting().add(toBeAssigned);
}
}
} else if (sr.getReqServiceSettings().get(i).getStaticValue() != null){
resSetInst.setStaticValue(sr.getReqServiceSettings().get(i).getStaticValue());
//do a hack here with the name
if (resSetInst.getRefResourceSetting().getName().equalsIgnoreCase("NAME")){
resSetInst.setStaticValue( ((ResourceRequest)resSetInst.eContainer()).getName() );
}else if (resSetInst.getRefResourceSetting().getName().equalsIgnoreCase("GW")){
Site s = (Site)resSetInst.getRefResourceSetting().eContainer().eContainer();
// if (s.getIgwlist().size()>0)
// resSetInst.setStaticValue( s.getIgwlist().get(0).getIP() );
}
else if (resSetInst.getRefResourceSetting().getName().equalsIgnoreCase("IP")){
String reqname = ((ResourceRequest)resSetInst.eContainer()).getName();
if (reqname.contains("ixix") ){
Site s = (Site)resSetInst.getRefResourceSetting().eContainer().eContainer();
// String igw="";
// if (s.getIgwlist().size()>0)
// igw = s.getIgwlist().get(0).getIP() ;
String oldIP = sr.getReqServiceSettings().get(i).getStaticValue();//xx.xx.xx.xx
String splitOldIP[]= oldIP.split( "\\." ) ;
int lastnum = Integer.parseInt(splitOldIP[3]);
// if (!"".equals(igw))
// splitOldIP = igw.split( "\\." ) ;
String splitName[]= reqname.split( "ixix" ) ;
int toadd = Integer.parseInt(splitName[1]);
toadd = lastnum+toadd -1;
String newIP = splitOldIP[0]+"."+splitOldIP[1]+"."+splitOldIP[2]+"."+toadd;
resSetInst.setStaticValue( newIP );
}
}
}
}
}
}
}
private boolean MoreRequiredResources() {
//first check for each setting of resource, if it needs special treatment
for (AdvicedOffer offer : this.getAdvicedOffers()) {
ResourceRequest resourceReqInvestigated = offer.getResourceRequest();
for (ResourceSettingInstance settingToInvestigate : resourceReqInvestigated.getReqResourceSettings()) {
ResourceSetting setting = settingToInvestigate.getRefResourceSetting();
for (AbstractSetting s : setting.getRequiresParams()) {
ResourceSetting requiredResourceSetting = (ResourceSetting)s;
//A setting RS of a resource resourceReqInvestigated needs another setting from another
//resource which doesn't exist in scenario
//1) Add new resource resourceRequired that is missing
//3) Find the corresponding service setting of setting RS
//4) Find the serviceReq that is assigned
//5) IF the serviceReq.refOfferedService and the NEWR have the same Service
//6) then assign the settings (maybe see getSettingValueFromService()
Resource resourceRequired = (Resource)requiredResourceSetting.eContainer();
//site.partner.office
Broker tempoffice = (Broker)(resourceRequired.eContainer().eContainer().eContainer());
//2) Find the service that resourceReqInvestigated implements
offer.getServiceRequest().getRefService() ;
//find a contract that the resourceRequired Implements
ResourceServiceContract c = findContractForResource(tempoffice, resourceRequired);
//check and try to return the inital requested ServiceRequest
ServiceRequest sr =tryToFindExistingServiceRequest( tempoffice, offer,
resourceReqInvestigated, settingToInvestigate,
resourceRequired, requiredResourceSetting, c.getForOfferedService()) ;
//Find if the required resource exists in the plan
ResourceRequest resourceRequest = CheckIfResourceRequestExistsInPlan(resourceRequired, sr);
if (resourceRequest==null){ //the resource doesn't exist and must be injected
AdvicedOffer myoffer;
if (sr!=null) //we had an initial service request for such resource
myoffer = AddOfferForContract(tempoffice, sr, c, sr.getName()+"_injected_" +injectedVar);
else//we need this resource to be present, no matter what
myoffer = AddOfferForContract(tempoffice, sr, c, "injected_" +injectedVar);
injectedVar++;
addSettingsToResourceRequest( myoffer.getResourceRequest(), myoffer.getServiceRequest() );
fixSettingAssignmentsWithNewResourceRequest(settingToInvestigate, requiredResourceSetting, offer, myoffer);
//if the resourcesettingIstance is assigned to another resource, then it is wrong
//It should be assigned to a setting of the new, injected resource.
return true; //return from here
}else{ //seems that resource exists in plan, so we must fix only the assignments here
for (ResourceSettingInstance resourcesetting : resourceRequest.getReqResourceSettings() ) {
if (resourcesetting.getRefResourceSetting().equals(requiredResourceSetting ))
settingToInvestigate.getAssignSetting().add(resourcesetting);
}
}
}
}
}
//check now for resource itself if it needs another resource to be in scenario
for (AdvicedOffer offer : this.getAdvicedOffers()) {
for (Resource resource : offer.getOfferedResource().getRequiresResources()) {
//check if resource is already in plan
if (CheckIfResourceRequestExistsInPlan(resource, null)==null){
Broker tempoffice = (Broker)(resource.eContainer().eContainer().eContainer());
ResourceServiceContract c = findContractForResource(tempoffice, resource);
AdvicedOffer myoffer = AddOfferForContract(tempoffice, null, c, "injected_"+injectedVar);
injectedVar++;
addSettingsToResourceRequest( myoffer.getResourceRequest(), myoffer.getServiceRequest() );
return true; //return from here
}
}
}
return false;
}
private ServiceRequest tryToFindExistingServiceRequest(Broker tempoffice,
AdvicedOffer offer, ResourceRequest resourceReqInvestigated,
ResourceSettingInstance settingToInvestigate,
Resource resourceRequired, ResourceSetting requiredResourceSetting,
Service offeredServiceOfResourceRequired) {
ServiceRequest sourceServiceReq = offer.getServiceRequest();
for (ServiceSettingInstance s : sourceServiceReq.getReqServiceSettings()) {
if (s.getRefServiceSetting().equals(settingToInvestigate.getRefResourceSetting().getImplServiceSetting())){
for (SettingInstance assignedSetting : s.getAssignSetting()) {
ServiceRequest targetServiceRequest = (ServiceRequest)assignedSetting.eContainer();
if (targetServiceRequest.getRefService().equals(offeredServiceOfResourceRequired))
return targetServiceRequest;
}
}
}
return null;
}
private void fixSettingAssignmentsWithNewResourceRequest(
ResourceSettingInstance settingToInvestigate, ResourceSetting requiredResourceSetting,
AdvicedOffer offer, AdvicedOffer newOffer) {
//initial serviceReq of offer
for (ResourceSettingInstance s : newOffer.getResourceRequest().getReqResourceSettings()) {
if (s.getRefResourceSetting().equals(requiredResourceSetting)){
settingToInvestigate.getAssignSetting().add(s);
}
}
}
public ResourceServiceContract findContractForResource(Broker tempoffice, Resource resource){
for (int j = 0; j < tempoffice.getResourceServiceContracts().size(); j++) {
ResourceServiceContract rs = tempoffice.getResourceServiceContracts().get(j);
if (rs.getForOfferedResource().equals(resource)){
return rs;
}
}
return null;
}
private ResourceRequest CheckIfResourceRequestExistsInPlan(Resource resource, ServiceRequest sr) {
for (AdvicedOffer offer : this.getAdvicedOffers()) {
if ( (offer.getOfferedResource().equals(resource)) &&
((sr==null) || (offer.getServiceRequest().equals(sr) )) )
return offer.getResourceRequest();
}
return null;
}
private ResourceSettingInstance findResourceSettingByEquivalentServiceReq(
ServiceSettingInstance assignedSetting) {
ServiceRequest serviceReq = ((ServiceRequest) assignedSetting.eContainer());
AdvicedOffer offer = findOfferForServiceRequest(serviceReq);
if (offer!=null){
ResourceRequest resourceRequest = offer.getResourceRequest();
for (ResourceSettingInstance setting : resourceRequest.getReqResourceSettings()) {
if (setting.getRefResourceSetting().getImplServiceSetting().getName().equals(assignedSetting.getRefServiceSetting().getName())){
return setting;
}
}
}
return null;
}
private AdvicedOffer findOfferForServiceRequest(ServiceRequest serviceReq) {
for (AdvicedOffer offer : this.advicedOffers) {
if (offer.getServiceRequest().equals(serviceReq))
return offer;
}
return null;
}
public RequestedFederationScenario getProposedScenario() {
return proposedScenario;
}
}