private void parseImage(Image image, File file) throws Exception {
    try {
      // Detects the file type
      BodyContentHandler handler = new BodyContentHandler();
      Metadata metadata = new Metadata();
      FileInputStream inputStream = new FileInputStream(file);
      ParseContext parseContext = new ParseContext();

      // Parser
      AutoDetectParser parser = new AutoDetectParser();
      parser.parse(inputStream, handler, metadata, parseContext);

      // Image field setting
      String date;
      if (metadata.getDate(metadata.ORIGINAL_DATE) != null) {
        date = metadata.getDate(metadata.ORIGINAL_DATE).toString();
      } else if (metadata.getDate(TikaCoreProperties.CREATED) != null) {
        date = metadata.getDate(TikaCoreProperties.CREATED).toString();
      } else if (metadata.getDate(DublinCore.CREATED) != null) {
        date = metadata.getDate(DublinCore.CREATED).toString();
      } else if (metadata.getDate(TikaCoreProperties.METADATA_DATE) != null) {
        date = metadata.getDate(TikaCoreProperties.METADATA_DATE).toString();
      } else if (metadata.getDate(DublinCore.MODIFIED) != null) {
        date = metadata.getDate(DublinCore.MODIFIED).toString();
      } else {
        // Current date+time
        metadata.set(Metadata.DATE, new Date());
        date = metadata.get(Metadata.DATE);
      }
      image.setLongitude(metadata.get(Geographic.LONGITUDE));
      image.setLatitude(metadata.get(Geographic.LATITUDE));
      ImageOperations.setMetadataParsingFinished();

      if (date != null) {
        image.setDate(date.toString());
      } else {
        image.setDate(null);
      }
      image.setLongitude(image.getLongitude());
      image.setLatitude(image.getLatitude());
      aPII.reverseGeocode(image);
      ImageOperations.setReverseGeocodeFinished();
      ImageOperations iO = new ImageOperations();
      iO.doOCR(image, file);
      ImageOperations.setOcrFinished();

    } catch (IOException e) {
      System.out.println(e.getMessage());
    } catch (TikaException te) {
      System.out.println(te.getMessage());
    } catch (SAXException se) {
      System.out.println(se.getMessage());
    } catch (InterruptedException ie) {
      System.out.println(ie.getMessage());
    } catch (IM4JavaException je) {
      je.printStackTrace();
    }
  }
  /**
   * Takes in an InputStream representing the submitted image file from the user's computer, uploads
   * the image to imgur for auto-tagging, processes and stores the image, and returns a redirect to
   * the image's results page.
   *
   * @param inputStream InputStream representing the image to be processed
   * @return a redirect to the image's results page
   * @throws IOException
   * @throws SQLException
   */
  @Override
  public String processInputStream(InputStream inputStream) throws IOException, SQLException {
    Image image = new Image();
    File tempFile = ImageOperations.streamToFile(inputStream);
    fillFields(image, tempFile);
    String imgurUploadUrl;
    Image tempImg;
    try {
      if ((tempImg = dBOps.imageBlobAlreadyExists(image)) == null) {
        dBOps.addEntity(image);
        imgurUploadUrl = aPII.uploadImage(tempFile);
        aPII.tagImageUrl(image, imgurUploadUrl);
        aPII.deleteImageFromImgur();
      } else {
        image.setID(tempImg.getID());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    String id = cryptoHandler.encryptId(image.getID());
    return id;
  }
  /**
   * Takes in an InputStream representing the submitted image file and a String representing the
   * submitted URL, processes and stores the image, and returns a redirect to the image's results
   * page.
   *
   * @param inputStream InputStream representing the image to be processed
   * @param url String representing the URL of the image
   * @return a redirect to the image's results page
   * @throws IOException
   * @throws SQLException
   */
  @Override
  public String processInputStream(InputStream inputStream, String url)
      throws IOException, SQLException {
    Image image = new Image();
    File tempFile = ImageOperations.streamToFile(inputStream);
    new ImageOperations()
        .fillFields(image, tempFile); // Sends image file to the DatabaseOperations object
    Image tempImg;

    try {
      if ((tempImg = dBOps.imageBlobAlreadyExists(image)) == null) {
        dBOps.addEntity(image);
        aPII.tagImageUrl(image, url);
      } else {
        image.setID(tempImg.getID());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    String id = cryptoHandler.encryptId(image.getID());
    return id;
  } /* NOTE: Change domain if switching to another server. */