EmulatorCarouselImageServlet.java 6.11 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.ImageHelper
 *  com.day.image.Layer
 *  javax.servlet.Servlet
 *  javax.servlet.ServletException
 *  javax.servlet.ServletOutputStream
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.wcm.emulator.impl;

import com.day.cq.commons.ImageHelper;
import com.day.cq.wcm.emulator.Emulator;
import com.day.cq.wcm.emulator.EmulatorService;
import com.day.image.Layer;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service(value={Servlet.class})
@Properties(value={@Property(name="sling.servlet.resourceTypes", value={"sling/servlet/default"}), @Property(name="sling.servlet.selectors", value={"emulatorstrip"}), @Property(name="sling.servlet.extensions", value={"png"}), @Property(name="sling.servlet.methods", value={"GET"})})
public class EmulatorCarouselImageServlet
extends SlingAllMethodsServlet {
    private static final Logger log = LoggerFactory.getLogger(EmulatorCarouselImageServlet.class);
    private static final Color COLOR_TRANSLUCENT = new Color(3);
    private static final String PATH_MASK = "/libs/wcm/emulator/components/base/resources/bg_carousel_mask.png";
    @Reference
    private EmulatorService emulatorService;
    private static final int THUMB_WIDTH = 60;
    private static final int THUMB_HEIGHT = 80;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        ResourceResolver resolver = request.getResourceResolver();
        List<Emulator> emulators = this.emulatorService.getEmulators(request.getResource());
        ArrayList<InputStream> thumbnails = new ArrayList<InputStream>();
        for (Emulator emulator : emulators) {
            Resource resource = resolver.getResource(emulator.getPath());
            if (null != resource) {
                Resource thumbnail = resolver.getResource(resource, "./thumbnail.png");
                if (thumbnail == null) {
                    thumbnails.add(this.getDefaultThumbnail());
                    continue;
                }
                InputStream inputStream = (InputStream)thumbnail.adaptTo(InputStream.class);
                if (null != inputStream) {
                    thumbnails.add(inputStream);
                    continue;
                }
                log.warn("failed getting thumbnail for emulator [{}].", (Object)emulator.getPath());
                thumbnails.add(this.getDefaultThumbnail());
                continue;
            }
            log.warn("emulator [{}] doesn't have a thumbnail.", (Object)emulator.getPath());
            thumbnails.add(this.getDefaultThumbnail());
        }
        Layer layer = new Layer(60, 80, null);
        int count = 0;
        for (InputStream stream : thumbnails) {
            Layer l = new Layer(stream);
            l.resize(60, 80);
            l.setX(count);
            layer.merge(l);
            count += 60;
        }
        Layer mirrorMask = ImageHelper.createLayer((Resource)resolver.getResource("/libs/wcm/emulator/components/base/resources/bg_carousel_mask.png"));
        if (null != mirrorMask) {
            mirrorMask.resize(layer.getWidth(), layer.getHeight());
            Layer mirror = this.flipLayer(layer);
            mirror.merge(mirrorMask);
            mirror.crop((Rectangle2D)new Rectangle(0, 0, layer.getWidth(), 30));
            mirror.setY(80);
            layer.merge(mirror);
        }
        response.setContentType("image/png");
        layer.write("image/png", 1.0, (OutputStream)response.getOutputStream());
    }

    private InputStream getDefaultThumbnail() throws IOException {
        Layer layer = new Layer(60, 80, (Paint)COLOR_TRANSLUCENT);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        layer.write("image/png", 1.0, (OutputStream)out);
        return new ByteArrayInputStream(out.toByteArray());
    }

    private Layer flipLayer(Layer layer) {
        AffineTransform tx = AffineTransform.getScaleInstance(1.0, -1.0);
        tx.translate(0.0, - layer.getHeight());
        BufferedImage img = new BufferedImage(layer.getWidth(), layer.getHeight(), 2);
        Graphics2D g2 = img.createGraphics();
        g2.drawRenderedImage(layer.getImage(), tx);
        return new Layer(img);
    }

    protected void bindEmulatorService(EmulatorService emulatorService) {
        this.emulatorService = emulatorService;
    }

    protected void unbindEmulatorService(EmulatorService emulatorService) {
        if (this.emulatorService == emulatorService) {
            this.emulatorService = null;
        }
    }
}