implemented very simple ad rotation support, good enough for our rotating
quote banners - also included quote banners (20 from Webb, 4 new)
|
@ -405,6 +405,15 @@ CREATE TABLE postpublish (
|
|||
INDEX display_order (on_date, postid)
|
||||
);
|
||||
|
||||
# Advertisement (actually quote, for now) banners
|
||||
CREATE TABLE adverts (
|
||||
adid INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
|
||||
imagepath VARCHAR(255) NOT NULL,
|
||||
pathstyle SMALLINT NOT NULL DEFAULT 0,
|
||||
caption VARCHAR(255),
|
||||
linkurl VARCHAR(255)
|
||||
);
|
||||
|
||||
##############################################################################
|
||||
# Set table access rights
|
||||
##############################################################################
|
||||
|
@ -1331,6 +1340,33 @@ INSERT INTO refsigftr (ftr_code, is_default, is_locked, is_hidden, require_read,
|
|||
(2, 0, 1, 1, 0, 10000, 63000, 'SYSA', 'System Administration', 'sysadmin'),
|
||||
(3, 1, 0, 0, 1, 500, 0, 'CONF', 'Conferences', 'confops');
|
||||
|
||||
# Create the initial advertisements (quotes).
|
||||
INSERT INTO adverts (imagepath) VALUES
|
||||
('images/ads/Brown.gif'),
|
||||
('images/ads/Caine.gif'),
|
||||
('images/ads/Frost.gif'),
|
||||
('images/ads/Keller.gif'),
|
||||
('images/ads/Letterman.gif'),
|
||||
('images/ads/Pooh.gif'),
|
||||
('images/ads/Shakespeare.gif'),
|
||||
('images/ads/Thomas.gif'),
|
||||
('images/ads/WolinskiTeamwork.gif'),
|
||||
('images/ads/Wonder.gif'),
|
||||
('images/ads/bonaparte.gif'),
|
||||
('images/ads/buscaglia.gif'),
|
||||
('images/ads/dana.gif'),
|
||||
('images/ads/deadpoets.gif'),
|
||||
('images/ads/ford.gif'),
|
||||
('images/ads/karen.gif'),
|
||||
('images/ads/lynett.gif'),
|
||||
('images/ads/mcauliffe.gif'),
|
||||
('images/ads/midler.gif'),
|
||||
('images/ads/sophocles.gif'),
|
||||
('images/ads/talbert.gif'),
|
||||
('images/ads/torvalds.gif'),
|
||||
('images/ads/wonka.gif'),
|
||||
('images/ads/worf.gif');
|
||||
|
||||
##############################################################################
|
||||
# Database Initialization
|
||||
##############################################################################
|
||||
|
|
37
src/com/silverwrist/venice/core/Advertisement.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (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.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.core;
|
||||
|
||||
public interface Advertisement
|
||||
{
|
||||
// Image path style values.
|
||||
public static final short CONTEXT_RELATIVE = 0;
|
||||
|
||||
public abstract int getAdID();
|
||||
|
||||
public abstract String getImagePath();
|
||||
|
||||
public abstract short getImagePathStyle();
|
||||
|
||||
public abstract String getCaption();
|
||||
|
||||
public abstract String getLinkURL();
|
||||
|
||||
public abstract void hit(String remote_addr);
|
||||
|
||||
} // end interface Advertisement
|
|
@ -107,4 +107,6 @@ public interface UserContext extends SearchMode
|
|||
|
||||
public abstract boolean authenticateWithToken(String token) throws DataException;
|
||||
|
||||
public abstract Advertisement selectAd();
|
||||
|
||||
} // end interface UserContext
|
||||
|
|
|
@ -77,4 +77,8 @@ public interface VeniceEngine extends SearchMode
|
|||
|
||||
public abstract int getNumAuditRecordsPerPage();
|
||||
|
||||
public abstract Advertisement getAdByID(int id);
|
||||
|
||||
public abstract Advertisement selectAd();
|
||||
|
||||
} // end interface VeniceEngine
|
||||
|
|
195
src/com/silverwrist/venice/core/impl/AdvertisementImpl.java
Normal file
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (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.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.core.impl;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.Random;
|
||||
import com.silverwrist.util.cachemap.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.db.*;
|
||||
|
||||
class AdvertisementImpl implements Advertisement
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Random rng = new Random(System.currentTimeMillis());
|
||||
private static CacheMap ad_cache = new CacheMap(500);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private DataPool datapool;
|
||||
private int adid;
|
||||
private String imagepath;
|
||||
private short style;
|
||||
private String caption;
|
||||
private String linkurl;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected AdvertisementImpl(DataPool datapool, ResultSet rs) throws SQLException
|
||||
{
|
||||
this.datapool = datapool;
|
||||
this.adid = rs.getInt("adid");
|
||||
this.imagepath = rs.getString("imagepath");
|
||||
this.style = rs.getShort("pathstyle");
|
||||
this.caption = rs.getString("caption");
|
||||
this.linkurl = rs.getString("linkurl");
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Advertisement getTheAd(DataPool datapool, Statement stmt, int ad_id) throws SQLException
|
||||
{
|
||||
Integer my_ad_id = new Integer(ad_id);
|
||||
Advertisement rc = (Advertisement)(ad_cache.get(my_ad_id));
|
||||
if (rc!=null)
|
||||
return rc;
|
||||
|
||||
ResultSet rs = stmt.executeQuery("SELECT * From adverts WHERE adid = " + ad_id + ";");
|
||||
if (!(rs.next()))
|
||||
return null;
|
||||
rc = new AdvertisementImpl(datapool,rs);
|
||||
ad_cache.put(my_ad_id,rc);
|
||||
return rc;
|
||||
|
||||
} // end getTheAd
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface Advertisement
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int getAdID()
|
||||
{
|
||||
return adid;
|
||||
|
||||
} // end getAdID
|
||||
|
||||
public String getImagePath()
|
||||
{
|
||||
return imagepath;
|
||||
|
||||
} // end getImagePath
|
||||
|
||||
public short getImagePathStyle()
|
||||
{
|
||||
return style;
|
||||
|
||||
} // end getImagePathStyle
|
||||
|
||||
public String getCaption()
|
||||
{
|
||||
return caption;
|
||||
|
||||
} // end getCaption
|
||||
|
||||
public String getLinkURL()
|
||||
{
|
||||
return linkurl;
|
||||
|
||||
} // end getLinkURL
|
||||
|
||||
public void hit(String remote_addr)
|
||||
{ // this does nothing right now
|
||||
} // end hit
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static functions for use within package
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static Advertisement getAdByID(DataPool datapool, int id)
|
||||
{
|
||||
Connection conn = null;
|
||||
|
||||
try
|
||||
{ // get a database connection and call the internal function
|
||||
conn = datapool.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
return getTheAd(datapool,stmt,id);
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // database error - no ad
|
||||
return null;
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // make sure the connection is released before we go
|
||||
if (conn!=null)
|
||||
datapool.releaseConnection(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
} // end getAdByID
|
||||
|
||||
static Advertisement getRandomAd(DataPool datapool)
|
||||
{
|
||||
Connection conn = null;
|
||||
|
||||
try
|
||||
{ // get a database connection and call the internal function
|
||||
conn = datapool.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT MAX(adid) FROM adverts;");
|
||||
if (!(rs.next()))
|
||||
throw new InternalStateError("getRandomAd() must be able to find MAX(adid)!");
|
||||
int maximum = rs.getInt(1);
|
||||
|
||||
for (int i=0; i<100; i++)
|
||||
{ // select an ad ID
|
||||
int ad_id = rng.nextInt(maximum) + 1;
|
||||
Advertisement rc = getTheAd(datapool,stmt,ad_id);
|
||||
if (rc!=null)
|
||||
return rc;
|
||||
|
||||
} // end for
|
||||
|
||||
// else just dump out and return null
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // database error - no ad
|
||||
return null;
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // make sure the connection is released before we go
|
||||
if (conn!=null)
|
||||
datapool.releaseConnection(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
return null; // no ad
|
||||
|
||||
} // end getRandomAd
|
||||
|
||||
} // end class AdvertisementImpl
|
|
@ -1345,6 +1345,13 @@ class UserContextImpl implements UserContext, UserBackend
|
|||
|
||||
} // end authenticateWithToken
|
||||
|
||||
public Advertisement selectAd()
|
||||
{
|
||||
// just get a random ad for now
|
||||
return AdvertisementImpl.getRandomAd(datapool);
|
||||
|
||||
} // end selectAd
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface UserBackend
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -1567,6 +1567,19 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end getNumAuditRecordsPerPage
|
||||
|
||||
public Advertisement getAdByID(int id)
|
||||
{
|
||||
return AdvertisementImpl.getAdByID(datapool,id);
|
||||
|
||||
} // end getAdByID
|
||||
|
||||
public Advertisement selectAd()
|
||||
{
|
||||
// just get a random ad for now
|
||||
return AdvertisementImpl.getRandomAd(datapool);
|
||||
|
||||
} // end selectAd
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface EngineBackend
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -608,7 +608,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
Variables.flushCookies(request,response);
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
BaseJSPData base = new BaseJSPData(engine,user,getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
|
@ -663,7 +663,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
catch (ServletMultipartException e)
|
||||
{ // this is an error message we need to generate and just bail out on
|
||||
logger.error("ServletMultipartException caught in doVenicePost!",e);
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),
|
||||
BaseJSPData base = new BaseJSPData(engine,user,getMyLocation(request,engine,user,rdat),
|
||||
new ErrorBox(null,"Internal Error: " + e.getMessage(),null));
|
||||
base.transfer(ctxt,rdat);
|
||||
return;
|
||||
|
@ -712,7 +712,7 @@ public abstract class VeniceServlet extends HttpServlet
|
|||
Variables.flushCookies(request,response);
|
||||
if (content!=null)
|
||||
{ // display the content!
|
||||
BaseJSPData base = new BaseJSPData(getMyLocation(request,engine,user,rdat),content);
|
||||
BaseJSPData base = new BaseJSPData(engine,user,getMyLocation(request,engine,user,rdat),content);
|
||||
base.transfer(ctxt,rdat);
|
||||
|
||||
} // end if
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.io.IOException;
|
|||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.servlets.Variables;
|
||||
import com.silverwrist.venice.servlets.format.menus.LeftMenu;
|
||||
|
||||
|
@ -40,6 +41,8 @@ public class BaseJSPData
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private VeniceEngine engine; // the Venice engine
|
||||
private UserContext user; // user context
|
||||
private String location; // location string to use for this page
|
||||
private VeniceContent content; // the actual content
|
||||
private boolean login_links = true; // show login links up top?
|
||||
|
@ -49,8 +52,10 @@ public class BaseJSPData
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public BaseJSPData(String location, VeniceContent content)
|
||||
public BaseJSPData(VeniceEngine engine, UserContext user, String location, VeniceContent content)
|
||||
{
|
||||
this.engine = engine;
|
||||
this.user = user;
|
||||
this.location = location;
|
||||
this.content = content;
|
||||
|
||||
|
@ -116,6 +121,47 @@ public class BaseJSPData
|
|||
|
||||
} // end transfer
|
||||
|
||||
public void renderBannerAd(Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
Advertisement advert;
|
||||
if (user.isLoggedIn())
|
||||
advert = user.selectAd();
|
||||
else
|
||||
advert = engine.selectAd();
|
||||
if (advert==null)
|
||||
{ // no advert found - bail out now!
|
||||
out.write(" ");
|
||||
return;
|
||||
|
||||
} // end if
|
||||
|
||||
String full_image_path;
|
||||
if (advert.getImagePathStyle()==Advertisement.CONTEXT_RELATIVE)
|
||||
{ // return the full image path
|
||||
full_image_path = rdat.getContextRelativePath(advert.getImagePath());
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // can't render the ad - just punt
|
||||
out.write(" ");
|
||||
return;
|
||||
|
||||
} // end else
|
||||
|
||||
// Write the banner ad.
|
||||
String url = advert.getLinkURL();
|
||||
String capt = advert.getCaption();
|
||||
if (url!=null)
|
||||
out.write("<A HREF=\"" + url + "\">");
|
||||
out.write("<IMG SRC=\"" + full_image_path + "\" ALT=\"");
|
||||
if (capt!=null)
|
||||
out.write(capt);
|
||||
out.write("\" ALIGN=RIGHT WIDTH=468 HEIGHT=60 HSPACE=2 VSPACE=2 BORDER=0>");
|
||||
if (url!=null)
|
||||
out.write("</A>");
|
||||
|
||||
} // end renderBannerAd
|
||||
|
||||
public void renderMenu(HttpSession session, Writer out, RenderData rdat) throws IOException
|
||||
{
|
||||
ComponentRender menu = Variables.getMenu(session);
|
||||
|
|
|
@ -190,6 +190,15 @@ public class RenderData
|
|||
|
||||
} // end getStaticIncludePath
|
||||
|
||||
public String getContextRelativePath(String name)
|
||||
{
|
||||
StringBuffer buf = new StringBuffer(request.getContextPath());
|
||||
if (name.charAt(0)!='/')
|
||||
buf.append('/');
|
||||
return buf.append(name).toString();
|
||||
|
||||
} // end getContextRelativePath
|
||||
|
||||
public String getStdFontTag(String color, int size)
|
||||
{
|
||||
return rconf.getStdFontTag(color,size);
|
||||
|
|
|
@ -55,10 +55,7 @@
|
|||
|
||||
<TD ALIGN=RIGHT WIDTH=150>
|
||||
<% if (rdat.useHTMLComments()) { %><!-- Banner Ad --><% } %>
|
||||
<%-- BEGIN TEMP - Banner Ad code --%>
|
||||
<IMG SRC="/venice/images/sample-banner.gif" ALT="Banner Ad - 468x60" ALIGN=RIGHT
|
||||
WIDTH=468 HEIGHT=60 HSPACE=2 VSPACE=2>
|
||||
<%-- END TEMP - Banner Ad Code --%>
|
||||
<% basedat.renderBannerAd(out,rdat); %>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
|
|
BIN
web/images/ads/Brown.gif
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
web/images/ads/Caine.gif
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
web/images/ads/Frost.gif
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
web/images/ads/Keller.gif
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
web/images/ads/Letterman.gif
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
web/images/ads/Pooh.gif
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
web/images/ads/Shakespeare.gif
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
web/images/ads/Thomas.gif
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
web/images/ads/WolinskiTeamwork.gif
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
web/images/ads/Wonder.gif
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
web/images/ads/bonaparte.gif
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
web/images/ads/buscaglia.gif
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
web/images/ads/dana.gif
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
web/images/ads/deadpoets.gif
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
web/images/ads/ford.gif
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
web/images/ads/karen.gif
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
web/images/ads/lynett.gif
Normal file
After Width: | Height: | Size: 6.2 KiB |
BIN
web/images/ads/mcauliffe.gif
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
web/images/ads/midler.gif
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
web/images/ads/sophocles.gif
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
web/images/ads/talbert.gif
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
web/images/ads/torvalds.gif
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
web/images/ads/wonka.gif
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
web/images/ads/worf.gif
Normal file
After Width: | Height: | Size: 2.4 KiB |