/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.message.Message
 *  com.l7tech.policy.assertion.Assertion
 *  com.l7tech.policy.assertion.AssertionStatus
 *  com.l7tech.policy.assertion.RoutingStatus
 *  com.l7tech.util.CausedIOException
 *  com.l7tech.util.NamespaceContextImpl
 *  com.l7tech.util.ResourceUtils
 *  com.l7tech.xml.ElementCursor
 *  com.l7tech.xml.xpath.CursorXPathFactory
 */
package com.l7tech.server.policy.assertion;

import com.l7tech.message.Message;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.assertion.RoutingStatus;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.policy.assertion.AbstractServerAssertion;
import com.l7tech.util.CausedIOException;
import com.l7tech.util.NamespaceContextImpl;
import com.l7tech.util.ResourceUtils;
import com.l7tech.xml.ElementCursor;
import com.l7tech.xml.xpath.CursorXPathFactory;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathException;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.SAXException;

public abstract class ServerXpathValidationAssertion<AT extends Assertion>
extends AbstractServerAssertion<AT> {
    private static final String d;
    private static final String e;
    private static final String f;
    private NamespaceContext g = new NamespaceContextImpl(Collections.emptyMap());
    private Map<XPathExpression, String> h = Collections.emptyMap();
    private static final String[] j;

    @Override
    public AssertionStatus checkRequest(PolicyEnforcementContext policyEnforcementContext) throws IOException {
        AssertionStatus assertionStatus;
        block8: {
            if (policyEnforcementContext.getRoutingStatus().equals(RoutingStatus.ROUTED)) {
                Message message = policyEnforcementContext.getResponse();
                assertionStatus = this.b(message);
            } else {
                if (this.isCheckRequestMessages()) {
                    Message message = policyEnforcementContext.getRequest();
                    assertionStatus = this.a(message);
                } else {
                    assertionStatus = AssertionStatus.NONE;
                }
                try {
                    try {
                        if (!AssertionStatus.NONE.equals(assertionStatus) || !this.isCheckResponseMessages()) break block8;
                    }
                    catch (IOException iOException) {
                        throw ServerXpathValidationAssertion.a(iOException);
                    }
                    policyEnforcementContext.addDeferredAssertion(this, this);
                }
                catch (IOException iOException) {
                    throw ServerXpathValidationAssertion.a(iOException);
                }
            }
        }
        return assertionStatus;
    }

    protected ServerXpathValidationAssertion(AT AT) {
        super(AT);
        this.b();
    }

    protected boolean isCheckRequestMessages() {
        return true;
    }

    protected boolean isCheckResponseMessages() {
        return true;
    }

    protected boolean isFailOnNonCompliantRequest() {
        return true;
    }

    protected boolean isFailOnNonCompliantResponse() {
        return false;
    }

    protected abstract InputStream getRulesResource();

    protected void onRequestNonSoap() {
    }

    protected void onResponseNonSoap() {
    }

    protected void onRequestNonCompliance(String string, String string2) {
    }

    protected void onResponseNonCompliance(String string, String string2) {
    }

    protected void onRequestFailure() {
    }

    protected void onResponseFailure() {
    }

    protected void onXPathError(XPathException xPathException) {
        this.logger.log(Level.WARNING, j[1], xPathException);
    }

    Map a() {
        return this.h;
    }

    /*
     * Unable to fully structure code
     */
    private AssertionStatus a(Message var1_1) throws IOException {
        block31: {
            block33: {
                block32: {
                    try {
                        if (this.logger.isLoggable(Level.FINE)) {
                            this.logger.fine(ServerXpathValidationAssertion.j[22]);
                        }
                    }
                    catch (XPathExpressionException v0) {
                        throw ServerXpathValidationAssertion.a(v0);
                    }
                    if (this.c(var1_1)) break block32;
                    this.onRequestNonSoap();
                    var2_2 = AssertionStatus.BAD_REQUEST;
                    break block31;
                }
                var3_3 = this.d(var1_1);
                if (var3_3 != null) break block33;
                var2_2 = AssertionStatus.BAD_REQUEST;
                break block31;
            }
            try {
                block30: {
                    block29: {
                        var4_4 = true;
                        var5_6 = this.a(var3_3);
                        for (XPathExpression var7_8 : this.h.keySet()) {
                            block28: {
                                try {
                                    if (this.b(var7_8)) {
                                        continue;
                                    }
                                }
                                catch (XPathExpressionException v1) {
                                    throw ServerXpathValidationAssertion.a(v1);
                                }
                                var8_9 = this.a(var7_8);
                                try {
                                    if (var5_6.contains(var8_9[0])) {
                                        continue;
                                    }
                                }
                                catch (XPathExpressionException v2) {
                                    throw ServerXpathValidationAssertion.a(v2);
                                }
                                try {
                                    if (this.logger.isLoggable(Level.FINEST)) {
                                        this.logger.finest(ServerXpathValidationAssertion.j[20] + var7_8.toString() + ServerXpathValidationAssertion.j[21]);
                                    }
                                }
                                catch (XPathExpressionException v3) {
                                    throw ServerXpathValidationAssertion.a(v3);
                                }
                                if (ServerXpathValidationAssertion.j[15].equals(var7_8.evaluate(var3_3))) continue;
                                try {
                                    block34: {
                                        if (!this.logger.isLoggable(Level.FINEST)) break block28;
                                        break block34;
                                        catch (XPathExpressionException v4) {
                                            throw ServerXpathValidationAssertion.a(v4);
                                        }
                                    }
                                    this.logger.finest(ServerXpathValidationAssertion.j[24]);
                                }
                                catch (XPathExpressionException v5) {
                                    throw ServerXpathValidationAssertion.a(v5);
                                }
                            }
                            this.onRequestNonCompliance(this.a(var8_9[0]), var8_9[1]);
                            var4_4 = false;
                            try {
                                if (!this.isFailOnNonCompliantRequest()) continue;
                                break;
                            }
                            catch (XPathExpressionException v6) {
                                throw ServerXpathValidationAssertion.a(v6);
                            }
                        }
                        if (var4_4) ** GOTO lbl67
                        try {
                            block35: {
                                if (this.isFailOnNonCompliantRequest()) break block29;
                                break block35;
                                catch (XPathExpressionException v7) {
                                    throw ServerXpathValidationAssertion.a(v7);
                                }
                            }
                            v8 = AssertionStatus.NONE;
                            break block30;
                        }
                        catch (XPathExpressionException v9) {
                            throw ServerXpathValidationAssertion.a(v9);
                        }
                    }
                    v8 = AssertionStatus.FALSIFIED;
                }
                var2_2 = v8;
                try {
                    if (AssertionStatus.FALSIFIED.equals(var2_2)) {
                        this.onRequestFailure();
                    }
                }
                catch (XPathExpressionException v10) {
                    throw ServerXpathValidationAssertion.a(v10);
                }
            }
            catch (XPathExpressionException var4_5) {
                this.onXPathError(var4_5);
                var2_2 = AssertionStatus.FAILED;
            }
        }
        return var2_2;
    }

    /*
     * Unable to fully structure code
     */
    private AssertionStatus b(Message var1_1) throws IOException {
        block31: {
            block33: {
                block32: {
                    try {
                        if (this.logger.isLoggable(Level.FINE)) {
                            this.logger.fine(ServerXpathValidationAssertion.j[7]);
                        }
                    }
                    catch (XPathExpressionException v0) {
                        throw ServerXpathValidationAssertion.a(v0);
                    }
                    if (this.c(var1_1)) break block32;
                    this.onResponseNonSoap();
                    var2_2 = AssertionStatus.BAD_REQUEST;
                    break block31;
                }
                var3_3 = this.d(var1_1);
                if (var3_3 != null) break block33;
                var2_2 = AssertionStatus.FALSIFIED;
                break block31;
            }
            try {
                block30: {
                    block29: {
                        var4_4 = true;
                        var5_6 = this.a(var3_3);
                        for (XPathExpression var7_8 : this.h.keySet()) {
                            block28: {
                                try {
                                    if (this.b(var7_8)) {
                                        continue;
                                    }
                                }
                                catch (XPathExpressionException v1) {
                                    throw ServerXpathValidationAssertion.a(v1);
                                }
                                var8_9 = this.a(var7_8);
                                try {
                                    if (var5_6.contains(var8_9[0])) {
                                        continue;
                                    }
                                }
                                catch (XPathExpressionException v2) {
                                    throw ServerXpathValidationAssertion.a(v2);
                                }
                                try {
                                    if (this.logger.isLoggable(Level.FINEST)) {
                                        this.logger.finest(ServerXpathValidationAssertion.j[13] + var7_8.toString() + ServerXpathValidationAssertion.j[12]);
                                    }
                                }
                                catch (XPathExpressionException v3) {
                                    throw ServerXpathValidationAssertion.a(v3);
                                }
                                if (ServerXpathValidationAssertion.j[4].equals(var7_8.evaluate(var3_3))) continue;
                                try {
                                    block34: {
                                        if (!this.logger.isLoggable(Level.FINEST)) break block28;
                                        break block34;
                                        catch (XPathExpressionException v4) {
                                            throw ServerXpathValidationAssertion.a(v4);
                                        }
                                    }
                                    this.logger.finest(ServerXpathValidationAssertion.j[0]);
                                }
                                catch (XPathExpressionException v5) {
                                    throw ServerXpathValidationAssertion.a(v5);
                                }
                            }
                            this.onResponseNonCompliance(this.a(var8_9[0]), var8_9[1]);
                            var4_4 = false;
                            try {
                                if (!this.isFailOnNonCompliantResponse()) continue;
                                break;
                            }
                            catch (XPathExpressionException v6) {
                                throw ServerXpathValidationAssertion.a(v6);
                            }
                        }
                        if (var4_4) ** GOTO lbl67
                        try {
                            block35: {
                                if (this.isFailOnNonCompliantResponse()) break block29;
                                break block35;
                                catch (XPathExpressionException v7) {
                                    throw ServerXpathValidationAssertion.a(v7);
                                }
                            }
                            v8 = AssertionStatus.NONE;
                            break block30;
                        }
                        catch (XPathExpressionException v9) {
                            throw ServerXpathValidationAssertion.a(v9);
                        }
                    }
                    v8 = AssertionStatus.FALSIFIED;
                }
                var2_2 = v8;
                try {
                    if (AssertionStatus.FALSIFIED.equals(var2_2)) {
                        this.onResponseFailure();
                    }
                }
                catch (XPathExpressionException v10) {
                    throw ServerXpathValidationAssertion.a(v10);
                }
            }
            catch (XPathExpressionException var4_5) {
                this.onXPathError(var4_5);
                var2_2 = AssertionStatus.FAILED;
            }
        }
        return var2_2;
    }

    private String[] a(XPathExpression xPathExpression) {
        String string = this.h.get(xPathExpression);
        if (string == null) {
            string = "";
        }
        return string.split(j[19], 2);
    }

    private boolean b(XPathExpression xPathExpression) {
        return this.a(xPathExpression)[0].startsWith("B");
    }

    private Set<String> c(XPathExpression xPathExpression) {
        String string = this.a(xPathExpression)[1];
        int n2 = string.indexOf(58);
        Set<String> set = !this.b(xPathExpression) || n2 < 0 ? Collections.emptySet() : new HashSet<String>(Arrays.asList(string.substring(n2 + 1).split(" ")));
        return set;
    }

    private Set<String> a(Object object) throws XPathExpressionException {
        HashSet<String> hashSet = new HashSet<String>();
        for (XPathExpression xPathExpression : this.h.keySet()) {
            try {
                if (!this.b(xPathExpression)) {
                    continue;
                }
            }
            catch (XPathExpressionException xPathExpressionException) {
                throw ServerXpathValidationAssertion.a(xPathExpressionException);
            }
            try {
                if (this.logger.isLoggable(Level.FINEST)) {
                    this.logger.finest(j[5] + xPathExpression.toString() + j[12]);
                }
            }
            catch (XPathExpressionException xPathExpressionException) {
                throw ServerXpathValidationAssertion.a(xPathExpressionException);
            }
            try {
                if (j[4].equals(xPathExpression.evaluate(object))) continue;
                hashSet.addAll(this.c(xPathExpression));
            }
            catch (XPathExpressionException xPathExpressionException) {
                throw ServerXpathValidationAssertion.a(xPathExpressionException);
            }
        }
        return hashSet;
    }

    private boolean c(Message message) throws IOException {
        boolean bl2 = false;
        try {
            if (message.isSoap()) {
                bl2 = true;
            }
        }
        catch (SAXException sAXException) {
            throw new CausedIOException((Throwable)sAXException);
        }
        return bl2;
    }

    private Object d(Message message) throws IOException {
        ElementCursor elementCursor;
        try {
            ElementCursor elementCursor2 = message.getXmlKnob().getElementCursor();
            elementCursor2.moveToRoot();
            elementCursor = elementCursor2;
        }
        catch (SAXException sAXException) {
            throw new CausedIOException((Throwable)sAXException);
        }
        return elementCursor;
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    private void b() {
        InputStream inputStream = null;
        try {
            inputStream = this.getRulesResource();
            if (inputStream != null) {
                Properties properties = new Properties();
                properties.load(inputStream);
                HashMap<XPathExpression, String> hashMap = new HashMap<XPathExpression, String>(properties.size());
                CursorXPathFactory cursorXPathFactory = new CursorXPathFactory();
                this.g = this.a(properties);
                this.a((XPathFactory)cursorXPathFactory, properties, hashMap);
                this.h = Collections.unmodifiableMap(hashMap);
            } else {
                String[] stringArray = j;
                this.logger.warning(stringArray[8]);
            }
        }
        catch (IOException iOException) {
            this.logger.log(Level.WARNING, j[6], iOException);
        }
        finally {
            ResourceUtils.closeQuietly((Closeable)inputStream);
        }
    }

    private NamespaceContext a(Map map) {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        Iterator iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            String string;
            Map.Entry entry;
            Map.Entry entry2 = entry = iterator.next();
            String string2 = (String)entry2.getKey();
            String string3 = (String)entry2.getValue();
            String[] stringArray = j;
            if (!string2.startsWith(stringArray[18]) || (string = string2.substring(stringArray[25].length())).length() == 0 || string3.length() == 0) continue;
            hashMap.put(string, string3);
        }
        return new NamespaceContextImpl(hashMap);
    }

    private String a(String string) {
        String string2 = string.indexOf(".") > 0 ? string.substring(0, string.lastIndexOf(".")) : string;
        return string2;
    }

    /*
     * Loose catch block
     */
    private void a(XPathFactory xPathFactory, Properties properties, Map<XPathExpression, String> map) {
        Iterator<Map.Entry<Object, Object>> iterator = properties.entrySet().iterator();
        while (iterator.hasNext()) {
            Object object;
            String string;
            String string2;
            String[] stringArray;
            String string3;
            block7: {
                Map.Entry<Object, Object> entry;
                Map.Entry<Object, Object> entry2 = entry = iterator.next();
                String string4 = (String)entry2.getKey();
                string3 = (String)entry2.getValue();
                if (string4 == null) continue;
                try {
                    block8: {
                        if (string3 == null) continue;
                        break block8;
                        catch (XPathExpressionException xPathExpressionException) {
                            throw ServerXpathValidationAssertion.a(xPathExpressionException);
                        }
                    }
                    if (!string4.endsWith(j[9])) continue;
                }
                catch (XPathExpressionException xPathExpressionException) {
                    throw ServerXpathValidationAssertion.a(xPathExpressionException);
                }
                stringArray = j;
                string2 = string4.substring(0, string4.length() - stringArray[3].length());
                string = this.a(string2);
                object = properties.getProperty(string + stringArray[14]);
                if (object != null) break block7;
                object = stringArray[2];
            }
            stringArray = j;
            object = string2 + stringArray[11] + (String)object;
            XPath xPath = xPathFactory.newXPath();
            xPath.setNamespaceContext(this.g);
            try {
                XPathExpression xPathExpression = xPath.compile(string3);
                map.put(xPathExpression, (String)object);
            }
            catch (XPathExpressionException xPathExpressionException) {
                stringArray = j;
                this.logger.log(Level.WARNING, stringArray[16] + string + stringArray[10] + string3 + stringArray[23], xPathExpressionException);
            }
        }
    }

    private static Exception a(Exception exception) {
        return exception;
    }

    /*
     * Unable to fully structure code
     */
    static {
        block10: {
            block9: {
                var5 = new String[26];
                var3_1 = 0;
                var2_2 = "%a\u001d2{uh\u000bP\u00103r!h\u0019\u0011\b)33l\u0011B\u0019h\u00168C\u000e)au}\u000f^\u001f#`&d\u0013V\\\u001eC4y\u0015\u00183^\\\"v&n\u000fX\f2z:c]W\u001343'x\u0011TR\u0005SA\u001d2{\u0004\tC\t#\u00198G\u001d*f4y\u0014_\u001bfq'l\u0013R\u0014fK\u0005l\tY\\a\u001f8C\u000e)aua\u0012P\u0018/}2-\u001e^\u00116\u007f<l\u0013R\u0019fa a\u0018BR\u001c-C\u0013%v&~\u0014_\u001bfa0~\r^\u00125vu`\u0018B\u000f't0#<(_\u001d$\u007f0-\t^\\*|4i]C\t*v&!]\u007f3\u00123%h\u000fW\u00134~<c\u001a\u0011\u001d(ju\u007f\b_\b/~0-\u000bP\u0010/w4y\u0014^\u0012h\u0005SA\u001d2{\rZ\u001d\\>c4y\u0015\u0011\u001553r\u0002G\u0011\u0002Z\u001f\u00128G\u001d*f4y\u0014_\u001bfK\u0005l\tY\\a\u0005SC\t*v\u0004\tC\t#\u001e8C\u000e)au}\u001cC\u000f/}2-%a\u001d2{uk\u0012C\\4f9h]\u0016\u0005SC\t*v\n3P\u0011#`%l\u001eTR\u0002G\u0011\u00128G\u001d*f4y\u0014_\u001bfK\u0005l\tY\\a\u0002Z\u001f\u001b-C\u0013%v&~\u0014_\u001bfa0|\bT\u000f238h\u000eB\u001d!v{\u0002Z\u001d";
                var4_3 = "%a\u001d2{uh\u000bP\u00103r!h\u0019\u0011\b)33l\u0011B\u0019h\u00168C\u000e)au}\u000f^\u001f#`&d\u0013V\\\u001eC4y\u0015\u00183^\\\"v&n\u000fX\f2z:c]W\u001343'x\u0011TR\u0005SA\u001d2{\u0004\tC\t#\u00198G\u001d*f4y\u0014_\u001bfq'l\u0013R\u0014fK\u0005l\tY\\a\u001f8C\u000e)aua\u0012P\u0018/}2-\u001e^\u00116\u007f<l\u0013R\u0019fa a\u0018BR\u001c-C\u0013%v&~\u0014_\u001bfa0~\r^\u00125vu`\u0018B\u000f't0#<(_\u001d$\u007f0-\t^\\*|4i]C\t*v&!]\u007f3\u00123%h\u000fW\u00134~<c\u001a\u0011\u001d(ju\u007f\b_\b/~0-\u000bP\u0010/w4y\u0014^\u0012h\u0005SA\u001d2{\rZ\u001d\\>c4y\u0015\u0011\u001553r\u0002G\u0011\u0002Z\u001f\u00128G\u001d*f4y\u0014_\u001bfK\u0005l\tY\\a\u0005SC\t*v\u0004\tC\t#\u001e8C\u000e)au}\u001cC\u000f/}2-%a\u001d2{uk\u0012C\\4f9h]\u0016\u0005SC\t*v\n3P\u0011#`%l\u001eTR\u0002G\u0011\u00128G\u001d*f4y\u0014_\u001bfK\u0005l\tY\\a\u0002Z\u001f\u001b-C\u0013%v&~\u0014_\u001bfa0|\bT\u000f238h\u000eB\u001d!v{\u0002Z\u001d".length();
                var1_4 = 25;
                var0_5 = -1;
lbl7:
                // 2 sources

                while (true) {
                    v0 = 36;
                    v1 = ++var0_5;
                    v2 = var2_2.substring(v1, v1 + var1_4);
                    v3 = -1;
                    break block9;
                    break;
                }
lbl13:
                // 1 sources

                while (true) {
                    var5[var3_1++] = ServerXpathValidationAssertion.b(v0, ServerXpathValidationAssertion.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    var2_2 = "g#_p97*I\u0012Rq0c*[SJkqq.S\u0000[*\nq\u0012Sa\"g.\\\u0016\u0010";
                    var4_3 = "g#_p97*I\u0012Rq0c*[SJkqq.S\u0000[*\nq\u0012Sa\"g.\\\u0016\u0010".length();
                    var1_4 = 25;
                    var0_5 = -1;
lbl22:
                    // 2 sources

                    while (true) {
                        v0 = 102;
                        v4 = ++var0_5;
                        v2 = var2_2.substring(v4, v4 + var1_4);
                        v3 = 0;
                        break block9;
                        break;
                    }
                    break;
                }
lbl28:
                // 1 sources

                while (true) {
                    var5[var3_1++] = ServerXpathValidationAssertion.b(v0, ServerXpathValidationAssertion.b(v2));
                    if ((var0_5 += var1_4) < var4_3) {
                        var1_4 = var2_2.charAt(var0_5);
                        ** continue;
                    }
                    break block10;
                    break;
                }
            }
            switch (v3) {
                default: {
                    ** continue;
                }
                ** case 0:
lbl39:
                // 1 sources

                ** continue;
            }
        }
        ServerXpathValidationAssertion.j = var5;
        ServerXpathValidationAssertion.e = ServerXpathValidationAssertion.j[3];
        ServerXpathValidationAssertion.f = ServerXpathValidationAssertion.j[25];
        ServerXpathValidationAssertion.d = ServerXpathValidationAssertion.j[17];
    }

    private static char[] b(String string) {
        char[] cArray = string.toCharArray();
        if (cArray.length < 2) {
            cArray = cArray;
            cArray[0] = (char)(cArray[0] ^ 0x29);
        }
        return cArray;
    }

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String b(int n2, char[] cArray) {
        char[] cArray2;
        block11: {
            int n3;
            int n4;
            int n5;
            block10: {
                n5 = n2;
                cArray2 = cArray;
                n4 = cArray.length;
                n3 = 0;
                if (!true) break block10;
                n4 = n4;
                if (n4 <= n3) break block11;
            }
            do {
                n5 = n5;
                cArray2 = cArray2;
                int n6 = n3;
                cArray2[n6] = (char)(cArray2[n6] ^ (n5 ^ (switch (n3 % 7) {
                    case 0 -> 89;
                    case 1 -> 21;
                    case 2 -> 88;
                    case 3 -> 98;
                    case 4 -> 55;
                    case 5 -> 113;
                    default -> 41;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

