package com.github.dynamicextensionsalfresco.webscripts.arguments; import java.lang.annotation.Annotation; import com.github.dynamicextensionsalfresco.webscripts.WebScriptWebRequest; import com.github.dynamicextensionsalfresco.webscripts.annotations.Command; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; import org.springframework.validation.BindingResult; import org.springframework.web.bind.support.WebRequestDataBinder; public class CommandArgumentResolver implements ArgumentResolver<Object, Command> { @Override public boolean supports(final Class<?> parameterType, final Class<? extends Annotation> annotationType) { return Command.class.equals(annotationType); } @Override public Object resolveArgument(final Class<?> parameterType, final Command command, final String name, final WebScriptRequest request, final WebScriptResponse response) { try { final Object commandObject = parameterType.newInstance(); final BindingResult result = performDataBinding(request, command, commandObject); if (result.hasErrors()) { throw new IllegalArgumentException("Errors binding @Command method parameter '" + name + "':" + result.getAllErrors().toString()); } return commandObject; } catch (final InstantiationException e) { throw new RuntimeException("Cannot create instance of class '" + parameterType.getName() + "'. Method parameters annotated with @Command must have a no-argument constructor."); } catch (final IllegalAccessException e) { throw new RuntimeException(e); } } protected BindingResult performDataBinding(final WebScriptRequest request, final Command command, final Object commandObject) { final WebRequestDataBinder dataBinder = new WebRequestDataBinder(commandObject); dataBinder.setIgnoreInvalidFields(command.ignoreInvalidFields()); dataBinder.setIgnoreUnknownFields(command.ignoreUnknownFields()); if (command.allowedFields().length > 0) { dataBinder.setAllowedFields(command.allowedFields()); } dataBinder.bind(new WebScriptWebRequest(request)); return dataBinder.getBindingResult(); } }