/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.internal.preferences;

import java.util.Iterator;
import java.util.Set;

/**
 * @since 3.1
 */
public class PropertyUtil {
    private PropertyUtil() {
    }
    
    public static boolean isEqual(IPropertyMap map1, IPropertyMap map2) {
        Set map1Keys = map1.keySet();
        Set map2Keys = map2.keySet();
        
        if (!map1Keys.equals(map2Keys)) {
            return false;
        }
        
        for (Iterator iter = map1Keys.iterator(); iter.hasNext();) {
            String next = (String) iter.next();
            
            if (!map1.getValue(next, Object.class).equals(map2.getValue(next, Object.class))) {
                return false;
            }
        }
        
        return true;
    }
    
    /**
     * Copies all properties from the given source to the given destination
     * 
     * @param destination
     * @param source
     * @since 3.1
     */
    public static void copy(IPropertyMap destination, IPropertyMap source) {
       Set keys = source.keySet();
       
       for (Iterator iter = keys.iterator(); iter.hasNext();) {
           String key = (String) iter.next();
        
           destination.setValue(key, source.getValue(key, Object.class));
       }
    }
    
    /**
     * Computes the union of a set property maps. The result will contain all properties from
     * all of the contributing maps. If the same property had a different value in two or
     * more maps, its value in the union will be null. If the same property 
     * 
     * Note that the result is a standalone
     * object and will not be updated to reflect subsequent changes in the source maps.
     * 
     * @param sources
     * @return
     * @since 3.1
     */
    public static IPropertyMap union(IPropertyMap[] sources) {
        PropertyMapUnion result = new PropertyMapUnion();
        
        for (int i = 0; i < sources.length; i++) {
            IPropertyMap map = sources[i];
            
            result.addMap(map);
        }
        
        return result;
    }
    
    public static boolean get(IPropertyMap toRead, String propertyId, boolean defaultValue) {
        Boolean result = ((Boolean)toRead.getValue(propertyId, Boolean.class));
        
        if (result == null) {
            return defaultValue;
        }
        
        return result.booleanValue();
    }
    
    public static int get(IPropertyMap toRead, String propertyId, int defaultValue) {
        Integer result = ((Integer)toRead.getValue(propertyId, Integer.class));
        
        if (result == null) {
            return defaultValue;
        }
        
        return result.intValue();
    }
}
