/***************************************************************************************************
 * Copyright (c) 2005 Eteration A.S. 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
 * https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors: Eteration A.S. - initial API and implementation
 **************************************************************************************************/

package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;

import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.TagElement;
import org.eclipse.jdt.core.dom.TypeDeclaration;


public class XDoxletAnnotationUtil {
	private static final String XDOCLET_EJB_BEAN_TAG = "@ejb.bean"; //$NON-NLS-1$
	private static final String XDOCLET_WEB_TAG = "@web"; //$NON-NLS-1$
	public static class XDocletFinder extends ASTVisitor {
		boolean isXDocletBean = false;
		boolean isXDocletWebBean = false;
	
		public XDocletFinder(boolean visitDocTags) {
			super(visitDocTags);
		}

		public boolean visit(TypeDeclaration type) {
			if (type.getJavadoc() == null)
				return true;
			Iterator tags = type.getJavadoc().tags().iterator();
			while (tags.hasNext()) {
				TagElement element = (TagElement) tags.next();
				if (XDOCLET_EJB_BEAN_TAG.equals(element.getTagName())) {
					isXDocletBean=true;
					return false;
				}else	if (element.getTagName() != null && element.getTagName().startsWith(XDOCLET_WEB_TAG)) {
					isXDocletWebBean=true;
					return false;
				}
			}
			return true;
		}
	}

	public static boolean isXDocletAnnotatedResource(IResource resource) {
		ICompilationUnit compilationUnit = JavaCore.createCompilationUnitFrom((IFile) resource);
		return isXDocletAnnotated(compilationUnit);
	}

	
	public static boolean isXDocletAnnotatedEjbClass(IJavaElement compilationUnit) {
		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
			ASTParser parser = ASTParser.newParser(AST.JLS3);
			parser.setSource((ICompilationUnit)compilationUnit);
			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
			ast.accept(docletFinder);
			return docletFinder.isXDocletBean;
		}
		return false;
	}
	public static boolean isXDocletAnnotatedWebClass(IJavaElement compilationUnit) {
		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
			ASTParser parser = ASTParser.newParser(AST.JLS3);
			parser.setSource((ICompilationUnit)compilationUnit);
			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
			ast.accept(docletFinder);
			return docletFinder.isXDocletWebBean;
		}
		return false;
	}
	public static boolean isXDocletAnnotated(IJavaElement compilationUnit) {
		if (compilationUnit != null && compilationUnit.getElementType() == IJavaElement.COMPILATION_UNIT){
			ASTParser parser = ASTParser.newParser(AST.JLS3);
			parser.setSource((ICompilationUnit)compilationUnit);
			CompilationUnit ast = (CompilationUnit) parser.createAST(null);
			XDoxletAnnotationUtil.XDocletFinder docletFinder = new XDoxletAnnotationUtil.XDocletFinder(true);
			ast.accept(docletFinder);
			return docletFinder.isXDocletWebBean || docletFinder.isXDocletBean ;
		}
		return false;
	}
}
