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.internal;
018
019import java.util.HashSet;
020import java.util.Set;
021
022import org.apache.wicket.markup.head.HeaderItem;
023import org.apache.wicket.markup.head.IHeaderResponse;
024import org.apache.wicket.request.Response;
025import org.apache.wicket.response.NullResponse;
026
027
028/**
029 * Default implementation of the {@link org.apache.wicket.markup.head.IHeaderResponse} interface.
030 * 
031 * @author Matej Knopp
032 * @author Igor Vaynberg (ivaynberg)
033 */
034public abstract class HeaderResponse implements IHeaderResponse
035{
036        private final Set<Object> rendered = new HashSet<Object>();
037
038        private boolean closed;
039
040        /**
041         * @see org.apache.wicket.markup.head.IHeaderResponse#markRendered(java.lang.Object)
042         */
043        @Override
044        public void markRendered(Object object)
045        {
046                rendered.add(object);
047        }
048
049        @Override
050        public void render(HeaderItem item)
051        {
052                if (!closed && !wasItemRendered(item))
053                {
054                        item.render(getResponse());
055                        markItemRendered(item);
056                }
057        }
058
059        protected boolean wasItemRendered(HeaderItem item)
060        {
061                for (Object curToken : item.getRenderTokens())
062                {
063                        if (wasRendered(curToken))
064                                return true;
065                }
066                return false;
067        }
068
069        protected void markItemRendered(HeaderItem item)
070        {
071                for (Object curToken : item.getRenderTokens())
072                {
073                        markRendered(curToken);
074                }
075        }
076
077        /**
078         * @see org.apache.wicket.markup.head.IHeaderResponse#wasRendered(java.lang.Object)
079         */
080        @Override
081        public boolean wasRendered(Object object)
082        {
083                return rendered.contains(object);
084        }
085
086        /**
087         * @see org.apache.wicket.markup.head.IHeaderResponse#close()
088         */
089        @Override
090        public void close()
091        {
092                closed = true;
093        }
094
095        /**
096         * @see org.apache.wicket.markup.head.IHeaderResponse#getResponse()
097         */
098        @Override
099        public final Response getResponse()
100        {
101                return closed ? NullResponse.getInstance() : getRealResponse();
102        }
103
104        /**
105         * @see org.apache.wicket.markup.head.IHeaderResponse#isClosed()
106         */
107        @Override
108        public boolean isClosed()
109        {
110                return closed;
111        }
112
113        /**
114         * Once the HeaderResponse is closed, no output may be written to it anymore. To enforce that,
115         * the {@link #getResponse()} is defined final in this class and will return a NullResponse
116         * instance once closed or otherwise the Response provided by this method.
117         * 
118         * @return Response
119         */
120        protected abstract Response getRealResponse();
121}