/*******************************************************************************
* Copyright (c) 2014, 2015 IBH SYSTEMS GmbH.
* 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:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.web.controller;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.packagedrone.web.RequestHandler;
import org.eclipse.packagedrone.web.ViewResolver;
import org.eclipse.packagedrone.web.controller.routing.RequestMappingInformation;
import org.eclipse.packagedrone.web.controller.routing.RequestMappingInformation.Match;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ControllerEntry
{
private final static Logger logger = LoggerFactory.getLogger ( ControllerEntry.class );
private final Object controller;
private final Set<ControllerCall> calls = new HashSet<> ();
private final ViewResolver viewResolver;
public ControllerEntry ( final Object controller )
{
this.controller = controller;
final Class<? extends Object> clazz = controller.getClass ();
this.viewResolver = clazz.getAnnotation ( ViewResolver.class );
final Set<ControllerInterceptorProcessor> interceptors = interceptorsFromController ();
logger.debug ( "Interceptors for {}: {}", controller, interceptors );
for ( final Method m : clazz.getMethods () )
{
final RequestMappingInformation rmi = parse ( m );
if ( rmi != null )
{
this.calls.add ( new ControllerCall ( controller, rmi, m, interceptors ) );
}
}
}
private Set<ControllerInterceptorProcessor> interceptorsFromController ()
{
final ControllerInterceptor[] interceptors = this.controller.getClass ().getAnnotationsByType ( ControllerInterceptor.class );
final Set<ControllerInterceptorProcessor> result = new HashSet<> ( interceptors.length );
for ( final ControllerInterceptor inter : interceptors )
{
try
{
result.add ( inter.value ().newInstance () );
}
catch ( InstantiationException | IllegalAccessException e )
{
throw new RuntimeException ( e );
}
}
return result;
}
public Object getController ()
{
return this.controller;
}
public ViewResolver getViewResolver ()
{
return this.viewResolver;
}
protected static RequestMappingInformation parse ( final Method method )
{
return Controllers.fromMethod ( method );
}
public RequestHandler findHandler ( final HttpServletRequest request, final HttpServletResponse response )
{
for ( final ControllerCall call : this.calls )
{
final Match match = call.matches ( request );
if ( match == null )
{
continue;
}
final RequestHandler handler = call.call ( match, request, response );
if ( handler != null )
{
return handler;
}
}
return null;
}
@Override
public String toString ()
{
return String.format ( "[Controller: %s]", this.controller );
}
}