All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.jawr.web.wicket.AbstractJawrReference Maven / Gradle / Ivy

There is a newer version: 3.9
Show newest version
/**
 * Copyright 2009-2012 Ibrahim Chaehoi
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 * 
 * 	http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language governing permissions
 * and limitations under the License.
 */
package net.jawr.web.wicket;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.http.HttpServletRequest;

import net.jawr.web.context.ThreadLocalJawrContext;
import net.jawr.web.resource.bundle.handler.ResourceBundlesHandler;
import net.jawr.web.resource.bundle.renderer.BundleRenderer;
import net.jawr.web.resource.bundle.renderer.BundleRendererContext;
import net.jawr.web.servlet.RendererRequestUtils;
import net.jawr.web.util.StringUtils;

import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.Response;
import org.apache.wicket.util.value.IValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This class defines the abstract class for the Jawr CSS and Stylesheet
 * references for Wicket.
 * 
 * @autor Robert Kopaczewski (Original author)
 * @author Ibrahim Chaehoi
 */
public abstract class AbstractJawrReference extends WebMarkupContainer {

	/** The serial version UID */
	private static final long serialVersionUID = 6483803210055728200L;

	/** The logger */
	private static final Logger LOGGER = LoggerFactory
			.getLogger(AbstractJawrReference.class);

	/** The bundle renderer */
	protected BundleRenderer renderer;

	/** The flag indicating if we must use the random parameter */
	protected String useRandomParam;

	/**
	 * Constructor
	 * 
	 * @param id
	 *            the ID
	 */
	public AbstractJawrReference(String id) {
		super(id);
	}

	@Override
	protected void onRender() {

		MarkupStream markupStream = findMarkupStream();
		try {
			final ComponentTag openTag = markupStream.getTag();
			final ComponentTag tag = openTag.mutable();
			final IValueMap attributes = tag.getAttributes();

			// Initialize attributes
			String src = getReferencePath(attributes);

			// src is mandatory
			if (null == src) {
				throw new IllegalStateException(
						"The src attribute is mandatory for this Jawr reference tag. ");
			}

			ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest();
			HttpServletRequest request = servletWebRequest
					.getContainerRequest();

			// Get an instance of the renderer.
			ResourceBundlesHandler rsHandler = (ResourceBundlesHandler) request
					.getSession().getServletContext()
					.getAttribute(getResourceHandlerAttributeName());
			if (null == rsHandler) {
				throw new IllegalStateException(
						"ResourceBundlesHandler not present in servlet context. Initialization of Jawr either failed or never occurred.");
			}

			// Refresh the config if needed
			if (RendererRequestUtils.refreshConfigIfNeeded(request,
					rsHandler.getConfig())) {
				rsHandler = (ResourceBundlesHandler) request.getSession()
						.getServletContext()
						.getAttribute(getResourceHandlerAttributeName());
			}

			Boolean useRandomFlag = null;
			if (StringUtils.isNotEmpty(useRandomParam)) {
				useRandomFlag = Boolean.valueOf(useRandomParam);
			}
			BundleRenderer renderer = createRenderer(rsHandler, useRandomFlag,
					tag);

			// set the debug override
			RendererRequestUtils.setRequestDebuggable(request, renderer
					.getBundler().getConfig());

			final Response response = getResponse();
			Writer writer = new RedirectWriter(response);
			BundleRendererContext ctx = RendererRequestUtils
					.getBundleRendererContext(request, renderer);

			renderer.renderBundleLinks(src, ctx, writer);
		} catch (IOException ex) {
			LOGGER.error("onRender() error : ", ex);
		} finally {
			// Reset the Thread local for the Jawr context
			ThreadLocalJawrContext.reset();
		}

		markupStream.skipComponent();
	}

	/**
	 * Returns the reference path
	 * 
	 * @param attributes
	 *            the attributes
	 * @return the reference path
	 */
	protected abstract String getReferencePath(final IValueMap attributes);

	/**
	 * Returns the resource bundle attribute name
	 * 
	 * @return the resource bundle attribute name
	 */
	protected abstract String getResourceHandlerAttributeName();

	/**
	 * Create the tag renderer.
	 * 
	 * @param rsHandler
	 *            the resource bundle handler
	 * @param useRandomParam
	 *            the flag indicating if we must use random parameter in debug
	 *            mode
	 * @param tag
	 *            the tag
	 * @return the tag renderer.
	 */
	protected abstract BundleRenderer createRenderer(
			ResourceBundlesHandler rsHandler, Boolean useRandomParam,
			ComponentTag tag);

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy