ExternalImplicitObjectELResolver.java 6.26 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.el.ELContext
 *  javax.el.ELResolver
 *  javax.el.PropertyNotWritableException
 *  javax.servlet.jsp.el.ImplicitObjectELResolver
 */
package com.adobe.granite.ui.components.impl;

import java.beans.FeatureDescriptor;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.PropertyNotWritableException;
import javax.servlet.jsp.el.ImplicitObjectELResolver;

/*
 * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
 */
public class ExternalImplicitObjectELResolver
extends ELResolver {
    private ImplicitObjectELResolver delegate = new ImplicitObjectELResolver();
    private static final String[] PROPERTY_NAMES = new String[]{"param", "paramValues", "header", "headerValues", "cookie"};
    private static final List<String> HEADER_BLACKLIST = Arrays.asList("authorization", "cookie", "proxy-authorization", "host", "x-forwarded-for", "x-forwarded-host");
    private static final List<String> COOKIE_BLACKLIST = Arrays.asList("csrftoken", "login-token");

    private static boolean isValid(Object base, Object property) {
        if (base != null) {
            return false;
        }
        for (String name : PROPERTY_NAMES) {
            if (!name.equals(property)) continue;
            return true;
        }
        return false;
    }

    public Object getValue(ELContext context, Object base, Object property) {
        if (!ExternalImplicitObjectELResolver.isValid(base, property)) {
            return null;
        }
        List<String> blacklist = null;
        if ("header".equals(property) || "headerValues".equals(property)) {
            blacklist = HEADER_BLACKLIST;
        } else if ("cookie".equals(property)) {
            blacklist = COOKIE_BLACKLIST;
        }
        if (blacklist == null) {
            return this.delegate.getValue(context, base, property);
        }
        return new FilteredMap((Map)this.delegate.getValue(context, base, property), blacklist);
    }

    public Class<?> getType(ELContext context, Object base, Object property) {
        if (ExternalImplicitObjectELResolver.isValid(base, property)) {
            context.setPropertyResolved(true);
        }
        return null;
    }

    public void setValue(ELContext context, Object base, Object property, Object val) {
        if (ExternalImplicitObjectELResolver.isValid(base, property)) {
            throw new PropertyNotWritableException();
        }
    }

    public boolean isReadOnly(ELContext context, Object base, Object property) {
        if (ExternalImplicitObjectELResolver.isValid(base, property)) {
            context.setPropertyResolved(true);
            return true;
        }
        return false;
    }

    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
        ArrayList<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>(5);
        FeatureDescriptor descriptor = new FeatureDescriptor();
        descriptor.setName("param");
        descriptor.setDisplayName("param");
        descriptor.setExpert(false);
        descriptor.setHidden(false);
        descriptor.setPreferred(true);
        descriptor.setValue("type", Map.class);
        descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
        list.add(descriptor);
        descriptor = new FeatureDescriptor();
        descriptor.setName("paramValues");
        descriptor.setDisplayName("paramValues");
        descriptor.setExpert(false);
        descriptor.setHidden(false);
        descriptor.setPreferred(true);
        descriptor.setValue("type", Map.class);
        descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
        list.add(descriptor);
        descriptor = new FeatureDescriptor();
        descriptor.setName("header");
        descriptor.setDisplayName("header");
        descriptor.setExpert(false);
        descriptor.setHidden(false);
        descriptor.setPreferred(true);
        descriptor.setValue("type", Map.class);
        descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
        list.add(descriptor);
        descriptor = new FeatureDescriptor();
        descriptor.setName("headerValues");
        descriptor.setDisplayName("headerValues");
        descriptor.setExpert(false);
        descriptor.setHidden(false);
        descriptor.setPreferred(true);
        descriptor.setValue("type", Map.class);
        descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
        list.add(descriptor);
        descriptor = new FeatureDescriptor();
        descriptor.setName("cookie");
        descriptor.setDisplayName("cookie");
        descriptor.setExpert(false);
        descriptor.setHidden(false);
        descriptor.setPreferred(true);
        descriptor.setValue("type", Map.class);
        descriptor.setValue("resolvableAtDesignTime", Boolean.TRUE);
        list.add(descriptor);
        return list.iterator();
    }

    public Class<?> getCommonPropertyType(ELContext context, Object base) {
        if (base == null) {
            return String.class;
        }
        return null;
    }

    /*
     * This class specifies class file version 49.0 but uses Java 6 signatures.  Assumed Java 6.
     */
    private class FilteredMap
    extends AbstractMap<String, Object> {
        private Map<String, Object> map;
        private List<String> blacklist;
        private Set<Map.Entry<String, Object>> entrySet;

        public FilteredMap(Map<String, Object> map, List<String> blacklist) {
            this.map = map;
            this.blacklist = blacklist;
        }

        @Override
        public Set<Map.Entry<String, Object>> entrySet() {
            if (this.entrySet != null) {
                return this.entrySet;
            }
            Set<Map.Entry<String, Object>> original = this.map.entrySet();
            this.entrySet = new HashSet<Map.Entry<String, Object>>(original.size());
            for (Map.Entry<String, Object> e : original) {
                if (this.blacklist.contains(e.getKey().toLowerCase())) continue;
                this.entrySet.add(e);
            }
            return this.entrySet;
        }
    }

}