All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.directwebremoting.servlet.BaseInterfaceHandler Maven / Gradle / Ivy

package org.directwebremoting.servlet;

import java.io.IOException;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.directwebremoting.extend.ConverterManager;
import org.directwebremoting.extend.ModuleManager;
import org.directwebremoting.util.LocalUtil;

/**
 * Handler base class for interface generation requests
 * @author Joe Walker [joe at getahead dot ltd dot uk]
 */
public abstract class BaseInterfaceHandler extends GeneratedJavaScriptHandler
{
    @Override
    protected String generateTemplate(String contextPath, String servletPath, String pathInfo) throws IOException
    {
        String scriptName = pathInfo;

        if (!scriptName.startsWith(getBaseInterfacePath()) || !scriptName.endsWith(PathConstants.EXTENSION_JS))
        {
            return null;
        }

        scriptName = scriptName.substring(getBaseInterfacePath().length());
        scriptName = scriptName.substring(0, scriptName.length() - PathConstants.EXTENSION_JS.length());

        if (!LocalUtil.isValidScriptName(scriptName))
        {
            log.debug("Throwing at request for script with name: '" + scriptName + "'");
            throw new SecurityException("Illegal script name.");
        }

        // Be flexible and let "/" separators in URL match both "." and "/" in
        // script names
        if (scriptName.contains("/"))
        {
            Pattern p = Pattern.compile(scriptName.replaceAll("/", "[/\\.]"));
            String match = null;
            for(String moduleName : moduleManager.getModuleNames(false))
            {
                if (p.matcher(moduleName).matches())
                {
                    if (match == null)
                    {
                        match = moduleName;
                    }
                    else
                    {
                        throw new IllegalArgumentException("Script name '" + scriptName + "' matches several modules.");
                    }
                }
            }
            if (match != null)
            {
                scriptName = match;
            }
        }

        // Generate script
        return generateInterfaceScript(contextPath, servletPath, scriptName);
    }

    /**
     * Returns the path used for interfaces by this Handler
     * @return interface path
     */
    protected abstract String getBaseInterfacePath();

    /**
     * Does the actual work of generating the interface script
     * @param contextPath ...
     * @param servletPath TODO
     * @param scriptName ...
     * @return interface script
     */
    public abstract String generateInterfaceScript(String contextPath, String servletPath, String scriptName);

    /**
     * Setter for the configured ModuleManager
     * @param moduleManager the ModuleManager
     */
    public void setModuleManager(ModuleManager moduleManager)
    {
        this.moduleManager = moduleManager;
    }

    /**
     * @param converterManager the converterManager to set
     */
    public void setConverterManager(ConverterManager converterManager)
    {
        this.converterManager = converterManager;
    }

    /**
     * Setter for the generator setting.
     * @param generateDtoClasses list of enabled places to generate DTO classes in
     */
    public void setGenerateDtoClasses(String generateDtoClasses)
    {
        this.generateDtoClasses = generateDtoClasses;
    }

    @Override
    public String toString()
    {
        return this.getClass().getSimpleName() + "(" + getBaseInterfacePath() + ")";
    }

    /**
     * Where we look up available script names
     */
    protected ModuleManager moduleManager = null;

    /**
     * ConverterManager to query for DTO classes
     */
    protected ConverterManager converterManager;

    /**
     * List of enabled places to generate DTO classes in
     */
    protected String generateDtoClasses;

    /**
     * The log stream
     */
    private static final Log log = LogFactory.getLog(BaseInterfaceHandler.class);
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy