/*******************************************************************************
 * Copyright (c) 2008 IONA Technologies PLC
 * 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:
 * IONA Technologies PLC - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.internal.cxf.core.utils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Annotation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MemberValuePair;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.ui.CodeStyleConfiguration;
import org.eclipse.jst.ws.annotations.core.AnnotationsCore;
import org.eclipse.jst.ws.annotations.core.AnnotationsManager;
import org.eclipse.jst.ws.annotations.core.initialization.IAnnotationAttributeInitializer;
import org.eclipse.jst.ws.annotations.core.utils.AnnotationUtils;
import org.eclipse.jst.ws.internal.cxf.core.CXFCorePlugin;
import org.eclipse.jst.ws.internal.cxf.core.model.CXFPackage;
import org.eclipse.jst.ws.internal.cxf.core.model.Java2WSDataModel;
import org.eclipse.jst.ws.jaxws.core.utils.JDTUtils;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.text.edits.TextEdit;
import org.osgi.framework.Version;

/**
 * Provides utility methods for working with the CXF model.
 * Also serving as an interim class to aid in refactoring core utilities into jaxws core.
 * 
 * @author sclarke
 *
 */
public final class CXFModelUtils {
    private static final Version v_0_0_0 = new Version("0.0.0");
    private static final Version v_2_1 = new Version(CXFCorePlugin.CXF_VERSION_2_1);
    private static final Version v_2_0_7 = new Version("2.0.7");
    private static final Version v_2_1_1 = new Version("2.1.1");

    public static final String WEB_SERVICE = "WebService"; //$NON-NLS-1$
    public static final String WEB_METHOD = "WebMethod"; //$NON-NLS-1$
    public static final String WEB_PARAM = "WebParam"; //$NON-NLS-1$
    public static final String REQUEST_WRAPPER = "RequestWrapper"; //$NON-NLS-1$
    public static final String RESPONSE_WRAPPER = "ResponseWrapper"; //$NON-NLS-1$

    private static Map<String, String> ANNOTATION_TYPENAME_MAP = new HashMap<String, String>();

    static {
        ANNOTATION_TYPENAME_MAP.put("ServiceMode", "javax.xml.ws.ServiceMode"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebFault", "javax.xml.ws.WebFault"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put(REQUEST_WRAPPER, "javax.xml.ws.RequestWrapper"); //$NON-NLS-1$
        ANNOTATION_TYPENAME_MAP.put(RESPONSE_WRAPPER, "javax.xml.ws.ResponseWrapper"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebServiceClient", "javax.xml.ws.WebServiceClient"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebEndpoint", "javax.xml.ws.WebEndpoint"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebServiceProvider", "javax.xml.ws.WebServiceProvider"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("BindingType", "javax.xml.ws.BindingType"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebServiceRef", "javax.xml.ws.WebServiceRef"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("WebServiceRefs", "javax.xml.ws.WebServiceRefs"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put(WEB_SERVICE, "javax.jws.WebService"); //$NON-NLS-1$
        ANNOTATION_TYPENAME_MAP.put(WEB_METHOD, "javax.jws.WebMethod"); //$NON-NLS-1$
        ANNOTATION_TYPENAME_MAP.put("Oneway", "javax.jws.OneWay"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put(WEB_PARAM, "javax.jws.WebParam"); //$NON-NLS-1$
        ANNOTATION_TYPENAME_MAP.put("WebResult", "javax.jws.WebResult"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("SOAPBinding", "javax.jws.SOAPBinding"); //$NON-NLS-1$ //$NON-NLS-2$
        ANNOTATION_TYPENAME_MAP.put("HandlerChain", "javax.jws.HandlerChain"); //$NON-NLS-1$ //$NON-NLS-2$
    }

    private CXFModelUtils() {
    }
    
    public static void getWebServiceAnnotationChange(IType type, Java2WSDataModel model, 
            TextFileChange textFileChange) throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();

        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);
        
        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);
        
        IAnnotationAttributeInitializer annotationAttributeInitializer = 
            AnnotationsManager.getAnnotationDefinitionForClass(WebService.class).
                getAnnotationAttributeInitializer();
        
        List<MemberValuePair> memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(type, ast,
                WebService.class);
        
        if (model.isUseServiceEndpointInterface() && type.isClass()) {
            MemberValuePair endpointInterfaceValuePair = AnnotationsCore.createStringMemberValuePair(ast, 
                    "endpointInterface", model.getFullyQualifiedJavaInterfaceName());
            memberValuePairs.add(1, endpointInterfaceValuePair);
        }
        
        Annotation annotation = AnnotationsCore.createAnnotation(ast, WebService.class,
                WebService.class.getSimpleName(), memberValuePairs);
        
        AnnotationUtils.createTypeAnnotationChange(source, compilationUnit, rewriter, source.findPrimaryType(),
                annotation,  textFileChange);
    }

    public static void createMethodAnnotationChange(IType type, IMethod method, 
            Class<? extends java.lang.annotation.Annotation> annotationClass, TextFileChange textFileChange) 
                throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();
        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);

        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);

        Annotation annotation = getAnnotation(method, ast, annotationClass);

        AnnotationUtils.createMethodAnnotationChange(source, compilationUnit, rewriter, method,
                annotation, textFileChange);
    }

    public static void getWebMethodAnnotationChange(IType type, IMethod method, 
            TextFileChange textFileChange) throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();
        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);

        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);

        Annotation annotation = getAnnotation(method, ast, WebMethod.class);

        AnnotationUtils.createMethodAnnotationChange(source, compilationUnit, rewriter, method,
                annotation, textFileChange);
    }
    
    public static void getRequestWrapperAnnotationChange(IType type, IMethod method, 
            TextFileChange textFileChange) throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();
        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);

        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);

        Annotation annotation = getAnnotation(method, ast, RequestWrapper.class);

        AnnotationUtils.createMethodAnnotationChange(source, compilationUnit, rewriter, method, 
                annotation, textFileChange);
    }

    public static void getResponseWrapperAnnotationChange(IType type, IMethod method,
            TextFileChange textFileChange) throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();
        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);

        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);

        Annotation annotation = getAnnotation(method, ast, ResponseWrapper.class);

        AnnotationUtils.createMethodAnnotationChange(source, compilationUnit, rewriter, method, 
                annotation, textFileChange);
    }
    
    public static void getWebParamAnnotationChange(IType type, final IMethod method, 
            SingleVariableDeclaration parameter, TextFileChange textFileChange) 
            throws CoreException {
        ICompilationUnit source = type.getCompilationUnit();
        CompilationUnit compilationUnit = AnnotationUtils.getASTParser(source);

        AST ast = compilationUnit.getAST();
        ASTRewrite rewriter = ASTRewrite.create(ast);

        Annotation annotation = getAnnotation(parameter, ast, WebParam.class);

        AnnotationUtils.createMethodParameterAnnotationChange(source, compilationUnit, 
                rewriter, parameter, method, annotation, textFileChange);
    }
    
    private static Annotation getAnnotation(IJavaElement javaElement, AST ast, 
                Class<? extends java.lang.annotation.Annotation> annotationClass) {
        
        IAnnotationAttributeInitializer annotationAttributeInitializer = AnnotationsManager.
            getAnnotationDefinitionForClass(annotationClass).getAnnotationAttributeInitializer();
        
        List<MemberValuePair> memberValuePairs = 
                annotationAttributeInitializer.getMemberValuePairs(javaElement, ast, annotationClass);
        
        return AnnotationsCore.createAnnotation(ast, annotationClass, annotationClass.getSimpleName(),
                memberValuePairs);
    }

    private static Annotation getAnnotation(ASTNode astNode, AST ast, 
                Class<? extends java.lang.annotation.Annotation> annotationClass) {
        
        IAnnotationAttributeInitializer annotationAttributeInitializer = AnnotationsManager.
            getAnnotationDefinitionForClass(annotationClass).getAnnotationAttributeInitializer();
        
        List<MemberValuePair> memberValuePairs = annotationAttributeInitializer.getMemberValuePairs(astNode, 
                ast, annotationClass);
        
        return AnnotationsCore.createAnnotation(ast, annotationClass, annotationClass.getSimpleName(),
                memberValuePairs);
    }
    
    public static void getImportsChange(ICompilationUnit compilationUnit, Java2WSDataModel model, 
            TextFileChange textFileChange, boolean classOnly) {
        try {
        
            ImportRewrite importRewrite = CodeStyleConfiguration.createImportRewrite(compilationUnit, true);
            
            importRewrite.addImport(ANNOTATION_TYPENAME_MAP.get(WEB_SERVICE));
            
            if (!classOnly) {
                Map<IMethod, Map<String, Boolean>> methodAnnotationMap = model.getMethodMap();
                Set<Entry<IMethod, Map<String, Boolean>>> methodAnnotationSet = methodAnnotationMap.entrySet();
                for (Map.Entry<IMethod, Map<String, Boolean>> methodAnnotation : methodAnnotationSet) {
                    Map<String, Boolean> methodMap = methodAnnotation.getValue();
                    Set<Entry<String, Boolean>> methodSet = methodMap.entrySet();
                    for (Map.Entry<String, Boolean> method : methodSet) {
                        if (ANNOTATION_TYPENAME_MAP.containsKey(method.getKey()) && method.getValue()) {
                            importRewrite.addImport(ANNOTATION_TYPENAME_MAP.get(method.getKey()));
                        }
                    }                    
                }
            }
            if (importRewrite.hasRecordedChanges()) {
                    TextEdit importTextEdit = importRewrite.rewriteImports(null);
                    textFileChange.addEdit(importTextEdit);
            }
        } catch (CoreException ce) {
            CXFCorePlugin.log(ce.getStatus());
        }
    }

    /**
     * Loads all public methods with the default annotation maps
     * @return
     */
    public static Map<IMethod, Map<String, Boolean>> getMethodMap(IType type, Java2WSDataModel model) {
        Map<IMethod, Map<String, Boolean>> methodMap = new HashMap<IMethod, Map<String, Boolean>>();

        try {
            IMethod[] methods = type.getMethods();
            for (IMethod method : methods) {
                if (type.isInterface()) {
                    methodMap.put(method, getAnnotationMap(model));                 
                } else if (type.isClass() && JDTUtils.isPublicMethod(method)) {
                    methodMap.put(method, getAnnotationMap(model));
                }
            }
        } catch (JavaModelException jme) {
            CXFCorePlugin.log(jme.getStatus());
        }
        return methodMap;
    }
    
    public static Map<String, Boolean> getAnnotationMap(Java2WSDataModel model) {
        Map<String, Boolean> annotationdMap = new HashMap<String, Boolean>();
        annotationdMap.put(CXFModelUtils.WEB_METHOD, model.isGenerateWebMethodAnnotation());
        annotationdMap.put(CXFModelUtils.WEB_PARAM, model.isGenerateWebParamAnnotation());
        annotationdMap.put(CXFModelUtils.REQUEST_WRAPPER, model.isGenerateRequestWrapperAnnotation());
        annotationdMap.put(CXFModelUtils.RESPONSE_WRAPPER, model.isGenerateResponseWrapperAnnotation());
        return annotationdMap;
    }
    
    /**
     * CXF wsdl2java -autoNameResolution is supported in the CXF 2.0 stream from 2.0.7
     * and in the CXF 2.1 stream from 2.1.1 up.
     * 
     * @param cxfRuntimeVersion
     * @return
     */
    public static boolean isAutoNameResolutionPermitted() {
        Version currentVersion = CXFCorePlugin.getDefault().getCurrentRuntimeVersion();
        //On startup with clean workspace show by default.
        if (currentVersion.compareTo(v_0_0_0) == 0) {
            return true;
        }

        if (currentVersion.compareTo(CXFModelUtils.v_2_1_1) >= 0) {
            return true;
        }

        if (currentVersion.compareTo(CXFModelUtils.v_2_0_7) >= 0
                && currentVersion.compareTo(CXFModelUtils.v_2_1) < 0) {
            return true;
        }
        return false;
    }
    
    public static boolean getDefaultBooleanValue(int classifierID, int featureID) {
        Object defaultValue = null;

        if (classifierID == CXFPackage.CXF_CONTEXT) {
            switch (featureID) {
            case CXFPackage.CXF_CONTEXT__EXPORT_CXF_CLASSPATH_CONTAINER:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_ExportCXFClasspathContainer()
                        .getDefaultValue();
                break;
            case CXFPackage.CXF_CONTEXT__VERBOSE:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_Verbose().getDefaultValue();
                break;
            case CXFPackage.CXF_CONTEXT__GENERATE_ANT_BUILD_FILE:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_GenerateAntBuildFile().getDefaultValue();
                break;
            case CXFPackage.CXF_CONTEXT__USE_SPRING_APPLICATION_CONTEXT:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_UseSpringApplicationContext()
                        .getDefaultValue();
                break;
            case CXFPackage.CXF_CONTEXT__GENERATE_CLIENT:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_GenerateClient().getDefaultValue();
                break;
            case CXFPackage.CXF_CONTEXT__GENERATE_SERVER:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_GenerateServer().getDefaultValue();
                break;
            }
        }

        if (classifierID == CXFPackage.JAVA2_WS_CONTEXT) {
            switch (featureID) {
            case CXFPackage.JAVA2_WS_CONTEXT__ANNOTATION_PROCESSING_ENABLED:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_AnnotationProcessingEnabled()
                        .getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__SOAP12_BINDING:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_Soap12Binding().getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_XSD_IMPORTS:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateXSDImports().getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_WRAPPER_FAULT_BEANS:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateWrapperFaultBeans()
                        .getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_WSDL:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateWSDL().getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_WEB_METHOD_ANNOTATION:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateWebMethodAnnotation()
                        .getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_WEB_PARAM_ANNOTATION:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateWebParamAnnotation()
                        .getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_REQUEST_WRAPPER_ANNOTATION:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateRequestWrapperAnnotation()
                        .getDefaultValue();
                break;
            case CXFPackage.JAVA2_WS_CONTEXT__GENERATE_RESPONSE_WRAPPER_ANNOTATION:
                defaultValue = CXFPackage.eINSTANCE.getJava2WSContext_GenerateResponseWrapperAnnotation()
                        .getDefaultValue();
                break;
            }
        }

        if (classifierID == CXFPackage.WSDL2_JAVA_CONTEXT) {
            switch (featureID) {
            case CXFPackage.WSDL2_JAVA_CONTEXT__NO_ADDRESS_BINDING:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_NoAddressBinding().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__USE_DEFAULT_VALUES:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_UseDefaultValues().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__AUTO_NAME_RESOLUTION:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_AutoNameResolution()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__GENERATE_IMPLEMENTATION:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_GenerateImplementation()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__PROCESS_SOAP_HEADERS:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_ProcessSOAPHeaders()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__GENERATE_ANT_BUILD_FILE:
                defaultValue = CXFPackage.eINSTANCE.getCXFContext_GenerateAntBuildFile().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__VALIDATE:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_Validate().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__LOAD_DEFAULT_NAMESPACE_PACKAGE_NAME_MAPPING:
                defaultValue = CXFPackage.eINSTANCE
                        .getWSDL2JavaContext_LoadDefaultNamespacePackageNameMapping().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__LOAD_DEFAULT_EXCLUDES_NAMEPSACE_MAPPING:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_LoadDefaultExcludesNamepsaceMapping()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_USE_DEFAULT_VALUES:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcUseDefaultValues()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_TO_STRING:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcToString().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_TO_STRING_MULTI_LINE:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcToStringMultiLine()
                        .getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_TO_STRING_SIMPLE:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcToStringSimple().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_LOCATOR:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcLocator().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_SYNC_METHODS:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcSyncMethods().getDefaultValue();
                break;
            case CXFPackage.WSDL2_JAVA_CONTEXT__XJC_MARK_GENERATED:
                defaultValue = CXFPackage.eINSTANCE.getWSDL2JavaContext_XjcMarkGenerated().getDefaultValue();
                break;
            }
        }

        if (defaultValue != null && defaultValue instanceof Boolean) {
            return ((Boolean) defaultValue).booleanValue();
        }

        return false;
    }

}
