/**********************************************************************************
 * $URL: https://source.sakaiproject.org/svn/providers/tags/sakai-10.6/jldap-mock/src/java/edu/amc/sakai/user/ResourcePropertiesEditStub.java $
 * $Id: ResourcePropertiesEditStub.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.opensource.org/licenses/ECL-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **********************************************************************************/

package edu.amc.sakai.user;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;

import org.sakaiproject.entity.api.ResourcePropertiesEdit;
import org.sakaiproject.util.BaseResourcePropertiesEdit;
import org.apache.commons.lang.StringUtils;

/**
 * Not a stub per-se, so much as a {@link BaseResourcePropertiesEdit} extension
 * with enhancements for testing equality, outputting a meaningful String
 * representation, and initializing state from a set of default and
 * override {@link Properties}.
 * 
 * 
 * @author dmccallum@unicon.net
 *
 */
public class ResourcePropertiesEditStub extends BaseResourcePropertiesEdit {

	private static final long serialVersionUID = 1L;
	
	public ResourcePropertiesEditStub() {
		super();
	}
	
	public ResourcePropertiesEditStub(Properties defaultConfig, Properties configOverrides) {
		super();
		if ( defaultConfig != null && !(defaultConfig.isEmpty()) ) {
			for ( Enumeration i = defaultConfig.propertyNames() ; i.hasMoreElements() ; ) {
				String propertyName = (String)i.nextElement();
				String propertyValue = StringUtils.trimToNull((String)defaultConfig.getProperty(propertyName));
				if ( propertyValue == null ) {
					continue;
				}
				String[] propertyValues = propertyValue.split(";");
				if ( propertyValues.length > 1 ) {
					for ( String splitPropertyValue : propertyValues ) {
						super.addPropertyToList(propertyName, splitPropertyValue);
					}
				} else {
					super.addProperty(propertyName, propertyValue);
				}
			}
		}
		
		if ( configOverrides != null && !(configOverrides.isEmpty()) ) {
			// slightly different... configOverrides are treated as complete
			// overwrites of existing values.
			for ( Enumeration i = configOverrides.propertyNames() ; i.hasMoreElements() ; ) {
				String propertyName = (String)i.nextElement();
				super.removeProperty(propertyName);
				String propertyValue = StringUtils.trimToNull((String)configOverrides.getProperty(propertyName));
				String[] propertyValues = propertyValue.split(";");
				if ( propertyValues.length > 1 ) {
					for ( String splitPropertyValue : propertyValues ) {
						super.addPropertyToList(propertyName, splitPropertyValue);
					}
				} else {
					super.addProperty(propertyName, propertyValue);
				}
			}
		}
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();
		
		for ( Iterator names = getPropertyNames(); names.hasNext();  ) {
			String name = (String)names.next();
			sb.append(name + "=" + this.getPropertyFormatted(name) + "; ");
		}
		
		return sb.toString();
	}
	
	/** Pure hack, but BaseResourceProperties doesn't have a meaningful impl */
	public boolean equals(Object o) {
		
		if ( o == this ) {
			return true;
		}
		
		if ( o == null ) {
			return false;
		}
		
        if ( !(o instanceof ResourcePropertiesEdit) ) {
            return false;
        }
    
        ResourcePropertiesEdit otherProps = (ResourcePropertiesEdit)o;
        
        int cnt = 0;
        Iterator namesInOther = otherProps.getPropertyNames();
        while ( namesInOther.hasNext() ) {

            cnt++;
            String nameInOther = (String)namesInOther.next();
            Object valueInOther = otherProps.get(nameInOther);

            Object valueInThis = get(nameInOther);
            
            if ( valueInThis == valueInOther ) {
            	continue;
            }
            
            if ( valueInThis == null || valueInOther == null ) {
                return false;
            }
            
            if ( !(valueInThis.equals(valueInOther)) ) {
                return false;
            }
                     
        }

        if ( m_props.size() != cnt ) {
            return false;
        }

        return true;
    
    }
	
}
