/*******************************************************************************
 * 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.utils.internal.annotations.impl;

import java.util.Iterator;
import java.util.List;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jst.ws.jaxws.utils.annotations.ILocator;
import org.eclipse.jst.ws.jaxws.utils.annotations.IValue;

/**
 * @author Plamen Pavlov
 */

public abstract class ValueImpl implements IValue
{
	private ILocator locator = null;

	protected abstract Expression getExpression(CompilationUnit unit, AST ast);

	
	@SuppressWarnings("unchecked")
	protected boolean addImports(AST ast, CompilationUnit unit, String annotationName)
	{
		String packageAnnotationName = getPackageName(annotationName);
		if (packageAnnotationName == null)
		{
			return false;
		}

		if (packageAnnotationName.equals("java.lang")) //$NON-NLS-1$
		{
			return true;
		}
		if (unit != null)
		{
			ImportDeclaration imp = ast.newImportDeclaration();
			imp.setName(ast.newName(annotationName));
			List<ImportDeclaration> imports = unit.imports();
			String imp1 = getImport(imports, getSimpleName(annotationName));
			if (imp1 == null)
			{
				if (getOnDemandImport(imports, packageAnnotationName) == null)
				{
					imports.add(imp);
				}
			} else
			{
				if (!imp1.equals(annotationName))
				{
					return false;
				}
			}
			return true;
		}

		return false;
	}

	protected static String getImport(List<ImportDeclaration> imports, String imp)
	{
		Iterator<ImportDeclaration> iter = imports.iterator();
		while (iter.hasNext())
		{
			ImportDeclaration next = iter.next();
			Name fqName = next.getName();
			SimpleName name;
			if (fqName.isQualifiedName())
			{
				name = ((QualifiedName) fqName).getName();
			} else
			{
				name = (SimpleName) fqName;
			}
			String simpleName = name.getIdentifier();
			if (imp.equals(simpleName))
			{
				return fqName.getFullyQualifiedName();
			}
		}
		return null;
	}

	protected static String getOnDemandImport(List<ImportDeclaration> imports, String imp)
	{
		Iterator<ImportDeclaration> iter = imports.iterator();
		while (iter.hasNext())
		{
			ImportDeclaration next = iter.next();
			if (!next.isOnDemand())
			{
				continue;
			}
			Name fqName = next.getName();
			String name = fqName.getFullyQualifiedName();
			if (imp.equals(name))
			{
				return name;
			}
		}
		return null;
	}

	protected static String getPackageName(String name)
	{
		int i = name.lastIndexOf('.');
		if (i == -1)
			return null;
		return name.substring(0, i);
	}

	protected static String getSimpleName(String name)
	{
		int i = name.lastIndexOf('.');
		if (i == -1)
			return name;
		return name.substring(i + 1);
	}
	
	public ILocator getLocator()
	{
		return this.locator;
	}

	public void setLocator(final ILocator locator)
	{
		this.locator = locator;
	}
}
