LinkCheckerTransformerFactory.java 7.62 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.apache.felix.scr.annotations.Activate
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Properties
 *  org.apache.felix.scr.annotations.Property
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.ReferenceCardinality
 *  org.apache.felix.scr.annotations.ReferencePolicy
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.apache.sling.commons.osgi.OsgiUtil
 *  org.apache.sling.rewriter.Transformer
 *  org.apache.sling.rewriter.TransformerFactory
 *  org.osgi.service.component.ComponentContext
 *  org.osgi.service.event.Event
 *  org.osgi.service.event.EventHandler
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.rewriter.linkchecker.impl;

import com.day.cq.rewriter.linkchecker.LinkChecker;
import com.day.cq.rewriter.linkchecker.LinkCheckerConfigProvider;
import com.day.cq.rewriter.linkchecker.impl.LinkCheckerTransformer;
import com.day.cq.rewriter.linkchecker.impl.LinkCheckerTransformerConfig;
import com.day.cq.rewriter.pipeline.RequestLinkChecker;
import com.day.cq.rewriter.pipeline.RequestRewriter;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.osgi.OsgiUtil;
import org.apache.sling.rewriter.Transformer;
import org.apache.sling.rewriter.TransformerFactory;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component(label="%linkcheckertransformer.name", description="%linkcheckertransformer.description", metatype=1, immediate=1)
@Service(value={TransformerFactory.class, EventHandler.class, LinkCheckerConfigProvider.class})
@Properties(value={@Property(name="pipeline.type", value={"linkchecker"}, propertyPrivate=1), @Property(name="event.topics", value={"org/apache/sling/api/resource/*"}, propertyPrivate=1)})
public class LinkCheckerTransformerFactory
implements TransformerFactory,
EventHandler,
LinkCheckerConfigProvider {
    private static final Logger log = LoggerFactory.getLogger((String)LinkCheckerTransformerFactory.class.getName());
    private static final boolean DEFAULT_DISABLE_REWRITING = false;
    private static final String REPOSITORY_READER_SERVICE = "repository-reader-service";
    @Property(boolValue={0})
    private static final String PROP_DISABLE_REWRITING = "linkcheckertransformer.disableRewriting";
    private static final boolean DEFAULT_DISABLE_CHECKING = false;
    @Property(boolValue={0})
    private static final String PROP_DISABLE_CHECKING = "linkcheckertransformer.disableChecking";
    private static final int DEFAULT_MAP_CACHE_SIZE = 5000;
    @Property(intValue={5000})
    private static final String PROP_MAP_CACHE_SIZE = "linkcheckertransformer.mapCacheSize";
    private static final boolean DEFAULT_STRICT_EXTENSION_CHECK = false;
    @Property(boolValue={0})
    private static final String PROP_STRICT_EXTENSION_CHECK = "linkcheckertransformer.strictExtensionCheck";
    private static final boolean DEFAULT_STRIP_HTML_EXTENSION = false;
    @Property(boolValue={0})
    private static final String PROP_STRIP_HTML_EXTENSION = "linkcheckertransformer.stripHtmltExtension";
    @Property(value={"a:href", "area:href", "form:action"})
    private static final String PROP_REWRITE_ELEMENTS = "linkcheckertransformer.rewriteElements";
    @Reference
    private LinkChecker linkChecker;
    @Reference
    private ResourceResolverFactory resourceResolverFactory;
    @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY, policy=ReferencePolicy.DYNAMIC)
    private volatile RequestLinkChecker requestLinkChecker;
    @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY, policy=ReferencePolicy.DYNAMIC)
    private volatile RequestRewriter requestRewriter;
    private LinkCheckerTransformerConfig config;

    @Activate
    protected void activate(ComponentContext ctx) throws LoginException {
        Dictionary props = ctx.getProperties();
        this.config = new LinkCheckerTransformerConfig(OsgiUtil.toBoolean(props.get("linkcheckertransformer.disableRewriting"), (boolean)false), OsgiUtil.toBoolean(props.get("linkcheckertransformer.disableChecking"), (boolean)false), OsgiUtil.toBoolean(props.get("linkcheckertransformer.strictExtensionCheck"), (boolean)false), OsgiUtil.toBoolean(props.get("linkcheckertransformer.stripHtmltExtension"), (boolean)false), OsgiUtil.toInteger(props.get("linkcheckertransformer.mapCacheSize"), (int)5000), OsgiUtil.toStringArray(props.get("linkcheckertransformer.rewriteElements"), (String[])new String[]{"a:href", "area:href", "form:action"}));
    }

    public Transformer createTransformer() {
        ResourceResolver serviceResourceResolver = null;
        try {
            serviceResourceResolver = this.resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap("sling.service.subservice", "repository-reader-service"));
        }
        catch (LoginException e) {
            log.error("Could not create service resource resolver.", (Throwable)e);
        }
        return new LinkCheckerTransformer(this.linkChecker, this.requestLinkChecker, this.requestRewriter, this.config, serviceResourceResolver);
    }

    public void handleEvent(Event event) {
        String path = (String)event.getProperty("path");
        if (path != null && (path.startsWith("/content") || path.startsWith("/etc/map"))) {
            this.config.clearCache();
        }
    }

    @Override
    public LinkCheckerTransformerConfig getConfig() {
        return this.config;
    }

    protected void bindLinkChecker(LinkChecker linkChecker) {
        this.linkChecker = linkChecker;
    }

    protected void unbindLinkChecker(LinkChecker linkChecker) {
        if (this.linkChecker == linkChecker) {
            this.linkChecker = null;
        }
    }

    protected void bindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        this.resourceResolverFactory = resourceResolverFactory;
    }

    protected void unbindResourceResolverFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.resourceResolverFactory == resourceResolverFactory) {
            this.resourceResolverFactory = null;
        }
    }

    protected void bindRequestLinkChecker(RequestLinkChecker requestLinkChecker) {
        this.requestLinkChecker = requestLinkChecker;
    }

    protected void unbindRequestLinkChecker(RequestLinkChecker requestLinkChecker) {
        if (this.requestLinkChecker == requestLinkChecker) {
            this.requestLinkChecker = null;
        }
    }

    protected void bindRequestRewriter(RequestRewriter requestRewriter) {
        this.requestRewriter = requestRewriter;
    }

    protected void unbindRequestRewriter(RequestRewriter requestRewriter) {
        if (this.requestRewriter == requestRewriter) {
            this.requestRewriter = null;
        }
    }
}