001/*
002 * (C) Copyright 2015 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Anahide Tchertchian
016 */
017package org.nuxeo.ecm.web.resources.wro.provider;
018
019import java.util.Collections;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023
024import org.apache.commons.logging.Log;
025import org.apache.commons.logging.LogFactory;
026import org.nuxeo.ecm.web.resources.api.Processor;
027import org.nuxeo.ecm.web.resources.api.service.WebResourceManager;
028import org.nuxeo.runtime.api.Framework;
029
030import ro.isdc.wro.model.resource.locator.UriLocator;
031import ro.isdc.wro.model.resource.processor.ResourcePostProcessor;
032import ro.isdc.wro.model.resource.processor.ResourcePreProcessor;
033import ro.isdc.wro.util.provider.ConfigurableProviderSupport;
034
035/**
036 * Nuxeo contributor to wro processors and locators, registered as a service.
037 *
038 * @since 7.3
039 */
040public class NuxeoConfigurableProvider extends ConfigurableProviderSupport {
041
042    private static final Log log = LogFactory.getLog(NuxeoConfigurableProvider.class);
043
044    public static final String PRE_TYPE = "wroPre";
045
046    public static final String POST_TYPE = "wroPost";
047
048    @Override
049    public Map<String, UriLocator> provideLocators() {
050        Map<String, UriLocator> map = new HashMap<String, UriLocator>();
051        map.put(NuxeoUriLocator.ALIAS, new NuxeoUriLocator());
052        return map;
053    }
054
055    public Map<String, ResourcePreProcessor> providePreProcessors() {
056        Map<String, ResourcePreProcessor> map = new HashMap<String, ResourcePreProcessor>();
057        // extend with runtime service processors registration
058        List<? extends Processor> processors = resolveProcessors(PRE_TYPE);
059        for (Processor p : processors) {
060            Class<?> klass = p.getTargetProcessorClass();
061            if (klass == null) {
062                // assume alias references a native wro processor
063                continue;
064            }
065            ResourcePreProcessor proc;
066            try {
067                proc = (ResourcePreProcessor) klass.newInstance();
068                map.put(p.getName(), proc);
069            } catch (ReflectiveOperationException e) {
070                log.error("Caught error when instanciating resource pre processor", e);
071                continue;
072            }
073        }
074        return map;
075    }
076
077    @Override
078    public Map<String, ResourcePostProcessor> providePostProcessors() {
079        Map<String, ResourcePostProcessor> map = new HashMap<String, ResourcePostProcessor>();
080        // extend with runtime service processors registration
081        List<Processor> processors = resolveProcessors(POST_TYPE);
082        for (Processor p : processors) {
083            Class<?> klass = p.getTargetProcessorClass();
084            if (klass == null) {
085                // assume alias references a native wro processor
086                continue;
087            }
088            ResourcePostProcessor proc;
089            try {
090                proc = (ResourcePostProcessor) klass.newInstance();
091                map.put(p.getName(), proc);
092            } catch (ReflectiveOperationException e) {
093                log.error("Caught error when instanciating resource post processor", e);
094                continue;
095            }
096        }
097        return map;
098    }
099
100    public static List<Processor> resolveProcessors(String type) {
101        WebResourceManager service = Framework.getService(WebResourceManager.class);
102        List<Processor> processors = service.getProcessors(type);
103        if (processors != null) {
104            return processors;
105        }
106        return Collections.emptyList();
107    }
108
109}