diff --git a/grails-bootstrap/src/main/groovy/grails/util/CollectionUtils.java b/grails-bootstrap/src/main/groovy/grails/util/CollectionUtils.java index 0e2cf86435b..fd7afa3a6cf 100644 --- a/grails-bootstrap/src/main/groovy/grails/util/CollectionUtils.java +++ b/grails-bootstrap/src/main/groovy/grails/util/CollectionUtils.java @@ -15,14 +15,7 @@ */ package grails.util; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Collection utility methods. @@ -66,4 +59,19 @@ public static List newList(T... values) { return new ArrayList(Arrays.asList(values)); } + + /** + * Gets a child map of the given parent map or returns an empty map if it doesn't exist + * + * @param parent The parent map + * @param key The key that holds the child map + * @return The child map + */ + public static Map getOrCreateChildMap(Map parent, String key) { + Object o = parent.get(key); + if(o instanceof Map) { + return (Map)o; + } + return new LinkedHashMap(); + } } diff --git a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/ChainMethod.groovy b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/ChainMethod.groovy deleted file mode 100644 index 9072f60e98f..00000000000 --- a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/ChainMethod.groovy +++ /dev/null @@ -1,9 +0,0 @@ -package org.codehaus.groovy.grails.web.metaclass - -/** - * @author Graeme Rocher - * @deprecated Use {@link org.grails.plugins.web.controllers.metaclass.ChainMethod} instead - */ -@Deprecated -class ChainMethod extends org.grails.plugins.web.controllers.metaclass.ChainMethod{ -} diff --git a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/WithFormMethod.groovy b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/WithFormMethod.groovy deleted file mode 100644 index 3eaa47fdf70..00000000000 --- a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/metaclass/WithFormMethod.groovy +++ /dev/null @@ -1,9 +0,0 @@ -package org.codehaus.groovy.grails.web.metaclass - -/** - * @author Graeme Rocher - * @deprecated Use {@link org.grails.plugins.web.controllers.metaclass.WithFormMethod} instead - */ -@Deprecated -class WithFormMethod extends org.grails.plugins.web.controllers.metaclass.WithFormMethod { -} diff --git a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/DelegatingApplicationAttributes.groovy b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/DelegatingApplicationAttributes.groovy index 17bbdb013ac..b6906651848 100644 --- a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/DelegatingApplicationAttributes.groovy +++ b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/DelegatingApplicationAttributes.groovy @@ -8,11 +8,11 @@ import groovy.transform.CompileStatic */ @Deprecated @CompileStatic -class DelegatingApplicationAttributes implements GrailsApplicationAttributes, grails.web.util.GrailsApplicationAttributes { +class DelegatingApplicationAttributes implements GrailsApplicationAttributes, org.grails.web.util.GrailsApplicationAttributes { - @Delegate grails.web.util.GrailsApplicationAttributes applicationAttributes + @Delegate org.grails.web.util.GrailsApplicationAttributes applicationAttributes - DelegatingApplicationAttributes(grails.web.util.GrailsApplicationAttributes applicationAttributes) { + DelegatingApplicationAttributes(org.grails.web.util.GrailsApplicationAttributes applicationAttributes) { this.applicationAttributes = applicationAttributes } } diff --git a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsWebRequest.groovy b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsWebRequest.groovy index 75066634877..13a99c2acde 100644 --- a/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsWebRequest.groovy +++ b/grails-compat/src/main/groovy/org/codehaus/groovy/grails/web/servlet/mvc/GrailsWebRequest.groovy @@ -1,7 +1,7 @@ package org.codehaus.groovy.grails.web.servlet.mvc import grails.util.Holders -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import org.codehaus.groovy.grails.commons.GrailsApplication import org.codehaus.groovy.grails.web.servlet.DelegatingApplicationAttributes diff --git a/grails-plugin-async/src/main/groovy/grails/artefact/AsyncController.groovy b/grails-plugin-async/src/main/groovy/grails/artefact/AsyncController.groovy index 778b29e9300..b7032ee6dba 100644 --- a/grails-plugin-async/src/main/groovy/grails/artefact/AsyncController.groovy +++ b/grails-plugin-async/src/main/groovy/grails/artefact/AsyncController.groovy @@ -15,7 +15,7 @@ */ package grails.artefact -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import javax.servlet.AsyncContext diff --git a/grails-plugin-async/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy b/grails-plugin-async/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy index f80e94e4ed5..60c4a0f02d5 100644 --- a/grails-plugin-async/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy +++ b/grails-plugin-async/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy @@ -1,7 +1,7 @@ package grails.async.web import groovy.transform.CompileStatic -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.context.ApplicationContext import org.springframework.util.Assert diff --git a/grails-plugin-async/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy b/grails-plugin-async/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy index 58c290808c5..22e9d45b0c0 100644 --- a/grails-plugin-async/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy +++ b/grails-plugin-async/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy @@ -21,7 +21,7 @@ import grails.async.web.AsyncGrailsWebRequest import groovy.transform.CompileStatic import org.grails.plugins.web.async.GrailsAsyncContext import org.grails.web.errors.GrailsExceptionResolver -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.ActionResultTransformer import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.web.context.request.async.AsyncWebRequest diff --git a/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy b/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy index 2813bc9336d..7c94fb0e0dc 100644 --- a/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy +++ b/grails-plugin-controllers/src/main/groovy/grails/artefact/Controller.groovy @@ -15,10 +15,38 @@ */ package grails.artefact +import grails.databinding.DataBindingSource +import grails.util.CollectionUtils +import grails.util.GrailsMetaClassUtils +import grails.util.GrailsNameUtils +import grails.web.UrlConverter +import grails.web.databinding.DataBindingUtils +import grails.web.mapping.UrlCreator +import grails.web.mapping.UrlMappings +import grails.web.mapping.UrlMappingsHolder +import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods +import org.codehaus.groovy.runtime.InvokerHelper +import org.grails.core.artefact.ControllerArtefactHandler +import org.grails.plugins.support.WebMetaUtils +import org.grails.plugins.web.api.MimeTypesApiSupport +import org.grails.plugins.web.controllers.metaclass.ForwardMethod +import org.grails.plugins.web.servlet.mvc.InvalidResponseHandler +import org.grails.plugins.web.servlet.mvc.ValidResponseHandler +import org.grails.web.mapping.ForwardUrlMappingInfo +import org.grails.web.mapping.UrlMappingUtils +import org.grails.web.servlet.mvc.SynchronizerTokensHolder import org.grails.web.servlet.mvc.TokenResponseHandler +import org.springframework.beans.MutablePropertyValues +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.validation.BindingResult +import org.springframework.validation.ObjectError + +import javax.servlet.ServletRequest +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.DEFAULT_ENCODING -import grails.artefact.controller.TempControllerServletApi +import grails.artefact.controller.ServletAttributes import grails.artefact.controller.support.ResponseRenderer import grails.core.GrailsControllerClass import grails.core.GrailsDomainClassProperty @@ -31,18 +59,14 @@ import grails.web.mapping.ResponseRedirector import grails.web.mapping.mvc.RedirectEventListener import grails.web.mapping.mvc.exceptions.CannotRedirectException import grails.web.servlet.mvc.GrailsParameterMap -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import java.lang.reflect.Method -import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods import org.grails.compiler.web.ControllerActionTransformer import org.grails.core.artefact.DomainClassArtefactHandler import org.grails.plugins.web.controllers.ControllerExceptionHandlerMetaData -import org.grails.plugins.web.controllers.metaclass.ChainMethod -import org.grails.plugins.web.controllers.metaclass.ForwardMethod -import org.grails.plugins.web.controllers.metaclass.WithFormMethod import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.ApplicationContext @@ -56,7 +80,7 @@ import org.springframework.web.servlet.support.RequestDataValueProcessor /** - * + * Classes that implement the {@link Controller} trait are automatically treated as web controllers in a Grails application * * @author Jeff Brown * @author Graeme Rocher @@ -65,17 +89,76 @@ import org.springframework.web.servlet.support.RequestDataValueProcessor * */ @CompileStatic -trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempControllerServletApi { +trait Controller implements ResponseRenderer, DataBinder, WebAttributes, ServletAttributes { - private ForwardMethod forwardMethod = new ForwardMethod() - private WithFormMethod withFormMethod = new WithFormMethod() private Collection redirectListeners private RequestDataValueProcessor requestDataValueProcessor + private UrlConverter urlConverter boolean useJessionId = false LinkGenerator grailsLinkGenerator String gspEncoding = DEFAULT_ENCODING + @Autowired(required=false) + void setRedirectListeners(Collection redirectListeners) { + this.redirectListeners = redirectListeners + } + + @Autowired(required=false) + void setUrlConverter(UrlConverter urlConverter) { + this.urlConverter = urlConverter + } + + void setLinkGenerator(LinkGenerator linkGenerator) { + grailsLinkGenerator = linkGenerator + } + + /** + *

The withFormat method is used to allow controllers to handle different types of + * request formats such as HTML, XML and so on. Example usage:

+ * + *
+     * 
+     *    withFormat {
+     *        html { render "html" }
+     *        xml { render "xml}
+     *    }
+     * 
+     * 
+ * + * @param callable + * @return The result of the closure execution selected + */ + def T withFormat(Closure callable) { + MimeTypesApiSupport mimeTypesSupport = new MimeTypesApiSupport() + HttpServletResponse response = GrailsWebRequest.lookup().currentResponse + mimeTypesSupport.withFormat((HttpServletResponse)response, callable) + } + + /** + * Sets a response header for the given name and value + * + * @param headerName The header name + * @param headerValue The header value + */ + void header(String headerName, headerValue) { + if (headerValue != null) { + final HttpServletResponse response = getResponse() + response?.setHeader headerName, headerValue.toString() + } + } + + /** + * Binds data for the given type to the given collection from the request + * + * @param targetType The target type + * @param collectionToPopulate The collection to populate + * @param request The request + */ + void bindData(Class targetType, Collection collectionToPopulate, ServletRequest request) { + DataBindingUtils.bindToCollection targetType, collectionToPopulate, request + } + /** * Return true if there are an errors * @return true if there are errors @@ -90,16 +173,19 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon * @param errors The error instance */ void setErrors(Errors errors) { - currentRequestAttributes().setAttribute(GrailsApplicationAttributes.ERRORS, errors, 0) + def webRequest = currentRequestAttributes() + setErrorsInternal(webRequest, errors) } + /** * Obtains the errors instance for the current controller * * @return The Errors instance */ Errors getErrors() { - (Errors)currentRequestAttributes().getAttribute(GrailsApplicationAttributes.ERRORS, 0) + def webRequest = currentRequestAttributes() + getErrorsInternal(webRequest) } @@ -121,47 +207,6 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon currentRequestAttributes().setAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, mav, 0) } - @Autowired(required=false) - void setRedirectListeners(Collection redirectListeners) { - this.redirectListeners = redirectListeners - } - - void setLinkGenerator(LinkGenerator linkGenerator) { - grailsLinkGenerator = linkGenerator - } - - @SuppressWarnings("unchecked") - Method getExceptionHandlerMethodFor(final Class exceptionType) throws Exception { - if(!Exception.class.isAssignableFrom(exceptionType)) { - throw new IllegalArgumentException("exceptionType [${exceptionType.getName()}] argument must be Exception or a subclass of Exception") - } - - Method handlerMethod - final List exceptionHandlerMetaDataInstances = (List)GrailsClassUtils.getStaticFieldValue(this.getClass(), ControllerActionTransformer.EXCEPTION_HANDLER_META_DATA_FIELD_NAME) - if(exceptionHandlerMetaDataInstances) { - - // find all of the handler methods which could accept this exception type - final List matches = (List)exceptionHandlerMetaDataInstances.findAll { ControllerExceptionHandlerMetaData cemd -> - cemd.exceptionType.isAssignableFrom(exceptionType) - } - - if(matches.size() > 0) { - ControllerExceptionHandlerMetaData theOne = matches.get(0) - - // if there are more than 1, find the one that is farthest down the inheritance hierarchy - for(int i = 1; i < matches.size(); i++) { - final ControllerExceptionHandlerMetaData nextMatch = matches.get(i) - if(theOne.getExceptionType().isAssignableFrom(nextMatch.getExceptionType())) { - theOne = nextMatch - } - } - handlerMethod = this.getClass().getMethod(theOne.getMethodName(), theOne.getExceptionType()) - } - } - - handlerMethod - } - /** * Returns the URI of the currently executing action * @@ -206,15 +251,69 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon Map getChainModel() { (Map)getFlash().get("chainModel") } - + /** - * Invokes the chain method for the given arguments + * Obtains the Grails parameter map + * + * @return The GrailsParameterMap instance + */ + GrailsParameterMap getParams() { + currentRequestAttributes().getParams() + } + + + /** + * Chains from one action to another via an HTTP redirect. The model is retained in the following request in the 'chainModel' property within flash scope. * * @param args The arguments + * * @return Result of the redirect call */ void chain(Map args) { - ChainMethod.invoke this, args + String controller = (args.controller ?: GrailsNameUtils.getLogicalPropertyName( getClass().name, ControllerArtefactHandler.TYPE)).toString() + String action = args.action?.toString() + String plugin = args.remove('plugin')?.toString() + def id = args.id + def params = CollectionUtils.getOrCreateChildMap(args, "params") + def model = CollectionUtils.getOrCreateChildMap(args, "model") + + def actionParams = params.findAll { Map.Entry it -> it.key?.toString()?.startsWith('_action_') } + actionParams.each { Map.Entry it -> params.remove(it.key) } + + + def currentWebRequest = webRequest + def currentFlash = currentWebRequest.flashScope + def chainModel = currentFlash.chainModel + if (chainModel instanceof Map) { + chainModel.putAll(model) + model = chainModel + } + currentFlash.chainModel = model + + + def appCtx = currentWebRequest.applicationContext + + UrlMappings mappings = appCtx.getBean(UrlMappingsHolder.BEAN_ID, UrlMappings) + + // Make sure that if an ID was given, it is used to evaluate + // the reverse URL mapping. + if (id) params.id = id + + UrlCreator creator = mappings.getReverseMapping(controller, action, plugin, params) + def response = currentWebRequest.getCurrentResponse() + + String url = creator.createURL(controller, action, plugin, params, 'utf-8') + + if (appCtx.containsBean("requestDataValueProcessor")) { + RequestDataValueProcessor valueProcessor = appCtx.getBean("requestDataValueProcessor", RequestDataValueProcessor) + if (valueProcessor != null) { + HttpServletRequest request = currentWebRequest.getCurrentRequest() + url = response.encodeRedirectURL(valueProcessor.processUrl(request, url)) + } + } else { + url = response.encodeRedirectURL(url) + } + response.sendRedirect url } /** @@ -224,7 +323,44 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon * @return The forwarded URL */ String forward(Map params) { - forwardMethod.forward getRequest(), getResponse(), params + def urlInfo = new ForwardUrlMappingInfo() + org.springframework.validation.DataBinder binder = new org.springframework.validation.DataBinder(urlInfo) + binder.bind(new MutablePropertyValues(params)) + + GrailsWebRequest webRequest = getWebRequest() + + if (webRequest) { + def controllerName + if(params.controller) { + controllerName = params.controller + } else { + controllerName = webRequest.controllerName + } + + if(controllerName) { + def convertedControllerName = convert(controllerName.toString()) + webRequest.controllerName = convertedControllerName + } + urlInfo.controllerName = webRequest.controllerName + + if(params.action) { + urlInfo.actionName = convert(params.action.toString()) + } + + if(params.namespace) { + urlInfo.namespace = params.namespace + } + + if(params.plugin) { + urlInfo.pluginName = params.plugin + } + } + + def model = params.model instanceof Map ? params.model : Collections.EMPTY_MAP + request.setAttribute(ForwardMethod.IN_PROGRESS, true) + String uri = UrlMappingUtils.forwardRequestForUrlMappingInfo(request, response, urlInfo, (Map)model, true) + request.setAttribute(ForwardMethod.CALLED, true) + return uri } /** @@ -234,7 +370,7 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon * @return The result of the closure execution */ TokenResponseHandler withForm(Closure callable) { - withFormMethod.withForm getWebRequest(), callable + withForm getWebRequest(), callable } @@ -245,24 +381,24 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon * @return null */ void redirect(Map argMap) { - + if (argMap.isEmpty()) { throw new MissingMethodException("redirect",this.getClass(), [ argMap ] as Object[]) } - + GrailsWebRequest webRequest = (GrailsWebRequest)RequestContextHolder.currentRequestAttributes() - + if(this instanceof GroovyObject) { GroovyObject controller = (GroovyObject)this - + // if there are errors add it to the list of errors - Errors controllerErrors = (Errors)controller.getProperty(ControllerDynamicMethods.ERRORS_PROPERTY) + Errors controllerErrors = getErrorsInternal(webRequest) Errors errors = (Errors)argMap.get(ControllerDynamicMethods.ERRORS_PROPERTY) if (controllerErrors != null && errors != null) { controllerErrors.addAllErrors errors } else { - controller.setProperty ControllerDynamicMethods.ERRORS_PROPERTY, errors + setErrorsInternal webRequest, errors } def action = argMap.get(GrailsControllerClass.ACTION) if (action != null) { @@ -274,14 +410,14 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon argMap.put GrailsControllerClass.NAMESPACE_PROPERTY, GrailsClassUtils.getStaticFieldValue(controller.getClass(), GrailsControllerClass.NAMESPACE_PROPERTY) } } - + ResponseRedirector redirector = new ResponseRedirector(getLinkGenerator(webRequest)) redirector.setRedirectListeners redirectListeners redirector.setRequestDataValueProcessor initRequestDataValueProcessor() redirector.setUseJessionId useJessionId redirector.redirect webRequest.getRequest(), webRequest.getResponse(), argMap } - + /** * Redirects for the given arguments. * @@ -307,6 +443,74 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon } throw new CannotRedirectException("Cannot redirect for object [${object}] it is not a domain or has no identifier. Use an explicit redirect instead ") } + + /** + *

Main entry point, this method will check the request for the necessary TOKEN and if it is valid + * will call the passed closure. + * + *

For an invalid response an InvalidResponseHandler is returned which will invoke the closure passed + * to the handleInvalid method. The idea here is to allow code like: + * + *


+     * withForm {
+     *   // handle valid form submission
+     * }.invalidToken {
+     *    // handle invalid form submission
+     * }
+     * 
+ */ + TokenResponseHandler withForm(GrailsWebRequest webRequest, Closure callable) { + TokenResponseHandler handler + if (isTokenValid(webRequest)) { + resetToken(webRequest) + handler = new ValidResponseHandler(callable?.call()) + } + else { + handler = new InvalidResponseHandler() + } + + webRequest.request.setAttribute(TokenResponseHandler.KEY, handler) + return handler + } + + /** + * Checks whether the token in th request is valid. + * + * @param request The servlet request + */ + private synchronized boolean isTokenValid(GrailsWebRequest webRequest) { + final request = webRequest.getCurrentRequest() + SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder)request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) + if (!tokensHolderInSession) return false + + String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] + if (!tokenInRequest) return false + + String urlInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_URI] + if (!urlInRequest) return false + + try { + return tokensHolderInSession.isValid(urlInRequest, tokenInRequest) + } + catch (IllegalArgumentException) { + return false + } + } + + /** + * Resets the token in the request + */ + private synchronized resetToken(GrailsWebRequest webRequest) { + final request = webRequest.getCurrentRequest() + SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder)request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) + String urlInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_URI] + String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] + + if (urlInRequest && tokenInRequest) { + tokensHolderInSession.resetToken(urlInRequest, tokenInRequest) + } + if (tokensHolderInSession.isEmpty()) request.getSession(false)?.removeAttribute(SynchronizerTokensHolder.HOLDER) + } public static ApplicationContext getStaticApplicationContext() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes() @@ -316,14 +520,148 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon ((GrailsWebRequest)requestAttributes).getApplicationContext() } - /** - * Obtains the Grails parameter map - * - * @return The GrailsParameterMap instance - */ - GrailsParameterMap getParams() { - currentRequestAttributes().getParams() - } + + /** + * Initializes a command object. + * + * If type is a domain class and the request body or parameters include an id, the id is used to retrieve + * the command object instance from the database, otherwise the no-arg constructor on type is invoke. If + * an attempt is made to retrieve the command object instance from the database and no corresponding + * record is found, null is returned. + * + * The command object is then subjected to data binding and dependency injection before being returned. + * + * + * @param type The type of the command object + * @return the initialized command object or null if the command object is a domain class, the body or + * parameters included an id and no corresponding record was found in the database. + */ + def initializeCommandObject(final Class type, final String commandObjectParameterName) throws Exception { + final HttpServletRequest request = getRequest() + def commandObjectInstance = null + try { + final DataBindingSource dataBindingSource = DataBindingUtils + .createDataBindingSource( + getGrailsApplication(), type, + request) + final DataBindingSource commandObjectBindingSource = WebMetaUtils + .getCommandObjectBindingSourceForPrefix( + commandObjectParameterName, dataBindingSource) + def entityIdentifierValue = null + final boolean isDomainClass = DomainClassArtefactHandler + .isDomainClass(type) + if (isDomainClass) { + entityIdentifierValue = commandObjectBindingSource + .getIdentifierValue() + if (entityIdentifierValue == null) { + final GrailsWebRequest webRequest = GrailsWebRequest + .lookup(request) + entityIdentifierValue = webRequest?.getParams().getIdentifier() + } + } + if (entityIdentifierValue instanceof String) { + entityIdentifierValue = ((String) entityIdentifierValue).trim() + if ("".equals(entityIdentifierValue) + || "null".equals(entityIdentifierValue)) { + entityIdentifierValue = null + } + } + + final HttpMethod requestMethod = HttpMethod.valueOf(request.getMethod()) + + if (entityIdentifierValue != null) { + try { + commandObjectInstance = InvokerHelper.invokeStaticMethod(type, "get", entityIdentifierValue) + } catch (Exception e) { + final Errors errors = getErrors() + if (errors != null) { + errors.reject(getClass().getName() + + ".commandObject." + + commandObjectParameterName + ".error", + e.getMessage()) + } + } + } else if (requestMethod == HttpMethod.POST || !isDomainClass) { + commandObjectInstance = type.newInstance() + } + + if (commandObjectInstance != null + && commandObjectBindingSource != null) { + final boolean shouldDoDataBinding + + if (entityIdentifierValue != null) { + switch (requestMethod) { + case HttpMethod.PATCH: + case HttpMethod.POST: + case HttpMethod.PUT: + shouldDoDataBinding = true + break + default: + shouldDoDataBinding = false + } + } else { + shouldDoDataBinding = true + } + + if (shouldDoDataBinding) { + bindData(commandObjectInstance, commandObjectBindingSource, Collections.EMPTY_MAP, null) + } + } + } catch (Exception e) { + final exceptionHandlerMethodFor = getExceptionHandlerMethodFor(e.getClass()) + if(exceptionHandlerMethodFor != null) { + throw e + } + commandObjectInstance = type.newInstance() + final o = GrailsMetaClassUtils.invokeMethodIfExists(commandObjectInstance, "getErrors") + if(o instanceof BindingResult) { + final BindingResult errors = (BindingResult)o + String msg = "Error occurred initializing command object [" + commandObjectParameterName + "]. " + e.getMessage() + ObjectError error = new ObjectError(commandObjectParameterName, msg) + errors.addError(error) + } + } + + if(commandObjectInstance != null) { + final ApplicationContext applicationContext = getApplicationContext() + final AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory() + autowireCapableBeanFactory.autowireBeanProperties(commandObjectInstance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false) + } + + commandObjectInstance + } + + @SuppressWarnings("unchecked") + Method getExceptionHandlerMethodFor(final Class exceptionType) throws Exception { + if(!Exception.class.isAssignableFrom(exceptionType)) { + throw new IllegalArgumentException("exceptionType [${exceptionType.getName()}] argument must be Exception or a subclass of Exception") + } + + Method handlerMethod + final List exceptionHandlerMetaDataInstances = (List)GrailsClassUtils.getStaticFieldValue(this.getClass(), ControllerActionTransformer.EXCEPTION_HANDLER_META_DATA_FIELD_NAME) + if(exceptionHandlerMetaDataInstances) { + + // find all of the handler methods which could accept this exception type + final List matches = (List)exceptionHandlerMetaDataInstances.findAll { ControllerExceptionHandlerMetaData cemd -> + cemd.exceptionType.isAssignableFrom(exceptionType) + } + + if(matches.size() > 0) { + ControllerExceptionHandlerMetaData theOne = matches.get(0) + + // if there are more than 1, find the one that is farthest down the inheritance hierarchy + for(int i = 1; i < matches.size(); i++) { + final ControllerExceptionHandlerMetaData nextMatch = matches.get(i) + if(theOne.getExceptionType().isAssignableFrom(nextMatch.getExceptionType())) { + theOne = nextMatch + } + } + handlerMethod = this.getClass().getMethod(theOne.getMethodName(), theOne.getExceptionType()) + } + } + + handlerMethod + } private LinkGenerator getLinkGenerator(GrailsWebRequest webRequest) { if (grailsLinkGenerator == null) { @@ -353,6 +691,17 @@ trait Controller implements ResponseRenderer, DataBinder, WebAttributes, TempCon actionName } + private Errors getErrorsInternal(GrailsWebRequest webRequest) { + (Errors) webRequest.getAttribute(GrailsApplicationAttributes.ERRORS, 0) + } + + private setErrorsInternal(GrailsWebRequest webRequest, Errors errors) { + webRequest.setAttribute(GrailsApplicationAttributes.ERRORS, errors, 0) + } + + private String convert(String value) { + (urlConverter) ? urlConverter.toUrlElement(value) : value + } /** * getter to obtain RequestDataValueProcessor from */ diff --git a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/ServletAttributes.groovy b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/ServletAttributes.groovy new file mode 100644 index 00000000000..a83d448c044 --- /dev/null +++ b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/ServletAttributes.groovy @@ -0,0 +1,75 @@ +/* + * Copyright 2014 the original author or authors. + * + * 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 grails.artefact.controller + +import grails.web.api.WebAttributes +import groovy.transform.CompileStatic +import org.springframework.context.ApplicationContext +import org.springframework.web.context.support.WebApplicationContextUtils + +import javax.servlet.ServletContext +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +/** + * This class is a temporary placeholder for Controller methods which in their current + * implementation there are direct references to the servlet api. This is temporary. + * + */ +@CompileStatic +trait ServletAttributes implements WebAttributes { + + private ServletContext servletContext + private ApplicationContext applicationContext + + HttpServletRequest getRequest() { + currentRequestAttributes().getCurrentRequest() + } + + /** + * Obtains the ApplicationContext instance + * @return The ApplicationContext instance + */ + ApplicationContext getApplicationContext() { + if (applicationContext == null) { + this.applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); + } + this.applicationContext + } + + /** + * Obtains the HttpServletResponse instance + * + * @return The HttpServletResponse instance + */ + HttpServletResponse getResponse() { + currentRequestAttributes().getCurrentResponse() + } + + /** + * Obtains the ServletContext instance + * + * @return The ServletContext instance + */ + ServletContext getServletContext() { + if (servletContext == null) { + servletContext = currentRequestAttributes().getServletContext() + } + servletContext + } + + +} diff --git a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/TempControllerServletApi.groovy b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/TempControllerServletApi.groovy deleted file mode 100644 index 4c224bccaed..00000000000 --- a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/TempControllerServletApi.groovy +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2014 the original author or authors. - * - * 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 grails.artefact.controller - -import grails.databinding.DataBindingSource -import grails.util.GrailsMetaClassUtils -import grails.web.api.WebAttributes -import grails.web.databinding.DataBindingUtils - -import javax.servlet.ServletContext -import javax.servlet.ServletRequest -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -import org.codehaus.groovy.runtime.InvokerHelper -import org.grails.core.artefact.DomainClassArtefactHandler -import org.grails.plugins.support.WebMetaUtils -import org.grails.plugins.web.api.MimeTypesApiSupport -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.beans.factory.config.AutowireCapableBeanFactory -import org.springframework.context.ApplicationContext -import org.springframework.http.HttpMethod -import org.springframework.validation.BindingResult -import org.springframework.validation.Errors -import org.springframework.validation.ObjectError -import org.springframework.web.context.support.WebApplicationContextUtils - -/** - * This class is a temporary placeholder for Controller methods which in their current - * implementation there are direct references to the servlet api. This is temporary. - * - */ -trait TempControllerServletApi implements WebAttributes { - - private ServletContext servletContext - private ApplicationContext applicationContext - - HttpServletRequest getRequest() { - currentRequestAttributes().getCurrentRequest() - } - - /** - * Obtains the ApplicationContext instance - * @return The ApplicationContext instance - */ - ApplicationContext getApplicationContext() { - if (applicationContext == null) { - this.applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); - } - this.applicationContext - } - - /** - * Obtains the HttpServletResponse instance - * - * @return The HttpServletResponse instance - */ - HttpServletResponse getResponse() { - currentRequestAttributes().getCurrentResponse() - } - - /** - * Obtains the ServletContext instance - * - * @return The ServletContext instance - */ - ServletContext getServletContext() { - if (servletContext == null) { - servletContext = currentRequestAttributes().getServletContext() - } - servletContext - } - - /** - * Initializes a command object. - * - * If type is a domain class and the request body or parameters include an id, the id is used to retrieve - * the command object instance from the database, otherwise the no-arg constructor on type is invoke. If - * an attempt is made to retrieve the command object instance from the database and no corresponding - * record is found, null is returned. - * - * The command object is then subjected to data binding and dependency injection before being returned. - * - * - * @param type The type of the command object - * @return the initialized command object or null if the command object is a domain class, the body or - * parameters included an id and no corresponding record was found in the database. - */ - def initializeCommandObject(final Class type, final String commandObjectParameterName) throws Exception { - final HttpServletRequest request = getRequest() - def commandObjectInstance = null - try { - final DataBindingSource dataBindingSource = DataBindingUtils - .createDataBindingSource( - getGrailsApplication(), type, - request) - final DataBindingSource commandObjectBindingSource = WebMetaUtils - .getCommandObjectBindingSourceForPrefix( - commandObjectParameterName, dataBindingSource) - def entityIdentifierValue = null - final boolean isDomainClass = DomainClassArtefactHandler - .isDomainClass(type) - if (isDomainClass) { - entityIdentifierValue = commandObjectBindingSource - .getIdentifierValue() - if (entityIdentifierValue == null) { - final GrailsWebRequest webRequest = GrailsWebRequest - .lookup(request) - entityIdentifierValue = webRequest?.getParams().getIdentifier() - } - } - if (entityIdentifierValue instanceof String) { - entityIdentifierValue = ((String) entityIdentifierValue).trim() - if ("".equals(entityIdentifierValue) - || "null".equals(entityIdentifierValue)) { - entityIdentifierValue = null - } - } - - final HttpMethod requestMethod = HttpMethod.valueOf(request.getMethod()) - - if (entityIdentifierValue != null) { - try { - commandObjectInstance = InvokerHelper.invokeStaticMethod(type, "get", entityIdentifierValue) - } catch (Exception e) { - final Errors errors = getErrors() - if (errors != null) { - errors.reject(getClass().getName() - + ".commandObject." - + commandObjectParameterName + ".error", - e.getMessage()) - } - } - } else if (requestMethod == HttpMethod.POST || !isDomainClass) { - commandObjectInstance = type.newInstance() - } - - if (commandObjectInstance != null - && commandObjectBindingSource != null) { - final boolean shouldDoDataBinding - - if (entityIdentifierValue != null) { - switch (requestMethod) { - case HttpMethod.PATCH: - case HttpMethod.POST: - case HttpMethod.PUT: - shouldDoDataBinding = true - break - default: - shouldDoDataBinding = false - } - } else { - shouldDoDataBinding = true - } - - if (shouldDoDataBinding) { - bindData(commandObjectInstance, commandObjectBindingSource, Collections.EMPTY_MAP, null) - } - } - } catch (Exception e) { - final exceptionHandlerMethodFor = getExceptionHandlerMethodFor(e.getClass()) - if(exceptionHandlerMethodFor != null) { - throw e - } - commandObjectInstance = type.newInstance() - final o = GrailsMetaClassUtils.invokeMethodIfExists(commandObjectInstance, "getErrors") - if(o instanceof BindingResult) { - final BindingResult errors = (BindingResult)o - String msg = "Error occurred initializing command object [" + commandObjectParameterName + "]. " + e.getMessage() - ObjectError error = new ObjectError(commandObjectParameterName, msg) - errors.addError(error) - } - } - - if(commandObjectInstance != null) { - final ApplicationContext applicationContext = getApplicationContext() - final AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory() - autowireCapableBeanFactory.autowireBeanProperties(commandObjectInstance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false) - } - - commandObjectInstance - } - - /** - *

The withFormat method is used to allow controllers to handle different types of - * request formats such as HTML, XML and so on. Example usage:

- * - *
-     * 
-     *    withFormat {
-     *        html { render "html" }
-     *        xml { render "xml}
-     *    }
-     * 
-     * 
- * - * @param callable - * @return The result of the closure execution selected - */ - def withFormat(Closure callable) { - MimeTypesApiSupport mimeTypesSupport = new MimeTypesApiSupport() - HttpServletResponse response = GrailsWebRequest.lookup().currentResponse - mimeTypesSupport.withFormat((HttpServletResponse)response, callable) - } - - /** - * Sets a response header for the given name and value - * - * @param headerName The header name - * @param headerValue The header value - */ - void header(String headerName, headerValue) { - if (headerValue != null) { - final HttpServletResponse response = getResponse() - response?.setHeader headerName, headerValue.toString() - } - } - - void bindData(Class targetType, Collection collectionToPopulate, ServletRequest request) { - DataBindingUtils.bindToCollection targetType, collectionToPopulate, request - } -} diff --git a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RenderHelper.groovy b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RenderHelper.groovy index 4032aebe957..54b2a0c1e41 100644 --- a/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RenderHelper.groovy +++ b/grails-plugin-controllers/src/main/groovy/grails/artefact/controller/support/RenderHelper.groovy @@ -27,7 +27,7 @@ import grails.web.JSONBuilder import grails.web.http.HttpHeaders import grails.web.mime.MimeType import grails.web.mime.MimeUtility -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.text.Template import groovy.util.slurpersupport.GPathResult import groovy.xml.StreamingMarkupBuilder diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/support/WebMetaUtils.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/support/WebMetaUtils.groovy index 35e5a278e0a..6ac78d6f388 100644 --- a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/support/WebMetaUtils.groovy +++ b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/support/WebMetaUtils.groovy @@ -39,7 +39,9 @@ import java.lang.reflect.Method * * @author Graeme Rocher * @since 1.0 + * @deprecated Will be removed in a future version of Grails */ +@Deprecated class WebMetaUtils { /** diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ChainMethod.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ChainMethod.groovy deleted file mode 100644 index e0e813b7141..00000000000 --- a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ChainMethod.groovy +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2004-2005 the original author or authors. - * - * 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 org.grails.plugins.web.controllers.metaclass - -import grails.util.GrailsNameUtils - -import javax.servlet.http.HttpServletRequest - -import org.grails.core.artefact.ControllerArtefactHandler -import grails.util.GrailsClassUtils as GCU -import grails.web.mapping.UrlCreator -import grails.web.mapping.UrlMappingsHolder -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.web.context.request.RequestContextHolder -import org.springframework.web.servlet.support.RequestDataValueProcessor - -/** - * Implementation of the chain() method for controllers. - * - * @author Graeme Rocher - * @since 1.0 - */ -class ChainMethod { - - static void invoke(target, Map args = [:]) { - def controller = args.controller ?: GrailsNameUtils.getLogicalPropertyName( - target.getClass().name, ControllerArtefactHandler.TYPE) - def action = args.action - def plugin = args.remove('plugin') - def id = args.id - def params = args.params ?: [:] - def model = args.model ?: [:] - - def actionParams = params.findAll { it.key?.startsWith('_action_') } - actionParams.each { params.remove(it.key) } - - GrailsWebRequest webRequest = RequestContextHolder.currentRequestAttributes() - def flash = webRequest.getFlashScope() - - def chainModel = flash.chainModel - if (chainModel instanceof Map) { - chainModel.putAll(model) - model = chainModel - } - flash.chainModel = model - - if (action instanceof Closure) { - def prop = GCU.getPropertyDescriptorForValue(target, action) - if (prop) { - action = prop.name - } - } - else { - action = action?.toString() - } - - def appCtx = webRequest.getApplicationContext() - - UrlMappingsHolder mappings = appCtx.getBean(UrlMappingsHolder.BEAN_ID) - - // Make sure that if an ID was given, it is used to evaluate - // the reverse URL mapping. - if (id) params.id = id - - UrlCreator creator = mappings.getReverseMapping(controller, action, plugin, params) - def response = webRequest.getCurrentResponse() - - String url = creator.createURL(controller, action, plugin, params, 'utf-8') - - if (appCtx.containsBean("requestDataValueProcessor")) { - RequestDataValueProcessor valueProcessor = appCtx.getBean("requestDataValueProcessor") - if (valueProcessor != null) { - HttpServletRequest request = webRequest.getCurrentRequest() - url = response.encodeRedirectURL(valueProcessor.processUrl(request, url)) - } - } else { - url = response.encodeRedirectURL(url) - } - response.sendRedirect url - } -} diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ForwardMethod.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ForwardMethod.groovy index 203a2023358..9e1af9fa823 100644 --- a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ForwardMethod.groovy +++ b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/ForwardMethod.groovy @@ -15,19 +15,7 @@ */ package org.grails.plugins.web.controllers.metaclass -import grails.web.UrlConverter import groovy.transform.CompileStatic -import org.grails.web.mapping.UrlMappingUtils -import org.springframework.beans.MutablePropertyValues -import org.springframework.validation.DataBinder - -import javax.servlet.http.HttpServletRequest -import javax.servlet.http.HttpServletResponse - -import org.grails.web.mapping.ForwardUrlMappingInfo -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.context.ApplicationContext - /** * Implements performing a forward. * @@ -36,70 +24,6 @@ import org.springframework.context.ApplicationContext */ @CompileStatic class ForwardMethod { - public static final String IN_PROGRESS = "org.codehaus.groovy.grails.FORWARD_IN_PROGRESS" public static final String CALLED = "org.codehaus.groovy.grails.FORWARD_CALLED" - - private UrlConverter urlConverter - - String forward(HttpServletRequest request, HttpServletResponse response, Map params) { - def urlInfo = new ForwardUrlMappingInfo() - DataBinder binder = new DataBinder(urlInfo) - binder.bind(new MutablePropertyValues(params)) - - GrailsWebRequest webRequest = GrailsWebRequest.lookup(request) - - if (webRequest) { - def controllerName - if(params.controller) { - controllerName = params.controller - } else { - controllerName = webRequest.controllerName - } - - if(controllerName) { - def convertedControllerName = convert(webRequest, controllerName.toString()) - webRequest.controllerName = convertedControllerName - } - urlInfo.controllerName = webRequest.controllerName - - if(params.action) { - urlInfo.actionName = convert(webRequest, params.action.toString()) - } - - if(params.namespace) { - urlInfo.namespace = params.namespace - } - - if(params.plugin) { - urlInfo.pluginName = params.plugin - } - } - - def model = params.model instanceof Map ? params.model : Collections.EMPTY_MAP - request.setAttribute(IN_PROGRESS, true) - String uri = UrlMappingUtils.forwardRequestForUrlMappingInfo(request, response, urlInfo, (Map)model, true) - request.setAttribute(CALLED, true) - return uri - } - - void setUrlConverter(UrlConverter urlConverter) { - this.urlConverter = urlConverter - } - - private UrlConverter lookupUrlConverter(GrailsWebRequest webRequest) { - if (!urlConverter) { - ApplicationContext applicationContext = webRequest?.getApplicationContext() - if (applicationContext) { - urlConverter = applicationContext.getBean("grailsUrlConverter", UrlConverter) - } - } - - urlConverter - } - - private String convert(GrailsWebRequest webRequest, String value) { - UrlConverter urlConverter = lookupUrlConverter(webRequest) - (urlConverter) ? urlConverter.toUrlElement(value) : value - } } diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/WithFormMethod.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/WithFormMethod.groovy deleted file mode 100644 index 11f02de02d5..00000000000 --- a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/WithFormMethod.groovy +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2004-2005 the original author or authors. - * - * 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 org.grails.plugins.web.controllers.metaclass - -import org.grails.web.servlet.mvc.AbstractTokenResponseHandler -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.grails.web.servlet.mvc.SynchronizerTokensHolder -import org.grails.web.servlet.mvc.TokenResponseHandler - -/** - * Implementation of the "Synchronizer Token Pattern" for Grails that handles duplicate form submissions - * by inspecting a token stored in the user session. - * - * @author Graeme Rocher - * @since 1.1 - */ -class WithFormMethod { - - /** - *

Main entry point, this method will check the request for the necessary TOKEN and if it is valid - * will call the passed closure. - * - *

For an invalid response an InvalidResponseHandler is returned which will invoke the closure passed - * to the handleInvalid method. The idea here is to allow code like: - * - *


-     * withForm {
-     *   // handle valid form submission
-     * }.invalidToken {
-     *    // handle invalid form submission
-     * }
-     * 
- */ - TokenResponseHandler withForm(GrailsWebRequest webRequest, Closure callable) { - TokenResponseHandler handler - if (isTokenValid(webRequest)) { - resetToken(webRequest) - handler = new ValidResponseHandler(callable?.call()) - } - else { - handler = new InvalidResponseHandler() - } - - webRequest.request.setAttribute(TokenResponseHandler.KEY, handler) - return handler - } - - /** - * Checks whether the token in th request is valid. - * - * @param request The servlet request - */ - protected synchronized boolean isTokenValid(GrailsWebRequest webRequest) { - final request = webRequest.getCurrentRequest() - SynchronizerTokensHolder tokensHolderInSession = request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) - if (!tokensHolderInSession) return false - - String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] - if (!tokenInRequest) return false - - String urlInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_URI] - if (!urlInRequest) return false - - try { - return tokensHolderInSession.isValid(urlInRequest, tokenInRequest) - } - catch (IllegalArgumentException) { - return false - } - } - - /** - * Resets the token in the request - */ - protected synchronized resetToken(GrailsWebRequest webRequest) { - final request = webRequest.getCurrentRequest() - SynchronizerTokensHolder tokensHolderInSession = request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) - String urlInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_URI] - String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] - - if (urlInRequest && tokenInRequest) { - tokensHolderInSession.resetToken(urlInRequest, tokenInRequest) - } - if (tokensHolderInSession.isEmpty()) request.getSession(false)?.removeAttribute(SynchronizerTokensHolder.HOLDER) - } -} - -class InvalidResponseHandler extends AbstractTokenResponseHandler { - - InvalidResponseHandler() { - super(false) - } - - protected Object invalidTokenInternal(Closure callable) { - callable?.call() - } -} - -class ValidResponseHandler extends AbstractTokenResponseHandler { - - def model - - ValidResponseHandler(model) { - super(true) - this.model = model - } - - protected Object invalidTokenInternal(Closure callable) { model } -} diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy new file mode 100644 index 00000000000..4bf073adabb --- /dev/null +++ b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy @@ -0,0 +1,40 @@ +/* + * Copyright 2014 original authors + * + * 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 org.grails.plugins.web.servlet.mvc + +import groovy.transform.CompileStatic +import org.grails.web.servlet.mvc.AbstractTokenResponseHandler + + +/** + * Handles an invalid token response. See {@link org.grails.web.servlet.mvc.TokenResponseHandler} + * + * @author Graeme Rocher + * @since 3.0 + */ +@CompileStatic +class InvalidResponseHandler extends AbstractTokenResponseHandler { + + InvalidResponseHandler() { + super(false) + } + + protected Object invalidTokenInternal(Closure callable) { + callable?.call() + } +} + diff --git a/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy new file mode 100644 index 00000000000..217e0e5e653 --- /dev/null +++ b/grails-plugin-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy @@ -0,0 +1,39 @@ +/* + * Copyright 2014 original authors + * + * 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 org.grails.plugins.web.servlet.mvc + +import groovy.transform.CompileStatic +import org.grails.web.servlet.mvc.AbstractTokenResponseHandler + + +/** + * Handles a valid token response. See {@link org.grails.web.servlet.mvc.TokenResponseHandler} + * + * @author Graeme Rocher + * @since 3.0 + */ +@CompileStatic +class ValidResponseHandler extends AbstractTokenResponseHandler { + + def model + + ValidResponseHandler(model) { + super(true) + this.model = model + } + + protected Object invalidTokenInternal(Closure callable) { model } +} diff --git a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/CompositeInterceptor.java b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/CompositeInterceptor.java index 0d16600cde1..7058a6e5992 100644 --- a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/CompositeInterceptor.java +++ b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/CompositeInterceptor.java @@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import grails.artefact.Controller; import org.grails.plugins.web.controllers.metaclass.ForwardMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterConfig.groovy b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterConfig.groovy index dca26622acd..81a961d7c18 100644 --- a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterConfig.groovy +++ b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterConfig.groovy @@ -20,7 +20,7 @@ import grails.core.GrailsApplication import grails.util.GrailsClassUtils import grails.web.mvc.FlashScope import grails.web.servlet.mvc.GrailsParameterMap -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import javax.servlet.ServletContext import javax.servlet.http.HttpServletRequest diff --git a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterToHandlerAdapter.groovy b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterToHandlerAdapter.groovy index a54d0a592a1..ec8cc0f4007 100644 --- a/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterToHandlerAdapter.groovy +++ b/grails-plugin-filters/src/main/groovy/org/grails/plugins/web/filters/FilterToHandlerAdapter.groovy @@ -24,7 +24,7 @@ import java.util.regex.Pattern import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.view.NullView import org.grails.web.util.WebUtils diff --git a/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/GroovyPagesGrailsPlugin.groovy b/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/GroovyPagesGrailsPlugin.groovy index 5b88563dda2..194dce1b83b 100644 --- a/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/GroovyPagesGrailsPlugin.groovy +++ b/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/GroovyPagesGrailsPlugin.groovy @@ -15,17 +15,15 @@ */ package org.grails.plugins.web import grails.config.Config -import grails.core.GrailsApplication import grails.core.GrailsClass import grails.core.GrailsTagLibClass import grails.gsp.PageRenderer -import grails.plugins.GrailsPluginManager import grails.plugins.Plugin import grails.util.BuildSettings import grails.util.Environment import grails.util.GrailsUtil import grails.web.pages.GroovyPagesUriService -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import groovy.util.logging.Commons import org.grails.buffer.StreamCharBufferMetaUtils diff --git a/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/taglib/UrlMappingTagLib.groovy b/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/taglib/UrlMappingTagLib.groovy index 8ddbe6a61f5..e235c5f54aa 100644 --- a/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/taglib/UrlMappingTagLib.groovy +++ b/grails-plugin-gsp/src/main/groovy/org/grails/plugins/web/taglib/UrlMappingTagLib.groovy @@ -2,7 +2,7 @@ package org.grails.plugins.web.taglib import grails.gsp.TagLib import grails.web.mapping.UrlMapping -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import grails.web.util.TypeConvertingMap import groovy.transform.CompileStatic import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods diff --git a/grails-plugin-mimetypes/src/main/groovy/org/grails/plugins/web/api/MimeTypesApiSupport.groovy b/grails-plugin-mimetypes/src/main/groovy/org/grails/plugins/web/api/MimeTypesApiSupport.groovy index 06d48362cc4..0e86fa3cd79 100644 --- a/grails-plugin-mimetypes/src/main/groovy/org/grails/plugins/web/api/MimeTypesApiSupport.groovy +++ b/grails-plugin-mimetypes/src/main/groovy/org/grails/plugins/web/api/MimeTypesApiSupport.groovy @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import org.grails.plugins.web.mime.FormatInterceptor -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest /** @@ -36,12 +36,12 @@ import org.grails.web.servlet.mvc.GrailsWebRequest @CompileStatic class MimeTypesApiSupport { - def withFormat(HttpServletRequest request, Closure callable) { - return withFormatInternal(request, getDefinedFormats(callable)) + def T withFormat(HttpServletRequest request, Closure callable) { + return (T)withFormatInternal(request, getDefinedFormats(callable)) } - def withFormat(HttpServletResponse response, Closure callable) { - return withFormatInternal(response, getDefinedFormats(callable)) + def T withFormat(HttpServletResponse response, Closure callable) { + return (T)withFormatInternal(response, getDefinedFormats(callable)) } protected Object withFormatInternal(formatProvider, LinkedHashMap formats) { diff --git a/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletRequestExtension.groovy b/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletRequestExtension.groovy index cb967125d50..7f0efc149b8 100644 --- a/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletRequestExtension.groovy +++ b/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletRequestExtension.groovy @@ -17,7 +17,7 @@ package org.grails.web.mime import grails.web.http.HttpHeaders import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.springframework.web.context.support.WebApplicationContextUtils import javax.servlet.http.HttpServletRequest diff --git a/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletResponseExtension.groovy b/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletResponseExtension.groovy index 62dd57a56cd..d7771914725 100644 --- a/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletResponseExtension.groovy +++ b/grails-plugin-mimetypes/src/main/groovy/org/grails/web/mime/HttpServletResponseExtension.groovy @@ -20,7 +20,7 @@ import grails.config.Settings import grails.core.GrailsApplication import grails.web.http.HttpHeaders import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import org.grails.core.lifecycle.ShutdownOperations import org.grails.plugins.web.api.MimeTypesApiSupport diff --git a/grails-plugin-rest/src/main/groovy/grails/artefact/controller/RestResponder.groovy b/grails-plugin-rest/src/main/groovy/grails/artefact/controller/RestResponder.groovy index 1a9ccc4cd24..08ff6071697 100644 --- a/grails-plugin-rest/src/main/groovy/grails/artefact/controller/RestResponder.groovy +++ b/grails-plugin-rest/src/main/groovy/grails/artefact/controller/RestResponder.groovy @@ -16,9 +16,6 @@ package grails.artefact.controller import groovy.transform.CompileDynamic - -import java.util.List; - import grails.artefact.Controller import grails.artefact.controller.support.ResponseRenderer import grails.core.GrailsDomainClassProperty @@ -27,7 +24,7 @@ import grails.rest.Resource import grails.rest.render.Renderer import grails.rest.render.RendererRegistry import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode @@ -39,7 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpStatus import org.springframework.validation.BeanPropertyBindingResult import org.springframework.validation.Errors -import org.springframework.util.Assert /** * diff --git a/grails-plugin-rest/src/main/groovy/org/grails/plugins/web/rest/render/ServletRenderContext.groovy b/grails-plugin-rest/src/main/groovy/org/grails/plugins/web/rest/render/ServletRenderContext.groovy index bfee2b2169e..955b0dbdfdd 100644 --- a/grails-plugin-rest/src/main/groovy/org/grails/plugins/web/rest/render/ServletRenderContext.groovy +++ b/grails-plugin-rest/src/main/groovy/org/grails/plugins/web/rest/render/ServletRenderContext.groovy @@ -18,7 +18,7 @@ package org.grails.plugins.web.rest.render import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.web.util.WebUtils import org.springframework.http.HttpMethod diff --git a/grails-plugin-rest/src/test/groovy/org/grails/plugins/web/rest/render/html/HtmlRendererSpec.groovy b/grails-plugin-rest/src/test/groovy/org/grails/plugins/web/rest/render/html/HtmlRendererSpec.groovy index 7fc1f7e67e4..c477252bc85 100644 --- a/grails-plugin-rest/src/test/groovy/org/grails/plugins/web/rest/render/html/HtmlRendererSpec.groovy +++ b/grails-plugin-rest/src/test/groovy/org/grails/plugins/web/rest/render/html/HtmlRendererSpec.groovy @@ -3,7 +3,7 @@ package org.grails.plugins.web.rest.render.html import grails.persistence.Entity import grails.validation.ValidationErrors import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.plugins.web.rest.render.ServletRenderContext import org.springframework.mock.web.MockHttpServletRequest diff --git a/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/ControllerUnitTestMixin.groovy b/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/ControllerUnitTestMixin.groovy index 03c01ca0c05..171a69c62f2 100644 --- a/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/ControllerUnitTestMixin.groovy +++ b/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/ControllerUnitTestMixin.groovy @@ -32,7 +32,7 @@ import grails.web.mime.MimeType import org.grails.web.pages.GroovyPageUtils import org.grails.plugins.support.WebMetaUtils import grails.web.mvc.FlashScope -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import grails.web.servlet.mvc.GrailsParameterMap import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.beans.factory.config.AutowireCapableBeanFactory diff --git a/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/FiltersUnitTestMixin.groovy b/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/FiltersUnitTestMixin.groovy index d469653e4ac..c60587513c5 100644 --- a/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/FiltersUnitTestMixin.groovy +++ b/grails-plugin-testing/src/main/groovy/grails/test/mixin/web/FiltersUnitTestMixin.groovy @@ -20,7 +20,7 @@ package grails.test.mixin.web import org.grails.plugins.web.filters.CompositeInterceptor import org.grails.plugins.web.filters.FiltersConfigArtefactHandler import org.grails.plugins.web.filters.FiltersGrailsPlugin -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.springframework.beans.factory.config.MethodInvokingFactoryBean import org.springframework.web.servlet.ModelAndView diff --git a/grails-plugin-testing/src/main/groovy/grails/test/mixin/webflow/WebFlowUnitTestMixin.groovy b/grails-plugin-testing/src/main/groovy/grails/test/mixin/webflow/WebFlowUnitTestMixin.groovy index 3ccd579304a..85f6cb1b526 100644 --- a/grails-plugin-testing/src/main/groovy/grails/test/mixin/webflow/WebFlowUnitTestMixin.groovy +++ b/grails-plugin-testing/src/main/groovy/grails/test/mixin/webflow/WebFlowUnitTestMixin.groovy @@ -19,7 +19,7 @@ import grails.test.mixin.web.ControllerUnitTestMixin import groovy.transform.CompileStatic import grails.util.GrailsMetaClassUtils -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.junit.Assert /** diff --git a/grails-plugin-testing/src/main/groovy/grails/test/runtime/GroovyPageTestPlugin.groovy b/grails-plugin-testing/src/main/groovy/grails/test/runtime/GroovyPageTestPlugin.groovy index d2dd16a5c40..e93856a1c45 100644 --- a/grails-plugin-testing/src/main/groovy/grails/test/runtime/GroovyPageTestPlugin.groovy +++ b/grails-plugin-testing/src/main/groovy/grails/test/runtime/GroovyPageTestPlugin.groovy @@ -19,7 +19,7 @@ package grails.test.runtime import groovy.transform.CompileStatic import org.grails.web.pages.GroovyPageBinding import org.grails.web.taglib.WebRequestTemplateVariableBinding -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest /** diff --git a/grails-test-suite-base/src/main/groovy/org/grails/plugins/web/AbstractGrailsPluginTests.groovy b/grails-test-suite-base/src/main/groovy/org/grails/plugins/web/AbstractGrailsPluginTests.groovy index f988eeb88fd..cb65d35198f 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/plugins/web/AbstractGrailsPluginTests.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/plugins/web/AbstractGrailsPluginTests.groovy @@ -16,7 +16,7 @@ import org.grails.plugins.DefaultGrailsPlugin import org.grails.plugins.MockGrailsPluginManager import org.grails.support.MockApplicationContext import org.grails.core.io.MockResourceLoader -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.context.ApplicationContext import org.springframework.core.io.support.PathMatchingResourcePatternResolver diff --git a/grails-test-suite-base/src/main/groovy/org/grails/web/servlet/mvc/AbstractGrailsControllerTests.groovy b/grails-test-suite-base/src/main/groovy/org/grails/web/servlet/mvc/AbstractGrailsControllerTests.groovy index b2b5ebc4f32..826a266a834 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/web/servlet/mvc/AbstractGrailsControllerTests.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/web/servlet/mvc/AbstractGrailsControllerTests.groovy @@ -2,7 +2,6 @@ package org.grails.web.servlet.mvc import grails.core.DefaultGrailsApplication import grails.core.GrailsApplication -import grails.core.GrailsDomainClass import grails.util.GrailsNameUtils import grails.util.GrailsWebMockUtil import grails.util.Holders @@ -12,14 +11,13 @@ import grails.web.UrlConverter import grails.web.databinding.DataBindingUtils import grails.web.databinding.GrailsWebDataBinder import grails.web.pages.GroovyPagesUriService -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.compiler.injection.GrailsAwareClassLoader import org.grails.databinding.converters.DateConversionHelper import org.grails.datastore.gorm.config.GrailsDomainClassMappingContext import org.grails.plugins.DefaultGrailsPlugin import org.grails.plugins.MockGrailsPluginManager -import org.grails.plugins.domain.DomainClassGrailsPlugin import org.grails.plugins.testing.GrailsMockHttpServletRequest import org.grails.plugins.testing.GrailsMockHttpServletResponse import org.grails.support.MockApplicationContext diff --git a/grails-test-suite-base/src/main/groovy/org/grails/web/taglib/AbstractGrailsTagTests.groovy b/grails-test-suite-base/src/main/groovy/org/grails/web/taglib/AbstractGrailsTagTests.groovy index 6c08f1ee238..0c3863ffe99 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/web/taglib/AbstractGrailsTagTests.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/web/taglib/AbstractGrailsTagTests.groovy @@ -8,7 +8,7 @@ import grails.util.GrailsWebMockUtil import grails.util.Holders import grails.util.Metadata import grails.web.pages.GroovyPagesUriService -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/ForwardMethodspec.groovy b/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/ForwardMethodspec.groovy index e42b1aa41dc..e778978c3ec 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/ForwardMethodspec.groovy +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/ForwardMethodspec.groovy @@ -1,6 +1,7 @@ package org.grails.web.metaclass -import org.grails.plugins.web.controllers.metaclass.ForwardMethod +import grails.artefact.Controller +import org.springframework.web.context.request.RequestContextHolder import javax.servlet.RequestDispatcher import javax.servlet.ServletContext @@ -9,7 +10,7 @@ import javax.servlet.http.HttpServletResponse import grails.web.UrlConverter -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.context.ApplicationContext @@ -17,7 +18,7 @@ import spock.lang.Specification class ForwardMethodSpec extends Specification { - ForwardMethod forwardMethod + ForwardMethodTest forwardMethod ApplicationContext appContext ServletContext servletContext HttpServletRequest request @@ -27,7 +28,7 @@ class ForwardMethodSpec extends Specification { UrlConverter urlConverter def setup() { - forwardMethod = new ForwardMethod() + forwardMethod = new ForwardMethodTest() appContext = Mock(ApplicationContext) servletContext = Mock(ServletContext) @@ -37,6 +38,7 @@ class ForwardMethodSpec extends Specification { urlConverter = Mock(UrlConverter) webRequest = new GrailsWebRequest(request, response, servletContext, appContext) + RequestContextHolder.setRequestAttributes(webRequest) dispatcher.forward(_,_) >> { } request.getAttribute(GrailsApplicationAttributes.ACTION_NAME_ATTRIBUTE) >> { 'fooBar' } @@ -46,6 +48,10 @@ class ForwardMethodSpec extends Specification { def parameters = [:] request.getParameterMap() >> { parameters } } + + void cleanup() { + RequestContextHolder.resetRequestAttributes() + } def 'Test forward request with controller and action params and url converter'() { setup: @@ -53,7 +59,7 @@ class ForwardMethodSpec extends Specification { urlConverter.toUrlElement(_) >> { it[0]?.toLowerCase() } forwardMethod.urlConverter = urlConverter when: - def forwardUri = forwardMethod.forward(request, response, params) + def forwardUri = forwardMethod.forward(params) then: forwardUri == '/grails/foo/foobar.dispatch' } @@ -62,9 +68,9 @@ class ForwardMethodSpec extends Specification { setup: Map params = [controller : 'foo', action : 'fooBar', model : [param1 : 1, param2 : 2]] urlConverter.toUrlElement(_) >> { it[0]?.toLowerCase() } - appContext.getBean("grailsUrlConverter", UrlConverter) >> { urlConverter } + forwardMethod.urlConverter = urlConverter when: - def forwardUri = forwardMethod.forward(request, response, params) + def forwardUri = forwardMethod.forward(params) then: forwardUri == '/grails/foo/foobar.dispatch' } @@ -75,8 +81,9 @@ class ForwardMethodSpec extends Specification { appContext.getBean("grailsUrlConverter", UrlConverter) >> { null } forwardMethod.urlConverter = null when: - def forwardUri = forwardMethod.forward(request, response, params) + def forwardUri = forwardMethod.forward(params) then: forwardUri == '/grails/foo/fooBar.dispatch' } -} \ No newline at end of file +} +class ForwardMethodTest implements Controller {} \ No newline at end of file diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/WithFormMethodTests.groovy b/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/WithFormMethodTests.groovy index 4e6ff305263..de32f87c252 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/WithFormMethodTests.groovy +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/metaclass/WithFormMethodTests.groovy @@ -15,10 +15,10 @@ package org.grails.web.metaclass +import grails.artefact.Controller import grails.util.GrailsWebMockUtil import org.grails.core.exceptions.GrailsRuntimeException -import org.grails.plugins.web.controllers.metaclass.WithFormMethod import org.grails.web.servlet.mvc.SynchronizerTokensHolder import org.springframework.web.context.request.RequestContextHolder @@ -267,3 +267,5 @@ class WithFormMethodTests extends GroovyTestCase { } } } + +class WithFormMethod implements Controller {} \ No newline at end of file diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributesTests.groovy b/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributesTests.groovy index c1fb75341ab..da5c243e810 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributesTests.groovy +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributesTests.groovy @@ -1,6 +1,6 @@ package org.grails.web.servlet -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.springframework.mock.web.MockHttpServletRequest import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods import org.grails.buffer.StreamCharBuffer diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/GrailsApplicationAttributesTests.java b/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/GrailsApplicationAttributesTests.java index 813759f8c59..2e8cfb61f01 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/GrailsApplicationAttributesTests.java +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/servlet/GrailsApplicationAttributesTests.java @@ -1,8 +1,7 @@ package org.grails.web.servlet; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.GroovyClassLoader; -import groovy.lang.GroovyObject; import junit.framework.TestCase; import org.grails.core.artefact.ControllerArtefactHandler; @@ -12,9 +11,7 @@ import org.grails.core.artefact.TagLibArtefactHandler; import org.grails.support.MockApplicationContext; import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods; -import org.grails.web.servlet.DefaultGrailsApplicationAttributes; import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; public class GrailsApplicationAttributesTests extends TestCase { @@ -47,34 +44,6 @@ public void testGetViewUri() throws Exception { assertEquals("/WEB-INF/grails-app/views/shared.gsp",attrs.getViewUri("/shared", request)); } - public void testGetTagLibForTag() throws Exception { - GroovyClassLoader gcl = new GroovyClassLoader(); - gcl.parseClass("class TestController {\n" + - "def list = {\n" + - "}\n" + - "}\n" + - "class FirstTagLib {\n" + - "Closure firstTag = {\n" + - "}\n" + - "}\n" + - "class SecondTagLib {\n" + - "Closure secondTag = {\n" + - "}\n" + - "}"); - - GrailsApplicationAttributes attrs = getAttributesForClasses(gcl.getLoadedClasses(),gcl); - assertNotNull(attrs); - assertNotNull(attrs.getApplicationContext()); - assertNotNull(attrs.getGrailsApplication()); - - MockHttpServletRequest request = new MockHttpServletRequest(); - MockHttpServletResponse response = new MockHttpServletResponse(); - GroovyObject controller = (GroovyObject)attrs.getApplicationContext().getBean("TestController"); - request.setAttribute(GrailsApplicationAttributes.CONTROLLER, controller); - GroovyObject tagLib1 = attrs.getTagLibraryForTag(request,response,"firstTag"); - assertNotNull(tagLib1); - } - private GrailsApplicationAttributes getAttributesForClasses(Class[] classes, GroovyClassLoader gcl) { MockApplicationContext context = new MockApplicationContext(); MockServletContext servletContext = new MockServletContext(); diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/sitemesh/GrailsLayoutDecoratorMapperTests.java b/grails-test-suite-uber/src/test/groovy/org/grails/web/sitemesh/GrailsLayoutDecoratorMapperTests.java index bca49f8e437..6b80ac355aa 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/sitemesh/GrailsLayoutDecoratorMapperTests.java +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/sitemesh/GrailsLayoutDecoratorMapperTests.java @@ -6,7 +6,7 @@ import grails.util.GrailsWebMockUtil; import grails.util.Holders; import grails.web.pages.GroovyPagesUriService; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import groovy.util.ConfigObject; diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/util/CodecPrintWriterTest.java b/grails-test-suite-uber/src/test/groovy/org/grails/web/util/CodecPrintWriterTest.java index 863d4d5b218..d52fdbc6c60 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/util/CodecPrintWriterTest.java +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/util/CodecPrintWriterTest.java @@ -26,7 +26,6 @@ import org.grails.encoder.EncodingStateRegistry; import org.grails.buffer.FastStringWriter; import org.grails.web.encoder.OutputEncodingStack; -import grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.junit.Test; import org.springframework.context.ApplicationContext; diff --git a/grails-test-suite-uber/src/test/groovy/org/grails/web/util/WebUtilsTests.groovy b/grails-test-suite-uber/src/test/groovy/org/grails/web/util/WebUtilsTests.groovy index 19028b0e3b0..20ba86d7c46 100644 --- a/grails-test-suite-uber/src/test/groovy/org/grails/web/util/WebUtilsTests.groovy +++ b/grails-test-suite-uber/src/test/groovy/org/grails/web/util/WebUtilsTests.groovy @@ -6,9 +6,7 @@ import org.grails.config.PropertySourcesConfig import org.grails.plugins.web.mime.MimeTypesFactoryBean import org.grails.support.MockApplicationContext import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest -import org.grails.web.util.WebUtils import org.springframework.mock.web.MockHttpServletRequest import org.springframework.mock.web.MockHttpServletResponse import org.springframework.mock.web.MockServletContext diff --git a/grails-test-suite-web/src/test/groovy/grails/rest/web/RespondMethodSpec.groovy b/grails-test-suite-web/src/test/groovy/grails/rest/web/RespondMethodSpec.groovy index 98dc015cb48..367337c5492 100644 --- a/grails-test-suite-web/src/test/groovy/grails/rest/web/RespondMethodSpec.groovy +++ b/grails-test-suite-web/src/test/groovy/grails/rest/web/RespondMethodSpec.groovy @@ -24,7 +24,7 @@ import grails.test.mixin.TestFor import org.grails.plugins.web.mime.MimeTypesFactoryBean import grails.web.mime.MimeType import grails.core.support.proxy.ProxyHandler -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.springframework.web.servlet.ModelAndView import spock.lang.Specification diff --git a/grails-test-suite-web/src/test/groovy/org/grails/plugins/web/filters/FilterExecutionTests.groovy b/grails-test-suite-web/src/test/groovy/org/grails/plugins/web/filters/FilterExecutionTests.groovy index cdede29639a..f22d6d95955 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/plugins/web/filters/FilterExecutionTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/plugins/web/filters/FilterExecutionTests.groovy @@ -1,6 +1,6 @@ package org.grails.plugins.web.filters -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.AbstractGrailsControllerTests import org.grails.web.util.WebUtils import org.springframework.web.servlet.HandlerInterceptor diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/pages/GroovyPageTests.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/pages/GroovyPageTests.groovy index 50bc40987d4..07a5c4ea560 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/pages/GroovyPageTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/pages/GroovyPageTests.groovy @@ -2,7 +2,7 @@ package org.grails.web.pages import grails.core.GrailsApplication import org.grails.web.servlet.DefaultGrailsApplicationAttributes -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.AbstractGrailsControllerTests import grails.web.servlet.mvc.GrailsParameterMap import org.grails.buffer.GrailsPrintWriterAdapter; diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/pages/ParseTests.java b/grails-test-suite-web/src/test/groovy/org/grails/web/pages/ParseTests.java index 21f1b41e1e7..b8953fbc290 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/pages/ParseTests.java +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/pages/ParseTests.java @@ -6,7 +6,7 @@ import grails.util.GrailsWebUtil; import grails.util.Holders; import grails.web.pages.GroovyPagesUriService; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.util.ConfigObject; import groovy.util.ConfigSlurper; diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ApplicationTagLibTests.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ApplicationTagLibTests.groovy index f5e75f15a4d..9fcf17532f8 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ApplicationTagLibTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ApplicationTagLibTests.groovy @@ -10,7 +10,7 @@ import javax.servlet.http.Cookie import org.grails.plugins.web.taglib.ApplicationTagLib import org.grails.plugins.web.taglib.FormTagLib import org.grails.web.pages.GroovyPageBinding -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.taglib.exceptions.GrailsTagException import org.grails.web.util.WebUtils diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/JavascriptTagLibTests.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/JavascriptTagLibTests.groovy index 3a4ae0f359f..820ff09c116 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/JavascriptTagLibTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/JavascriptTagLibTests.groovy @@ -6,7 +6,7 @@ import org.grails.plugins.web.taglib.JavascriptProvider import org.grails.plugins.web.taglib.JavascriptTagLib import org.grails.core.io.MockStringResourceLoader import org.grails.web.pages.GroovyPageBinding -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.taglib.exceptions.GrailsTagException import org.springframework.web.util.WebUtils diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/RenderTagLibTests.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/RenderTagLibTests.groovy index eb26a60c46e..92e3c13abbf 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/RenderTagLibTests.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/RenderTagLibTests.groovy @@ -20,7 +20,7 @@ import org.grails.core.artefact.UrlMappingsArtefactHandler import org.grails.core.io.MockStringResourceLoader import org.grails.buffer.FastStringWriter import org.grails.web.pages.GroovyPageBinding -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.sitemesh.FactoryHolder import org.grails.web.sitemesh.GSPSitemeshPage import org.grails.web.sitemesh.GrailsLayoutDecoratorMapper diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ValidationTagLibSpec.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ValidationTagLibSpec.groovy index 7a80771a714..de32faa3a72 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ValidationTagLibSpec.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/taglib/ValidationTagLibSpec.groovy @@ -5,14 +5,8 @@ import grails.test.mixin.Mock import grails.test.mixin.TestFor import grails.test.mixin.TestMixin import grails.test.mixin.web.GroovyPageUnitTestMixin -import grails.web.util.GrailsApplicationAttributes -import org.grails.core.io.MockStringResourceLoader import org.grails.plugins.web.taglib.ValidationTagLib -import org.springframework.beans.factory.support.RootBeanDefinition -import org.springframework.context.MessageSourceResolvable import org.springframework.context.i18n.LocaleContextHolder -import org.springframework.validation.Errors -import org.springframework.validation.FieldError import spock.lang.Specification /* diff --git a/grails-test/src/main/groovy/org/grails/plugins/testing/AbstractGrailsMockHttpServletResponse.groovy b/grails-test/src/main/groovy/org/grails/plugins/testing/AbstractGrailsMockHttpServletResponse.groovy index 70437d2d18a..63ef81ad083 100644 --- a/grails-test/src/main/groovy/org/grails/plugins/testing/AbstractGrailsMockHttpServletResponse.groovy +++ b/grails-test/src/main/groovy/org/grails/plugins/testing/AbstractGrailsMockHttpServletResponse.groovy @@ -21,7 +21,7 @@ import groovy.util.slurpersupport.GPathResult import javax.servlet.http.HttpServletRequest import org.codehaus.groovy.grails.web.json.JSONElement -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.mock.web.MockHttpServletResponse import org.springframework.util.ReflectionUtils diff --git a/grails-test/src/main/groovy/org/grails/plugins/testing/GrailsMockHttpServletRequest.groovy b/grails-test/src/main/groovy/org/grails/plugins/testing/GrailsMockHttpServletRequest.groovy index 44e3d73b8e3..c109bc05f79 100644 --- a/grails-test/src/main/groovy/org/grails/plugins/testing/GrailsMockHttpServletRequest.groovy +++ b/grails-test/src/main/groovy/org/grails/plugins/testing/GrailsMockHttpServletRequest.groovy @@ -15,7 +15,6 @@ */ package org.grails.plugins.testing -import grails.artefact.ApiDelegate import grails.converters.JSON import grails.converters.XML @@ -31,7 +30,7 @@ import javax.servlet.http.HttpServletResponse import javax.servlet.http.Part import grails.web.mime.MimeType -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.web.util.WebUtils import org.springframework.http.HttpHeaders diff --git a/grails-test/src/main/groovy/org/grails/test/support/GrailsTestRequestEnvironmentInterceptor.groovy b/grails-test/src/main/groovy/org/grails/test/support/GrailsTestRequestEnvironmentInterceptor.groovy index a314c56892f..aa9e3bb603b 100644 --- a/grails-test/src/main/groovy/org/grails/test/support/GrailsTestRequestEnvironmentInterceptor.groovy +++ b/grails-test/src/main/groovy/org/grails/test/support/GrailsTestRequestEnvironmentInterceptor.groovy @@ -17,7 +17,7 @@ package org.grails.test.support import grails.util.GrailsWebMockUtil import grails.util.Holders -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.plugins.testing.GrailsMockHttpServletRequest import org.grails.plugins.testing.GrailsMockHttpServletResponse diff --git a/grails-web-common/src/main/groovy/grails/util/GrailsWebMockUtil.groovy b/grails-web-common/src/main/groovy/grails/util/GrailsWebMockUtil.groovy index faa57c5a80c..47be0d77dd8 100644 --- a/grails-web-common/src/main/groovy/grails/util/GrailsWebMockUtil.groovy +++ b/grails-web-common/src/main/groovy/grails/util/GrailsWebMockUtil.groovy @@ -15,7 +15,7 @@ */ package grails.util -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import javax.servlet.ServletContext diff --git a/grails-web-common/src/main/groovy/grails/util/GrailsWebUtil.java b/grails-web-common/src/main/groovy/grails/util/GrailsWebUtil.java index b7f33d836f0..1e9b9f8f48e 100644 --- a/grails-web-common/src/main/groovy/grails/util/GrailsWebUtil.java +++ b/grails-web-common/src/main/groovy/grails/util/GrailsWebUtil.java @@ -17,7 +17,7 @@ import grails.core.ApplicationAttributes; import grails.core.GrailsApplication; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.GroovyObject; import groovy.util.ConfigObject; diff --git a/grails-web-common/src/main/groovy/grails/web/api/WebAttributes.groovy b/grails-web-common/src/main/groovy/grails/web/api/WebAttributes.groovy index 2935601f8a3..6d04ebdca97 100644 --- a/grails-web-common/src/main/groovy/grails/web/api/WebAttributes.groovy +++ b/grails-web-common/src/main/groovy/grails/web/api/WebAttributes.groovy @@ -17,17 +17,18 @@ package grails.web.api import grails.core.GrailsApplication import grails.web.mvc.FlashScope -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.context.ApplicationContext import org.springframework.web.context.request.RequestContextHolder -import org.springframework.web.context.support.WebApplicationContextUtils /** + * + * Common web attributes inherited by all controllers and tag libraries * * @author Jeff Brown + * @author Graeme Rocher * * @since 3.0 * diff --git a/grails-web-common/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsApplicationAttributes.groovy b/grails-web-common/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsApplicationAttributes.groovy index 032bcf0a90b..6232a2d9ecd 100644 --- a/grails-web-common/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsApplicationAttributes.groovy +++ b/grails-web-common/src/main/groovy/org/codehaus/groovy/grails/web/servlet/GrailsApplicationAttributes.groovy @@ -16,8 +16,8 @@ package org.codehaus.groovy.grails.web.servlet /** - * @deprecated Use {@link grails.web.util.GrailsApplicationAttributes} instead + * @deprecated Use {@link org.grails.web.util.GrailsApplicationAttributes} instead */ -public interface GrailsApplicationAttributes extends grails.web.util.GrailsApplicationAttributes { +public interface GrailsApplicationAttributes extends org.grails.web.util.GrailsApplicationAttributes { } \ No newline at end of file diff --git a/grails-web-common/src/main/groovy/org/grails/web/api/CommonWebApi.java b/grails-web-common/src/main/groovy/org/grails/web/api/CommonWebApi.java index ad2c807cca1..c5d38eb00d2 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/api/CommonWebApi.java +++ b/grails-web-common/src/main/groovy/org/grails/web/api/CommonWebApi.java @@ -28,7 +28,7 @@ import org.grails.encoder.CodecLookupHelper; import org.grails.encoder.Encoder; import grails.web.mvc.FlashScope; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import grails.web.servlet.mvc.GrailsParameterMap; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.codehaus.groovy.runtime.InvokerHelper; diff --git a/grails-web-common/src/main/groovy/org/grails/web/errors/GrailsWrappedRuntimeException.java b/grails-web-common/src/main/groovy/org/grails/web/errors/GrailsWrappedRuntimeException.java index 028828028f1..d0540bf5353 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/errors/GrailsWrappedRuntimeException.java +++ b/grails-web-common/src/main/groovy/org/grails/web/errors/GrailsWrappedRuntimeException.java @@ -39,7 +39,7 @@ import org.grails.exceptions.reporting.SourceCodeAware; import org.grails.web.support.ResourceAwareTemplateEngine; import org.grails.buffer.FastStringPrintWriter; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; diff --git a/grails-web-common/src/main/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributes.java b/grails-web-common/src/main/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributes.java index 7d31164efd7..78a61b4bf0f 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributes.java +++ b/grails-web-common/src/main/groovy/org/grails/web/servlet/DefaultGrailsApplicationAttributes.java @@ -16,7 +16,7 @@ package org.grails.web.servlet; import grails.web.mvc.FlashScope; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.GroovyObject; import java.io.Writer; @@ -24,15 +24,12 @@ import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import grails.core.GrailsApplication; import grails.core.GrailsControllerClass; -import grails.core.GrailsTagLibClass; -import org.grails.core.artefact.TagLibArtefactHandler; import grails.plugins.GrailsPluginManager; import org.grails.web.support.ResourceAwareTemplateEngine; import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods; @@ -224,23 +221,6 @@ public GrailsApplication getGrailsApplication() { return grailsApplication; } - public GroovyObject getTagLibraryForTag(HttpServletRequest request, HttpServletResponse response,String tagName) { - return getTagLibraryForTag(request, response, tagName, DEFAULT_NAMESPACE); - } - - public GroovyObject getTagLibraryForTag(HttpServletRequest request, HttpServletResponse response,String tagName, String namespace) { - String nonNullNamesapce = namespace == null ? DEFAULT_NAMESPACE : namespace; - String fullTagName = nonNullNamesapce + ":" + tagName; - - GrailsTagLibClass tagLibClass = (GrailsTagLibClass) getGrailsApplication().getArtefactForFeature( - TagLibArtefactHandler.TYPE, fullTagName); - if (tagLibClass == null) { - return null; - } - - return (GroovyObject)getApplicationContext().getBean(tagLibClass.getFullName()); - } - public Writer getOut(HttpServletRequest request) { return (Writer)request.getAttribute(OUT); } diff --git a/grails-web-common/src/main/groovy/org/grails/web/servlet/GrailsFlashScope.java b/grails-web-common/src/main/groovy/org/grails/web/servlet/GrailsFlashScope.java index 363c6f480de..3f1e1f1c8e0 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/servlet/GrailsFlashScope.java +++ b/grails-web-common/src/main/groovy/org/grails/web/servlet/GrailsFlashScope.java @@ -16,7 +16,7 @@ package org.grails.web.servlet; import grails.web.mvc.FlashScope; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; diff --git a/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java b/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java index 71fa4fc331b..e0a5a6e8e89 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java +++ b/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java @@ -43,7 +43,7 @@ import org.grails.web.beans.PropertyEditorRegistryUtils; import org.grails.web.pages.FilteringCodecsByContentTypeSettings; import grails.web.mvc.FlashScope; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.exceptions.ControllerExecutionException; import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.PropertyEditorRegistrySupport; diff --git a/grails-web-common/src/main/groovy/org/grails/web/servlet/view/AbstractGrailsView.java b/grails-web-common/src/main/groovy/org/grails/web/servlet/view/AbstractGrailsView.java index 83d630b4e82..10a5fb4aa25 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/servlet/view/AbstractGrailsView.java +++ b/grails-web-common/src/main/groovy/org/grails/web/servlet/view/AbstractGrailsView.java @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.grails.web.util.WebUtils; import org.springframework.web.context.request.RequestAttributes; diff --git a/grails-web-common/src/main/groovy/grails/web/util/GrailsApplicationAttributes.java b/grails-web-common/src/main/groovy/org/grails/web/util/GrailsApplicationAttributes.java similarity index 85% rename from grails-web-common/src/main/groovy/grails/web/util/GrailsApplicationAttributes.java rename to grails-web-common/src/main/groovy/org/grails/web/util/GrailsApplicationAttributes.java index 122d957e85c..0461ff88f41 100644 --- a/grails-web-common/src/main/groovy/grails/web/util/GrailsApplicationAttributes.java +++ b/grails-web-common/src/main/groovy/org/grails/web/util/GrailsApplicationAttributes.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package grails.web.util; +package org.grails.web.util; import grails.web.mvc.FlashScope; import groovy.lang.GroovyObject; @@ -150,31 +150,6 @@ public interface GrailsApplicationAttributes extends ApplicationAttributes, org. */ ResourceAwareTemplateEngine getPagesTemplateEngine(); - /** - * Retrieves a Grails tag library from the request for the named tag in - * the default namespace GroovyPage.DEFAULT_NAMESPACE - * - * @param request the request instance - * @param response the response instancte - * @param tagName The name of the tag that contains the tag library - * - * @return An instance of the tag library or null if not found - */ - GroovyObject getTagLibraryForTag(HttpServletRequest request, HttpServletResponse response, String tagName); - - /** - * Retrieves a Grails tag library from the request for the named tag in a - * given namespace. - * - * @param request the request instance - * @param response the response instancte - * @param tagName The name of the tag that contains the tag library - * @param namespace The namespace of the tag - * - * @return An instance of the tag library or null if not found - */ - GroovyObject getTagLibraryForTag(HttpServletRequest request, HttpServletResponse response, - String tagName, String namespace); /** * Holds the current response write for the request @@ -189,7 +164,13 @@ GroovyObject getTagLibraryForTag(HttpServletRequest request, HttpServletResponse */ void setOut(HttpServletRequest currentRequest, Writer out2); + /** + * @return The GroovyPageUriService instance + */ GroovyPagesUriService getGroovyPagesUriService(); + /** + * @return The MessageSource instance + */ MessageSource getMessageSource(); } diff --git a/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java b/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java index 21baa829b95..23e39ee5497 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java +++ b/grails-web-common/src/main/groovy/org/grails/web/util/WebUtils.java @@ -29,7 +29,6 @@ import grails.core.GrailsApplication; import grails.util.GrailsStringUtils; import grails.web.mime.MimeType; -import grails.web.util.GrailsApplicationAttributes; import grails.web.servlet.mvc.GrailsParameterMap; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.springframework.context.ApplicationContext; diff --git a/grails-web-common/src/main/resources/META-INF/grails.factories b/grails-web-common/src/main/resources/META-INF/grails.factories index bc9f77b6797..1c81663cad1 100644 --- a/grails-web-common/src/main/resources/META-INF/grails.factories +++ b/grails-web-common/src/main/resources/META-INF/grails.factories @@ -1,2 +1,2 @@ -grails.web.util.GrailsApplicationAttributes=org.grails.web.servlet.DefaultGrailsApplicationAttributes +org.grails.web.util.GrailsApplicationAttributes=org.grails.web.servlet.DefaultGrailsApplicationAttributes diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPageWritable.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPageWritable.java index 659e9fd7470..7dd23128b31 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPageWritable.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPageWritable.java @@ -16,7 +16,7 @@ package org.grails.web.pages; import grails.util.Environment; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.Binding; import groovy.lang.Writable; import org.apache.commons.logging.Log; diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesServlet.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesServlet.java index 886004a1334..e92befb37f7 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesServlet.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesServlet.java @@ -19,7 +19,7 @@ import grails.plugins.GrailsPluginManager; import grails.plugins.PluginManagerAware; import grails.util.GrailsStringUtils; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.text.Template; import org.grails.core.io.support.GrailsFactoriesLoader; import org.grails.plugins.BinaryGrailsPlugin; diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesTemplateEngine.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesTemplateEngine.java index 0ab694c7219..13ffa506182 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesTemplateEngine.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/GroovyPagesTemplateEngine.java @@ -63,7 +63,7 @@ import org.grails.web.pages.discovery.GroovyPageScriptSource; import org.grails.web.pages.ext.jsp.TagLibraryResolver; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.grails.web.taglib.TagLibraryLookup; diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/DefaultGroovyPageLocator.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/DefaultGroovyPageLocator.java index e8c9b1b6877..1929c0cd675 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/DefaultGroovyPageLocator.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/DefaultGroovyPageLocator.java @@ -40,7 +40,7 @@ import org.grails.web.pages.GroovyPage; import org.grails.web.pages.GroovyPageBinding; import org.grails.web.taglib.TemplateVariableBinding; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocator.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocator.java index fd6c817b377..623cd436e74 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocator.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocator.java @@ -29,7 +29,7 @@ import org.grails.web.pages.DefaultGroovyPagesUriService; import org.grails.web.taglib.TemplateVariableBinding; import grails.web.pages.GroovyPagesUriService; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.springframework.beans.factory.annotation.Autowired; diff --git a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GroovyPageStaticResourceLocator.java b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GroovyPageStaticResourceLocator.java index 8a699e91814..ea54284a985 100644 --- a/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GroovyPageStaticResourceLocator.java +++ b/grails-web-gsp/src/main/groovy/org/grails/web/pages/discovery/GroovyPageStaticResourceLocator.java @@ -20,7 +20,7 @@ import grails.plugins.GrailsPlugin; import org.grails.web.pages.GroovyPageBinding; import org.grails.web.taglib.TemplateVariableBinding; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.springframework.core.io.Resource; import org.springframework.web.context.request.RequestAttributes; diff --git a/grails-web-gsp/src/test/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocatorSpec.groovy b/grails-web-gsp/src/test/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocatorSpec.groovy index 7d1f7a18975..111eb8fc39d 100644 --- a/grails-web-gsp/src/test/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocatorSpec.groovy +++ b/grails-web-gsp/src/test/groovy/org/grails/web/pages/discovery/GrailsConventionGroovyPageLocatorSpec.groovy @@ -5,7 +5,7 @@ import grails.plugins.DefaultGrailsPluginManager import grails.plugins.metadata.GrailsPlugin import grails.util.GrailsUtil import grails.util.GrailsWebMockUtil -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.core.io.SimpleMapResourceLoader import org.grails.plugins.BinaryGrailsPlugin diff --git a/grails-web-gsp/src/test/groovy/org/grails/web/servlet/view/GroovyPageViewResolverSpec.groovy b/grails-web-gsp/src/test/groovy/org/grails/web/servlet/view/GroovyPageViewResolverSpec.groovy index 58d4bc6f4bc..f2f03a84702 100644 --- a/grails-web-gsp/src/test/groovy/org/grails/web/servlet/view/GroovyPageViewResolverSpec.groovy +++ b/grails-web-gsp/src/test/groovy/org/grails/web/servlet/view/GroovyPageViewResolverSpec.groovy @@ -1,7 +1,7 @@ package org.grails.web.servlet.view; import grails.util.GrailsWebMockUtil -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import javax.servlet.http.HttpServletRequest diff --git a/grails-web-jsp/src/main/groovy/org/grails/web/pages/ext/jsp/PageContextFactory.groovy b/grails-web-jsp/src/main/groovy/org/grails/web/pages/ext/jsp/PageContextFactory.groovy index 9a699099dad..4583a09ac52 100644 --- a/grails-web-jsp/src/main/groovy/org/grails/web/pages/ext/jsp/PageContextFactory.groovy +++ b/grails-web-jsp/src/main/groovy/org/grails/web/pages/ext/jsp/PageContextFactory.groovy @@ -20,7 +20,7 @@ import javax.servlet.jsp.PageContext as PC import org.grails.web.pages.GroovyPageBinding import org.grails.web.pages.GroovyPagesServlet -import grails.web.util.GrailsApplicationAttributes as GAA +import org.grails.web.util.GrailsApplicationAttributes as GAA import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.web.context.request.RequestContextHolder diff --git a/grails-web-mvc/src/main/groovy/org/grails/web/errors/GrailsExceptionResolver.java b/grails-web-mvc/src/main/groovy/org/grails/web/errors/GrailsExceptionResolver.java index 44247d5b664..2c34fb3af37 100644 --- a/grails-web-mvc/src/main/groovy/org/grails/web/errors/GrailsExceptionResolver.java +++ b/grails-web-mvc/src/main/groovy/org/grails/web/errors/GrailsExceptionResolver.java @@ -41,7 +41,7 @@ import org.grails.exceptions.ExceptionUtils; import org.grails.web.mapping.UrlMappingUtils; import grails.web.mapping.UrlMappingsHolder; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.mvc.exceptions.GrailsMVCException; import org.grails.web.sitemesh.GrailsContentBufferingResponse; import org.grails.web.util.WebUtils; diff --git a/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/GroovyPageLayoutFinder.java b/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/GroovyPageLayoutFinder.java index ffb9dd50cb9..4d224f47b09 100644 --- a/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/GroovyPageLayoutFinder.java +++ b/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/GroovyPageLayoutFinder.java @@ -29,7 +29,7 @@ import grails.util.GrailsStringUtils; import org.grails.io.support.GrailsResourceUtils; import org.codehaus.groovy.grails.web.metaclass.ControllerDynamicMethods; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.view.AbstractGrailsView; import org.grails.web.servlet.view.GrailsViewResolver; import org.grails.web.servlet.view.LayoutViewResolver; diff --git a/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/SpringMVCViewDecorator.java b/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/SpringMVCViewDecorator.java index 59aabcd2392..67fb9350e5e 100644 --- a/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/SpringMVCViewDecorator.java +++ b/grails-web-sitemesh/src/main/groovy/org/grails/web/sitemesh/SpringMVCViewDecorator.java @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.view.AbstractGrailsView; import org.springframework.web.servlet.View; import org.springframework.web.servlet.view.AbstractUrlBasedView; diff --git a/grails-web-taglib/src/main/groovy/grails/artefact/TagLibrary.groovy b/grails-web-taglib/src/main/groovy/grails/artefact/TagLibrary.groovy index 37188533982..52c990c14e0 100644 --- a/grails-web-taglib/src/main/groovy/grails/artefact/TagLibrary.groovy +++ b/grails-web-taglib/src/main/groovy/grails/artefact/TagLibrary.groovy @@ -17,7 +17,7 @@ package grails.artefact import grails.util.Environment import grails.web.api.WebAttributes -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode diff --git a/grails-web-taglib/src/main/groovy/org/grails/web/taglib/TagBodyClosure.java b/grails-web-taglib/src/main/groovy/org/grails/web/taglib/TagBodyClosure.java index 0bf623a0460..50076c392d4 100644 --- a/grails-web-taglib/src/main/groovy/org/grails/web/taglib/TagBodyClosure.java +++ b/grails-web-taglib/src/main/groovy/org/grails/web/taglib/TagBodyClosure.java @@ -15,7 +15,7 @@ */ package org.grails.web.taglib; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import groovy.lang.Binding; import groovy.lang.Closure; import org.grails.web.encoder.OutputEncodingStack; diff --git a/grails-web-url-mappings/src/main/groovy/grails/web/mapping/ResponseRedirector.groovy b/grails-web-url-mappings/src/main/groovy/grails/web/mapping/ResponseRedirector.groovy index 95bde91da93..460b1256267 100644 --- a/grails-web-url-mappings/src/main/groovy/grails/web/mapping/ResponseRedirector.groovy +++ b/grails-web-url-mappings/src/main/groovy/grails/web/mapping/ResponseRedirector.groovy @@ -17,12 +17,12 @@ package grails.web.mapping import groovy.transform.CompileStatic import groovy.util.logging.Commons -import grails.web.util.GrailsApplicationAttributes import grails.web.http.HttpHeaders import org.grails.web.servlet.mvc.GrailsWebRequest import grails.web.mapping.mvc.RedirectEventListener import grails.web.mapping.mvc.exceptions.CannotRedirectException import org.codehaus.groovy.runtime.DefaultGroovyMethods +import org.grails.web.util.GrailsApplicationAttributes import org.springframework.util.Assert import org.springframework.web.servlet.support.RequestDataValueProcessor diff --git a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java index 94514d5aa0a..1dd9de793de 100644 --- a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java +++ b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/UrlMappingUtils.java @@ -21,7 +21,7 @@ import grails.web.mapping.UrlMappingInfo; import grails.web.mapping.UrlMappingsHolder; import groovy.lang.Binding; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.servlet.WrappedResponseHolder; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.grails.web.servlet.mvc.exceptions.ControllerExecutionException; diff --git a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/mvc/UrlMappingsInfoHandlerAdapter.groovy b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/mvc/UrlMappingsInfoHandlerAdapter.groovy index 81b2a6830f2..fb15d4728ec 100644 --- a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/mvc/UrlMappingsInfoHandlerAdapter.groovy +++ b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/mvc/UrlMappingsInfoHandlerAdapter.groovy @@ -3,7 +3,7 @@ package org.grails.web.mapping.mvc import groovy.transform.CompileStatic import grails.core.GrailsControllerClass import grails.web.mapping.UrlMappingInfo -import grails.web.util.GrailsApplicationAttributes +import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.ActionResultTransformer import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.context.ApplicationContext diff --git a/grails-web/src/main/groovy/org/grails/web/servlet/ErrorHandlingServlet.java b/grails-web/src/main/groovy/org/grails/web/servlet/ErrorHandlingServlet.java index dd2c9bbdaa4..c463fbb5b3f 100644 --- a/grails-web/src/main/groovy/org/grails/web/servlet/ErrorHandlingServlet.java +++ b/grails-web/src/main/groovy/org/grails/web/servlet/ErrorHandlingServlet.java @@ -25,13 +25,12 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import grails.web.util.GrailsApplicationAttributes; +import org.grails.web.util.GrailsApplicationAttributes; import org.grails.web.errors.GrailsExceptionResolver; import org.grails.web.errors.GrailsWrappedRuntimeException; import grails.web.mapping.UrlMappingInfo; import org.grails.web.mapping.UrlMappingUtils; import grails.web.mapping.UrlMappingsHolder; -import org.grails.web.servlet.WrappedResponseHolder; import org.grails.web.servlet.mvc.GrailsDispatcherServlet; import org.grails.web.servlet.mvc.GrailsWebRequest; import org.grails.web.util.WebUtils;