/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* CloudML is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.cloudml.deployer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathNotFoundException;
import org.cloudml.core.ComponentInstance;
import org.cloudml.core.Deployment;
import org.cloudml.core.NamedElement;
import org.cloudml.core.VM;
import org.cloudml.core.VMInstance;
import org.cloudml.core.WithProperties;
import org.cloudml.core.samples.SensApp;
/**
*
* @author huis
*/
public class CloudMLElementComparator {
public static class ElementUpdate{
public Object element = null;
public String path = null;
public Object oldValue = null;
public Object newValue = null;
public ElementUpdate(Object element, String path, Object oldValue, Object newValue){
this.element = element;
this.path = path;
this.oldValue = oldValue;
this.newValue = newValue;
}
@Override
public String toString(){
Object name = null;
if(element instanceof NamedElement){
name = ((NamedElement) element).getName();
}
else
name = element;
return String.format("%s(%s)::%s is changed from %s to %s",
name,
element.getClass().getSimpleName(),
path,
oldValue,
newValue
);
}
}
public static final Map<String, Collection<String>> toCompareDefault =
new HashMap<String, Collection<String>>();
static{
toCompareDefault.put(
"VMInstance",
Arrays.asList("ips", "status", "type/os", "type/location",
"type/minRam", "type/maxRam", "type/minStorage",
"type/maxStorage", "type/minCores", "type/maxCores"
));
toCompareDefault.put("InternalComponentInstance",
Arrays.asList("status"));
}
private boolean compareProperties = true;
private boolean compareResources = false; //Not Supported yet
private Collection<String> toCompare = null;
private ArrayList<ElementUpdate> updates = new ArrayList<ElementUpdate>();
private Object current = null;
private Object target = null;
public boolean isEmpty(){
return updates.isEmpty();
}
public Collection<ElementUpdate> getUpdates(){
return updates;
}
public void clean(){
updates.clear();
}
public CloudMLElementComparator(Object current, Object target){
this.current = current;
this.target = target;
this.toCompare = toCompareDefault.get(current.getClass().getSimpleName());
if(compareProperties){
ArrayList<String> newList = new ArrayList<String>();
newList.addAll(this.toCompare);
this.toCompare = newList;
try{
for(String s : ((WithProperties)current).getProperties().keySet())
if(!toCompare.contains(s))
toCompare.add("properties/"+s);
}
catch(Exception e){
e.printStackTrace();
}
try{
for(String s : ((WithProperties)target).getProperties().keySet())
if(!toCompare.contains(s))
toCompare.add("properties/"+s);
}
catch(Exception e){
e.printStackTrace();
}
}
if(compareResources){
ArrayList<String> newList = new ArrayList<String>();
newList.addAll(this.toCompare);
this.toCompare = newList;
}
}
public Collection<ElementUpdate> compare(){
for(String attr : toCompare){
Object c = query(current, attr);
Object t = query(target, attr);
if(c == null){
if(t == null)
continue;
}
else if(c.equals(t)){
continue;
}
updates.add(new ElementUpdate(current, attr, c, t));
}
return this.updates;
}
public static Object query(Object obj, String path){
try{
JXPathContext jxpc = JXPathContext.newContext(obj);
return jxpc.getValue(path);
}
catch(NullPointerException e){
return null;
}
catch(JXPathNotFoundException e){
return null;
}
}
public static void main(String[] args){
}
}