/*******************************************************************************
 * Copyright (c) 2007, 2008 SAP AG 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:
 * Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.web.operations;

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

import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;

public class BinaryConstructor implements Constructor {
	
	private IMethod method;

	public BinaryConstructor(IMethod method) {
		this.method = method;
	}

	/**
	 * @see Constructor#isParameterless()
	 */
	public boolean isParameterless() {
		return method.getNumberOfParameters() == 0;
	}

	/**
	 * @see Constructor#isPublic()
	 */
	public boolean isPublic() {
		int flags;
		try {
			flags = method.getFlags();
		} catch (JavaModelException e) {
			WebPlugin.log(e);
			flags = 0;
		}
        return Flags.isPublic(flags);
	}

	/**
	 * @see Constructor#isProtected()
	 */
	public boolean isProtected() {
		int flags;
		try {
			flags = method.getFlags();
		} catch (JavaModelException e) {
			WebPlugin.log(e);
			flags = 0;
		}
        return Flags.isProtected(flags);
	}

	/**
	 * @see Constructor#getParamsForCall()
	 */
	public String getParamsForCall() {
		return this.getParams(false, true);
	}

	/**
	 * @see Constructor#getParamsForDeclaration()
	 */
	public String getParamsForDeclaration() {
		return this.getParams(true, true);
	}

	/**
	 * @see Constructor#getParamsForJavadoc()()
	 */
	public String getParamsForJavadoc() {
		return this.getParams(true, false);
	}
	
	/**
	 * @see Constructor#getNonPrimitiveParameterTypes()
	 */
	public List<String> getNonPrimitiveParameterTypes() {
		List<String> result = new ArrayList<String>();
		
		String[] parameterTypes = method.getParameterTypes();
		for (String parameterType : parameterTypes) {
			if (Signature.getTypeSignatureKind(parameterType) != Signature.BASE_TYPE_SIGNATURE) {
				result.add(Signature.toString(parameterType));
			}
		}
		
		return result;
	}

	private String getParams(boolean types, boolean names) {
		StringBuilder result = new StringBuilder();
		
        String[] parameterTypes = method.getParameterTypes();
        String[] parameterNames;
		try {
			parameterNames = method.getParameterNames();
		} catch (JavaModelException e) {
			WebPlugin.log(e);
			
			parameterNames = new String[parameterTypes.length];
			for (int i = 0; i < parameterNames.length; i++) {
				parameterNames[i] = "arg" + i;
			}
		}
        
        for (int i = 0; i < parameterTypes.length; i++) {
        	if (types) 
        		result.append(Signature.getSignatureSimpleName(parameterTypes[i]));
        	
        	if (types && names) 
        		result.append(" "); //$NON-NLS-1$
        	
        	if (names) 
        		result.append(parameterNames[i]);
        	
            if (i < parameterNames.length - 1)
                result.append(", "); //$NON-NLS-1$
        }
		
		return result.toString();
	}

}
