I d’ont understand how it is possible that list elements will be affected by null so inexplicably in my program. Performing a call Hierarchy on requirements list, here is what I got :
1:
private void checkCompletion(int bidId){
Bid bid = BidOperation.removeBid(getRunningAgrts(), bidId);
BidOperation.addBidToList(getExecutedRes(), bid);
if (BidOperation.difference(getRequirements(),
getExecutedRes()).size() == 0){
finishExecution();
SimTable.incrementSucessRate();
}
}
2 :
public boolean checkFirstSetComplete(){
if (BidOperation.difference(getRequirements(),
getTentAndFinaPartialRes()).size() == 0)
return true;
else return false;
}
3 :
boolean equality2 = BidOperation.equality(bid.getResourceList(),
getRequirements());
4 :
protected double expectedCost(){
double sum = 0;
for (ResChar elt : getRequirements()){
sum += elt.getNbCopies() * elt.getUnitCost() * usageTime();
}
return sum;
}
5 :
public Bid generateOffer(Integer sellerId, List<ResChar> sellerSpec){
...
if ((getFullFinalAgrts().size() + getFullTentAgrts().size() == 0) &&
(BidOperation.difference(getRequirements(), sellerSpec).size() == 0))
...
}
6 :
private boolean intersectSellerBuyer(List<ResChar> sellerRes){
for (ResChar sellerResource : sellerRes){
for (ResChar buyerResource : getRequirements()){
if (sellerResource.getTypeId() == buyerResource.getTypeId()){
return true;
}
}
}
return false;
}
7 :
private void mainLoop(){
int t = (int)CloudSim.clock();
for ( Map.Entry<Integer, List<ResChar>> entry : sellerCharacteristicsList.entrySet()){
if (intersectSellerBuyer(entry.getValue()) &&
!negociateWithSeller(entry.getKey())){
sendNow(entry.getKey(), CSBTs.BUYER_OFFER,
generateOffer (entry.getKey(),entry.getValue()));
}
}
if ((estpB != -1) && (t > estpB)){
decommitAndOrCancelAllPartialBids(t);
}
if (t > tBK){
k--; tBK = (bTimes.getDlB() - t) / k + t;
if (BidOperation.difference(getRequirements(),
getTentAndFinaPartialRes()).size() > 0){
decommitAndOrCancelAllPartialBids(t);
}
}
}
8 :
private double partDenominator(){
double sum = 0;
for (ResChar elt : getRequirements()){
sum += elt.getNbCopies() * unitCost(elt) * BidOperation.ratio(elt);
}
return sum;
}
9 :
private boolean runningTask(){
boolean runningTask = false;
if (isRunningTask())
return true;
else if (BidOperation.difference(getRequirements(), getRunningRes()).size() == 0){
System.out.println("The running resource :" +getRunningRes().size());
System.out.println("The requirements :" +getRequirements().size());
setRunningTask(true);
runningTask = true;
}
return runningTask;
}
And finnally the BidOperation.diferrence method :
public static List<ResChar> difference(List<ResChar> list1, List<ResChar> list2){
ResourceList list = new ResourceList(list1);
Iterator<ResChar> listItr = list.resourceList.listIterator();
Iterator<ResChar> listItr2 = list2.listIterator();
int diff;
while (listItr.hasNext()){
ResChar elt = listItr.next();
while (listItr2.hasNext()){
ResChar elt2 = listItr2.next();
if (elt2.getTypeId() == elt.getTypeId()){
diff = elt.getNbCopies() - elt2.getNbCopies();
if (diff > 0)
elt.setNbCopies(diff);
else
listItr.remove();
break;
}
}
}
return list.resourceList;
}
The last method is used in order to not modify directly the requirement list. To that reason I used a copy constructor. Could anyone has enough time to explain me the so confused assignement of null to the requirement elements during the run time ?
Thank you.