UserDataHandler.java 7.65 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.localization.LocaleMap
 *  com.scene7.is.catalog.util.localization.LocalizedText
 *  com.scene7.is.provider.ProcessingStatus
 *  com.scene7.is.provider.RequestTypeEnum
 *  com.scene7.is.provider.Response
 *  com.scene7.is.provider.ResponseData
 *  com.scene7.is.provider.TextResponseGenerator
 *  com.scene7.is.provider.TextResponseTypeEnum
 *  com.scene7.is.provider.UserData
 *  com.scene7.is.sleng.CacheEnum
 *  com.scene7.is.sleng.ImageServer
 *  com.scene7.is.util.MimeTypeEnum
 *  com.scene7.is.util.TextEncodingTypeEnum
 *  com.scene7.is.util.XMLUtil
 *  com.scene7.is.util.collections.CollectionUtil
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider;

import com.scene7.is.catalog.util.localization.LocaleMap;
import com.scene7.is.catalog.util.localization.LocalizedText;
import com.scene7.is.provider.ProcessingStatus;
import com.scene7.is.provider.RequestTypeEnum;
import com.scene7.is.provider.Response;
import com.scene7.is.provider.ResponseData;
import com.scene7.is.provider.TextResponseGenerator;
import com.scene7.is.provider.TextResponseTypeEnum;
import com.scene7.is.provider.UserData;
import com.scene7.is.ps.provider.IZoomException;
import com.scene7.is.ps.provider.ModifierSet;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.RequestHandler;
import com.scene7.is.ps.provider.Util;
import com.scene7.is.ps.provider.defs.ModifierEnum;
import com.scene7.is.sleng.CacheEnum;
import com.scene7.is.sleng.ImageServer;
import com.scene7.is.util.MimeTypeEnum;
import com.scene7.is.util.TextEncodingTypeEnum;
import com.scene7.is.util.XMLUtil;
import com.scene7.is.util.collections.CollectionUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class UserDataHandler
implements RequestHandler {
    private static final String USER_DATA_NAME = "userdata";
    private final ImageServer imageServer;

    UserDataHandler(ImageServer imageServer) {
        assert (imageServer != null);
        this.imageServer = imageServer;
    }

    @NotNull
    @Override
    public Response getResponse(@NotNull Request parsedRequest, @NotNull ProcessingStatus status) throws IZoomException {
        ModifierSet attr = parsedRequest.getGlobalAttributes();
        UserData userData = parsedRequest.getUserData();
        TextEncodingTypeEnum encoding = parsedRequest.getResponseEncoding();
        TextResponseTypeEnum responseType = parsedRequest.getResponseType();
        LocaleMap localeMap = parsedRequest.getCatalogValue(ModifierEnum.I_LOCALE_STR_MAP);
        String locale = parsedRequest.getGlobalAttributes().getOrDie(ModifierEnum.LOCALE);
        String jsonId = attr.get(ModifierEnum.ID, "");
        String jsonHandler = attr.get(ModifierEnum.HANDLER, "");
        Response response = new Response().setExpiration(Util.computeExpiration(parsedRequest, this.imageServer)).setClientCacheUse(CacheEnum.ON).setRequestType(parsedRequest.getType());
        ResponseData data = UserDataHandler.formatUserData(userData, encoding, responseType, localeMap, locale, jsonId, jsonHandler);
        response.setData(data);
        return response;
    }

    public static ResponseData formatUserData(@NotNull UserData userData, @NotNull TextEncodingTypeEnum encoding, @NotNull TextResponseTypeEnum responseType, @NotNull LocaleMap localeMap, @NotNull String locale, @NotNull String jsonId, @NotNull String jsonHandler) throws IZoomException {
        switch (responseType) {
            case XML: {
                return ResponseData.createResponseMessage((String)UserDataHandler.toXml(localeMap, locale, userData, encoding), (TextEncodingTypeEnum)encoding, (MimeTypeEnum)responseType.getMimeType());
            }
            case JSON: 
            case JAVASCRIPT: {
                return ResponseData.createResponseData((byte[])UserDataHandler.toText(localeMap, locale, userData, responseType, jsonId, jsonHandler), (TextEncodingTypeEnum)encoding, (MimeTypeEnum)responseType.getMimeType());
            }
        }
        if (userData.props.isEmpty()) {
            return ResponseData.createResponseMessage((String)userData.unformatted.get(localeMap, locale), (TextEncodingTypeEnum)encoding, (MimeTypeEnum)responseType.getMimeType());
        }
        return ResponseData.createResponseData((byte[])UserDataHandler.toText(localeMap, locale, userData, responseType, jsonId, jsonHandler), (TextEncodingTypeEnum)encoding, (MimeTypeEnum)responseType.getMimeType());
    }

    public static Element createXmlElement(@NotNull Document doc, @NotNull LocaleMap localeMap, @NotNull String locale, @NotNull UserData userData, @NotNull String labelKey) throws IZoomException {
        Element root = XMLUtil.createElement((Document)doc, (String)"userdata");
        if (!userData.props.isEmpty()) {
            Map map = LocalizedText.localize((LocaleMap)localeMap, (String)locale, (Map)userData.props);
            for (Map.Entry entry : map.entrySet()) {
                try {
                    if (((String)entry.getKey()).equals(labelKey)) continue;
                    if (((String)entry.getKey()).contains(":")) {
                        throw new IZoomException(IZoomException.XML_ATTRIBUTE_ERROR, "Colon character is not allowed in userdata property key names", null);
                    }
                    root.setAttribute((String)entry.getKey(), (String)entry.getValue());
                    continue;
                }
                catch (DOMException e) {
                    throw new IZoomException(IZoomException.XML_ATTRIBUTE_ERROR, "Invalid user data property: " + (String)entry.getKey() + ", " + (String)entry.getValue(), e);
                }
            }
        } else {
            XMLUtil.appendCDATASection((Document)doc, (Element)root, (String)userData.unformatted.get(localeMap, locale));
        }
        return root;
    }

    public static Map<String, String> getJsonAttributes(@NotNull LocaleMap localeMap, @NotNull String locale, @NotNull UserData userData, @NotNull String labelKey) {
        if (!userData.props.isEmpty()) {
            Map localizedMap = LocalizedText.localize((LocaleMap)localeMap, (String)locale, (Map)userData.props);
            localizedMap.remove(labelKey);
            return localizedMap;
        }
        HashMap map = CollectionUtil.hashMap();
        map.put("$t", userData.unformatted.get(localeMap, locale));
        return map;
    }

    @NotNull
    private static String toXml(@NotNull LocaleMap localeMap, @NotNull String locale, @NotNull UserData userData, @NotNull TextEncodingTypeEnum encoding) throws IZoomException {
        Document doc = XMLUtil.createDocument();
        Element root = UserDataHandler.createXmlElement(doc, localeMap, locale, userData, "");
        doc.appendChild(root);
        return XMLUtil.toXMLString((Document)doc, (TextEncodingTypeEnum)encoding, (boolean)false);
    }

    private static byte[] toText(@NotNull LocaleMap localeMap, @NotNull String locale, @NotNull UserData userData, @NotNull TextResponseTypeEnum responseType, @NotNull String jsonId, @NotNull String jsonHandler) {
        Map map2;
        Map map2;
        if (userData.props.isEmpty()) {
            map2 = CollectionUtil.hashMap();
            map2.put("userdata", userData.unformatted.get(localeMap, locale));
        } else {
            map2 = LocalizedText.localize((LocaleMap)localeMap, (String)locale, (Map)userData.props);
        }
        return TextResponseGenerator.generateNoTextComments((Map)map2, (TextResponseTypeEnum)responseType, (String)jsonId, (String)jsonHandler);
    }

}