/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.model.internal.mergers;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jst.javaee.core.PersistenceContextRef;
import org.eclipse.jst.javaee.core.PropertyType;

/**
 * Merges persistence context references artifacts.
 * 
 * @author Dimitar Giormov
 *
 */
public class PersistenceContextRefsMerger extends BaseRefsMerger {
	
    /**
     *  Constructor for the class. 
     * 
     * @param base - base list with persistence context references.
     *               that have higher priority and are result of the merge. 
     * @param toMerge - toMerge list to be imported in base list.
     */
    public PersistenceContextRefsMerger(List _base, List _toMerge) {
        super(_base, _toMerge);
    }

    
    /* (non-Javadoc)
     * @see org.eclipse.jst.javaee.ejb.model.mergers.common.ModelElementsMerger#process()
     */
    @Override
	public List process() throws ModelException {
        List warnings = new ArrayList();
        for (Object oToMerge : getToMergeElemets()) {
			PersistenceContextRef envEntry = (PersistenceContextRef) oToMerge;
			boolean found = false;
			for (Object oBase : getBaseElements()) {
				PersistenceContextRef envEntryBase = (PersistenceContextRef) oBase;
				if (envEntryBase.getPersistenceContextRefName().equals(envEntry.getPersistenceContextRefName())){
					copyMissingPropertesInBase(envEntryBase, envEntry);
					found = true;
					break;
				}
			}
			if (found){
				continue;
			}
			getBaseElements().add(EcoreUtil.copy((EObject) oToMerge));
		}
        return warnings;
    }
    

    protected void copyMissingPropertesInBase(PersistenceContextRef baseElement, PersistenceContextRef toMergeElement) {
    	if(baseElement.getPersistenceUnitName() == null){
    		baseElement.setPersistenceUnitName(toMergeElement.getPersistenceUnitName());
    	}
    	
    	if(baseElement.getPersistenceContextType() == null){
    		baseElement.setPersistenceContextType(toMergeElement.getPersistenceContextType());
    	}
    	
    	if(baseElement.getMappedName() == null){
          baseElement.setMappedName(toMergeElement.getMappedName());
      }
    	
    	copyMissingPersistentPropertiesInBase(baseElement.getPersistenceProperties(), toMergeElement.getPersistenceProperties());
    }
    
    
    private void copyMissingPersistentPropertiesInBase(
        List persistenceProperties, List persistenceProperties2) {
      for (Object mergeProps : persistenceProperties2) {
        PropertyType mProp = (PropertyType) mergeProps;
        if(!containsProperty(persistenceProperties , mProp)){
          persistenceProperties.add( mProp);
        }
        
      }
    }
    
    private boolean containsProperty(List list, PropertyType p){
      for (Object baseProps : list) {
        PropertyType bProp = (PropertyType) baseProps;
        if(p.getName().equals(bProp.getName())){
          return true;
        }
      }
      return false;
    }


    @Override
	protected void copyMissingPropertesInBase(Object base, Object toMerge){
    	copyMissingPropertesInBase((PersistenceContextRef) base, (PersistenceContextRef) toMerge);
    }
    
}
