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.markup.head.filter;
018
019import java.util.ArrayList;
020import java.util.List;
021import java.util.Objects;
022
023import org.apache.wicket.markup.head.HeaderItem;
024import org.apache.wicket.markup.head.IWrappedHeaderItem;
025import org.apache.wicket.request.Response;
026
027/**
028 * {@link HeaderItem} that specifies the filter it belongs to. Dependencies of a
029 * {@code FilteredHeaderItem} belong to the same filter. If used in conjunction with
030 * {@link JavaScriptFilteredIntoFooterHeaderResponse}, use
031 * {@link FilteringHeaderResponse#DEFAULT_HEADER_FILTER_NAME DEFAULT_HEADER_FILTER_NAME} to render
032 * items in the header.
033 * 
034 * @author papegaaij
035 */
036public class FilteredHeaderItem extends HeaderItem implements IWrappedHeaderItem
037{
038        private static final long serialVersionUID = 1L;
039
040        private final HeaderItem wrapped;
041
042        private final String filterName;
043
044        /**
045         * Construct.
046         * 
047         * @param wrapped
048         *            the actual {@link HeaderItem}
049         * @param filterName
050         *            the name of the filter this item belongs to
051         */
052        public FilteredHeaderItem(HeaderItem wrapped, String filterName)
053        {
054                this.wrapped = wrapped;
055                this.filterName = filterName;
056        }
057
058        /**
059         * @return the actual {@link HeaderItem}
060         */
061        @Override
062        public HeaderItem getWrapped()
063        {
064                return wrapped;
065        }
066
067        @Override
068        public FilteredHeaderItem wrap(HeaderItem item)
069        {
070                return new FilteredHeaderItem(item, getFilterName());
071        }
072
073        /**
074         * @return the name of the filter this item belongs to
075         */
076        public String getFilterName()
077        {
078                return filterName;
079        }
080
081        @Override
082        public Iterable<?> getRenderTokens()
083        {
084                return getWrapped().getRenderTokens();
085        }
086
087        @Override
088        public void render(Response response)
089        {
090                getWrapped().render(response);
091        }
092
093        @Override
094        public List<HeaderItem> getDependencies()
095        {
096                List<FilteredHeaderItem> ret = new ArrayList<>();
097                for (HeaderItem curDependency : getWrapped().getDependencies())
098                {
099                        ret.add(wrap(curDependency));
100                }
101                List<HeaderItem> dependencies = super.getDependencies();
102                dependencies.addAll(ret);
103                return dependencies;
104        }
105
106        @Override
107        public Iterable<? extends HeaderItem> getProvidedResources()
108        {
109                return getWrapped().getProvidedResources();
110        }
111
112        @Override
113        public int hashCode()
114        {
115                return Objects.hash(wrapped, filterName);
116        }
117
118        @Override
119        public boolean equals(Object o)
120        {
121                if (this == o) return true;
122                if (o == null || getClass() != o.getClass()) return false;
123                FilteredHeaderItem that = (FilteredHeaderItem) o;
124                return Objects.equals(wrapped, that.wrapped) &&
125                                Objects.equals(filterName, that.filterName);
126        }
127
128        @Override
129        public String toString()
130        {
131                return "FilteredHeaderItem(" + getWrapped() + ", " + getFilterName() + ")";
132        }
133}