/*******************************************************************************
 * Copyright (c) 2009 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.ws.jaxws.dom.runtime.persistence.sync;

import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.SBAnnotationFeatures.SB_ANNOTATION;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.NAME_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.TARGET_NAMESPACE_ATTRIBUTE;
import static org.eclipse.jst.ws.jaxws.dom.runtime.persistence.WSAnnotationFeatures.WS_ANNOTATION;
import static org.eclipse.jst.ws.jaxws.utils.ContractChecker.nullCheckParam;

import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.DomPackage;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IServiceEndpointInterface;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingParameterStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingStyle;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.SOAPBindingUse;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.IModelElementSynchronizer;
import org.eclipse.jst.ws.jaxws.utils.JaxWsUtils;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation;
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotationInspector;

/**
 * Synchronizer that merges content of {@link IServiceEndpointInterface} with the current content of 
 * the class implementing it.  
 * 
 * @author Georgi Vachkov
 */
public class SeiMerger extends ElementSynchronizerImpl
{
	private AbstractMethodSynchronizer methodSynchronizer;
	
	/**
	 * Constructor
	 * @param parent
	 * @param methodSync the synchronizer that takes care for the SEI methods
	 */
	public SeiMerger(IModelElementSynchronizer parent, AbstractMethodSynchronizer methodSync) 
	{
		super(parent);
		nullCheckParam(methodSync);
		this.methodSynchronizer = methodSync;
	}
		
	protected void merge(IServiceEndpointInterface sei, IAnnotation<IType> wsAnnotation, IAnnotationInspector inspector) throws JavaModelException
	{
		final String seiName = wsAnnotation.getPropertyValue(NAME_ATTRIBUTE) == null ? 
				JaxWsUtils.getDefaultPorttypeName(wsAnnotation.getAppliedElement().getFullyQualifiedName()) : wsAnnotation.getPropertyValue(NAME_ATTRIBUTE);
				
		if (!seiName.equals(sei.getName())) {
			util().setFeatureValue(sei, DomPackage.ISERVICE_ENDPOINT_INTERFACE__NAME, seiName);
		}
				
		// add targetNamespace
		final String targetNs = extractTargetNamespace(wsAnnotation);
		if (!targetNs.equals(sei.getTargetNamespace())) {
			util().setFeatureValue(sei, DomPackage.ISERVICE_ENDPOINT_INTERFACE__TARGET_NAMESPACE, targetNs);
		}
		
		mergeSoapBinding(sei, inspector);
		methodSynchronizer.synchronizeMethods(sei, wsAnnotation.getAppliedElement(), inspector);
		
		adaptToLocationInterface(sei, WS_ANNOTATION, wsAnnotation);
	}
	
	private String extractTargetNamespace(final IAnnotation<IType> wsAnnotation)
	{
		// add targetNamespace
		final String targetNs = wsAnnotation.getPropertyValue(TARGET_NAMESPACE_ATTRIBUTE);
		if (targetNs==null) {
			return JaxWsUtils.composeJaxWsTargetNamespaceByPackage(wsAnnotation.getAppliedElement().getPackageFragment().getElementName());
		}	
		
		return targetNs;
	}
	
	private void mergeSoapBinding(final IServiceEndpointInterface sei, final IAnnotationInspector inspector) throws JavaModelException
	{
		final IAnnotation<IType> sbAnnotation = inspector.inspectType(SB_ANNOTATION);
		
		final SOAPBindingStyle style = defCalc().defineSBStyle(sbAnnotation);
		if (sei.getSoapBindingStyle() != style) {
			sei.setSoapBindingStyle(style);
		}
		
		final SOAPBindingUse use = defCalc().defineSBUse(sbAnnotation);
		if (sei.getSoapBindingUse() != use) {
			sei.setSoapBindingUse(use);
		}
		
		final SOAPBindingParameterStyle paramStyle = defCalc().defineSBParameterStyle(sbAnnotation);
		if (sei.getSoapBindingParameterStyle() != paramStyle) {
			sei.setSoapBindingParameterStyle(paramStyle);
		}
		
		adaptToLocationInterface(sei, SB_ANNOTATION, sbAnnotation);
	}
}
