ImageSetConverter.java 5.92 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.catalog.util.localization.LocalizedText
 *  com.scene7.is.catalog.util.localization.LocalizedTextParser
 *  com.scene7.is.provider.ImageSet
 *  com.scene7.is.provider.ImageSetItem
 *  com.scene7.is.sleng.Color
 *  com.scene7.is.util.Converter
 *  com.scene7.is.util.collections.CollectionUtil
 *  com.scene7.is.util.text.Parser
 *  com.scene7.is.util.text.ParserUtil
 *  com.scene7.is.util.text.ParsingException
 *  com.scene7.is.util.text.Scanner
 *  org.apache.commons.beanutils.ConversionException
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider.parsers;

import com.scene7.is.catalog.util.localization.LocalizedText;
import com.scene7.is.catalog.util.localization.LocalizedTextParser;
import com.scene7.is.provider.ImageSet;
import com.scene7.is.provider.ImageSetItem;
import com.scene7.is.ps.provider.parsers.ColorConverter;
import com.scene7.is.sleng.Color;
import com.scene7.is.util.Converter;
import com.scene7.is.util.collections.CollectionUtil;
import com.scene7.is.util.text.Parser;
import com.scene7.is.util.text.ParserUtil;
import com.scene7.is.util.text.ParsingException;
import com.scene7.is.util.text.Scanner;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
import org.apache.commons.beanutils.ConversionException;
import org.jetbrains.annotations.NotNull;

public class ImageSetConverter
extends Converter<String, ImageSet> {
    private static final boolean[] SEPARATORS = new boolean[256];
    private static final boolean[] BRACES = new boolean[256];
    private static final Converter<String, ImageSet> INSTANCE;
    private static final Parser<ImageSet> PARSER_INSTANCE;

    @NotNull
    public static Parser<ImageSet> imageSetParser() {
        return PARSER_INSTANCE;
    }

    @NotNull
    public static Converter<String, ImageSet> imageSetConverter() {
        return INSTANCE;
    }

    @NotNull
    public ImageSet convert(@NotNull String value) throws ConversionException {
        StringReader reader = new StringReader(value);
        try {
            List items = CollectionUtil.list();
            if (value.isEmpty()) {
                return new ImageSet(items);
            }
            StringBuilder buffer = new StringBuilder(value.length());
            char last = ',';
            do {
                buffer.setLength(0);
                int next = ImageSetConverter.collectItem(reader, buffer);
                String item = buffer.toString();
                if (ImageSetConverter.isColorLabel(item)) {
                    Color color = (Color)ColorConverter.colorParser().parse(item.substring(1, 9));
                    LocalizedText label = (LocalizedText)LocalizedTextParser.localizedTextParser().parse(item.substring(9, item.length() - 1));
                    items.add(ImageSetItem.imageSetColorLabel((char)last, (Color)color, (LocalizedText)label));
                } else if (ImageSetConverter.isLabel(item)) {
                    items.add(ImageSetItem.imageSetLabel((char)last, (LocalizedText)((LocalizedText)LocalizedTextParser.localizedTextParser().parse(item))));
                } else {
                    items.add(ImageSetItem.imageSetAsset((char)last, (String)item));
                }
                if (next == -1) break;
                last = (char)next;
                Scanner.skipOne((Reader)reader, (char)last);
            } while (true);
            return new ImageSet(items);
        }
        catch (IOException e) {
            throw new AssertionError(e);
        }
        catch (ParsingException e) {
            throw new ConversionException((Throwable)e);
        }
    }

    @NotNull
    public String revert(@NotNull ImageSet src) throws ConversionException {
        ImageSet copy = new ImageSet(src.items);
        return copy.generateString();
    }

    private static boolean isLabel(@NotNull String item) {
        return item.contains("^loc=");
    }

    private static boolean isColorLabel(String item) {
        return item.startsWith("{0x") && item.endsWith("}") && item.length() >= 10;
    }

    private static int collectItem(@NotNull Reader reader, @NotNull StringBuilder buffer) throws ParsingException, IOException {
        int c = Scanner.collectUntil((Reader)reader, (StringBuilder)buffer, (boolean[])SEPARATORS, (boolean)true);
        while (c == 123 || c == 40) {
            ImageSetConverter.collectWithBraces(reader, buffer);
            c = Scanner.collectUntil((Reader)reader, (StringBuilder)buffer, (boolean[])SEPARATORS, (boolean)true);
        }
        return c;
    }

    private static void collectWithBraces(Reader reader, StringBuilder buffer) throws ParsingException, IOException {
        int closingBrace;
        int openingBrace = Scanner.collectOne((Reader)reader, (StringBuilder)buffer);
        if (openingBrace == 40) {
            closingBrace = 41;
        } else if (openingBrace == 123) {
            closingBrace = 125;
        } else {
            throw new ParsingException(1, String.valueOf((char)openingBrace), null);
        }
        int c = Scanner.collectUntil((Reader)reader, (StringBuilder)buffer, (boolean[])BRACES, (boolean)true);
        while (c == 40 || c == 123) {
            ImageSetConverter.collectWithBraces(reader, buffer);
            c = Scanner.collectUntil((Reader)reader, (StringBuilder)buffer, (boolean[])BRACES, (boolean)true);
        }
        if (c != closingBrace) {
            throw new ParsingException(0, "Unbalanced braces in the sources value", null);
        }
        Scanner.collectOne((Reader)reader, (StringBuilder)buffer);
    }

    private ImageSetConverter() {
        super(String.class, ImageSet.class);
    }

    static {
        Scanner.setChars((boolean[])SEPARATORS, (String)",:;{(", (boolean)true);
        Scanner.setChars((boolean[])BRACES, (String)"(){}", (boolean)true);
        INSTANCE = new ImageSetConverter();
        PARSER_INSTANCE = ParserUtil.parser(INSTANCE);
    }
}