/*
* Copyright 2004-2005 Graeme Rocher
*
* 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.web.mapping;
import grails.core.GrailsApplication;
import grails.gorm.validation.Constrained;
import grails.gorm.validation.ConstrainedProperty;
import grails.web.mapping.UrlMapping;
import org.grails.web.util.WebUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import java.net.URI;
import java.util.Collections;
import java.util.Map;
import javax.servlet.ServletContext;
/**
* Abstract UrlMapping implementation that provides common basic functionality.
*
* @author Graeme Rocher
* @since 0.5.5
*/
public abstract class AbstractUrlMapping implements UrlMapping {
protected final ConstrainedProperty[] constraints;
protected Object controllerName;
protected Object actionName;
protected Object namespace;
protected Object pluginName;
protected Object viewName;
protected Object forwardURI;
protected Object redirectInfo;
protected ServletContext servletContext;
protected GrailsApplication grailsApplication;
@SuppressWarnings("rawtypes")
protected Map parameterValues = Collections.emptyMap();
protected boolean parseRequest;
protected String mappingName;
protected String httpMethod = ANY_HTTP_METHOD;
protected String version = ANY_VERSION;
/**
* Base constructor required to construct a UrlMapping instance
*
* @param controllerName The name of the controller
* @param actionName The name of the action
* @param constraints Any constraints that apply to the mapping
* @param grailsApplication The GrailsApplication instance
*/
public AbstractUrlMapping(Object redirectInfo, Object controllerName, Object actionName, Object namespace, Object pluginName, Object viewName, ConstrainedProperty[] constraints, GrailsApplication grailsApplication) {
this.controllerName = controllerName;
this.actionName = actionName;
this.namespace = namespace;
this.pluginName = pluginName;
this.constraints = constraints;
this.viewName = viewName;
setGrailsApplication(grailsApplication);
this.redirectInfo = redirectInfo;
}
private void setGrailsApplication(GrailsApplication grailsApplication) {
this.grailsApplication = grailsApplication;
if(grailsApplication != null) {
final ApplicationContext applicationContext = grailsApplication.getMainContext();
if(applicationContext instanceof WebApplicationContext) {
this.servletContext = ((WebApplicationContext)applicationContext).getServletContext();
}
}
}
protected AbstractUrlMapping(Object viewName, ConstrainedProperty[] constraints, GrailsApplication grailsApplication) {
this.viewName = viewName;
this.constraints = constraints;
this.grailsApplication = grailsApplication;
setGrailsApplication(grailsApplication);
}
protected AbstractUrlMapping(URI uri, ConstrainedProperty[] constraints, GrailsApplication grailsApplication) {
this.forwardURI = uri;
this.constraints = constraints;
this.grailsApplication = grailsApplication;
setGrailsApplication(grailsApplication);
}
@Override
public String getHttpMethod() {
return httpMethod;
}
@Override
public String getVersion() {
return version;
}
/**
* @see UrlMapping#getConstraints()
*/
public Constrained[] getConstraints() {
return constraints;
}
/**
* @see UrlMapping#getControllerName()
*/
public Object getControllerName() {
return controllerName;
}
/**
* @see grails.web.mapping.UrlMapping#getActionName()
*/
public Object getActionName() {
return actionName;
}
public Object getPluginName() {
return pluginName;
}
public Object getNamespace() {
return namespace;
}
/**
* @see grails.web.mapping.UrlMapping#getViewName()
*/
public Object getViewName() {
return viewName;
}
@SuppressWarnings({"unchecked","rawtypes"})
public void setParameterValues(Map parameterValues) {
this.parameterValues = Collections.unmodifiableMap(parameterValues);
}
public void setParseRequest(boolean shouldParse) {
this.parseRequest = shouldParse;
}
public String getMappingName() {
return mappingName;
}
public void setMappingName(String name) {
mappingName = name;
}
public boolean hasRuntimeVariable(String name) {
if (constraints != null) {
for (int i = 0; i < constraints.length; i++) {
ConstrainedProperty cp = constraints[i];
if (cp.getPropertyName().equals(name)) return true;
}
}
return false;
}
public Object getRedirectInfo() {
return redirectInfo;
}
}