From: <way...@us...> - 2007-08-24 19:36:58
|
Revision: 4923 http://dcm4che.svn.sourceforge.net/dcm4che/?rev=4923&view=rev Author: wayfarer3130 Date: 2007-08-24 12:36:55 -0700 (Fri, 24 Aug 2007) Log Message: ----------- JIRA XER-28 Add support for displaying in Opera. Now displays image page only - still need to add other pages. Modified Paths: -------------- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/ContentTypeFilter.java dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/MaxAgeFilter.java dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/TimeFilter.java dcm4chee/xero/trunk/xero-war/src/main/webapp/WEB-INF/web.xml dcm4chee/xero/trunk/xero-war/src/main/webapp/js/AjaxXslt.js dcm4chee/xero/trunk/xero-war/src/main/webapp/js/Events.js Added Paths: ----------- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/CharResponseWrapper.java dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/XsltFilter.java Added: dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/CharResponseWrapper.java =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/CharResponseWrapper.java (rev 0) +++ dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/CharResponseWrapper.java 2007-08-24 19:36:55 UTC (rev 4923) @@ -0,0 +1,25 @@ +package org.dcm4chee.xero.servlet; + +import java.io.CharArrayWriter; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** Copied (partially) from java.sun.com example. */ +public class CharResponseWrapper extends HttpServletResponseWrapper { + private CharArrayWriter output; + + public String toString() { + return output.toString(); + } + + public CharResponseWrapper(HttpServletResponse response) { + super(response); + output = new CharArrayWriter(); + } + + public PrintWriter getWriter() { + return new PrintWriter(output); + } +} Modified: dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/ContentTypeFilter.java =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/ContentTypeFilter.java 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/ContentTypeFilter.java 2007-08-24 19:36:55 UTC (rev 4923) @@ -1,3 +1,40 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is part of dcm4che, an implementation of DICOM(TM) in + * Java(TM), hosted at http://sourceforge.net/projects/dcm4che. + * + * The Initial Developer of the Original Code is + * Bill Wallace, Agfa HealthCare Inc., + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Bill Wallace <bil...@ag...> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ package org.dcm4chee.xero.servlet; import java.io.IOException; Modified: dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/MaxAgeFilter.java =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/MaxAgeFilter.java 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/MaxAgeFilter.java 2007-08-24 19:36:55 UTC (rev 4923) @@ -1,3 +1,40 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is part of dcm4che, an implementation of DICOM(TM) in + * Java(TM), hosted at http://sourceforge.net/projects/dcm4che. + * + * The Initial Developer of the Original Code is + * Bill Wallace, Agfa HealthCare Inc., + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Bill Wallace <bil...@ag...> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ package org.dcm4chee.xero.servlet; import java.io.IOException; Modified: dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/TimeFilter.java =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/TimeFilter.java 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/TimeFilter.java 2007-08-24 19:36:55 UTC (rev 4923) @@ -1,3 +1,40 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is part of dcm4che, an implementation of DICOM(TM) in + * Java(TM), hosted at http://sourceforge.net/projects/dcm4che. + * + * The Initial Developer of the Original Code is + * Bill Wallace, Agfa HealthCare Inc., + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Bill Wallace <bil...@ag...> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ package org.dcm4chee.xero.servlet; import java.io.IOException; Added: dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/XsltFilter.java =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/XsltFilter.java (rev 0) +++ dcm4chee/xero/trunk/xero-war/src/main/java/org/dcm4chee/xero/servlet/XsltFilter.java 2007-08-24 19:36:55 UTC (rev 4923) @@ -0,0 +1,171 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is part of dcm4che, an implementation of DICOM(TM) in + * Java(TM), hosted at http://sourceforge.net/projects/dcm4che. + * + * The Initial Developer of the Original Code is + * Bill Wallace, Agfa HealthCare Inc., + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Bill Wallace <bil...@ag...> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +package org.dcm4chee.xero.servlet; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.net.MalformedURLException; +import java.net.URL; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.URIResolver; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +/** + * This class sits in front of another page and applies the requested XSLT to + * the page. The XSLT to be applied may only depend on the base URL (eg + * /xero/image/image.seam), the browser and the language. + * + * @author bwallace + */ +public class XsltFilter implements Filter { + public String XSLT_PARAMETER = "xslt"; + + FilterConfig filterConfig; + + Transformer transformer; + + public void destroy() { + } + + /** + * Gets the transformer appropriate to transform the given request, as + * embodied in the responseWrapper + */ + protected Transformer getTransformer(ServletRequest request, String xml) throws IOException { + if (transformer == null) { + String styleSheet = "http://wtl-bwallace:8080/xero/image/imageXsl.xsl"; + URL url = new URL(styleSheet); + Source styleSource = new StreamSource(url.openStream()); + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + try { + transformer = transformerFactory.newTransformer(styleSource); + } catch (TransformerConfigurationException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + return transformer; + } + + /** + * Detect if XSLT should be applied + */ + protected boolean checkApplyXslt(ServletRequest request) { + if ("true".equalsIgnoreCase(request.getParameter(XSLT_PARAMETER))) + return true; + HttpServletRequest hRequest = (HttpServletRequest) request; + String agent = hRequest.getHeader("USER-AGENT"); + if (agent.indexOf("AppleWebKit") >= 0) { + return true; + } + if (agent.indexOf("Opera") >= 0) { + return true; + } + return false; + } + + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filters) throws IOException, ServletException { + if (!checkApplyXslt(request)) { + filters.doFilter(request, response); + return; + } + + PrintWriter out = response.getWriter(); + CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response); + filters.doFilter(request, responseWrapper); + // Get response from servlet + String xml = responseWrapper.toString(); + StringReader sr = new StringReader(xml); + Source xmlSource = new StreamSource(sr); + + try { + Transformer useTransform = getTransformer(request, xml); + useTransform.setURIResolver(new UrlURIResolver()); + CharArrayWriter caw = new CharArrayWriter(); + StreamResult result = new StreamResult(caw); + useTransform.transform(xmlSource, result); + response.setContentLength(caw.toString().length()); + out.write(caw.toString()); + } catch (Exception ex) { + out.println(ex.toString()); + out.write(responseWrapper.toString()); + } + } + + public void init(FilterConfig config) throws ServletException { + this.filterConfig = config; + } + +} + +/** + * Figures out what source to use for various URI requests TODO High priority - + * validate the path being requested to ensure it is locally valid and safe to + * resolve. TODO Later on, include any security credentials. + */ +class UrlURIResolver implements URIResolver { + + public Source resolve(String href, String base) throws TransformerException { + URL url; + String sUrl = "http://localhost:8080/" + href; + try { + url = new URL(sUrl); + return new StreamSource(url.openStream()); + } catch (MalformedURLException e) { + throw new RuntimeException("Invalid URL:" + base + href, e); + } catch (IOException e) { + throw new RuntimeException("IO Exception on URL:" + base + href, e); + } + } +} Modified: dcm4chee/xero/trunk/xero-war/src/main/webapp/WEB-INF/web.xml =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/webapp/WEB-INF/web.xml 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/webapp/WEB-INF/web.xml 2007-08-24 19:36:55 UTC (rev 4923) @@ -65,7 +65,12 @@ <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> - + + <filter> + <filter-name>XsltFilter</filter-name> + <filter-class>org.dcm4chee.xero.servlet.XsltFilter</filter-class> + </filter> + <filter> <filter-name>Seam Exception Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamExceptionFilter</filter-class> @@ -105,6 +110,15 @@ </filter> <filter> + <filter-name>HtmlContentFilter</filter-name> + <filter-class>org.dcm4chee.xero.servlet.ContentTypeFilter</filter-class> + <init-param> + <param-name>contentType</param-name> + <param-value>text/html</param-value> + </init-param> + </filter> + + <filter> <filter-name>SvgContentFilter</filter-name> <filter-class>org.dcm4chee.xero.servlet.ContentTypeFilter</filter-class> <init-param> @@ -126,6 +140,7 @@ <filter-name>TimeFilter</filter-name> <url-pattern>*.seam</url-pattern> </filter-mapping> + <filter-mapping> <filter-name>TimeFilter</filter-name> <url-pattern>*.xml</url-pattern> @@ -144,13 +159,13 @@ <filter-name>SvgContentFilter</filter-name> <url-pattern>*.svg</url-pattern> </filter-mapping> + + <filter-mapping> + <filter-name>XsltFilter</filter-name> + <url-pattern>/image/image.seam</url-pattern> + </filter-mapping> <filter-mapping> - <filter-name>ShortMaxAgeFilter</filter-name> - <url-pattern>*.seam</url-pattern> - </filter-mapping> - - <filter-mapping> <filter-name>Seam Redirect Filter</filter-name> <url-pattern>*.seam</url-pattern> </filter-mapping> Modified: dcm4chee/xero/trunk/xero-war/src/main/webapp/js/AjaxXslt.js =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/webapp/js/AjaxXslt.js 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/webapp/js/AjaxXslt.js 2007-08-24 19:36:55 UTC (rev 4923) @@ -57,6 +57,7 @@ XsltAjax.prototype.debug=debug; // Use for expensive debugging statements only - set to 3 normally. +XsltAjax.prototype.profile=info; XsltAjax.prototype.logLevel=3; XsltAjax.prototype.info=info @@ -116,7 +117,7 @@ */ XsltAjax.prototype.setXsltUri = function(xsltUri) { this.xsltUri = xsltUri; - if( xsltUri===undefined ) { + if( xsltUri===undefined || browserName==="Safari" || browserName==="Konqueror" || browserName==="Opera") { this.xsltProcessor = undefined; return; } @@ -258,6 +259,9 @@ if(!file) { alert("Ajax read requested from undefined URL - did you forget to have a node with the id the name of the action and the right href or set the URL?"); } + if( !this.xsltProcessor ) { + file = file+"&xslt=true"; + } this.inProgress = true; var xmlObj = null; var asXml = null; @@ -308,7 +312,7 @@ this.inProgress = false; this.replaceNodeTime = (new Date()).getTime(); - this.debug("Server load:"+(this.fromServerTime-this.startTime)+ + this.profile("Server load:"+(this.fromServerTime-this.startTime)+ " parse:"+(this.endParseTime-this.fromServerTime)+ " xslt:"+(this.xslTime-this.endParseTime)+" replace:"+(this.replaceNodeTime-this.xslTime)+ " total:"+(this.replaceNodeTime-this.startTime)); Modified: dcm4chee/xero/trunk/xero-war/src/main/webapp/js/Events.js =================================================================== --- dcm4chee/xero/trunk/xero-war/src/main/webapp/js/Events.js 2007-08-24 13:48:23 UTC (rev 4922) +++ dcm4chee/xero/trunk/xero-war/src/main/webapp/js/Events.js 2007-08-24 19:36:55 UTC (rev 4923) @@ -231,7 +231,18 @@ if( navigator.appName=="Microsoft Internet Explorer" ) { return "IE"; } - warn("Unknown browser -update browserNameFunc with support for "+navigator.appName); + if( navigator.userAgent.indexOf("WebKit")>=0 ) { + return "Safari"; + } + if( navigator.userAgent.indexOf("Konqueror")>=0 ) { + return "Konqueror"; + } + if( navigator.userAgent.indexOf("Gecko")>=0 ) { + return "Firefox"; + } + if( window.opera ) return "Opera"; + var msg = "Unknown browser -update browserNameFunc with support for "+navigator.appName+" userAgent="+navigator.userAgent; + warn(msg); return navigator.appName; }; -var browserName = browserNameFunc(); \ No newline at end of file +var browserName = browserNameFunc(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |