?? dwrxmlconfigurator.java
字號:
/*
* Copyright 2005 Joe Walker
*
* 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.directwebremoting.impl;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.ServletContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.directwebremoting.AccessControl;
import org.directwebremoting.AjaxFilter;
import org.directwebremoting.AjaxFilterManager;
import org.directwebremoting.Configurator;
import org.directwebremoting.Container;
import org.directwebremoting.ConverterManager;
import org.directwebremoting.Creator;
import org.directwebremoting.CreatorManager;
import org.directwebremoting.TypeHintContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.util.LocalUtil;
import org.directwebremoting.util.LogErrorHandler;
import org.directwebremoting.util.Logger;
import org.directwebremoting.util.Messages;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* A configurator that gets its configuration by reading a dwr.xml file.
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public class DwrXmlConfigurator implements Configurator
{
/**
* Setter for the resource name that we can use to read a file from the
* servlet context
* @param servletResourceName The name to lookup
* @throws IOException On file read failure
* @throws ParserConfigurationException On XML setup failure
* @throws SAXException On XML parse failure
*/
public void setServletResourceName(String servletResourceName) throws IOException, ParserConfigurationException, SAXException
{
this.servletResourceName = servletResourceName;
ServletContext servletContext = WebContextFactory.get().getServletContext();
if (servletContext == null)
{
throw new IOException(Messages.getString("DwrXmlConfigurator.MissingServletContext")); //$NON-NLS-1$
}
InputStream in = null;
try
{
in = servletContext.getResourceAsStream(servletResourceName);
if (in == null)
{
throw new IOException(Messages.getString("DwrXmlConfigurator.MissingConfigFile", servletResourceName)); //$NON-NLS-1$
}
setInputStream(in);
}
finally
{
LocalUtil.close(in);
}
}
/**
* Setter for a classpath based lookup
* @param classResourceName The resource to lookup in the classpath
* @throws IOException On file read failure
* @throws ParserConfigurationException On XML setup failure
* @throws SAXException On XML parse failure
*/
public void setClassResourceName(String classResourceName) throws IOException, ParserConfigurationException, SAXException
{
this.classResourceName = classResourceName;
InputStream in = getClass().getResourceAsStream(classResourceName);
if (in == null)
{
throw new IOException(Messages.getString("DwrXmlConfigurator.MissingConfigFile", classResourceName)); //$NON-NLS-1$
}
setInputStream(in);
}
/**
* Setter for a direct input stream to configure from
* @param in The input stream to read from.
* @throws IOException On file read failure
* @throws ParserConfigurationException On XML setup failure
* @throws SAXException On XML parse failure
*/
public void setInputStream(InputStream in) throws ParserConfigurationException, SAXException, IOException
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(new DTDEntityResolver());
db.setErrorHandler(new LogErrorHandler());
document = db.parse(in);
}
/**
* To set the configuration document directly
* @param document The new configuration document
*/
public void setDocument(Document document)
{
this.document = document;
}
/* (non-Javadoc)
* @see org.directwebremoting.Configurator#configure(org.directwebremoting.Container)
*/
public void configure(Container container)
{
accessControl = (AccessControl) container.getBean(AccessControl.class.getName());
ajaxFilterManager = (AjaxFilterManager) container.getBean(AjaxFilterManager.class.getName());
converterManager = (ConverterManager) container.getBean(ConverterManager.class.getName());
creatorManager = (CreatorManager) container.getBean(CreatorManager.class.getName());
Element root = document.getDocumentElement();
NodeList rootChildren = root.getChildNodes();
for (int i = 0; i < rootChildren.getLength(); i++)
{
Node node = rootChildren.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
{
Element child = (Element) node;
if (child.getNodeName().equals(ELEMENT_INIT))
{
loadInits(child);
}
else if (child.getNodeName().equals(ELEMENT_ALLOW))
{
loadAllows(child);
}
else if (child.getNodeName().equals(ELEMENT_SIGNATURES))
{
loadSignature(child);
}
}
}
}
/**
* Internal method to load the inits element
* @param child The element to read
*/
private void loadInits(Element child)
{
NodeList inits = child.getChildNodes();
for (int j = 0; j < inits.getLength(); j++)
{
if (inits.item(j).getNodeType() == Node.ELEMENT_NODE)
{
Element initer = (Element) inits.item(j);
if (initer.getNodeName().equals(ATTRIBUTE_CREATOR))
{
String id = initer.getAttribute(ATTRIBUTE_ID);
String className = initer.getAttribute(ATTRIBUTE_CLASS);
creatorManager.addCreatorType(id, className);
}
else if (initer.getNodeName().equals(ATTRIBUTE_CONVERTER))
{
String id = initer.getAttribute(ATTRIBUTE_ID);
String className = initer.getAttribute(ATTRIBUTE_CLASS);
converterManager.addConverterType(id, className);
}
}
}
}
/**
* Internal method to load the create/convert elements
* @param child The element to read
*/
private void loadAllows(Element child)
{
NodeList allows = child.getChildNodes();
for (int j = 0; j < allows.getLength(); j++)
{
if (allows.item(j).getNodeType() == Node.ELEMENT_NODE)
{
Element allower = (Element) allows.item(j);
if (allower.getNodeName().equals(ELEMENT_CREATE))
{
loadCreate(allower);
}
else if (allower.getNodeName().equals(ELEMENT_CONVERT))
{
loadConvert(allower);
}
else if (allower.getNodeName().equals(ELEMENT_FILTER))
{
loadFilter(allower);
}
}
}
}
/**
* Internal method to load the convert element
* @param allower The element to read
*/
private void loadConvert(Element allower)
{
String match = allower.getAttribute(ATTRIBUTE_MATCH);
String type = allower.getAttribute(ATTRIBUTE_CONVERTER);
try
{
Map params = createSettingMap(allower);
converterManager.addConverter(match, type, params);
}
catch (NoClassDefFoundError ex)
{
log.info("Convertor '" + type + "' not loaded due to NoClassDefFoundError. (match='" + match + "'). Cause: " + ex.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
catch (Exception ex)
{
log.error("Failed to add convertor: match=" + match + ", type=" + type, ex); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* Internal method to load the create element
* @param allower The element to read
*/
private void loadCreate(Element allower)
{
String type = allower.getAttribute(ATTRIBUTE_CREATOR);
String javascript = allower.getAttribute(ATTRIBUTE_JAVASCRIPT);
try
{
Map params = createSettingMap(allower);
creatorManager.addCreator(javascript, type, params);
processPermissions(javascript, allower);
processAuth(javascript, allower);
processParameters(javascript, allower);
processAjaxFilters(javascript, allower);
}
catch (NoClassDefFoundError ex)
{
log.info("Creator '" + type + "' not loaded due to NoClassDefFoundError. (javascript='" + javascript + "'). Cause: " + ex.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
catch (Exception ex)
{
log.error("Failed to add creator: type=" + type + ", javascript=" + javascript, ex); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* Internal method to load the convert element
* @param allower The element to read
*/
private void loadFilter(Element allower)
{
String type = allower.getAttribute(ATTRIBUTE_CLASS);
try
{
Class impl = LocalUtil.classForName(type);
AjaxFilter object = (AjaxFilter) impl.newInstance();
LocalUtil.setParams(object, createSettingMap(allower), ignore);
ajaxFilterManager.addAjaxFilter(object);
}
catch (ClassCastException ex)
{
log.error(type + " does not implement " + AjaxFilter.class.getName(), ex); //$NON-NLS-1$
}
catch (NoClassDefFoundError ex)
{
log.info("Missing class for filter (class='" + type + "'). Cause: " + ex.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
catch (Exception ex)
{
log.error("Failed to add filter: class=" + type, ex); //$NON-NLS-1$
}
}
/**
* Create a parameter map from nested <param name="foo" value="blah"/>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -