Finished work on the local binarizer and renamed it to HybridBinarizer. It uses the...
[zxing.git] / zxingorg / src / com / google / zxing / web / DecodeServlet.java
index 7041175..4ed5f5a 100644 (file)
 
 package com.google.zxing.web;
 
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.BinaryBitmap;
 import com.google.zxing.DecodeHintType;
+import com.google.zxing.LuminanceSource;
 import com.google.zxing.MultiFormatReader;
 import com.google.zxing.Reader;
 import com.google.zxing.ReaderException;
 import com.google.zxing.Result;
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.client.j2se.BufferedImageMonochromeBitmapSource;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
 import com.google.zxing.client.result.ParsedResult;
 import com.google.zxing.client.result.ResultParser;
+import com.google.zxing.common.HybridBinarizer;
+
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.http.Header;
-import org.apache.http.HttpException;
 import org.apache.http.HttpMessage;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpVersion;
+import org.apache.http.HttpEntity;
 import org.apache.http.client.HttpClient;
-import org.apache.http.client.params.HttpClientParams;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.conn.scheme.PlainSocketFactory;
 import org.apache.http.conn.scheme.Scheme;
 import org.apache.http.conn.scheme.SchemeRegistry;
 import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.conn.ClientConnectionManager;
 import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
+import org.apache.http.impl.conn.SingleClientConnManager;
 import org.apache.http.params.BasicHttpParams;
 import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;
 
-import javax.imageio.ImageIO;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.InputStream;
@@ -68,10 +67,18 @@ import java.util.List;
 import java.util.Vector;
 import java.util.logging.Logger;
 
+import javax.imageio.ImageIO;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * {@link HttpServlet} which decodes images containing barcodes. Given a URL, it will
  * retrieve the image and decode it. It can also process image files uploaded via POST.
- * 
+ *
  * @author Sean Owen
  */
 public final class DecodeServlet extends HttpServlet {
@@ -85,7 +92,7 @@ public final class DecodeServlet extends HttpServlet {
   static {
     HINTS = new Hashtable<DecodeHintType, Object>(5);
     HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
-    Vector possibleFormats = new Vector();
+    Vector<BarcodeFormat> possibleFormats = new Vector<BarcodeFormat>();
     possibleFormats.add(BarcodeFormat.UPC_A);
     possibleFormats.add(BarcodeFormat.UPC_E);
     possibleFormats.add(BarcodeFormat.EAN_8);
@@ -95,10 +102,12 @@ public final class DecodeServlet extends HttpServlet {
     possibleFormats.add(BarcodeFormat.ITF);
     possibleFormats.add(BarcodeFormat.QR_CODE);
     possibleFormats.add(BarcodeFormat.DATAMATRIX);
+    possibleFormats.add(BarcodeFormat.PDF417);
     HINTS.put(DecodeHintType.POSSIBLE_FORMATS, possibleFormats);
   }
 
-  private HttpClient client;
+  private HttpParams params;
+  private SchemeRegistry registry;
   private DiskFileItemFactory diskFileItemFactory;
 
   @Override
@@ -107,23 +116,21 @@ public final class DecodeServlet extends HttpServlet {
     Logger logger = Logger.getLogger("com.google.zxing");
     logger.addHandler(new ServletContextLogHandler(servletConfig.getServletContext()));
 
-    HttpParams params = new BasicHttpParams();
+    params = new BasicHttpParams();
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
 
-    SchemeRegistry registry = new SchemeRegistry();
+    registry = new SchemeRegistry();
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
     registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
 
-    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, registry), params);
-
     diskFileItemFactory = new DiskFileItemFactory();
 
     log.info("DecodeServlet configured");
   }
 
   @Override
-  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
+  protected void doGet(HttpServletRequest request, HttpServletResponse response)
+      throws ServletException, IOException {
     String imageURIString = request.getParameter("u");
     if (imageURIString == null || imageURIString.length() == 0) {
       response.sendRedirect("badurl.jspx");
@@ -142,11 +149,33 @@ public final class DecodeServlet extends HttpServlet {
       return;
     }
 
-    HttpGet getRequest = new HttpGet(imageURI);
+    ClientConnectionManager connectionManager = new SingleClientConnManager(params, registry);
+    HttpClient client = new DefaultHttpClient(connectionManager, params);
+
+    HttpUriRequest getRequest = new HttpGet(imageURI);
     getRequest.addHeader("Connection", "close"); // Avoids CLOSE_WAIT socket issue?
 
     try {
-      HttpResponse getResponse = client.execute(getRequest);
+
+      HttpResponse getResponse;
+      try {
+        getResponse = client.execute(getRequest);
+      } catch (IllegalArgumentException iae) {
+        // Thrown if hostname is bad or null
+        getRequest.abort();
+        response.sendRedirect("badurl.jspx");
+        return;
+      } catch (SocketException se) {
+        // Thrown if hostname is bad or null
+        getRequest.abort();
+        response.sendRedirect("badurl.jspx");
+        return;
+      } catch (UnknownHostException uhe) {
+        getRequest.abort();
+        response.sendRedirect("badurl.jspx");
+        return;
+      }
+
       if (getResponse.getStatusLine().getStatusCode() != HttpServletResponse.SC_OK) {
         response.sendRedirect("badurl.jspx");
         return;
@@ -155,24 +184,19 @@ public final class DecodeServlet extends HttpServlet {
         response.sendRedirect("badimage.jspx");
         return;
       }
+
       log.info("Decoding " + imageURI);
-      InputStream is = getResponse.getEntity().getContent();
+      HttpEntity entity = getResponse.getEntity();
+      InputStream is = entity.getContent();
       try {
         processStream(is, request, response);
       } finally {
+        entity.consumeContent();
         is.close();
       }
-    } catch (IllegalArgumentException iae) {
-      // Thrown if hostname is bad or null
-      getRequest.abort();
-      response.sendRedirect("badurl.jspx");
-    } catch (SocketException se) {
-      // Thrown if hostname is bad or null
-      getRequest.abort();
-      response.sendRedirect("badurl.jspx");
-    } catch (UnknownHostException uhe) {
-      getRequest.abort();
-      response.sendRedirect("badurl.jspx");
+
+    } finally {
+      connectionManager.shutdown();
     }
 
   }
@@ -213,8 +237,8 @@ public final class DecodeServlet extends HttpServlet {
 
   }
 
-  private static void processStream(InputStream is, HttpServletRequest request, HttpServletResponse response)
-      throws ServletException, IOException {
+  private static void processStream(InputStream is, ServletRequest request,
+      HttpServletResponse response) throws ServletException, IOException {
     BufferedImage image = ImageIO.read(is);
     if (image == null) {
       response.sendRedirect("badimage.jspx");
@@ -224,7 +248,9 @@ public final class DecodeServlet extends HttpServlet {
     Reader reader = new MultiFormatReader();
     Result result;
     try {
-      result = reader.decode(new BufferedImageMonochromeBitmapSource(image), HINTS);
+      LuminanceSource source = new BufferedImageLuminanceSource(image);
+      BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+      result = reader.decode(bitmap, HINTS);
     } catch (ReaderException re) {
       log.info("DECODE FAILED: " + re.toString());
       response.sendRedirect("notfound.jspx");