Make attachments more robusts
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 7 May 2009 16:20:10 +0000 (16:20 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 7 May 2009 16:20:10 +0000 (16:20 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2424 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/attachment/GetAttachmentHandler.java
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/attachment/SimpleAttachment.java
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.agent/META-INF/spring/common.xml
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.agent/META-INF/spring/osgi.xml

index 77a21ae319825f3ac1682cbc2665c08aa898e9e2..b5ac9b5e65ccacf6ca8dda79a2c2267662e9128a 100644 (file)
@@ -13,12 +13,30 @@ import org.springframework.web.HttpRequestHandler;
 \r
 /** Returns one single result. */\r
 public class GetAttachmentHandler implements HttpRequestHandler {\r
+       protected final String FORCE_DOWNLOAD = "Content-Type: application/force-download";\r
+\r
        private AttachmentsStorage attachmentsStorage;\r
 \r
        public void handleRequest(HttpServletRequest request,\r
                        HttpServletResponse response) throws ServletException, IOException {\r
                String uuid = request.getParameter("uuid");\r
                String contentType = request.getParameter("contentType");\r
+               String name = request.getParameter("name");\r
+               if (contentType == null || "".equals(contentType.trim())) {\r
+                       contentType = FORCE_DOWNLOAD;\r
+               }\r
+\r
+               if (contentType.trim().equals(FORCE_DOWNLOAD)) {\r
+                       if (name != null) {\r
+                               contentType = contentType + ";name=\"" + name + "\"";\r
+                               response.setHeader("Content-Disposition",\r
+                                               "attachment; filename=\"" + name + "\"");\r
+                       }\r
+                       response.setHeader("Expires", "0");\r
+                       response.setHeader("Cache-Control", "no-cache, must-revalidate");\r
+                       response.setHeader("Pragma", "no-cache");\r
+               }\r
+\r
                SimpleAttachment resourceDescriptor = new SimpleAttachment();\r
                resourceDescriptor.setUuid(uuid);\r
                resourceDescriptor.setContentType(contentType);\r
index 23dad53f16f61d7b7f027ec4aaf6447b93e79717..1c1f13eb9319ec98b8157c87a0166757b780efcc 100644 (file)
@@ -5,7 +5,7 @@ import java.util.UUID;
 public class SimpleAttachment implements Attachment {
        private String uuid = UUID.randomUUID().toString();
        private String name;
-       private String contentType;
+       private String contentType = "";
 
        public String getUuid() {
                return uuid;
index 05a60b73bd5e9db39073fed4cbc2fd54e05e3fdd..36d951093a964c18b68fea9f0348a089e1f553ac 100644 (file)
@@ -13,50 +13,51 @@ import org.springframework.beans.factory.config.Scope;
 public class ExecutionScope implements Scope {
        private final static Log log = LogFactory.getLog(ExecutionScope.class);
 
-       private final ThreadLocal<ExecutionContext> executionContext 
-                       = new ThreadLocal<ExecutionContext>();
-       
+       private final ThreadLocal<ExecutionContext> executionContext = new ThreadLocal<ExecutionContext>();
+
        public final ThreadLocal<String> executionContextBeanName = new ThreadLocal<String>();
-       
+
        public Object get(String name, ObjectFactory objectFactory) {
 
                if (log.isTraceEnabled())
                        log.trace("Getting scoped bean " + name);
-               
+
                // check if an execution context is defined for this thread
-               if(executionContext.get() == null) {
+               if (executionContext.get() == null) {
                        // if not, we expect objectFactory to produce an ExecutionContext
                        Object obj = objectFactory.getObject();
-                       if(obj instanceof ExecutionContext) {
+                       if (obj instanceof ExecutionContext) {
                                // store the ExecutionContext in the ThreadLocal
-                               executionContext.set((ExecutionContext)obj);
+                               executionContext.set((ExecutionContext) obj);
                                executionContextBeanName.set(name);
                                return obj;
+                       } else {
+                               throw new SlcException(
+                                               "Expected an ExecutionContext, got an object of class "
+                                                               + obj.getClass()
+                                                               + " for bean "
+                                                               + name
+                                                               + ": make sure that you have porperly set scope=\"execution\" where required");
                        }
-                       else {
-                               throw new SlcException("Expected an ExecutionContext, got an object of class "
-                                               + obj.getClass() + " for bean " + name);
-                       }                       
                }
-               
-               if(name.equals(executionContextBeanName.get())) {
+
+               if (name.equals(executionContextBeanName.get())) {
                        return executionContext.get();
-               }
-               else {
-                       // see if the executionContext already knows the object 
+               } else {
+                       // see if the executionContext already knows the object
                        Object obj = executionContext.get().findScopedObject(name);
-                       if(obj == null) {
+                       if (obj == null) {
                                obj = objectFactory.getObject();
-                               if(!(obj instanceof ExecutionContext)) {
+                               if (!(obj instanceof ExecutionContext)) {
                                        executionContext.get().addScopedObject(name, obj);
-                               }
-                               else {
-                                       throw new SlcException("Only one ExecutionContext can be defined per Thread");
+                               } else {
+                                       throw new SlcException(
+                                                       "Only one ExecutionContext can be defined per Thread");
                                }
                        }
                        return obj;
                }
-               
+
                // if (ExecutionContext.getScopedObjects().containsKey(name)) {
                // // returns cached instance
                // Object obj = ExecutionContext.getScopedObjects().get(name);
@@ -74,18 +75,17 @@ public class ExecutionScope implements Scope {
        }
 
        public String getConversationId() {
-               
+
                return executionContext.get().getUuid();
        }
-       
+
        public Boolean hasExecutionContext() {
                return executionContext.get() != null;
        }
-       
 
        public void registerDestructionCallback(String name, Runnable callback) {
                // TODO: implement it
-               //throw new UnsupportedOperationException();
+               // throw new UnsupportedOperationException();
        }
 
        public Object remove(String name) {
index 6e170a134be0c252f33af04faf4bf9c6b7973fa7..5dfab09ad92bc305ecac819b7041c1fa16cf463b 100644 (file)
@@ -13,4 +13,7 @@
                        </value>
                </property>
        </bean>
+
+       <bean id="treeTestResultLogger" class="org.argeo.slc.core.test.tree.TreeTestResultLogger" />
+
 </beans>
\ No newline at end of file
index 7d6a13d25b9b8b431b71e7e53e812b0e4dd1449c..0460d7e07e9f7357d972cf3694dc07a8874964ae 100644 (file)
@@ -6,8 +6,16 @@
        http://www.springframework.org/schema/beans   \r
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
-       <service ref="resultListener" interface="org.argeo.slc.core.test.tree.TreeTestResultListener" />\r
+       <!-- Deprecated -->\r
+       <service ref="resultListener"\r
+               interface="org.argeo.slc.core.test.tree.TreeTestResultListener" />\r
        <service ref="resultListener" interface="org.argeo.slc.test.TestResultListener" />\r
+\r
+       <!-- Deprecated -->\r
+       <service ref="treeTestResultLogger" interface="org.argeo.slc.test.TestResultListener" />\r
+       <service ref="treeTestResultLogger"\r
+               interface="org.argeo.slc.core.test.tree.TreeTestResultListener" />\r
+\r
        <service ref="slcExecutionListener" interface="org.argeo.slc.process.SlcExecutionNotifier" />\r
 \r
        <!-- Manager -->\r
@@ -18,9 +26,6 @@
 \r
        <service ref="jmsAgent.attachmentUploader" interface="org.argeo.slc.core.attachment.AttachmentUploader" />\r
 \r
-       <service interface="org.argeo.slc.core.test.tree.TreeTestResultListener">\r
-               <beans:bean class="org.argeo.slc.core.test.tree.TreeTestResultLogger" />\r
-       </service>\r
 \r
        <list id="slcExecutionListeners" interface="org.argeo.slc.process.SlcExecutionNotifier"\r
                cardinality="0..N" />\r