/***
 * Copyright (c) 2009 Caelum - www.caelum.com.br/opensource
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 	http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package br.com.caelum.vraptor.controller;

import br.com.caelum.vraptor.proxy.CDIProxies;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Objects;

import javax.enterprise.inject.Vetoed;

@Vetoed
public class DefaultControllerMethod implements ControllerMethod {

	private final BeanClass controller;
	private final Method method;

	public DefaultControllerMethod(BeanClass controller, Method method) {
		this.controller = controller;
		this.method = method;
	}

	public static ControllerMethod instanceFor(Class<?> type, Method method) {
        type = CDIProxies.extractRawTypeIfPossible(type);
		return new DefaultControllerMethod(new DefaultBeanClass(type), method);
	}

	@Override
	public Method getMethod() {
		return method;
	}

	@Override
	public int getArity() {
		return method.getParameterTypes().length;
	}

	@Override
	public BeanClass getController() {
		return controller;
	}

	@Override
	public boolean containsAnnotation(Class<? extends Annotation> annotation) {
		return method.isAnnotationPresent(annotation);
	}
	
	@Override
	public Annotation[] getAnnotations(){
		return method.getAnnotations();
	}

	@Override
	public String toString() {
		return "[DefaultControllerMethod: " + method + "]";
	}

	@Override
	public int hashCode() {
		return Objects.hash(method, controller);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null || getClass() != obj.getClass())
			return false;
		
		DefaultControllerMethod other = (DefaultControllerMethod) obj;
		return Objects.equals(method, other.method) && Objects.equals(controller, other.controller);
	}

}

@@ -696,48 +696,39 @@
 ort 
-br.com.caelum.vraptor.proxy.CDIProxies;%0A
+javax.enterprise.inject.Vetoed;
 %0Aimp
@@ -835,38 +835,78 @@
 ort 
-javax.enterprise.inject.Vetoed
+static br.com.caelum.vraptor.proxy.CDIProxies.extractRawTypeIfPossible
 ;%0A%0A@
@@ -1259,34 +1259,17 @@
 ) %7B%0A
-        type = CDIProxies.
+%09%09type = 
 extr
@@ -1731,17 +1731,16 @@
 on);%0A%09%7D%0A
-%09
 %0A%09@Overr
@@ -1780,16 +1780,17 @@
 ations()
+ 
 %7B%0A%09%09retu
@@ -2067,16 +2067,18 @@
  == obj)
+ %7B
 %0A%09%09%09retu
@@ -2086,16 +2086,20 @@
 n true;%0A
+%09%09%7D%0A
 %09%09if (ob
@@ -2140,16 +2140,18 @@
 Class())
+ %7B
 %0A%09%09%09retu
@@ -2162,16 +2162,18 @@
 alse;%0A%09%09
+%7D%0A
 %0A%09%09Defau

remove sepaces to tabs