📄 applyxslt.java
字号:
try
{
transformer.setParameter("servlet-RemoteUser", new XString(request.getRemoteUser()));
}
catch (Exception e)
{
}
}
/**
* Writes the following information to the servlet log:
* <ol>
* <li>HTTP status code</li>
* <li>Message</li>
* <li>Stack trace</li>
* </ol>
* @param axe Contains valid HTTP status code, message, and stack trace (optional)
*/
protected void writeLog(ApplyXSLTException axe)
{
writeLog(axe.getMessage(), axe.getStatusCode(), axe.getException());
}
/**
* Writes the following information to the servlet log:
* <ol>
* <li>HTTP status code</li>
* <li>Message</li>
* <li>Stack trace</li>
* </ol>
* @param msg Message to be logged
* @param statusCode Valid status code from javax.servlet.http.HttpServletResponse
* @param t Used to generate stack trace (may be =null to suppress stack trace)
*/
protected void writeLog(String msg, int statusCode, Throwable t)
{
if (t == null)
writeLog(msg, statusCode);
else
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
PrintWriter writer = new PrintWriter(bytes, true);
System.out.println("Exception is " + t.getClass().getName());
t.printStackTrace(writer);
log("HTTP Status Code: " + statusCode + " - " + msg + EOL + bytes.toString());
}
}
/**
* Writes the following information to the servlet log:
* <ol>
* <li>HTTP status code</li>
* <li>Message</li>
* </ol>
* @param msg Message to be logged
* @param statusCode Valid status code from javax.servlet.http.HttpServletResponse
*/
protected void writeLog(String msg, int statusCode)
{
log("HTTP Status Code: " + statusCode + " - " + msg);
}
/**
* Invokes response.sendError setting an HTTP status code and optionally an error message
* as an HTML page.
* <p>If running in debug mode, also try to return a stack trace of the exception and
* and xml/xsl processor messages.</p>
* @param response Where to stream the exception to
* @param xse The wrapper which contains the exception and its HTTP status code
* @param debug Indicates whether to include stack trace, etc.
*/
protected void displayException(HttpServletResponse response, ApplyXSLTException xse, boolean debug)
{
String mesg = xse.getMessage();
if (mesg == null)
mesg = "";
else mesg = "<B>" + mesg + "</B>";
StringTokenizer tokens = new StringTokenizer(mesg, EOL);
StringBuffer strBuf = new StringBuffer();
while (tokens.hasMoreTokens())
strBuf.append(tokens.nextToken() + EOL + "<BR>");
mesg = strBuf.toString();
if (debug)
{
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
PrintWriter writer = new PrintWriter(bytes, true);
xse.getException().printStackTrace(writer);
mesg += " <PRE> " + bytes.toString() + " </PRE> ";
}
response.setContentType("text/html");
try
{
response.sendError(xse.getStatusCode(), mesg);
}
catch (IOException ioe)
{
System.err.println("IOException is occurring when sendError is called");
}
}
/**
* Mapping of HTTP request's user-Agent values to stylesheet media= values.
* <p>This mapping is defined by a file pointed to by the operational parameter "mediaURL" which can
* either contain a full URL or a path relative to the System's server.root /servlets directory.</p>
* @see #setMediaProps
* @see #getMedia
* @serial
*/
protected OrderedProps ourMediaProps = null;
/**
* Returns a connection which respects the Accept-Language header of the HTTP request. This
* is useful when XSL files are internationalized for use with Web servers which respect this
* header.
* <p>For example, Apache 1.3.6 may be configured for multiviews. Under this configuration,
* requests for http://myhost/index.html would return http://myhost/index.html.fr to French browsers
* and http://myhost/index.html.en to English browsers.</p>
* @param url Location to connect to
* @param request Could contain an Accept-Language header
* @return An Accept-Language-enabled URL connection
* @see #getStylesheet
*/
protected URLConnection toAcceptLanguageConnection(URL url, HttpServletRequest request)
throws Exception
{
URLConnection tempConnection = url.openConnection();
tempConnection.setRequestProperty("Accept-Language", request.getHeader("Accept-Language"));
return tempConnection;
}
/**
* Returns the XSL stylesheet URL associated with the specified XML document. If multiple XSL
* stylesheets are associated with the XML document, preference will be given to the stylesheet
* which contains an attribute name/value pair that corresponds to the specified attributeName
* and attributeValue.
* @param xmlSource XML XSLTInputSource to be searched for associated XSL stylesheets
* @param attributeName Attribute name to provide preferential matching
* @param attributeValue Attribute value to provide preferential matching
* @return The preferred XSL stylesheet URL, or null if no XSL stylesheet association is found
* @see #getStylesheet
*/
public static String getXSLURLfromDoc(StreamSource xmlSource,
String attributeName,
String attributeValue,
TransformerFactory tFactory)
{
String tempURL = null, returnURL = null;
try
{
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
Node sourceTree = docBuilder.parse(xmlSource.getInputStream());
for(Node child=sourceTree.getFirstChild(); null != child; child=child.getNextSibling())
{
if(Node.PROCESSING_INSTRUCTION_NODE == child.getNodeType())
{
ProcessingInstruction pi = (ProcessingInstruction)child;
if(pi.getNodeName().equals("xml-stylesheet"))
{
PIA pia = new PIA(pi);
if("text/xsl".equals(pia.getAttribute("type")))
{
tempURL = pia.getAttribute("href");
String attribute = pia.getAttribute(attributeName);
if ((attribute != null) && (attribute.indexOf(attributeValue) > -1))
return tempURL;
if (!"yes".equals(pia.getAttribute("alternate")))
returnURL = tempURL;
}
}
}
}
}
catch(Exception saxExc)
{
}
return returnURL;
}
/**
* The attribute name in the <?xml-stylesheet> tag used in stylesheet selection.
*/
protected static final String STYLESHEET_ATTRIBUTE = "media";
/**
* The HTTP Header used for matching the Stylesheet attribute via the
* media properties file selected.
*/
protected static final String HEADER_NAME = "user-Agent";
}
/**
* Stores the keys and values from a file (similar to a properties file) and
* can return the first value which has a key contained in its string.
* File can have comment lines starting with '#" and for each line the entries are
* separated by tabs and '=' char.
*/
class OrderedProps
{
/**
* Stores the Key and Values as an array of Strings
*/
private Vector attVec = new Vector(15);
/**
* Constructor.
* @param inputStream Stream containing the properties file.
* @exception IOException Thrown if unable to read from stream
*/
OrderedProps(InputStream inputStream)
throws IOException
{
BufferedReader input = new BufferedReader(new InputStreamReader(inputStream));
String currentLine, Key = null;
StringTokenizer currentTokens;
while ((currentLine = input.readLine()) != null)
{
currentTokens = new StringTokenizer(currentLine, "=\t\r\n");
if (currentTokens.hasMoreTokens()) Key = currentTokens.nextToken().trim();
if ((Key != null) && !Key.startsWith("#") && currentTokens.hasMoreTokens())
{
String temp[] = new String[2];
temp[0] = Key; temp[1] = currentTokens.nextToken().trim();
attVec.addElement(temp);
}
}
}
/**
* Iterates through the Key list and returns the first value for whose
* key the given string contains. Returns "unknown" if no key is contained
* in the string.
* @param s String being searched for a key.
* @return Value for key found in string, otherwise "unknown"
*/
String getValue(String s)
{
int i, j = attVec.size();
for (i = 0; i < j; i++)
{
String temp[] = (String[]) attVec.elementAt(i);
if (s.indexOf(temp[0]) > -1)
return temp[1];
}
return "unknown";
}
}
/**
* Parses a processing instruction's (PI) attributes for easy retrieval.
*/
class PIA
{
private Hashtable piAttributes = null;
/**
* Constructor.
* @param pi The processing instruction whose attributes are to be parsed
*/
PIA(ProcessingInstruction pi)
{
piAttributes = new Hashtable();
StringTokenizer tokenizer = new StringTokenizer(pi.getNodeValue(), "=\"");
while(tokenizer.hasMoreTokens())
{
piAttributes.put(tokenizer.nextToken().trim(), tokenizer.nextToken().trim());
}
}
/**
* Returns value of specified attribute.
* @param name Attribute name
* @return Attribute value, or null if the attribute name does not exist
*/
String getAttribute(String name)
{
return (String) piAttributes.get(name);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -