CreateSpinSetServlet.java 7.42 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.servlets.HtmlStatusResponseHelper
 *  com.day.cq.dam.api.Asset
 *  com.day.cq.dam.api.s7dam.set.SpinSet
 *  com.day.cq.dam.commons.util.DamUtil
 *  com.day.cq.dam.commons.util.S7SetHelper
 *  javax.jcr.RepositoryException
 *  javax.jcr.Session
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestParameter
 *  org.apache.sling.api.resource.ModifiableValueMap
 *  org.apache.sling.api.resource.PersistenceException
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.dam.pim.impl.production;

import com.day.cq.commons.servlets.HtmlStatusResponseHelper;
import com.day.cq.dam.api.Asset;
import com.day.cq.dam.api.s7dam.set.SpinSet;
import com.day.cq.dam.commons.util.DamUtil;
import com.day.cq.dam.commons.util.S7SetHelper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
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.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(metatype=0)
@Service
@Properties(value={@Property(name="sling.servlet.resourceTypes", value={"sling/servlet/default"}), @Property(name="sling.servlet.methods", value={"POST"}), @Property(name="sling.servlet.selectors", value={"createspinset"})})
public class CreateSpinSetServlet
extends SlingAllMethodsServlet {
    private static final Logger log = LoggerFactory.getLogger(CreateSpinSetServlet.class);

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        Resource resource = request.getResource();
        ResourceResolver resourceResolver = request.getResourceResolver();
        String spinSetsFolderName = "spinsets";
        spinSetsFolderName = request.getRequestParameter("spinSetsFolderName").getString();
        try {
            this.createProductsSpinSet(resource);
            Session session = (Session)resourceResolver.adaptTo(Session.class);
            if (session.hasPendingChanges()) {
                session.save();
            }
            HtmlStatusResponseHelper.createStatusResponse((boolean)true, (String)("Created Spin sets under " + resource.getPath())).send((HttpServletResponse)response, true);
        }
        catch (RepositoryException e) {
            log.warn("\"Error while creating spin sets under " + resource.getPath() + " : " + e.getMessage());
            HtmlStatusResponseHelper.createStatusResponse((boolean)false, (String)("Error while creating spin sets under " + resource.getPath())).send((HttpServletResponse)response, true);
        }
    }

    private void createProductsSpinSet(Resource res) throws RepositoryException, PersistenceException {
        if (res == null) {
            return;
        }
        ArrayList<Asset> assetList = new ArrayList<Asset>();
        for (Resource child : res.getChildren()) {
            Asset asset = (Asset)child.adaptTo(Asset.class);
            if (asset != null && DamUtil.isImage((Asset)asset)) {
                assetList.add(asset);
                continue;
            }
            this.createProductsSpinSet(child);
        }
        if (!assetList.isEmpty()) {
            Collections.sort(assetList, new Comparator<Asset>(){

                @Override
                public int compare(Asset asset1, Asset asset2) {
                    try {
                        String name1 = asset1.getName();
                        String name2 = asset2.getName();
                        String[] parts1 = name1.split("\\.")[0].split("_");
                        String[] parts2 = name2.split("\\.")[0].split("_");
                        int lcm = parts1.length > parts2.length ? parts2.length : parts1.length;
                        for (int i = 0; i < lcm; ++i) {
                            String part1 = parts1[i];
                            String part2 = parts2[i];
                            int cmp = 0;
                            try {
                                Integer i1 = Integer.parseInt(part1);
                                Integer i2 = Integer.parseInt(part2);
                                cmp = i1.compareTo(i2);
                            }
                            catch (Exception e) {
                                cmp = part1.compareToIgnoreCase(part2);
                            }
                            if (cmp == 0) continue;
                            return cmp;
                        }
                        return new Integer(parts1.length).compareTo(parts2.length);
                    }
                    catch (Exception e) {
                        return asset1.getName().compareToIgnoreCase(asset2.getName());
                    }
                }
            });
            int n = (int)Math.ceil(Math.sqrt(assetList.size()));
            String spinSetName = res.getName() + "_spinset";
            if (res.getChild(spinSetName) == null) {
                SpinSet spinSet = S7SetHelper.createS7SpinSet((Resource)res, (String)spinSetName, new HashMap());
                for (int i = 0; i < n; ++i) {
                    if (assetList.size() - i * n < n) continue;
                    spinSet.addRow(assetList.subList(i * n, Math.min(assetList.size(), (i + 1) * n)).toArray((T[])new Asset[n]));
                }
                ValueMap vm = (ValueMap)res.adaptTo(ValueMap.class);
                Resource spinSetMetadata = ((Resource)((Asset)spinSet.adaptTo(Asset.class)).adaptTo(Resource.class)).getChild("jcr:content").getChild("metadata");
                if (vm.containsKey((Object)"cq:productReference")) {
                    ((ModifiableValueMap)spinSetMetadata.adaptTo(ModifiableValueMap.class)).put((Object)"cq:productReference", vm.get("cq:productReference", String.class));
                }
                if (vm.containsKey((Object)"dam:productID")) {
                    ((ModifiableValueMap)spinSetMetadata.adaptTo(ModifiableValueMap.class)).put((Object)"dam:productID", vm.get("dam:productID", String.class));
                }
            }
        }
    }

}