CVS: TapestryBook/bannerads/src/bannerads/components BannerAd.java,NONE,1.1 BannerService.java,NONE,1.1

Howard Lewis Ship <[email protected]> Thu, 01 May 2003 10:39:24 -0700
Newsgroups gmane.comp.java.tapestry.cvs
Message-ID <[email protected]>
Update of /cvsroot/tapestry/TapestryBook/bannerads/src/bannerads/components
In directory sc8-pr-cvs1:/tmp/cvs-serv13484/bannerads/src/bannerads/components

Added Files:
	BannerAd.java BannerService.java 
Log Message:
Add new example for banner ads (services + components).

--- NEW FILE: BannerAd.java ---
package bannerads.components;

import org.apache.tapestry.AbstractComponent;
import org.apache.tapestry.IEngine;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.IEngineService;
import org.apache.tapestry.engine.ILink;

import bannerads.IBanner;
import bannerads.IBannerSource;

/**
 * Renders a &lt;a&gt; tag around a &lt;img&gt; tag; this consistitues a
 * banner impression.
 */
public class BannerAd extends AbstractComponent
{

    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
    {
        if (cycle.isRewinding())
            return;

        IBanner banner = getRandomBanner(cycle);
        IEngineService service = cycle.getEngine().getService(BannerService.SERVICE_NAME);

        ILink link = service.getLink(cycle, this, new Object[] { banner.getId()});

        writer.begin("a");
        writer.attribute("href", link.getURL());
        renderInformalParameters(writer, cycle);

        writer.beginEmpty("img");
        writer.attribute("src", banner.getImageURL());
        writer.attribute("width", banner.getWidth());
        writer.attribute("height", banner.getHeight());
        writer.attribute("alt", banner.getTitle());
        writer.attribute("border", 0);

        writer.end(); // <a>
    }

    private IBanner getRandomBanner(IRequestCycle cycle)
    {
        IEngine engine = cycle.getEngine();
        IBannerSource source =
            (IBannerSource) engine.getSpecification().getExtension(
                BannerService.BANNER_SOURCE_EXTENSION_NAME,
                IBannerSource.class);

        source.initialize(cycle);

        return source.getRandomBanner();
    }

}

--- NEW FILE: BannerService.java ---
package bannerads.components;

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.tapestry.IComponent;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.RedirectException;
import org.apache.tapestry.engine.AbstractService;
import org.apache.tapestry.engine.IEngineServiceView;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.request.ResponseOutputStream;

import bannerads.IBanner;
import bannerads.IBannerSource;

public class BannerService extends AbstractService
{
    public static final String SERVICE_NAME = "bannerads.banner";

    /**
     * Name ("<code>bannerads.banner-source</code>")
     * of an application extension that implements
     * {@link bannerads.IBannerSource}. 
     */
    public static final String BANNER_SOURCE_EXTENSION_NAME = "bannerads.banner-source";

    /**
     *  The lone parameter should be the banner id.
     */
    public ILink getLink(IRequestCycle cycle, IComponent component, Object[] parameters)
    {
        return constructLink(cycle, SERVICE_NAME, null, parameters, false);
    }

    public void service(
        IEngineServiceView engine,
        IRequestCycle cycle,
        ResponseOutputStream output)
        throws ServletException, IOException
    {
        IBannerSource source =
            (IBannerSource) engine.getSpecification().getExtension(
                BANNER_SOURCE_EXTENSION_NAME,
                IBannerSource.class);

        source.initialize(cycle);

        Object[] parameters = getParameters(cycle);

        String bannerId = (String) parameters[0];

        IBanner banner = source.getBanner(bannerId);
        source.recordClickthru(bannerId);

        throw new RedirectException(banner.getClickThruURL());
    }

    public String getName()
    {
        return SERVICE_NAME;
    }

}



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf