| 1 10 package org.mmbase.servlet; 11 12 import javax.servlet.http.HttpServletResponse ; 13 import javax.servlet.ServletException ; 14 15 import java.util.Map ; 16 17 import org.mmbase.bridge.*; 18 import org.mmbase.storage.search.*; 19 import org.mmbase.security.Rank; 20 21 import org.mmbase.module.builders.Images; 22 import org.mmbase.util.logging.*; 23 import org.mmbase.util.functions.*; 24 25 38 public class ImageServlet extends HandleServlet { 39 private static Logger log; 40 41 45 private boolean convert = false; 46 47 public void init() throws ServletException { 48 super.init(); 49 String convertParameter = getInitParameter("convert"); 50 convert = "true".equals(convertParameter); 51 log = Logging.getLoggerInstance(ImageServlet.class); 52 if (convert) { 53 log.service("Image servlet will accept image conversion templates"); 54 } 55 } 56 57 protected final Cloud getClassCloud() { 59 return super.getClassCloud(); 60 } 61 62 public String getServletInfo() { 63 return "Serves (cached) MMBase images"; 64 } 65 66 protected Map getAssociations() { 67 Map a = super.getAssociations(); 68 a.put("images", new Integer (50)); a.put("attachments", new Integer (5)); a.put("downloads", new Integer (-10)); return a; 72 } 73 74 protected String getMimeType(Node node) { 75 return node.getFunctionValue("mimetype", null).toString(); 76 } 77 78 79 83 84 protected boolean setContent(QueryParts query, Node node, String mimeType) throws java.io.IOException { 85 Node originalNode; 86 if (node.getNodeManager().getName().equals("icaches")) { 87 Cloud c = node.getCloud(); 88 int originalNodeNumber = node.getIntValue("id"); 89 90 if (! c.mayRead(originalNodeNumber) && c.getUser().getRank().equals(Rank.ANONYMOUS)) { 91 c = getCloud(query); 93 } 94 95 if (c == null || ! c.mayRead(originalNodeNumber)) { 96 query.getResponse().sendError(HttpServletResponse.SC_FORBIDDEN, "Permission denied on original image node '" + originalNodeNumber + "'"); 97 return false; 98 } 99 originalNode = c.getNode(originalNodeNumber); 100 } else { originalNode = node; 102 } 103 104 query.getResponse().setHeader("Content-Disposition", "inline; filename=\"" + getFileName(node, originalNode, "mmbase-image")+ "\""); 105 return true; 106 } 107 108 113 protected Node getServedNode(QueryParts query, Node node) throws java.io.IOException { 114 if (node == null) { 115 return null; 116 } 117 Node n = query.getServedNode(); 118 if (n != null) { 119 return n; 120 } 121 String nodeNumber = query.getNodeNumber(); 122 String nodeIdentifier = query.getNodeIdentifier(); 123 if (node.getNodeManager().getName().equals("icaches")) { 124 if (! nodeNumber.equals(nodeIdentifier)) { 125 query.getResponse().sendError(HttpServletResponse.SC_FORBIDDEN, "Cannot convert icache node"); 126 return null; 127 } else { 128 n = getNode(query); 129 n.getFunctionValue("wait", null); 130 } 131 } else { 132 if (! nodeNumber.equals(nodeIdentifier)) { 134 if (convert) { 135 Parameters args = new Parameters(Images.CACHE_PARAMETERS); 136 String template = nodeIdentifier.substring(nodeNumber.length() + 1); 137 try { 138 template = java.net.URLDecoder.decode(template, "UTF-8"); 139 } catch (IllegalArgumentException iae) { 140 } 142 args.set("template", template); 143 int icacheNodeNumber = node.getFunctionValue("cache", args).toInt(); 144 Cloud cloud = node.getCloud(); 145 cloud = findCloud(cloud, "" + icacheNodeNumber, query); 146 if (cloud == null) { 147 return null; 148 } 149 Node icache = cloud.getNode(icacheNodeNumber); 150 icache.getFunctionValue("wait", null); 151 n = icache; 152 } else { 153 query.getResponse().sendError(HttpServletResponse.SC_FORBIDDEN, "This server does not allow you to convert an image in this way"); 154 return null; 155 } 156 } else { 157 n = getNode(query); 158 } 159 } 160 query.setServedNode(n); 161 return n; 162 } 163 164 168 protected Node desperatelyGetNode(Cloud cloud, String nodeIdentifier) { 169 log.debug("Desperately searching node '" + nodeIdentifier + "'"); 170 NodeManager nm = cloud.getNodeManager("images"); 171 NodeQuery nq = nm.createQuery(); 172 Constraint c = nq.createConstraint(nq.createStepField("title"), nodeIdentifier); 173 nq.setConstraint(c); 174 nq.addSortOrder(nq.createStepField("number"), SortOrder.ORDER_DESCENDING); 175 NodeList result = nm.getList(nq); 176 if (result.size() == 0) return null; 177 return result.getNode(0); 178 } 179 180 181 } 182 | Popular Tags |