MediaSetNodeXmlWriter.java 13.5 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.localization.LocaleMap
 *  com.scene7.is.provider.ImageSetColorLabel
 *  com.scene7.is.provider.UserData
 *  com.scene7.is.provider.ZoomTargets
 *  com.scene7.is.sleng.HotSpot
 *  com.scene7.is.util.SizeInt
 *  com.scene7.is.util.XMLUtil
 *  com.scene7.is.util.error.ApplicationException
 *  org.jetbrains.annotations.NotNull
 *  org.jetbrains.annotations.Nullable
 */
package com.scene7.is.ps.provider.fvctx;

import com.scene7.is.catalog.util.localization.LocaleMap;
import com.scene7.is.provider.ImageSetColorLabel;
import com.scene7.is.provider.UserData;
import com.scene7.is.provider.ZoomTargets;
import com.scene7.is.ps.provider.HotSpotResponseGenerator;
import com.scene7.is.ps.provider.IZoomException;
import com.scene7.is.ps.provider.Request;
import com.scene7.is.ps.provider.UserDataHandler;
import com.scene7.is.ps.provider.fvctx.FvctxImageProps;
import com.scene7.is.ps.provider.fvctx.MediaSetItemType;
import com.scene7.is.ps.provider.fvctx.MediaSetMetaData;
import com.scene7.is.ps.provider.fvctx.MediaSetNodeWriter;
import com.scene7.is.ps.provider.fvctx.MediaSetSetType;
import com.scene7.is.ps.provider.fvctx.MediaSetVideoExtension;
import com.scene7.is.ps.provider.fvctx.MediaSetVideoProps;
import com.scene7.is.sleng.HotSpot;
import com.scene7.is.util.SizeInt;
import com.scene7.is.util.XMLUtil;
import com.scene7.is.util.error.ApplicationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class MediaSetNodeXmlWriter
extends MediaSetNodeWriter<Document> {
    @NotNull
    private final Document document = XMLUtil.createDocument();
    @NotNull
    private final Element root = this.document.createElement("set");
    @NotNull
    private Element currentElement;
    @NotNull
    private List<Element> nestedFrameSwatches = new ArrayList<Element>();

    MediaSetNodeXmlWriter(int fvctxVersion, @NotNull LocaleMap localeMap, @NotNull String locale, @NotNull String labelKey, @NotNull MediaSetMetaData publicMetaData, @NotNull MediaSetSetType setType, @NotNull String netPath, int brochureLimit) {
        super(fvctxVersion, localeMap, locale, labelKey, publicMetaData, setType, netPath, brochureLimit);
        this.document.appendChild(this.root);
        XMLUtil.appendAsAttributes((Element)this.root, this.getRootAttributes());
        this.currentElement = this.root;
    }

    @Override
    public void postProcess() throws IZoomException {
        this.appendMetaData(this.document, this.currentElement, this.publicMetaData, this.localeMap, this.locale, false);
    }

    @NotNull
    public Document getProduct() {
        MediaSetNodeXmlWriter.addNumPagesAttribute(this.root);
        return this.document;
    }

    @Override
    public void startItem(MediaSetItemType type) {
        Element item = this.document.createElement("item");
        this.currentElement.appendChild(item);
        this.currentElement = item;
        XMLUtil.appendAsAttributes((Element)this.currentElement, this.getStartItemAttributes(type));
    }

    @Override
    public void endItem(@NotNull String imageVersion) {
        XMLUtil.appendAsAttributes((Element)this.currentElement, MediaSetNodeXmlWriter.getEndItemAttributes(imageVersion));
        this.currentElement = (Element)this.currentElement.getParentNode();
    }

    @Override
    public void startFrameset() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void endFrameset(@NotNull SizeInt size, @NotNull String imageVersion, @NotNull String metaVersion, boolean anonymousFrames) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void startSet(@NotNull String recordName, @NotNull MediaSetSetType setType) {
        Element set = this.document.createElement("set");
        this.currentElement.appendChild(set);
        this.currentElement = set;
        XMLUtil.appendAsAttributes((Element)this.currentElement, MediaSetNodeXmlWriter.getStartSetAttributes(recordName, setType));
    }

    @Override
    public void endSet(@NotNull MediaSetMetaData metaData) throws IZoomException {
        this.appendMetaData(this.document, this.currentElement, metaData, metaData.getLocaleMap(), metaData.getLocale(), false);
        this.currentElement = (Element)this.currentElement.getParentNode();
    }

    @Override
    public void startFrame(@NotNull String netPath, @NotNull String query, Request parsedRequest, FvctxImageProps imageProps, boolean hasNestedFrame, boolean isMediaSetItem) {
        Element frame = this.document.createElement("item");
        this.currentElement.appendChild(frame);
        this.currentElement = frame;
        if (!hasNestedFrame) {
            Element imageElement = this.createImageElement(netPath, query, imageProps, isMediaSetItem);
            this.currentElement.appendChild(imageElement);
        } else {
            this.nestedFrameSwatches.add(null);
        }
    }

    @Override
    public void startVideoFrame(@NotNull String netPath, @NotNull String query, @NotNull MediaSetVideoProps videoProps) throws ApplicationException {
        Element frame = this.document.createElement("item");
        this.currentElement.appendChild(frame);
        this.currentElement = frame;
        Element video = this.createVideoElement(netPath, query, videoProps);
        this.currentElement.appendChild(video);
    }

    @Override
    public void endVideoFrame(@NotNull MediaSetMetaData metaData, @NotNull String version, @NotNull String suffix) throws IZoomException {
        XMLUtil.appendAsAttributes((Element)this.currentElement, MediaSetNodeXmlWriter.getVideoFrameAttributes(version, suffix));
        this.appendMetaData(this.document, this.currentElement, metaData, metaData.getLocaleMap(), metaData.getLocale(), false);
        this.currentElement = (Element)this.currentElement.getParentNode();
    }

    @Override
    public void endFrame(@Nullable SizeInt size, @NotNull String imageVersion, @NotNull MediaSetMetaData metaData, boolean hasNestedFrames) throws IZoomException {
        Element nestedFrameSwatch;
        XMLUtil.appendAsAttributes((Element)this.currentElement, this.getFrameAttributes(size, imageVersion, hasNestedFrames, MediaSetNodeXmlWriter.findFrameItemType(hasNestedFrames, this.currentElement)));
        if (!hasNestedFrames) {
            boolean[] metadataFlags = this.appendMetaData(this.document, this.currentElement, metaData, metaData.getLocaleMap(), metaData.getLocale(), true);
            XMLUtil.appendAsAttributes((Element)this.currentElement, MediaSetNodeXmlWriter.getSuppressedMetaDataAttributes(metadataFlags));
        } else if (!this.nestedFrameSwatches.isEmpty() && (nestedFrameSwatch = this.nestedFrameSwatches.remove(this.nestedFrameSwatches.size() - 1)) != null) {
            this.currentElement.appendChild(nestedFrameSwatch);
        }
        this.currentElement = (Element)this.currentElement.getParentNode();
    }

    @Override
    public void startAnonymousFrame() {
        Element frame = this.document.createElement("item");
        this.currentElement.appendChild(frame);
        this.currentElement = frame;
    }

    @Override
    public void endAnonymousFrame() {
        this.currentElement = (Element)this.currentElement.getParentNode();
    }

    @Override
    public void image(@NotNull String netPath, @NotNull String query, Request parsedRequest, FvctxImageProps imageProps) {
        Element imageElement = this.createImageElement(netPath, query, imageProps, false);
        this.currentElement.appendChild(imageElement);
    }

    @Override
    public void swatch(@NotNull String netPath, @NotNull String query, Request parsedRequest, FvctxImageProps imageProps, boolean hasNestedFrame, boolean isMediaItemSwatch) {
        Element swatch = this.createSwatchImageElement(netPath, query, imageProps);
        if (hasNestedFrame && !isMediaItemSwatch) {
            assert (!this.nestedFrameSwatches.isEmpty());
            this.nestedFrameSwatches.set(this.nestedFrameSwatches.size() - 1, swatch);
        }
        if (!hasNestedFrame || isMediaItemSwatch) {
            this.currentElement.appendChild(swatch);
        }
    }

    @Override
    public void swatch(@NotNull ImageSetColorLabel data, @NotNull LocaleMap localeMap, @NotNull String locale, boolean hasNestedFrame) {
        Element e = this.document.createElement("s");
        XMLUtil.appendAsAttributes((Element)e, MediaSetNodeXmlWriter.getSwatchProps(data, localeMap, locale));
        if (hasNestedFrame) {
            assert (!this.nestedFrameSwatches.isEmpty());
            this.nestedFrameSwatches.set(this.nestedFrameSwatches.size() - 1, e);
        } else {
            this.currentElement.appendChild(e);
        }
    }

    @Override
    public void defaultSwatch() throws ApplicationException {
    }

    @NotNull
    private Element createImageElement(@NotNull String netPath, @NotNull String query, @NotNull FvctxImageProps imageProps, boolean isMediaSetItem) {
        Element image = this.document.createElement("i");
        XMLUtil.appendAsAttributes((Element)image, this.getImageAttributes(netPath, query, imageProps, isMediaSetItem));
        return image;
    }

    @NotNull
    private Element createSwatchImageElement(@NotNull String netPath, String query, @NotNull FvctxImageProps imageProps) {
        Element swatch = this.document.createElement("s");
        XMLUtil.appendAsAttributes((Element)swatch, this.getCommonImageAttributes(netPath, query, imageProps));
        return swatch;
    }

    @NotNull
    private Element createVideoElement(@NotNull String netPath, @NotNull String query, @NotNull MediaSetVideoProps videoProps) {
        String fileSuffix = videoProps.getFileSuffix();
        Element v = MediaSetVideoExtension.isVideoFileExtension(fileSuffix) || fileSuffix.isEmpty() ? this.document.createElement("v") : this.document.createElement("c");
        XMLUtil.appendAsAttributes((Element)v, this.getCommonVideoAttributes(netPath, query, videoProps));
        return v;
    }

    private boolean[] appendMetaData(@NotNull Document document, @NotNull Element e, @NotNull MediaSetMetaData metaData, @NotNull LocaleMap localeMap, @NotNull String locale, boolean isPrivate) throws IZoomException {
        boolean[] shouldAppendMetaData = this.shouldAppendMetadata(metaData, isPrivate);
        if (shouldAppendMetaData[0]) {
            Element t = metaData.getTargets().createXmlElement(document, localeMap, locale, true, true);
            e.appendChild(t);
        }
        if (shouldAppendMetaData[1]) {
            Element h = HotSpotResponseGenerator.createHotspotXmlElement(document, localeMap, locale, metaData.getMaps());
            e.appendChild(h);
        }
        if (shouldAppendMetaData[2]) {
            for (UserData userData : metaData.getUserData()) {
                if (!this.shouldAppendUserData(userData)) continue;
                Element userDataElement = UserDataHandler.createXmlElement(document, localeMap, locale, userData, this.labelKey);
                e.appendChild(userDataElement);
            }
        }
        return shouldAppendMetaData;
    }

    @NotNull
    private static String findFrameItemType(boolean hasNestedFrame, Element element) {
        NodeList nodeList;
        String itemType = MediaSetItemType.IMG.name().toLowerCase();
        if (hasNestedFrame && (nodeList = element.getElementsByTagName("set")).getLength() > 0) {
            Element set = (Element)nodeList.item(0);
            itemType = set.getAttribute("type");
            assert (itemType != null);
            assert (itemType.length() > 0);
        }
        return itemType;
    }

    private static void addNumPagesAttribute(@NotNull Element root) {
        NodeList sets;
        String rootType = root.getAttribute("type");
        if (rootType != null && MediaSetSetType.isECatSet(rootType)) {
            MediaSetNodeXmlWriter.setNumPagesAttribute(root.getChildNodes());
        }
        if ((sets = root.getElementsByTagName("set")) != null) {
            for (int i = 0; i < sets.getLength(); ++i) {
                Element set = (Element)sets.item(i);
                String elementSetType = set.getAttribute("type");
                if (elementSetType == null || !MediaSetSetType.isECatSet(elementSetType)) continue;
                MediaSetNodeXmlWriter.setNumPagesAttribute(set.getChildNodes());
            }
        }
    }

    private static void setNumPagesAttribute(@NotNull NodeList items) {
        if (items.getLength() > 2) {
            Element firstItem = (Element)items.item(0);
            Element secondItem = (Element)items.item(1);
            MediaSetNodeXmlWriter.setNumPagesAttribute(firstItem, secondItem);
            Element nextToLastItem = (Element)items.item(items.getLength() - 2);
            Element lastItem = (Element)items.item(items.getLength() - 1);
            MediaSetNodeXmlWriter.setNumPagesAttribute(lastItem, nextToLastItem);
        }
    }

    private static void setNumPagesAttribute(@NotNull Element a, @NotNull Element b) {
        String bHeight;
        String bWidth;
        String aHeight;
        String aWidth;
        String aTagName = a.getTagName();
        String bTagName = b.getTagName();
        if (aTagName.equalsIgnoreCase("item") && bTagName.equalsIgnoreCase("item") && MediaSetNodeXmlWriter.shouldSetPagesAttribute(aWidth = a.getAttribute("dx"), aHeight = a.getAttribute("dy"), bWidth = b.getAttribute("dx"), bHeight = b.getAttribute("dy"))) {
            a.setAttribute("np", "1");
        }
    }
}