Package ch.entwine.weblounge.common.content.image

Examples of ch.entwine.weblounge.common.content.image.ImagePreviewGenerator


    }

    if (resource == null)
      throw new IllegalArgumentException("Resource cannot be null");

    ImagePreviewGenerator imagePreviewGenerator = null;
    synchronized (previewGenerators) {
      if (previewGenerators.size() == 0) {
        logger.debug("Unable to generate page previews since no image renderer is available");
        return;
      }
      imagePreviewGenerator = previewGenerators.get(0);
    }

    ResourceURI uri = resource.getURI();
    Site site = uri.getSite();
    String html = null;
    try {
      URL pageURL = new URL(UrlUtils.concat(site.getHostname(environment).toExternalForm(), PAGE_HANDLER_PREFIX, uri.getIdentifier()));
      html = render(pageURL, site, environment, language, resource.getVersion());
      if (StringUtils.isBlank(html)) {
        logger.warn("Error rendering preview of page " + uri.getPath());
        return;
      }
      html = HTMLUtils.escapeHtml(HTMLUtils.unescape(html));
    } catch (ServletException e) {
      logger.warn("Error rendering page " + uri.getPath(), e);
      throw new IOException(e);
    }

    // Try to convert html to xhtml
    HtmlCleaner cleaner = new HtmlCleaner();
    CleanerProperties xhtmlProperties = cleaner.getProperties();
    TagNode xhtmlNode = cleaner.clean(html);
    if (xhtmlNode == null) {
      logger.warn("Error creating well-formed document from page {}", resource);
      return;
    }

    File xhtmlFile = null;
    is = new ByteArrayInputStream(html.getBytes("UTF-8"));

    // Write the resource content to disk. This step is needed, as the preview
    // generator can only handle files.
    try {
      xhtmlFile = File.createTempFile("xhtml", ".xml");
      Serializer xhtmlSerializer = new SimpleXmlSerializer(xhtmlProperties);
      xhtmlSerializer.writeToFile(xhtmlNode, xhtmlFile.getAbsolutePath(), "UTF-8");
    } catch (IOException e) {
      logger.error("Error creating temporary copy of file content at " + xhtmlFile, e);
      FileUtils.deleteQuietly(xhtmlFile);
      throw e;
    } finally {
      IOUtils.closeQuietly(is);
    }

    File imageFile = File.createTempFile("xhtml-preview", "." + PREVIEW_FORMAT);
    FileOutputStream imageFos = null;

    // Render the page and write back to client
    try {
      int screenshotWidth = DEFAULT_SCREENSHOT_WIDTH;
      int screenshotHeight = DEFAULT_SCREENSHOT_HEIGHT;
      if (style != null && style.getWidth() > 0 && style.getHeight() > 0) {
        screenshotHeight = (int) ((float) screenshotWidth / (float) style.getWidth() * style.getHeight());
      }

      // Create the renderer. Due to a synchronization bug in the software,
      // this needs to be synchronized
      Java2DRenderer renderer = null;
      try {
        synchronized (this) {
          renderer = new Java2DRenderer(xhtmlFile, screenshotWidth, screenshotHeight);
        }
      } catch (Throwable t) {
        if (isRenderingEnvironmentSane) {
          logger.warn("Error creating Java 2D renderer for previews: {}" + t.getMessage());
          logger.warn("Page preview rendering will be switched off");
          isRenderingEnvironmentSane = false;
        }
        logger.debug("Error creating Java 2D renderer for preview of page {}: {}" + uri.getPath(), t.getMessage());
        return;
      }

      // Configure the renderer
      renderer.getSharedContext().setBaseURL(site.getHostname().toExternalForm());
      renderer.getSharedContext().setInteractive(false);

      // Make sure the renderer is using a user agent that will correctly
      // resolve urls
      WebloungeUserAgent agent = userAgents.get(site.getIdentifier());
      if (agent == null) {
        agent = new WebloungeUserAgent(site.getHostname().getURL());
        userAgents.put(site.getIdentifier(), agent);
      }
      renderer.getSharedContext().setUserAgentCallback(agent);

      // Render the page to an image
      BufferedImage img = renderer.getImage();
      FSImageWriter imageWriter = new FSImageWriter(PREVIEW_FORMAT);
      imageFos = new FileOutputStream(imageFile);
      imageWriter.write(img, imageFos);

    } catch (IOException e) {
      logger.error("Error creating temporary copy of file content at " + xhtmlFile, e);
      throw e;
    } catch (XRRuntimeException e) {
      logger.warn("Error rendering page content at " + uri + ": " + e.getMessage());
      throw e;
    } catch (HeadlessException e) {
      logger.warn("Headless error while trying to render page preview: " + e.getMessage());
      logger.warn("Page preview rendering will be switched off");
      isRenderingEnvironmentSane = false;
      throw e;
    } catch (Throwable t) {
      logger.warn("Error rendering page content at " + uri + ": " + t.getMessage(), t);
      throw new IOException(t);
    } finally {
      IOUtils.closeQuietly(imageFos);
      FileUtils.deleteQuietly(xhtmlFile);
    }

    FileInputStream imageIs = null;

    // Scale the image to the correct size
    try {
      imageIs = new FileInputStream(imageFile);
      imagePreviewGenerator.createPreview(resource, environment, language, style, PREVIEW_FORMAT, imageIs, os);
    } catch (IOException e) {
      logger.error("Error creating temporary copy of file content at " + xhtmlFile, e);
      throw e;
    } catch (Throwable t) {
      logger.warn("Error scaling page preview at " + uri + ": " + t.getMessage(), t);
View Full Code Here


     *
     * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
     */
    @Override
    public Object addingService(ServiceReference reference) {
      ImagePreviewGenerator previewGenerator = (ImagePreviewGenerator) super.addingService(reference);
      addPreviewGenerator(previewGenerator);
      return previewGenerator;
    }
View Full Code Here

    // We don't need the input stream
    IOUtils.closeQuietly(is);

    // Find a suitable image preview generator for scaling
    ImagePreviewGenerator imagePreviewGenerator = null;
    synchronized (previewGenerators) {
      for (ImagePreviewGenerator generator : previewGenerators) {
        if (generator.supports(format)) {
          imagePreviewGenerator = generator;
          break;
        }
      }
      if (imagePreviewGenerator == null) {
        logger.debug("Unable to generate page previews since no image renderer is available");
        return;
      }
    }

    // Find the relevant metadata to start the request
    ResourceURI uri = resource.getURI();
    long version = resource.getVersion();
    Site site = uri.getSite();

    // Create the url
    URL pageURL = new URL(UrlUtils.concat(site.getHostname(environment).toExternalForm(), PAGE_HANDLER_PREFIX, uri.getIdentifier()));
    if (version == Resource.WORK) {
      pageURL = new URL(UrlUtils.concat(pageURL.toExternalForm(), "work_" + language.getIdentifier() + ".html"));
    } else {
      pageURL = new URL(UrlUtils.concat(pageURL.toExternalForm(), "index_" + language.getIdentifier() + ".html"));
    }

    // Create a temporary file
    final File rendererdFile = File.createTempFile("phantomjs-", "." + format, phantomTmpDir);
    final URL finalPageURL = pageURL;
    final AtomicBoolean success = new AtomicBoolean();

    // Call PhantomJS to render the page
    try {
      final PhantomJsProcessExecutor phantomjs = new PhantomJsProcessExecutor(scriptFile.getAbsolutePath(), pageURL.toExternalForm(), rendererdFile.getAbsolutePath()) {
        @Override
        protected void onProcessFinished(int exitCode) throws IOException {
          super.onProcessFinished(exitCode);
          switch (exitCode) {
            case 0:
              if (rendererdFile.length() > 0) {
                success.set(true);
                logger.debug("Page preview of {} created at {}", finalPageURL, rendererdFile.getAbsolutePath());
              } else {
                logger.warn("Error creating page preview of {}", finalPageURL);
                success.set(false);
                FileUtils.deleteQuietly(rendererdFile);
              }
              break;
            default:
              success.set(false);
              logger.warn("Error creating page preview of {}", finalPageURL);
              FileUtils.deleteQuietly(rendererdFile);
          }
        }
      };

      // Finally have PhantomJS create the preview
      logger.debug("Creating preview of {}", finalPageURL);
      phantomjs.execute();

    } catch (ProcessExcecutorException e) {
      logger.warn("Error creating page preview of {}: {}", pageURL, e.getMessage());
      throw new IOException(e);
    } finally {
      // If page preview rendering failed, there is no point in scaling the
      // images
      if (!success.get()) {
        logger.debug("Skipping scaling of failed preview rendering {}", pageURL);
        FileUtils.deleteQuietly(rendererdFile);
        return;
      }
    }

    FileInputStream imageIs = null;

    // Scale the image to the correct size
    try {
      imageIs = new FileInputStream(rendererdFile);
      imagePreviewGenerator.createPreview(resource, environment, language, style, PREVIEW_FORMAT, imageIs, os);
    } catch (IOException e) {
      logger.error("Error reading original page preview from " + rendererdFile, e);
      throw e;
    } catch (Throwable t) {
      logger.warn("Error scaling page preview at " + uri + ": " + t.getMessage(), t);
View Full Code Here

     *
     * @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
     */
    @Override
    public Object addingService(ServiceReference reference) {
      ImagePreviewGenerator previewGenerator = (ImagePreviewGenerator) super.addingService(reference);
      addPreviewGenerator(previewGenerator);
      return previewGenerator;
    }
View Full Code Here

        return;
      }

      // Find us an image serializer
      ImageResourceSerializer irs = (ImageResourceSerializer) s;
      ImagePreviewGenerator imagePreviewGenerator = (ImagePreviewGenerator) irs.getPreviewGenerator(format);
      if (imagePreviewGenerator == null) {
        logger.warn("Image resource serializer {} does not provide support for '{}'", irs, format);
        return;
      }

      // Now scale the original preview according to the existing styles
      for (Language l : languages) {
        if (!resource.supportsContentLanguage(l))
          continue;

        // Have we been told to stop doing work in the meantime?
        if (canceled)
          return;

        // Create the original preview image for every language
        File originalPreview = null;
        if (!resource.supportsContentLanguage(l))
          continue;
        originalPreview = createPreview(resource, null, l, previewGenerator, format);
        if (originalPreview == null || !originalPreview.exists() || originalPreview.length() == 0) {
          logger.warn("Preview generation for {} failed", resource);
          return;
        }

        long resourceLastModified = ResourceUtils.getModificationDate(resource, l).getTime();

        // Create the remaining styles
        for (ImageStyle style : styles) {

          // Have we been told to stop doing work in the meantime?
          if (canceled)
            return;

          // The original has been produced already
          if (ImageScalingMode.None.equals(style.getScalingMode()))
            continue;

          FileInputStream fis = null;
          FileOutputStream fos = null;
          try {
            File scaledFile = ImageStyleUtils.createScaledFile(resource, l, style);

            // Create the file if it doesn't exist or if it is out dated. Note
            // that the last modified date of a file has a precision of seconds
            if (!scaledFile.isFile() || FileUtils.isFileOlder(scaledFile, new Date(resourceLastModified))) {

              logger.info("Creating preview at {}", scaledFile.getAbsolutePath());

              fis = new FileInputStream(originalPreview);
              fos = new FileOutputStream(scaledFile);
              imagePreviewGenerator.createPreview(originalPreview, environment, l, style, format, fis, fos);
              scaledFile.setLastModified(Math.max(new Date().getTime(), resourceLastModified));

              // Store the style definition used while creating the preview
              File baseDir = ImageStyleUtils.getDirectory(resource.getURI().getSite(), style);
              File definitionFile = new File(baseDir, "style.xml");
View Full Code Here

TOP

Related Classes of ch.entwine.weblounge.common.content.image.ImagePreviewGenerator

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.