/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.internal.core.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.CDIUtil;
import org.jboss.tools.cdi.core.IBeanMethod;
import org.jboss.tools.cdi.core.IInterceptorBinding;
import org.jboss.tools.cdi.core.IParameter;
import org.jboss.tools.cdi.internal.core.impl.definition.MethodDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.ParameterDefinition;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class BeanMethod extends BeanMember implements IBeanMethod {
protected IMethod method;
protected AnnotationDeclaration inject;
List<IParameter> parameters = new ArrayList<IParameter>();
public BeanMethod() {}
public void setDefinition(MethodDefinition definition) {
super.setDefinition(definition);
setMethod(definition.getMethod());
inject = definition.getInjectAnnotation();
List<ParameterDefinition> ps = definition.getParameters();
for (ParameterDefinition p: ps) {
// if(p.isAnnotationPresent(CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME)) {
// continue;
// }
Parameter parameter = newParameter(p);
parameter.setBeanMethod(this);
parameter.setDefinition(p);
parameters.add(parameter);
}
}
protected Parameter newParameter(ParameterDefinition p) {
return ((MethodDefinition)definition).parametersAreInjectionPoints() ? new InjectionPointParameter() : new Parameter();
}
public IMethod getMethod() {
return method;
}
public void setMethod(IMethod method) {
this.method = method;
setMember(method);
}
public IMember getSourceMember() {
return getMethod();
}
public List<IParameter> getParameters() {
return parameters;
}
@Override
public MethodDefinition getDefinition() {
return (MethodDefinition)definition;
}
public boolean isDisposer() {
for (IParameter p: parameters) {
if(p.isAnnotationPresent(CDIConstants.DISPOSES_ANNOTATION_TYPE_NAME)) return true;
}
return false;
}
public boolean isObserver() {
for (IParameter p: parameters) {
if(p.isAnnotationPresent(CDIConstants.OBSERVERS_ANNOTATION_TYPE_NAME)) return true;
}
return false;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.cdi.core.IBeanMethod#isLifeCycleCallbackMethod()
*/
public boolean isLifeCycleCallbackMethod() {
return definition.getAnnotation(CDIConstants.PRE_DESTROY_TYPE_NAME)!=null || definition.getAnnotation(CDIConstants.POST_CONSTRUCTOR_TYPE_NAME)!=null;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.cdi.core.IInterceptorBinded#getInterceptorBindings()
*/
public Collection<IInterceptorBinding> getInterceptorBindings() {
return CDIUtil.getAllInterceptorBindings(this);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.cdi.core.ICDIElement#getSimpleJavaName()
*/
@Override
public String getElementName() {
return getClassBean().getBeanClass().getElementName() + "." + getMethod().getElementName() + "()"; //$NON-NLS-1$
}
@Override
public boolean isDeclaredFor(IJavaElement element) {
if(getMethod() == element) {
return true;
}
if(element instanceof IMethod) {
IMethod other = (IMethod)element;
return getMethod().getElementName().equals(other.getElementName())
&& getMethod().getDeclaringType().getFullyQualifiedName().equals(other.getDeclaringType().getFullyQualifiedName())
&& equalArrays(getMethod().getParameterTypes(), other.getParameterTypes());
}
return false;
}
private boolean equalArrays(String[] a1, String[] a2) {
if(a1.length != a2.length) {
return false;
}
for (int i = 0; i < a1.length; i++) {
if(!a1[i].equals(a2[i])) {
return false;
}
}
return true;
}
}