CVS: TapestryBook/bannerads/src/bannerads/impl Banner.java,NONE,1.1 XMLBannerSource.java,NONE,1.1

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

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

--- NEW FILE: Banner.java ---
package bannerads.impl;

import bannerads.IBanner;

public class Banner implements IBanner
{
    private String _id;
    private String _imageURL;
    private int _width;
    private int _height;
    private String _clickThruURL;
    private String _title;
    private int _impressions;
    private int _clickThrus;

    public String getClickThruURL()
    {
        return _clickThruURL;
    }

    public int getHeight()
    {
        return _height;
    }

    public String getId()
    {
        return _id;
    }

    public String getImageURL()
    {
        return _imageURL;
    }

    public String getTitle()
    {
        return _title;
    }

    public int getWidth()
    {
        return _width;
    }

    public void setClickThruURL(String string)
    {
        _clickThruURL = string;
    }

    public void setHeight(int height)
    {
        _height = height;
    }

    public void setId(String string)
    {
        _id = string;
    }

    public void setImageURL(String string)
    {
        _imageURL = string;
    }

    public void setTitle(String string)
    {
        _title = string;
    }

    public void setWidth(int width)
    {
        _width = width;
    }

	public int getClickThrus()
	{
		return _clickThrus;
	}
	
	public int getImpressions()
	{
		return _impressions;
	}
	
	public void incrementClickThrus()
	{
		_clickThrus++;
	}
	
	public void incrementImpressions()
	{
		_impressions++;
	}
}

--- NEW FILE: XMLBannerSource.java ---
package bannerads.impl;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.ServletContext;

import org.apache.commons.digester.Digester;
import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.IResourceLocation;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.resource.ContextResourceLocation;

import bannerads.IBanner;
import bannerads.IBannerSource;

public class XMLBannerSource implements IBannerSource
{
    private Random random = new Random();

    private String _bannersFile = "banners.xml";

    /**
     * Map of {@link Banner} keyed on (String) banner id.
     */
    private Map _banners;
    private List _bannerIds;

    public IBanner getRandomBanner()
    {
        int count = _bannerIds.size();
        int index = random.nextInt(count);
        String id = (String) _bannerIds.get(index);

        return getBanner(id);
    }

    public IBanner getBanner(String bannerId)
    {
        return (IBanner) _banners.get(bannerId);
    }

    public void recordImpression(String bannerId)
    {
		Banner b = (Banner)getBanner(bannerId);
		b.incrementImpressions();
		
    }

    public void recordClickthru(String bannerId)
    {
		Banner b = (Banner)getBanner(bannerId);
		b.incrementClickThrus();
    }

    /**
     * Initializes the list of banners from the a file
     * stored in WEB-INF.
     */
    public synchronized void initialize(IRequestCycle cycle)
    {
        if (_banners == null)
        {
            ServletContext servletContext =
                cycle.getRequestContext().getServlet().getServletContext();
            IResourceLocation location =
                new ContextResourceLocation(servletContext, "WEB-INF/" + _bannersFile);

            Banner[] banners = read(location);

            _banners = new HashMap();
            _bannerIds = new ArrayList();

            for (int i = 0; i < banners.length; i++)
            {
                String id = banners[i].getId();
                _bannerIds.add(id);
                _banners.put(id, banners[i]);
            }
        }
    }

    public String getBannersFile()
    {
        return _bannersFile;
    }

    public void setBannersFile(String string)
    {
        _bannersFile = string;
    }

	public Banner[] read(IResourceLocation location)
	 {
		 Digester digester = new Digester();

		 digester.addObjectCreate("banner-ads", ArrayList.class);
		 digester.addObjectCreate("banner-ads/banner", Banner.class);

		 // The attribute names match the property names, so this can do it all.
		 digester.addSetProperties("banner-ads/banner");
		 
		 // This adds each banner instance to the list, by
		 // invoking method add() on the ArrayList.
		 
		 digester.addSetNext("banner-ads/banner", "add");

		 URL fileURL = location.getResourceURL();
		 List banners = null;
		 try
		 {

			 InputStream stream = fileURL.openStream();

			 banners = (List) digester.parse(stream);

			 stream.close();
		 }
		 catch (Exception ex)
		 {
			 throw new ApplicationRuntimeException("Unable to read banner ads file " + location, ex);
		 }

		 int count = Tapestry.size(banners);

		 return (Banner[]) banners.toArray(new Banner[count]);
	 }
}



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