001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.wicket.resource;
018
019import java.util.ArrayList;
020import java.util.Arrays;
021import java.util.List;
022
023import org.apache.wicket.javascript.IJavaScriptCompressor;
024
025/**
026 * Used to apply several {@link IJavaScriptCompressor} to the javascript compression.<br>
027 * <br>
028 * Usage:
029 * 
030 * <pre>
031 * CompositeJavaScriptCompressor compositeJavaScriptCompressor = new CompositeJavaScriptCompressor();
032 * 
033 * compositeJavaScriptCompressor.add(new MyJavaScriptCompressor());
034 * compositeJavaScriptCompressor.add(new AnotherJavaScriptCompressor());
035 * 
036 * this.getResourceSettings().setJavaScriptCompressor(compositeJavaScriptCompressor);
037 * </pre>
038 * The compressors can also be given as constructor arguments.
039 * 
040 * @since 6.20.0
041 * @author Tobias Soloschenko
042 */
043public class CompositeJavaScriptCompressor implements IScopeAwareTextResourceProcessor, IJavaScriptCompressor
044{
045        /* Compressors to compress javascript content */
046        private final List<IJavaScriptCompressor> compressors = new ArrayList<>();
047
048        /**
049         * Initializes the composite javascript compressor with the given {@link IJavaScriptCompressor}(s)
050         * 
051         * @param compressors
052         *            The {@link IJavaScriptCompressor}(s) this composite javascript compressor is
053         *            initialized with
054         */
055        public CompositeJavaScriptCompressor(IJavaScriptCompressor... compressors)
056        {
057                this.compressors.addAll(Arrays.asList(compressors));
058        }
059
060        /**
061         * Compresses the given original content in the order of compressors. If no compressor has been
062         * given the original content is going to be returned.
063         */
064        @Override
065        public String process(String input, Class<?> scope, String name)
066        {
067                String compressed = input;
068                for (IJavaScriptCompressor compressor : compressors)
069                {
070                        if (compressor instanceof IScopeAwareTextResourceProcessor)
071                        {
072                                IScopeAwareTextResourceProcessor processor = (IScopeAwareTextResourceProcessor)compressor;
073                                compressed = processor.process(compressed, scope, name);
074                        }
075                        else
076                        {
077                                compressed = compressor.compress(compressed);
078                        }
079                }
080                return compressed;
081        }
082
083        @Override
084        public String compress(String original)
085        {
086                throw new UnsupportedOperationException(CompositeCssCompressor.class.getSimpleName() +
087                                ".process() should be used instead!");
088        }
089
090        /**
091         * Adds a IJavaScriptCompressor to the list of delegates.
092         * 
093         * @return {@code this} instance, for chaining
094         */
095        public CompositeJavaScriptCompressor add(IJavaScriptCompressor compressor)
096        {
097                compressors.add(compressor);
098                return this;
099        }
100}