completed the transition away from features and toward "services" - the old
database-based configuration has been replaced with the new XML-based one. This paves the way for further modularization of the code.
This commit is contained in:
parent
85518ca0d5
commit
f5a5009932
|
@ -53,7 +53,7 @@
|
|||
<!-- Members service -->
|
||||
<service id="Members" index="4">
|
||||
<setup default="true" locked="true"/>
|
||||
<access permission="Community.Read"/>
|
||||
<access permission="Community.Read" role="Community.Member"/>
|
||||
<link sequence="4800" href="members?sig=${cid}" type="servlet">Members</link>
|
||||
</service>
|
||||
|
||||
|
|
|
@ -198,22 +198,6 @@ CREATE TABLE refcategory (
|
|||
UNIQUE INDEX display (parent, name)
|
||||
);
|
||||
|
||||
# A reference to feature codes and what they mean.
|
||||
CREATE TABLE refsigftr (
|
||||
ftr_code SMALLINT NOT NULL PRIMARY KEY,
|
||||
is_default TINYINT DEFAULT 0,
|
||||
is_locked TINYINT DEFAULT 0,
|
||||
is_hidden TINYINT DEFAULT 0,
|
||||
require_read TINYINT DEFAULT 1,
|
||||
sequence SMALLINT NOT NULL,
|
||||
min_level SMALLINT UNSIGNED DEFAULT 0,
|
||||
symbol CHAR(4) NOT NULL,
|
||||
name VARCHAR(64) NOT NULL,
|
||||
applet VARCHAR(64) NOT NULL,
|
||||
UNIQUE INDEX name_x (name),
|
||||
UNIQUE index sequence_x (sequence)
|
||||
);
|
||||
|
||||
# The table mapping SIGs and their associated features.
|
||||
CREATE TABLE sigftrs (
|
||||
sigid INT NOT NULL,
|
||||
|
@ -472,18 +456,18 @@ INSERT INTO refaudit (type, descr) VALUES
|
|||
(111, 'Admin Change User Account'),
|
||||
(112, 'Admin Set Account Security'),
|
||||
(113, 'Admin Lock/Unlock Account'),
|
||||
(201, 'Create New SIG'),
|
||||
(202, 'Set SIG Membership'),
|
||||
(203, 'Set SIG Contact Info'),
|
||||
(204, 'Set SIG Feature Set'),
|
||||
(205, 'Set SIG Name'),
|
||||
(206, 'Set SIG Alias'),
|
||||
(207, 'Set SIG Category'),
|
||||
(208, 'Set SIG Hiding Information'),
|
||||
(209, 'Set SIG Members-Only Flag'),
|
||||
(210, 'Set SIG Join Key'),
|
||||
(211, 'Set SIG Security Levels'),
|
||||
(212, 'Delete SIG'),
|
||||
(201, 'Create New Community'),
|
||||
(202, 'Set Community Membership'),
|
||||
(203, 'Set Community Contact Info'),
|
||||
(204, 'Set Community Services'),
|
||||
(205, 'Set Community Name'),
|
||||
(206, 'Set Community Alias'),
|
||||
(207, 'Set Community Category'),
|
||||
(208, 'Set Community Hiding Information'),
|
||||
(209, 'Set Community Members-Only Flag'),
|
||||
(210, 'Set Community Join Key'),
|
||||
(211, 'Set Community Security Levels'),
|
||||
(212, 'Delete Community'),
|
||||
(301, 'Create New Conference'),
|
||||
(302, 'Set Conference Security Levels'),
|
||||
(303, 'Set Conference Name'),
|
||||
|
@ -874,15 +858,6 @@ INSERT INTO refcategory (catid, parent, symlink, name) VALUES
|
|||
# Make sure the special "System" category is hidden.
|
||||
UPDATE refcategory SET hide_dir = 1, hide_search = 1 WHERE catid = 15;
|
||||
|
||||
# Populate the Features reference table.
|
||||
INSERT INTO refsigftr (ftr_code, is_default, is_locked, is_hidden, require_read, sequence, min_level,
|
||||
symbol, name, applet) VALUES
|
||||
(0, 1, 1, 1, 0, 4900, 0, 'PROF', 'Profile', 'sigprofile'),
|
||||
(1, 1, 1, 1, 0, 5000, 57000, 'ADMN', 'Administration', 'sigadmin'),
|
||||
(2, 0, 1, 1, 0, 10000, 63000, 'SYSA', 'System Administration', 'sysadmin'),
|
||||
(3, 1, 0, 0, 1, 500, 0, 'CONF', 'Conferences', 'confops'),
|
||||
(4, 1, 1, 0, 1, 4800, 0, 'MEMB', 'Members', 'members');
|
||||
|
||||
# Create the initial advertisements (quotes).
|
||||
INSERT INTO adverts (imagepath) VALUES
|
||||
('images/ads/Brown.gif'),
|
||||
|
|
|
@ -20,6 +20,7 @@ package com.silverwrist.venice.core;
|
|||
import java.util.BitSet;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import com.silverwrist.venice.except.AccessError;
|
||||
import com.silverwrist.venice.except.DataException;
|
||||
import com.silverwrist.venice.except.EmailException;
|
||||
|
@ -68,13 +69,11 @@ public interface CommunityContext extends SearchMode
|
|||
|
||||
public abstract void putContactInfo(ContactInfo ci) throws DataException, AccessError;
|
||||
|
||||
public abstract BitSet getFeatures();
|
||||
public abstract Set getServices();
|
||||
|
||||
public abstract void setFeatures(BitSet feature_set, BitSet mask) throws DataException, AccessError;
|
||||
public abstract Set getConfiguredServices();
|
||||
|
||||
public abstract List getCommunityFeaturesList();
|
||||
|
||||
public abstract String getDefaultApplet();
|
||||
public abstract void setServiceEnable(ServiceToken token, boolean enable) throws AccessError, DataException;
|
||||
|
||||
public abstract void setName(String name) throws DataException, AccessError;
|
||||
|
||||
|
@ -98,9 +97,9 @@ public interface CommunityContext extends SearchMode
|
|||
|
||||
public abstract void setMembersOnly(boolean flag) throws DataException, AccessError;
|
||||
|
||||
public abstract short getInitialFeatureIndex();
|
||||
public abstract ServiceToken getDefaultService();
|
||||
|
||||
public abstract void setInitialFeatureIndex(short ndx) throws DataException, AccessError;
|
||||
public abstract void setDefaultService(ServiceToken token) throws AccessError, DataException;
|
||||
|
||||
public abstract String getJoinKey() throws DataException, AccessError;
|
||||
|
||||
|
|
|
@ -17,16 +17,14 @@
|
|||
*/
|
||||
package com.silverwrist.venice.core;
|
||||
|
||||
public interface CommunityFeature
|
||||
public interface ServiceGroup
|
||||
{
|
||||
public abstract int getFeatureCode();
|
||||
public static final int SVCGRP_GLOBAL = 0;
|
||||
|
||||
public abstract String getSymbol();
|
||||
public static final int SVCGRP_COMMUNITY = 1;
|
||||
|
||||
public abstract String getName();
|
||||
public static final int SVCGRP_USER = 2;
|
||||
|
||||
public abstract String getApplet();
|
||||
public static final int NUM_SVCGRPS = 3;
|
||||
|
||||
public abstract int getSequence();
|
||||
|
||||
} // end interface CommunityFeature
|
||||
} // end interface ServiceGroup
|
110
src/com/silverwrist/venice/core/ServiceToken.java
Normal file
110
src/com/silverwrist/venice/core/ServiceToken.java
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* 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 class ServiceToken implements Comparable, ServiceGroup
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private int group;
|
||||
private String symbol;
|
||||
private int index;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected ServiceToken(int group, String symbol, int index)
|
||||
{
|
||||
this.group = group;
|
||||
this.symbol = symbol;
|
||||
this.index = index;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class Object
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public boolean equals(Object o)
|
||||
{
|
||||
if ((o==null) || !(o instanceof ServiceToken))
|
||||
return false;
|
||||
ServiceToken other = (ServiceToken)o;
|
||||
return ((this.group==other.group) && (this.symbol.equals(other.symbol)));
|
||||
|
||||
} // end equals
|
||||
|
||||
public int hashCode()
|
||||
{
|
||||
return (group << 24) ^ symbol.hashCode();
|
||||
|
||||
} // end hashCode
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return symbol;
|
||||
|
||||
} // end toString
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface Comparable
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int compareTo(Object o)
|
||||
{
|
||||
if (o==null)
|
||||
throw new NullPointerException("compareTo null object!");
|
||||
ServiceToken other = (ServiceToken)o; // may throw ClassCastException
|
||||
int rc = this.group - other.group;
|
||||
if (rc!=0)
|
||||
return rc;
|
||||
return this.symbol.compareTo(other.symbol);
|
||||
|
||||
} // end compareTo
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final int getGroup()
|
||||
{
|
||||
return group;
|
||||
|
||||
} // end getGroup
|
||||
|
||||
public final String getSymbol()
|
||||
{
|
||||
return symbol;
|
||||
|
||||
} // end getSymbol
|
||||
|
||||
public final int getIndex()
|
||||
{
|
||||
return index;
|
||||
|
||||
} // end getIndex
|
||||
|
||||
} // end class ServiceToken
|
|
@ -27,16 +27,12 @@ import com.silverwrist.venice.except.DataException;
|
|||
import com.silverwrist.venice.except.EmailException;
|
||||
import com.silverwrist.venice.htmlcheck.HTMLChecker;
|
||||
|
||||
public interface VeniceEngine extends SearchMode
|
||||
public interface VeniceEngine extends SearchMode, ServiceGroup
|
||||
{
|
||||
public abstract void initialize(Document config, String app_root) throws ConfigException, DataException;
|
||||
|
||||
public abstract void shutdown() throws ConfigException;
|
||||
|
||||
public abstract int getNumFeatures();
|
||||
|
||||
public abstract BitSet getAllFeaturesMask();
|
||||
|
||||
public abstract UserContext createUserContext(String remote_addr) throws DataException;
|
||||
|
||||
public abstract String getEmailAddressForUser(String username) throws DataException, AccessError;
|
||||
|
|
|
@ -28,6 +28,7 @@ import com.silverwrist.venice.core.*;
|
|||
import com.silverwrist.venice.core.internals.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
|
||||
class CommunityCoreData implements CommunityData, CommunityDataBackend
|
||||
{
|
||||
|
@ -94,17 +95,17 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
private boolean hidden_search; // hidden from keyword searches?
|
||||
private boolean members_only; // only members allowed in this community?
|
||||
private boolean is_admin; // is this the administrative community?
|
||||
private short initial_feature; // the "initial" feature to display for this community
|
||||
private String name; // the name of this community
|
||||
private String language; // the default language code
|
||||
private String synopsis; // the synopsis of the community
|
||||
private String rules; // the community "rules"
|
||||
private String alias; // the community alias value
|
||||
private boolean public_comm; // is this a public community?
|
||||
private BitSet features; // set of available features
|
||||
private ObjectCache conf_objcache = new ObjectCache(new ConferenceCommunityContextImplCreator());
|
||||
private boolean deleted = false; // has this community been deleted?
|
||||
private OptionSet flags; // property flags
|
||||
private HashSet services; // services for this community
|
||||
private ServiceToken initial_service; // the initial service
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -152,13 +153,18 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end while
|
||||
|
||||
// get the community feature set
|
||||
// get the set of community services
|
||||
services = new HashSet();
|
||||
sql.setLength(0);
|
||||
sql.append("SELECT ftr_code FROM sigftrs WHERE sigid = ").append(cid).append(';');
|
||||
rs = stmt.executeQuery(sql.toString());
|
||||
features = new BitSet();
|
||||
while (rs.next())
|
||||
features.set(rs.getInt("ftr_code"));
|
||||
{ // get the service tokens and return them
|
||||
ServiceToken token = env.getSCM().getTokenForIndex(ServiceControl.SVCGRP_COMMUNITY,rs.getInt(1));
|
||||
if (token!=null)
|
||||
services.add(token);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
|
@ -178,7 +184,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
protected CommunityCoreData(EnvEngine env, int cid, java.util.Date creation,
|
||||
String name, String alias, int host_uid, String language, String synopsis,
|
||||
String rules, String joinkey, boolean hide_dir, boolean hide_search,
|
||||
BitSet features)
|
||||
int[] levels, Set services)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("new CommunityCoreData for BRAND NEW COMMUNITY " + cid);
|
||||
|
@ -188,11 +194,11 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
this.created = creation;
|
||||
this.last_access = creation;
|
||||
this.last_update = creation;
|
||||
this.read_level = new_env.getDefaultRole("Community.Read").getLevel();
|
||||
this.write_level = new_env.getDefaultRole("Community.Write").getLevel();
|
||||
this.create_level = new_env.getDefaultRole("Community.Create").getLevel();
|
||||
this.delete_level = new_env.getDefaultRole("Community.Delete").getLevel();
|
||||
this.join_level = new_env.getDefaultRole("Community.Join").getLevel();
|
||||
this.read_level = levels[0];
|
||||
this.write_level = levels[1];
|
||||
this.create_level = levels[2];
|
||||
this.delete_level = levels[3];
|
||||
this.join_level = levels[4];
|
||||
this.contactid = -1;
|
||||
this.host_uid = host_uid;
|
||||
this.category_id = 0;
|
||||
|
@ -200,15 +206,15 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
this.hidden_search = hide_search;
|
||||
this.members_only = true;
|
||||
this.is_admin = false;
|
||||
this.initial_feature = 0;
|
||||
this.name = name;
|
||||
this.language = language;
|
||||
this.synopsis = synopsis;
|
||||
this.rules = rules;
|
||||
this.alias = alias;
|
||||
this.public_comm = StringUtil.isStringEmpty(joinkey);
|
||||
this.features = (BitSet)(features.clone());
|
||||
this.flags = new OptionSet();
|
||||
this.services = new HashSet(services);
|
||||
this.initial_service = env.getSCM().getTokenForIndex(ServiceControl.SVCGRP_COMMUNITY,0);
|
||||
if (env.getEngine().getParamBoolean(EngineBackend.BP_POSTPICTURES))
|
||||
flags.set(BP_POSTPICTURES);
|
||||
|
||||
|
@ -237,7 +243,6 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
hidden_search = rs.getBoolean("hide_search");
|
||||
members_only = rs.getBoolean("membersonly");
|
||||
is_admin = rs.getBoolean("is_admin");
|
||||
initial_feature = rs.getShort("init_ftr");
|
||||
name = rs.getString("signame");
|
||||
language = rs.getString("language");
|
||||
synopsis = rs.getString("synopsis");
|
||||
|
@ -251,6 +256,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
else // Admin is NEVER a public community!
|
||||
public_comm = false;
|
||||
alias = rs.getString("alias");
|
||||
initial_service = env.getSCM().getTokenForIndex(ServiceControl.SVCGRP_COMMUNITY,rs.getShort("init_ftr"));
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("Loaded data for community \"" + name + "\" (ID " + cid + ", alias '" + alias
|
||||
|
@ -578,17 +584,53 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end putContactInfo
|
||||
|
||||
public BitSet getFeatureSet()
|
||||
public Set getServices()
|
||||
{
|
||||
return (BitSet)(features.clone());
|
||||
return Collections.unmodifiableSet((Set)(services.clone()));
|
||||
|
||||
} // end getFeatureSet
|
||||
} // end getServices
|
||||
|
||||
public synchronized void putFeatureSet(EnvCommunity outer, BitSet set) throws DataException
|
||||
public Set getServices(EnvCommunity outer)
|
||||
{
|
||||
HashSet tmp = new HashSet();
|
||||
Iterator it = services.iterator();
|
||||
while (it.hasNext())
|
||||
{ // get the service associated with the token
|
||||
ServiceToken token = (ServiceToken)(it.next());
|
||||
CommService svc = (CommService)(env.getSCM().getServiceForToken(token));
|
||||
|
||||
// Check the permission first.
|
||||
String perm = svc.getPermission();
|
||||
if (perm!=null)
|
||||
{ // test the permission against the outer environment
|
||||
if (!(outer.testPermission(perm)))
|
||||
continue; // permission failed - just go on to the next one
|
||||
|
||||
} // end if
|
||||
|
||||
if (outer.satisfy(svc.getRole()))
|
||||
tmp.add(token);
|
||||
|
||||
} // end getServices
|
||||
|
||||
if (tmp.isEmpty())
|
||||
return Collections.EMPTY_SET;
|
||||
else
|
||||
return Collections.unmodifiableSet(tmp);
|
||||
|
||||
} // end getServices
|
||||
|
||||
public synchronized void setServiceEnable(EnvCommunity outer, ServiceToken token, boolean enable)
|
||||
throws DataException
|
||||
{
|
||||
if (deleted)
|
||||
throw new DataException("This community has been deleted.");
|
||||
|
||||
if (enable && services.contains(token))
|
||||
return;
|
||||
if (!enable && !(services.contains(token)))
|
||||
return;
|
||||
|
||||
Connection conn = null; // database connection
|
||||
AuditRecord ar = null; // audit record
|
||||
|
||||
|
@ -599,35 +641,26 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
stmt.executeUpdate("LOCK TABLES sigftrs WRITE;");
|
||||
|
||||
try
|
||||
{ // first, delete all the old entries
|
||||
StringBuffer sql = new StringBuffer("DELETE FROM sigftrs WHERE sigid = ");
|
||||
sql.append(cid).append(';');
|
||||
stmt.executeUpdate(sql.toString());
|
||||
|
||||
// now, add all the new entries
|
||||
sql.setLength(0);
|
||||
for (int i=0; i<set.length(); i++)
|
||||
{ // test all the bits in the new feature set
|
||||
if (set.get(i))
|
||||
{ // append the appropriate element to the SQL statement we're building
|
||||
if (sql.length()==0)
|
||||
sql.append("INSERT INTO sigftrs (sigid, ftr_code) VALUES ");
|
||||
else
|
||||
sql.append(", ");
|
||||
sql.append('(').append(cid).append(", ").append(i).append(')');
|
||||
|
||||
} // end if
|
||||
|
||||
} // end for
|
||||
|
||||
if (sql.length()>0)
|
||||
{ // add the features to the database
|
||||
sql.append(';');
|
||||
stmt.executeUpdate(sql.toString());
|
||||
{ // execute the right statement
|
||||
StringBuffer sql;
|
||||
if (enable)
|
||||
{ // create an INSERT statement
|
||||
sql = new StringBuffer("INSERT INTO sigftrs (sigid, ftr_code) VALUES (");
|
||||
sql.append(cid).append(", ").append(token.getIndex()).append(");");
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // create a DELETE statement
|
||||
sql = new StringBuffer("DELETE FROM sigftrs WHERE sigid = ");
|
||||
sql.append(cid).append(" AND ftr_code = ").append(token.getIndex()).append(';');
|
||||
|
||||
features = set;
|
||||
} // end else
|
||||
|
||||
stmt.executeUpdate(sql.toString());
|
||||
if (enable)
|
||||
services.add(token);
|
||||
else
|
||||
services.remove(token);
|
||||
|
||||
} // end try
|
||||
finally
|
||||
|
@ -665,21 +698,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
} // end putFeatureSet
|
||||
|
||||
public List getCommunityFeaturesList(int level)
|
||||
{
|
||||
return env.getEngine().getCommunityFeatureSet(features,level,canReadCommunitySubObjects(level));
|
||||
|
||||
} // end getCommunityFeaturesList
|
||||
|
||||
public String getDefaultApplet()
|
||||
{
|
||||
StringBuffer buf = new StringBuffer(env.getEngine().getAppletForFeature(initial_feature));
|
||||
buf.append("?sig=").append(cid);
|
||||
return buf.toString();
|
||||
|
||||
} // end getDefaultApplet
|
||||
} // end setServiceEnable
|
||||
|
||||
public synchronized void setName(EnvCommunity outer, String name) throws DataException
|
||||
{
|
||||
|
@ -1076,13 +1095,13 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end setMembersOnly
|
||||
|
||||
public short getInitialFeatureIndex()
|
||||
public ServiceToken getDefaultService()
|
||||
{
|
||||
return initial_feature;
|
||||
return initial_service;
|
||||
|
||||
} // end getInitialFeatureIndex
|
||||
} // end getDefaultService
|
||||
|
||||
public synchronized void setInitialFeatureIndex(short ndx) throws DataException
|
||||
public synchronized void setDefaultService(ServiceToken token) throws DataException
|
||||
{
|
||||
if (deleted)
|
||||
throw new DataException("This community has been deleted.");
|
||||
|
@ -1094,11 +1113,11 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
conn = env.getConnection();
|
||||
Statement stmt = conn.createStatement();
|
||||
StringBuffer sql = new StringBuffer("UPDATE sigs SET init_ftr = ");
|
||||
sql.append(ndx).append(", lastupdate = '");
|
||||
sql.append(token.getIndex()).append(", lastupdate = '");
|
||||
java.util.Date now = new java.util.Date();
|
||||
sql.append(SQLUtil.encodeDate(now)).append("' WHERE sigid = ").append(cid).append(';');
|
||||
stmt.executeUpdate(sql.toString());
|
||||
initial_feature = ndx;
|
||||
initial_service = token;
|
||||
last_update = now;
|
||||
|
||||
} // end try
|
||||
|
@ -1114,7 +1133,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
} // end setInitialFeatureIndex
|
||||
} // end setDefaultService
|
||||
|
||||
public String getJoinKey() throws DataException
|
||||
{
|
||||
|
@ -1435,17 +1454,13 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end getMemberCount
|
||||
|
||||
public boolean isFeaturePresent(String symbol)
|
||||
public boolean hasService(ServiceToken token)
|
||||
{
|
||||
if (deleted)
|
||||
return false;
|
||||
int ndx = env.getEngine().getFeatureIndexBySymbol(symbol);
|
||||
if (ndx>=0)
|
||||
return features.get(ndx);
|
||||
else
|
||||
return false;
|
||||
return services.contains(token);
|
||||
|
||||
} // end isFeaturePresent
|
||||
} // end hasService
|
||||
|
||||
public synchronized ConferenceCommunityContext getConferenceDataObject(int confid) throws DataException
|
||||
{
|
||||
|
@ -1954,12 +1969,11 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
boolean hide_search) throws DataException, AccessError
|
||||
{
|
||||
Connection conn = null; // database connection
|
||||
BitSet def_features = env.getEngine().getDefaultFeaturesMask();
|
||||
int new_cid; // ID of the new community
|
||||
java.util.Date creation; // creation date!
|
||||
AuditRecord ar = null; // the audit record
|
||||
CommunityCoreData comm; // the new community that gets returned
|
||||
|
||||
|
||||
try
|
||||
{ // get a database connection and create the appropriate SELECT statement
|
||||
conn = env.getConnection();
|
||||
|
@ -1981,14 +1995,15 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
+ "rules, joinkey, alias) VALUES ('");
|
||||
creation = new java.util.Date();
|
||||
String creation_str = SQLUtil.encodeDate(creation);
|
||||
int level_read = env.getCommunityDefaultRole("Community.Read").getLevel();
|
||||
int level_write = env.getCommunityDefaultRole("Community.Write").getLevel();
|
||||
int level_create = env.getCommunityDefaultRole("Community.Create").getLevel();
|
||||
int level_delete = env.getCommunityDefaultRole("Community.Delete").getLevel();
|
||||
int level_join = env.getCommunityDefaultRole("Community.Join").getLevel();
|
||||
int[] levels = new int[5];
|
||||
levels[0] = env.getCommunityDefaultRole("Community.Read").getLevel();
|
||||
levels[1] = env.getCommunityDefaultRole("Community.Write").getLevel();
|
||||
levels[2] = env.getCommunityDefaultRole("Community.Create").getLevel();
|
||||
levels[3] = env.getCommunityDefaultRole("Community.Delete").getLevel();
|
||||
levels[4] = env.getCommunityDefaultRole("Community.Join").getLevel();
|
||||
sql.append(creation).append("', '").append(creation).append("', '").append(creation).append("', ");
|
||||
sql.append(level_read).append(", ").append(level_write).append(", ").append(level_create).append(", ");
|
||||
sql.append(level_delete).append(", ").append(level_join).append(", ").append(host_uid).append(", ");
|
||||
sql.append(levels[0]).append(", ").append(levels[1]).append(", ").append(levels[2]).append(", ");
|
||||
sql.append(levels[3]).append(", ").append(levels[4]).append(", ").append(host_uid).append(", ");
|
||||
sql.append(hide_dir ? '1' : '0').append(", ").append(hide_search ? '1' : '0').append(", ");
|
||||
sql.append(SQLUtil.encodeStringArg(name)).append(", ").append(SQLUtil.encodeStringArg(language));
|
||||
sql.append(", ").append(SQLUtil.encodeStringArg(synopsis)).append(", ");
|
||||
|
@ -2011,22 +2026,22 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
|
||||
} // end else
|
||||
|
||||
if (def_features.length()>0)
|
||||
{ // need to build the community's defined feature set
|
||||
// Assign the new community the default services for new communities.
|
||||
Set default_service = env.getSCM().getDefaultServices(ServiceControl.SVCGRP_COMMUNITY);
|
||||
if (default_service.size()>0)
|
||||
{ // build the communty's defined service set
|
||||
sql.setLength(0);
|
||||
for (int i=0; i<def_features.length(); i++)
|
||||
{ // look for set bits in the feature set
|
||||
if (def_features.get(i))
|
||||
{ // build up the SQL statement piece by piece
|
||||
if (sql.length()==0)
|
||||
sql.append("INSERT INTO sigftrs (sigid, ftr_code) VALUES ");
|
||||
else
|
||||
sql.append(", ");
|
||||
sql.append('(').append(new_cid).append(", ").append(i).append(')');
|
||||
|
||||
} // end if
|
||||
|
||||
} // end for
|
||||
Iterator it = default_service.iterator();
|
||||
while (it.hasNext())
|
||||
{ // appeand each clause to the string in turn
|
||||
ServiceToken token = (ServiceToken)(it.next());
|
||||
if (sql.length()==0)
|
||||
sql.append("INSERT INTO sigftrs (sigid, ftr_code) VALUES ");
|
||||
else
|
||||
sql.append(", ");
|
||||
sql.append('(').append(new_cid).append(", ").append(token.getIndex()).append(')');
|
||||
|
||||
} // end while
|
||||
|
||||
// close out the SQL statement
|
||||
sql.append(';');
|
||||
|
@ -2050,7 +2065,7 @@ class CommunityCoreData implements CommunityData, CommunityDataBackend
|
|||
// Create the CommunityCoreData object representing this community and register it with the engine's
|
||||
// community data object cache.
|
||||
comm = new CommunityCoreData(env,new_cid,creation,name,alias,host_uid,language,synopsis,rules,joinkey,
|
||||
hide_dir,hide_search,def_features);
|
||||
hide_dir,hide_search,levels,default_service);
|
||||
comm.newProperties(conn);
|
||||
|
||||
} // end try
|
||||
|
|
|
@ -27,6 +27,7 @@ import com.silverwrist.venice.db.*;
|
|||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.security.Role;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
|
||||
class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
||||
{
|
||||
|
@ -82,6 +83,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
private CommunitySimpleDataCache cache; // cache object for name and alias
|
||||
private CommunityData data = null; // the actual community data
|
||||
private boolean deleted = false; // has this community been deleted?
|
||||
private ServiceToken x_conf_token; // token for Conferences service
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
|
@ -97,6 +99,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
this.cid = cid;
|
||||
setMemberValues(granted_level,true,locked);
|
||||
this.cache = new CommunitySimpleDataCache(name,alias);
|
||||
this.x_conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -111,6 +114,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
this.show_admin = false;
|
||||
this.locked = false;
|
||||
this.cache = new CommunitySimpleDataCache(name,alias);
|
||||
this.x_conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -124,6 +128,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
this.cache = null; // no cache required - we have the CommunityData
|
||||
this.data = data;
|
||||
setMemberValues(new_env.getDefaultRole("Community.Creator").getLevel(),true,true);
|
||||
this.x_conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -198,7 +203,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
if (deleted)
|
||||
throw new DataException("This community has been deleted.");
|
||||
|
||||
if (!(getData().isFeaturePresent("CONF")))
|
||||
if (!(getData().hasService(x_conf_token)))
|
||||
{ // the community doesn't use conferencing
|
||||
logger.error("the community doesn't use conferencing");
|
||||
throw new AccessError("This community does not use the conferencing feature.");
|
||||
|
@ -206,7 +211,21 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
} // end if
|
||||
|
||||
getData().testMembership(level,is_member);
|
||||
if (!(env.getEngine().canAccessFeature("CONF",level,getData().canReadCommunitySubObjects(level))))
|
||||
CommService svc = (CommService)(env.getSCM().getServiceForToken(x_conf_token));
|
||||
String perm = svc.getPermission();
|
||||
if (perm!=null)
|
||||
{ // test the permission
|
||||
if (!(env.testPermission(perm)))
|
||||
{ // you can't access the conferences!
|
||||
logger.error("user not permitted to read confs from this community");
|
||||
throw new AccessError("You are not permitted to access this community's conferences.");
|
||||
|
||||
} // end if
|
||||
|
||||
} // end if
|
||||
|
||||
Role r = svc.getRole();
|
||||
if (!(r.isSatisfiedBy(level)))
|
||||
{ // you can't access the conferences!
|
||||
logger.error("user not permitted to read confs from this community");
|
||||
throw new AccessError("You are not permitted to access this community's conferences.");
|
||||
|
@ -479,64 +498,48 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
|
||||
} // end putContactInfo
|
||||
|
||||
public BitSet getFeatures()
|
||||
public Set getServices()
|
||||
{
|
||||
CommunityData d = getDataNE();
|
||||
if (d!=null)
|
||||
return d.getFeatureSet();
|
||||
return d.getServices(env);
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end getFeatures
|
||||
} // end getServices
|
||||
|
||||
public void setFeatures(BitSet feature_set, BitSet mask) throws DataException, AccessError
|
||||
public Set getConfiguredServices()
|
||||
{
|
||||
CommunityData d = getDataNE();
|
||||
if (d!=null)
|
||||
return d.getServices();
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end getConfiguredServices
|
||||
|
||||
public void setServiceEnable(ServiceToken token, boolean enable) throws AccessError, DataException
|
||||
{
|
||||
if (token.getGroup()!=ServiceToken.SVCGRP_COMMUNITY)
|
||||
throw new IllegalArgumentException("Not a community service token.");
|
||||
Service svc = env.getSCM().getServiceForToken(token);
|
||||
if (svc==null)
|
||||
throw new IllegalArgumentException("Invalid service token.");
|
||||
|
||||
getData().testMembership(level,is_member);
|
||||
if (!(getData().canModifyCommunityProfile(level)))
|
||||
{ // this user can't modify the community feature set
|
||||
logger.error("user not permitted to modify the community's feature set");
|
||||
throw new AccessError("You are not permitted to modify the community's feature set.");
|
||||
logger.error("user not permitted to modify the community's information");
|
||||
throw new AccessError("You are not permitted to modify the community's information.");
|
||||
|
||||
} // end if
|
||||
|
||||
// Adjust the "mask"...this function cannot affect the set of "locked" features.
|
||||
BitSet real_mask = (BitSet)(mask.clone());
|
||||
real_mask.andNot(env.getEngine().getLockedFeaturesMask());
|
||||
if (svc.isLocked())
|
||||
return; // can't modify the state of a locked service
|
||||
|
||||
// Figure out which bits are being carried over from the old feature set.
|
||||
BitSet new_features = getData().getFeatureSet();
|
||||
new_features.andNot(real_mask);
|
||||
getData().setServiceEnable(env,token,enable);
|
||||
|
||||
// Figure out which bits are being set by the new feature set.
|
||||
BitSet update_bits = (BitSet)(feature_set.clone());
|
||||
update_bits.and(real_mask);
|
||||
|
||||
// Put the features together to result in the final feature set, which we set down in
|
||||
// the "back end" class.
|
||||
new_features.or(update_bits);
|
||||
getData().putFeatureSet(env,new_features);
|
||||
|
||||
} // end setFeatures
|
||||
|
||||
public List getCommunityFeaturesList()
|
||||
{
|
||||
CommunityData d = getDataNE();
|
||||
if (d!=null)
|
||||
return d.getCommunityFeaturesList(level);
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end getCommunityFeaturesList
|
||||
|
||||
public String getDefaultApplet()
|
||||
{
|
||||
CommunityData d = getDataNE();
|
||||
if (d!=null)
|
||||
return d.getDefaultApplet();
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end getDefaultApplet
|
||||
} // end setServiceEnable
|
||||
|
||||
public void setName(String name) throws DataException, AccessError
|
||||
{
|
||||
|
@ -710,25 +713,25 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
|
||||
} // end setMembersOnly
|
||||
|
||||
public short getInitialFeatureIndex()
|
||||
public ServiceToken getDefaultService()
|
||||
{
|
||||
CommunityData d = getDataNE();
|
||||
if (d!=null)
|
||||
return d.getInitialFeatureIndex();
|
||||
return d.getDefaultService();
|
||||
else
|
||||
return 0;
|
||||
return null;
|
||||
|
||||
} // end getInitialFeatureIndex
|
||||
} // end getDefaultService
|
||||
|
||||
public void setInitialFeatureIndex(short ndx) throws DataException, AccessError
|
||||
public void setDefaultService(ServiceToken token) throws AccessError, DataException
|
||||
{
|
||||
if (!(env.getEngine().isValidInitialFeatureIndex(ndx)))
|
||||
{ // the mode is not valid
|
||||
logger.error("feature index value " + String.valueOf(ndx) + " is not valid");
|
||||
throw new IllegalArgumentException("invalid initial feature index");
|
||||
|
||||
} // end if
|
||||
|
||||
if (token.getGroup()!=ServiceToken.SVCGRP_COMMUNITY)
|
||||
throw new IllegalArgumentException("Not a community service token.");
|
||||
Service svc = env.getSCM().getServiceForToken(token);
|
||||
if (svc==null)
|
||||
throw new IllegalArgumentException("Invalid service token.");
|
||||
if (!(getData().hasService(token)))
|
||||
throw new DataException("This service is not enabled for this community.");
|
||||
getData().testMembership(level,is_member);
|
||||
if (!(getData().canModifyCommunityProfile(level)))
|
||||
{ // this user can't modify the community feature set
|
||||
|
@ -737,9 +740,9 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
|
||||
} // end if
|
||||
|
||||
getData().setInitialFeatureIndex(ndx);
|
||||
getData().setDefaultService(token);
|
||||
|
||||
} // end setInitialFeatureIndex
|
||||
} // end setDefaultService
|
||||
|
||||
public String getJoinKey() throws DataException, AccessError
|
||||
{
|
||||
|
@ -1056,7 +1059,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
boolean hide_list) throws DataException, AccessError
|
||||
{
|
||||
getData().testMembership(level,is_member);
|
||||
if (!(getData().isFeaturePresent("CONF")))
|
||||
if (!(getData().hasService(x_conf_token)))
|
||||
{ // we can't create a conference in this community
|
||||
logger.error("this community does not use conferencing");
|
||||
throw new AccessError("You are not permitted to create conferences in this community.");
|
||||
|
@ -1085,7 +1088,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
return false;
|
||||
if (!(d.checkMembership(level,is_member)))
|
||||
return false;
|
||||
if (d.isFeaturePresent("CONF"))
|
||||
if (d.hasService(x_conf_token))
|
||||
return d.canCreateCommunitySubObjects(level);
|
||||
else
|
||||
return false;
|
||||
|
@ -1120,7 +1123,7 @@ class CommunityUserContextImpl implements CommunityContext, CommunityBackend
|
|||
return false;
|
||||
if (!(d.checkMembership(level,is_member)))
|
||||
return false;
|
||||
if (d.isFeaturePresent("CONF"))
|
||||
if (d.hasService(x_conf_token))
|
||||
return d.canCreateCommunitySubObjects(level);
|
||||
else
|
||||
return false;
|
||||
|
|
|
@ -17,17 +17,35 @@
|
|||
*/
|
||||
package com.silverwrist.venice.core.impl;
|
||||
|
||||
import java.lang.ref.*;
|
||||
import java.util.*;
|
||||
import org.apache.log4j.*;
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.core.ServiceGroup;
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
import com.silverwrist.venice.util.XMLLoader;
|
||||
|
||||
class ServiceControlManager
|
||||
class ServiceControlManager implements ServiceControl
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class implementing ServiceTokens that allows them to be constructed
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static class MyServiceToken extends ServiceToken
|
||||
{
|
||||
public MyServiceToken(int group, String symbol, int index)
|
||||
{
|
||||
super(group,symbol,index);
|
||||
|
||||
} // end constructor
|
||||
|
||||
} // end class MyServiceToken
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal "Community Service Site" class
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -41,6 +59,17 @@ class ServiceControlManager
|
|||
|
||||
} // end class MyCommServiceSite
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal "Service Predicate" class
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
abstract class ServicePredicate
|
||||
{
|
||||
public abstract boolean test(Service svc);
|
||||
|
||||
} // end class ServicePredicate
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -53,15 +82,17 @@ class ServiceControlManager
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Map comm_symbol_to_service;
|
||||
private Map comm_index_to_service;
|
||||
private Map[] symbol_to_service = new Map[NUM_SVCGRPS];
|
||||
private Map[] index_to_service = new Map[NUM_SVCGRPS];
|
||||
private SoftReference[] list_all_cache = new SoftReference[NUM_SVCGRPS];
|
||||
private SoftReference[] list_default_cache = new SoftReference[NUM_SVCGRPS];
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
ServiceControlManager(Document cfg, SecurityMonitor sm_global, SecurityMonitor sm_comm)
|
||||
ServiceControlManager(Document cfg, SecurityMonitorEnvironment sm_env)
|
||||
throws ConfigException
|
||||
{
|
||||
XMLLoader loader = XMLLoader.get();
|
||||
|
@ -70,12 +101,16 @@ class ServiceControlManager
|
|||
NodeList nl;
|
||||
int i;
|
||||
|
||||
symbol_to_service[SVCGRP_GLOBAL] = Collections.EMPTY_MAP;
|
||||
index_to_service[SVCGRP_GLOBAL] = Collections.EMPTY_MAP;
|
||||
|
||||
// Get the "community" section
|
||||
Element sect = root_h.getSubElement("community");
|
||||
if (sect!=null)
|
||||
{ // load the services for the section
|
||||
HashMap tmp_symbol_to_service = new HashMap();
|
||||
HashMap tmp_index_to_service = new HashMap();
|
||||
SecurityMonitor sm_comm = sm_env.getMonitor("Community");
|
||||
nl = sect.getChildNodes();
|
||||
for (i=0; i<nl.getLength(); i++)
|
||||
{ // get each element node...
|
||||
|
@ -83,30 +118,40 @@ class ServiceControlManager
|
|||
if ((n.getNodeType()==Node.ELEMENT_NODE) && (n.getNodeName().equals("service")))
|
||||
{ // create the appropriate service settings
|
||||
CommService svc = initCommunityService((Element)n,sm_comm);
|
||||
tmp_symbol_to_service.put(svc.getSymbol(),svc);
|
||||
tmp_index_to_service.put(new Integer(svc.getIndex()),svc);
|
||||
tmp_symbol_to_service.put(svc.getToken().getSymbol(),svc);
|
||||
tmp_index_to_service.put(new Integer(svc.getToken().getIndex()),svc);
|
||||
|
||||
} // end if
|
||||
|
||||
} // end for
|
||||
|
||||
if (tmp_symbol_to_service.size()>0)
|
||||
comm_symbol_to_service = Collections.unmodifiableMap(tmp_symbol_to_service);
|
||||
symbol_to_service[SVCGRP_COMMUNITY] = Collections.unmodifiableMap(tmp_symbol_to_service);
|
||||
else
|
||||
comm_symbol_to_service = Collections.EMPTY_MAP;
|
||||
symbol_to_service[SVCGRP_COMMUNITY] = Collections.EMPTY_MAP;
|
||||
if (tmp_index_to_service.size()>0)
|
||||
comm_index_to_service = Collections.unmodifiableMap(tmp_index_to_service);
|
||||
index_to_service[SVCGRP_COMMUNITY] = Collections.unmodifiableMap(tmp_index_to_service);
|
||||
else
|
||||
comm_index_to_service = Collections.EMPTY_MAP;
|
||||
index_to_service[SVCGRP_COMMUNITY] = Collections.EMPTY_MAP;
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // no community services - undo this
|
||||
comm_symbol_to_service = Collections.EMPTY_MAP;
|
||||
comm_index_to_service = Collections.EMPTY_MAP;
|
||||
symbol_to_service[SVCGRP_COMMUNITY] = Collections.EMPTY_MAP;
|
||||
index_to_service[SVCGRP_COMMUNITY] = Collections.EMPTY_MAP;
|
||||
|
||||
} // end else
|
||||
|
||||
symbol_to_service[SVCGRP_USER] = Collections.EMPTY_MAP;
|
||||
index_to_service[SVCGRP_USER] = Collections.EMPTY_MAP;
|
||||
|
||||
for (i=0; i<NUM_SVCGRPS; i++)
|
||||
{ // blank out all our cache arrays
|
||||
list_all_cache[i] = null;
|
||||
list_default_cache[i] = null;
|
||||
|
||||
} // end for
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -114,31 +159,158 @@ class ServiceControlManager
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private CommService initCommunityService(Element root, SecurityMonitor sm) throws ConfigException
|
||||
private static final ServiceToken newToken(int group, Element service) throws ConfigException
|
||||
{
|
||||
XMLLoader loader = XMLLoader.get();
|
||||
|
||||
// Load the symbol and index from the root element.
|
||||
String symbol = loader.configGetAttribute(service,"id");
|
||||
int index = loader.configGetAttributeInt(service,"index");
|
||||
|
||||
return new MyServiceToken(group,symbol,index);
|
||||
|
||||
} // end newToken
|
||||
|
||||
private final CommService initCommunityService(Element root, SecurityMonitor sm) throws ConfigException
|
||||
{
|
||||
ServiceToken token = newToken(SVCGRP_COMMUNITY,root);
|
||||
CommService svc;
|
||||
// FUTURE: do a create of a specific class
|
||||
svc = new StaticCommService();
|
||||
svc.initialize(root,sm,new MyCommServiceSite());
|
||||
svc.initialize(token,root,sm,new MyCommServiceSite());
|
||||
return svc;
|
||||
|
||||
} // end initCommunityService
|
||||
|
||||
private final synchronized Set listServices(int group, ServicePredicate predicate)
|
||||
{
|
||||
HashSet tmp = new HashSet();
|
||||
Iterator it = symbol_to_service[group].values().iterator();
|
||||
while (it.hasNext())
|
||||
{ // get each service in turn
|
||||
Service svc = (Service)(it.next());
|
||||
if (predicate.test(svc))
|
||||
tmp.add(svc.getToken());
|
||||
|
||||
} // end while
|
||||
|
||||
if (tmp.isEmpty())
|
||||
return Collections.EMPTY_SET;
|
||||
else
|
||||
return Collections.unmodifiableSet(tmp);
|
||||
|
||||
} // end listCommunities
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface ServiceControl
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public Set getAllServices(int group)
|
||||
{
|
||||
if ((group<0) || (group>=NUM_SVCGRPS))
|
||||
throw new IndexOutOfBoundsException("group index not valid");
|
||||
synchronized (this)
|
||||
{ // extract the reference
|
||||
Set rc = null;
|
||||
if (list_all_cache[group]!=null)
|
||||
rc = (Set)(list_all_cache[group].get());
|
||||
if (rc==null)
|
||||
{ // need to regenerate the set
|
||||
rc = listServices(group,new ServicePredicate(){
|
||||
public final boolean test(Service svc) { return true; }
|
||||
});
|
||||
|
||||
// cache the result
|
||||
list_all_cache[group] = new SoftReference(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return rc;
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
} // end getAllServices
|
||||
|
||||
public Set getDefaultServices(int group)
|
||||
{
|
||||
if ((group<0) || (group>=NUM_SVCGRPS))
|
||||
throw new IndexOutOfBoundsException("group index not valid");
|
||||
synchronized (this)
|
||||
{ // extract the reference
|
||||
Set rc = null;
|
||||
if (list_default_cache[group]!=null)
|
||||
rc = (Set)(list_default_cache[group].get());
|
||||
if (rc==null)
|
||||
{ // need to regenerate the set
|
||||
rc = listServices(group,new ServicePredicate(){
|
||||
public final boolean test(Service svc) { return svc.isDefault(); }
|
||||
});
|
||||
|
||||
// cache the result
|
||||
list_default_cache[group] = new SoftReference(rc);
|
||||
|
||||
} // end if
|
||||
|
||||
return rc;
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
} // end getDefaultServices
|
||||
|
||||
public Service getServiceForSymbol(int group, String sym)
|
||||
{
|
||||
if ((group<0) || (group>=NUM_SVCGRPS))
|
||||
throw new IndexOutOfBoundsException("group index not valid");
|
||||
return (Service)(symbol_to_service[group].get(sym));
|
||||
|
||||
} // end getServiceForSymbol
|
||||
|
||||
public Service getServiceForToken(ServiceToken token)
|
||||
{
|
||||
return this.getServiceForSymbol(token.getGroup(),token.getSymbol());
|
||||
|
||||
} // end getServiceForToken
|
||||
|
||||
public ServiceToken getTokenForIndex(int group, int ndx)
|
||||
{
|
||||
if ((group<0) || (group>=NUM_SVCGRPS))
|
||||
throw new IndexOutOfBoundsException("group index not valid");
|
||||
Service svc = (Service)(index_to_service[group].get(new Integer(ndx)));
|
||||
return ((svc==null) ? null : svc.getToken());
|
||||
|
||||
} // end getTokenForIndex
|
||||
|
||||
public ServiceToken getTokenForSymbol(int group, String sym)
|
||||
{
|
||||
Service svc = this.getServiceForSymbol(group,sym);
|
||||
return ((svc==null) ? null : svc.getToken());
|
||||
|
||||
} // end getTokenForSymbol
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final void shutdown()
|
||||
public final synchronized void shutdown()
|
||||
{
|
||||
Iterator it = comm_symbol_to_service.values().iterator();
|
||||
while (it.hasNext())
|
||||
{ // shut down each service in turn
|
||||
CommService svc = (CommService)(it.next());
|
||||
svc.shutdown();
|
||||
for (int i=0; i<NUM_SVCGRPS; i++)
|
||||
{ // shutdown all three lists of services
|
||||
Iterator it = symbol_to_service[i].values().iterator();
|
||||
while (it.hasNext())
|
||||
{ // shut down each service in turn
|
||||
Service svc = (Service)(it.next());
|
||||
svc.shutdown();
|
||||
|
||||
} // end while
|
||||
} // end while
|
||||
|
||||
symbol_to_service[i] = Collections.EMPTY_MAP;
|
||||
|
||||
} // end for
|
||||
|
||||
} // end shutdown
|
||||
|
||||
} // end class ServiceControlManager
|
||||
|
||||
|
||||
|
|
|
@ -19,10 +19,10 @@ package com.silverwrist.venice.core.impl;
|
|||
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
import com.silverwrist.venice.util.XMLLoader;
|
||||
|
||||
class StaticCommService implements CommService
|
||||
{
|
||||
|
@ -31,8 +31,7 @@ class StaticCommService implements CommService
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private String symbol;
|
||||
private int index;
|
||||
private ServiceToken token;
|
||||
private boolean is_default;
|
||||
private boolean is_locked;
|
||||
private SecurityMonitor secmon;
|
||||
|
@ -45,21 +44,45 @@ class StaticCommService implements CommService
|
|||
*/
|
||||
|
||||
public StaticCommService()
|
||||
{
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface Service
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void shutdown()
|
||||
{ // do nothing
|
||||
} // end shutdown
|
||||
|
||||
public ServiceToken getToken()
|
||||
{
|
||||
return token;
|
||||
|
||||
} // end getToken
|
||||
|
||||
public boolean isDefault()
|
||||
{
|
||||
return is_default;
|
||||
|
||||
} // end isDefault
|
||||
|
||||
public boolean isLocked()
|
||||
{
|
||||
return is_locked;
|
||||
|
||||
} // end isLocked
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface CommunityService
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void initialize(Element root, SecurityMonitor sm, CommServiceSite site) throws ConfigException
|
||||
public void initialize(ServiceToken token, Element root, SecurityMonitor sm, CommServiceSite site)
|
||||
throws ConfigException
|
||||
{
|
||||
XMLLoader loader = XMLLoader.get();
|
||||
|
||||
// Load the symbol and index from the root element.
|
||||
symbol = loader.configGetAttribute(root,"id");
|
||||
index = loader.configGetAttributeInt(root,"index");
|
||||
this.token = token;
|
||||
|
||||
// Get the setup from the subelement.
|
||||
DOMElementHelper h = new DOMElementHelper(root);
|
||||
|
@ -116,20 +139,16 @@ class StaticCommService implements CommService
|
|||
|
||||
} // end initialize
|
||||
|
||||
public void shutdown()
|
||||
{ // do nothing
|
||||
} // end shutdown
|
||||
|
||||
public String getSymbol()
|
||||
public String getPermission()
|
||||
{
|
||||
return symbol;
|
||||
return permission;
|
||||
|
||||
} // end getSymbol
|
||||
} // end getPermission
|
||||
|
||||
public int getIndex()
|
||||
public Role getRole()
|
||||
{
|
||||
return index;
|
||||
return role;
|
||||
|
||||
} // end getIndex
|
||||
} // end getRole
|
||||
|
||||
} // end class StaticCommService
|
||||
|
|
|
@ -37,100 +37,6 @@ import com.silverwrist.venice.util.XMLLoader;
|
|||
|
||||
public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class storing feature information.
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
class VeniceFeatureDef implements CommunityFeature
|
||||
{
|
||||
int code;
|
||||
String symbol;
|
||||
String name;
|
||||
String applet;
|
||||
boolean is_default;
|
||||
boolean is_locked;
|
||||
boolean is_hidden;
|
||||
boolean requires_read;
|
||||
int sequence;
|
||||
int min_level;
|
||||
|
||||
VeniceFeatureDef(int code, ResultSet rs) throws SQLException
|
||||
{
|
||||
this.code = code;
|
||||
this.is_default = rs.getBoolean("is_default");
|
||||
this.is_locked = rs.getBoolean("is_locked");
|
||||
this.is_hidden = rs.getBoolean("is_hidden");
|
||||
this.requires_read = rs.getBoolean("require_read");
|
||||
this.sequence = rs.getInt("sequence");
|
||||
this.min_level = rs.getInt("min_level");
|
||||
this.symbol = rs.getString("symbol");
|
||||
this.name = rs.getString("name");
|
||||
this.applet = rs.getString("applet");
|
||||
|
||||
} // end constructor
|
||||
|
||||
public int getFeatureCode()
|
||||
{
|
||||
return code;
|
||||
|
||||
} // end getFeatureCode
|
||||
|
||||
public String getSymbol()
|
||||
{
|
||||
return symbol;
|
||||
|
||||
} // end getSymbol
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
|
||||
} // end getName
|
||||
|
||||
public String getApplet()
|
||||
{
|
||||
return applet;
|
||||
|
||||
} // end getApplet
|
||||
|
||||
public int getSequence()
|
||||
{
|
||||
return sequence;
|
||||
|
||||
} // end getSequence
|
||||
|
||||
boolean featureAllowed(int level, boolean has_read)
|
||||
{
|
||||
if (level<min_level)
|
||||
return false;
|
||||
if (requires_read)
|
||||
return has_read;
|
||||
else
|
||||
return true;
|
||||
|
||||
} // end featureAllowed
|
||||
|
||||
boolean isVisible()
|
||||
{
|
||||
return !is_hidden;
|
||||
|
||||
} // end isVisible
|
||||
|
||||
boolean isLocked()
|
||||
{
|
||||
return is_locked;
|
||||
|
||||
} // end isLocked
|
||||
|
||||
boolean isDefault()
|
||||
{
|
||||
return is_default;
|
||||
|
||||
} // end isDefault
|
||||
|
||||
} // end class VeniceFeatureDef
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class storing side box information.
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -347,8 +253,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
private javax.mail.Session mailsession = null; // email session object
|
||||
private StockMessages stock_messages = null; // stock messages holder
|
||||
private ObjectCache comm_objcache = new ObjectCache(new CommunityCoreDataCreator());
|
||||
private VeniceFeatureDef[] features; // master feature table
|
||||
private Hashtable feature_syms = new Hashtable(); // hashtable mapping symbols to features
|
||||
private ObjectCache conf_objcache = new ObjectCache(new ConferenceCoreDataCreator());
|
||||
private HTMLCheckerConfig[] html_configs; // holder for HTML checker configurations
|
||||
private int[] gp_ints; // global integer parameters
|
||||
|
@ -760,8 +664,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
// Now done with the sidebox config...
|
||||
// Load the services config file.
|
||||
subdoc = loader.loadConfigDocument(services_config);
|
||||
// TODO: following needs to use the sm_env
|
||||
scmgr = new ServiceControlManager(subdoc,global_security,community_security);
|
||||
scmgr = new ServiceControlManager(subdoc,sm_env);
|
||||
|
||||
} // end try
|
||||
catch (ConfigException ce)
|
||||
|
@ -773,7 +676,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
} // end catch
|
||||
|
||||
// Initialize the environment.
|
||||
env = new EnvEngine(this,datapool);
|
||||
env = new EnvEngine(this,datapool,scmgr);
|
||||
|
||||
for (i=0; i<sideboxes.length; i++) // insert sideboxes into hashtable
|
||||
sidebox_ids.put(new Integer(sideboxes[i].getID()),sideboxes[i]);
|
||||
|
@ -786,26 +689,7 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
try
|
||||
{ // get a connection from the data pool
|
||||
conn = env.getConnection();
|
||||
|
||||
// load the master feature table
|
||||
Statement stmt = conn.createStatement();
|
||||
ResultSet rs = stmt.executeQuery("SELECT * FROM refsigftr ORDER BY ftr_code;");
|
||||
VeniceFeatureDef[] tmp_array = new VeniceFeatureDef[64];
|
||||
int max_value = -1;
|
||||
while (rs.next())
|
||||
{ // store the values as we get them
|
||||
int ndx = rs.getInt("ftr_code");
|
||||
tmp_array[ndx] = new VeniceFeatureDef(ndx,rs);
|
||||
if (ndx>max_value)
|
||||
max_value = ndx;
|
||||
|
||||
} // end while
|
||||
|
||||
// store the real feature table as an array
|
||||
features = new VeniceFeatureDef[++max_value];
|
||||
System.arraycopy(tmp_array,0,features,0,max_value);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug(max_value + " features loaded from database");
|
||||
|
||||
// load the global defaults
|
||||
loadDefaults(stmt);
|
||||
|
@ -823,9 +707,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end finally
|
||||
|
||||
for (i=0; i<features.length; i++) // insert feature symbols into hashtable
|
||||
feature_syms.put(features[i].getSymbol(),features[i]);
|
||||
|
||||
// Here is where we create the HTML Checker and all the goodies it relies on.
|
||||
// Start by creating some of the subsidiary objects that get added to HTML Checker configs.
|
||||
EmailRewriter email_rewriter = new EmailRewriter();
|
||||
|
@ -920,25 +801,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end shutdown
|
||||
|
||||
public int getNumFeatures()
|
||||
{
|
||||
checkInitialized();
|
||||
return features.length;
|
||||
|
||||
} // end getNumFeatures
|
||||
|
||||
public BitSet getAllFeaturesMask()
|
||||
{
|
||||
checkInitialized();
|
||||
BitSet rc = new BitSet();
|
||||
for (int i=0; i<features.length; i++)
|
||||
if (features[i].isVisible())
|
||||
rc.set(i);
|
||||
|
||||
return rc;
|
||||
|
||||
} // end getAllFeaturesMask
|
||||
|
||||
public UserContext createUserContext(String remote_addr) throws DataException
|
||||
{
|
||||
checkInitialized();
|
||||
|
@ -1825,84 +1687,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end detachCommunityDataObject
|
||||
|
||||
public BitSet getLockedFeaturesMask()
|
||||
{
|
||||
checkInitialized();
|
||||
BitSet rc = new BitSet();
|
||||
for (int i=0; i<features.length; i++)
|
||||
if (features[i].isLocked())
|
||||
rc.set(i);
|
||||
|
||||
return rc;
|
||||
|
||||
} // end getLockedFeaturesMask
|
||||
|
||||
public List getCommunityFeatureSet(BitSet enabled_features, int level, boolean read_privs)
|
||||
{
|
||||
checkInitialized();
|
||||
ArrayList rc = new ArrayList();
|
||||
for (int i=0; i<features.length; i++)
|
||||
if (enabled_features.get(i) && features[i].featureAllowed(level,read_privs))
|
||||
{ // this feature must be included in the eventual output set
|
||||
CommunityFeature elt = features[i];
|
||||
boolean insert_me = true;
|
||||
for (int j=0; insert_me && (j<rc.size()); j++)
|
||||
if (elt.getSequence()<((CommunityFeature)(rc.get(j))).getSequence())
|
||||
{ // put the item in the list
|
||||
rc.add(j,elt);
|
||||
insert_me = false;
|
||||
|
||||
} // end if and for
|
||||
|
||||
if (insert_me) // insert at end by default
|
||||
rc.add(elt);
|
||||
|
||||
} // end if and for
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("getCommunityFeatureSet() loaded " + rc.size() + " elements");
|
||||
|
||||
return Collections.unmodifiableList(rc); // wrap the vector for return
|
||||
|
||||
} // end getCommunityFeatureSet
|
||||
|
||||
public String getAppletForFeature(int code)
|
||||
{
|
||||
checkInitialized();
|
||||
if ((code<0) || (code>=features.length))
|
||||
{ // the index is out of bounds!
|
||||
logger.error("getAppletForFeature(" + code + ") => out of range");
|
||||
throw new IndexOutOfBoundsException("invalid feature code");
|
||||
|
||||
} // end if
|
||||
|
||||
String rc = features[code].getApplet();
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("getAppletForFeature(" + code + ") => \"" + rc + "\"");
|
||||
return rc;
|
||||
|
||||
} // end getAppletForFeature
|
||||
|
||||
public boolean isValidInitialFeatureIndex(short ndx)
|
||||
{
|
||||
if ((ndx<0) || (ndx>=features.length))
|
||||
return false;
|
||||
return features[ndx].isVisible();
|
||||
|
||||
} // end isValidInitialFeatureIndex
|
||||
|
||||
public BitSet getDefaultFeaturesMask()
|
||||
{
|
||||
checkInitialized();
|
||||
BitSet rc = new BitSet();
|
||||
for (int i=0; i<features.length; i++)
|
||||
if (features[i].isDefault())
|
||||
rc.set(i);
|
||||
|
||||
return rc;
|
||||
|
||||
} // end getDefaultFeaturesMask
|
||||
|
||||
public void registerNewCommunity(CommunityData comm)
|
||||
{
|
||||
checkInitialized();
|
||||
|
@ -1913,26 +1697,6 @@ public class VeniceEngineImpl implements VeniceEngine, EngineBackend
|
|||
|
||||
} // end registerNewCommunity
|
||||
|
||||
public int getFeatureIndexBySymbol(String symbol)
|
||||
{
|
||||
VeniceFeatureDef fd = (VeniceFeatureDef)(feature_syms.get(symbol));
|
||||
if (fd!=null)
|
||||
return fd.getFeatureCode();
|
||||
else
|
||||
return -1;
|
||||
|
||||
} // end getFeatureIndexBySymbol
|
||||
|
||||
public boolean canAccessFeature(String symbol, int level, boolean has_read)
|
||||
{
|
||||
VeniceFeatureDef fd = (VeniceFeatureDef)(feature_syms.get(symbol));
|
||||
if (fd!=null)
|
||||
return fd.featureAllowed(level,has_read);
|
||||
else
|
||||
return false;
|
||||
|
||||
} // end canAccessFeature
|
||||
|
||||
public ConferenceData getConferenceDataObject(int confid) throws DataException
|
||||
{
|
||||
checkInitialized();
|
||||
|
|
|
@ -20,8 +20,10 @@ package com.silverwrist.venice.core.internals;
|
|||
import java.util.BitSet;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import com.silverwrist.venice.core.CommunityProperties;
|
||||
import com.silverwrist.venice.core.ContactInfo;
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
import com.silverwrist.venice.except.AccessError;
|
||||
import com.silverwrist.venice.except.DataException;
|
||||
|
||||
|
@ -69,13 +71,12 @@ public interface CommunityData
|
|||
|
||||
public abstract void putContactInfo(EnvCommunity outer, ContactInfo ci) throws DataException;
|
||||
|
||||
public abstract BitSet getFeatureSet();
|
||||
public abstract Set getServices();
|
||||
|
||||
public abstract void putFeatureSet(EnvCommunity outer, BitSet set) throws DataException;
|
||||
public abstract Set getServices(EnvCommunity outer);
|
||||
|
||||
public abstract List getCommunityFeaturesList(int level);
|
||||
|
||||
public abstract String getDefaultApplet();
|
||||
public abstract void setServiceEnable(EnvCommunity outer, ServiceToken token, boolean enable)
|
||||
throws DataException;
|
||||
|
||||
public abstract void setName(EnvCommunity outer, String name) throws DataException;
|
||||
|
||||
|
@ -102,9 +103,9 @@ public interface CommunityData
|
|||
|
||||
public abstract void setMembersOnly(EnvCommunity outer, boolean flag) throws DataException;
|
||||
|
||||
public abstract short getInitialFeatureIndex();
|
||||
public abstract ServiceToken getDefaultService();
|
||||
|
||||
public abstract void setInitialFeatureIndex(short ndx) throws DataException;
|
||||
public abstract void setDefaultService(ServiceToken token) throws DataException;
|
||||
|
||||
public abstract String getJoinKey() throws DataException;
|
||||
|
||||
|
@ -130,7 +131,7 @@ public interface CommunityData
|
|||
|
||||
public abstract int getMemberCount(boolean include_hidden) throws DataException;
|
||||
|
||||
public abstract boolean isFeaturePresent(String symbol);
|
||||
public abstract boolean hasService(ServiceToken token);
|
||||
|
||||
public abstract ConferenceCommunityContext getConferenceDataObject(int confid) throws DataException;
|
||||
|
||||
|
|
|
@ -71,22 +71,8 @@ public interface EngineBackend
|
|||
|
||||
public abstract void detachCommunityDataObject(int cid);
|
||||
|
||||
public abstract BitSet getLockedFeaturesMask();
|
||||
|
||||
public abstract List getCommunityFeatureSet(BitSet enabled_features, int level, boolean read_privs);
|
||||
|
||||
public abstract String getAppletForFeature(int code);
|
||||
|
||||
public abstract boolean isValidInitialFeatureIndex(short ndx);
|
||||
|
||||
public abstract BitSet getDefaultFeaturesMask();
|
||||
|
||||
public abstract void registerNewCommunity(CommunityData comm);
|
||||
|
||||
public abstract int getFeatureIndexBySymbol(String symbol);
|
||||
|
||||
public abstract boolean canAccessFeature(String symbol, int level, boolean has_read);
|
||||
|
||||
public abstract ConferenceData getConferenceDataObject(int confid) throws DataException;
|
||||
|
||||
public abstract void detachConferenceDataObject(int confid);
|
||||
|
|
|
@ -136,6 +136,12 @@ public class EnvCommunity extends EnvUser
|
|||
|
||||
} // end testPermission
|
||||
|
||||
public boolean satisfy(Role role)
|
||||
{
|
||||
return role.isSatisfiedBy(comm.realCommunityLevel());
|
||||
|
||||
} // end satisfy
|
||||
|
||||
public boolean testPermission(String symbol)
|
||||
{
|
||||
if ( symbol.equals(PERM_READ) || symbol.equals(PERM_WRITE) || symbol.equals(PERM_CREATE)
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
package com.silverwrist.venice.core.internals;
|
||||
|
||||
import com.silverwrist.venice.except.AccessError;
|
||||
import com.silverwrist.venice.security.Role;
|
||||
import com.silverwrist.venice.security.SecurityMonitor;
|
||||
|
||||
public class EnvConference extends EnvCommunity
|
||||
|
@ -92,6 +93,12 @@ public class EnvConference extends EnvCommunity
|
|||
|
||||
} // end testPermission
|
||||
|
||||
public boolean satisfy(Role role)
|
||||
{
|
||||
return role.isSatisfiedBy(conf.env_getConfLevel());
|
||||
|
||||
} // end satisfy
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -24,6 +24,7 @@ import com.silverwrist.venice.core.SecurityInfo;
|
|||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.except.AccessError;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.ServiceControl;
|
||||
|
||||
public class EnvEngine
|
||||
{
|
||||
|
@ -34,16 +35,18 @@ public class EnvEngine
|
|||
|
||||
private EngineBackend engine; // the engine
|
||||
private DataPool datapool; // the database pool
|
||||
private ServiceControl scon; // the service controller
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public EnvEngine(EngineBackend engine, DataPool datapool)
|
||||
public EnvEngine(EngineBackend engine, DataPool datapool, ServiceControl scon)
|
||||
{
|
||||
this.engine = engine;
|
||||
this.datapool = datapool;
|
||||
this.scon = scon;
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -51,6 +54,7 @@ public class EnvEngine
|
|||
{
|
||||
this.engine = other.engine;
|
||||
this.datapool = other.datapool;
|
||||
this.scon = other.scon;
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -82,6 +86,12 @@ public class EnvEngine
|
|||
|
||||
} // end getDataPool
|
||||
|
||||
public final ServiceControl getSCM()
|
||||
{
|
||||
return scon;
|
||||
|
||||
} // end getSCM
|
||||
|
||||
public final Connection getConnection() throws SQLException
|
||||
{
|
||||
return datapool.getConnection();
|
||||
|
|
|
@ -73,15 +73,45 @@ public class EnvUser extends EnvEngine
|
|||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class EnvEngine
|
||||
* Internal operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
protected SecurityMonitor getStaticMonitor()
|
||||
protected boolean testPermissionDynamic(String symbol, String errormsg) throws AccessError
|
||||
{
|
||||
return sm;
|
||||
if (symbol.equals(PERM_CREATECOMMUNITY))
|
||||
{ // the Create Community permission test
|
||||
Role r = getEngine().getParamRole(EngineBackend.ROLEP_CREATECOMMUNITY);
|
||||
if (r.isSatisfiedBy(user.realBaseLevel()))
|
||||
return true;
|
||||
logger.error("testPermission() fail for permission " + PERM_CREATECOMMUNITY);
|
||||
if (errormsg==null)
|
||||
errormsg = "You are not authorized to create new communities.";
|
||||
throw new AccessError(errormsg);
|
||||
|
||||
} // end getStaticMonitor
|
||||
} // end if
|
||||
|
||||
return false;
|
||||
|
||||
} // end testPermission
|
||||
|
||||
protected boolean testPermissionDynamic(String symbol)
|
||||
{
|
||||
if (symbol.equals(PERM_CREATECOMMUNITY))
|
||||
{ // do the "Create Community" test here
|
||||
Role r = getEngine().getParamRole(EngineBackend.ROLEP_CREATECOMMUNITY);
|
||||
return r.isSatisfiedBy(user.realBaseLevel());
|
||||
|
||||
} // end if
|
||||
|
||||
return false;
|
||||
|
||||
} // end testPermission
|
||||
|
||||
protected int levelSelf()
|
||||
{
|
||||
return user.realBaseLevel();
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
|
@ -120,6 +150,8 @@ public class EnvUser extends EnvEngine
|
|||
|
||||
public boolean testPermission(String symbol, String errormsg) throws AccessError
|
||||
{
|
||||
if (testPermissionDynamic(symbol,errormsg))
|
||||
return true;
|
||||
if (symbol.equals(PERM_CREATECOMMUNITY))
|
||||
{ // the Create Community permission test
|
||||
Role r = getEngine().getParamRole(EngineBackend.ROLEP_CREATECOMMUNITY);
|
||||
|
@ -149,6 +181,12 @@ public class EnvUser extends EnvEngine
|
|||
|
||||
} // end testPermission
|
||||
|
||||
public boolean satisfy(Role role)
|
||||
{
|
||||
return role.isSatisfiedBy(user.realBaseLevel());
|
||||
|
||||
} // end satisfy
|
||||
|
||||
public final UserBackend getUser()
|
||||
{
|
||||
return user;
|
||||
|
|
|
@ -20,12 +20,20 @@ package com.silverwrist.venice.servlets;
|
|||
import java.io.*;
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.*;
|
||||
import org.apache.log4j.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.servlets.format.*;
|
||||
|
||||
public class CommunityFrontEnd extends VeniceServlet
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static Category logger = Category.getInstance(CommunityFrontEnd.class);
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class HttpServlet
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -56,7 +64,9 @@ public class CommunityFrontEnd extends VeniceServlet
|
|||
CommunityContext comm = user.getCommunityContext(alias);
|
||||
|
||||
// get the default servlet from the community context
|
||||
String def_servlet = comm.getDefaultApplet();
|
||||
String def_servlet = rdat.getDefaultServletAddress(comm);
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("CommunityFrontEnd bouncing to: " + def_servlet);
|
||||
if (def_servlet==null)
|
||||
{ // return the default servlet
|
||||
changeMenuTop(request);
|
||||
|
@ -65,7 +75,7 @@ public class CommunityFrontEnd extends VeniceServlet
|
|||
} // end if
|
||||
|
||||
// and go there
|
||||
throw new RedirectResult(def_servlet);
|
||||
throw new RedirectResult(def_servlet,true);
|
||||
|
||||
} // end try
|
||||
catch (DataException de)
|
||||
|
|
|
@ -35,6 +35,7 @@ public class RedirectResult extends ExecuteResult
|
|||
*/
|
||||
|
||||
private String target;
|
||||
private boolean absolute;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -45,6 +46,15 @@ public class RedirectResult extends ExecuteResult
|
|||
{
|
||||
super();
|
||||
this.target = target;
|
||||
this.absolute = false;
|
||||
|
||||
} // end constructor
|
||||
|
||||
public RedirectResult(String target, boolean absolute)
|
||||
{
|
||||
super();
|
||||
this.target = target;
|
||||
this.absolute = absolute;
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -55,6 +65,13 @@ public class RedirectResult extends ExecuteResult
|
|||
|
||||
public void execute(RenderData rdat) throws IOException
|
||||
{
|
||||
if (absolute)
|
||||
{ // allow us to explicitly specify absolute redirection
|
||||
rdat.redirectAbsolute(target);
|
||||
return;
|
||||
|
||||
} // end if
|
||||
|
||||
for (int i=0; i<absolute_prefixes.length; i++)
|
||||
if (target.startsWith(absolute_prefixes[i]))
|
||||
{ // this is an absolute redirection...do it!
|
||||
|
|
|
@ -579,6 +579,12 @@ public class RenderConfig implements ColorSelectors
|
|||
|
||||
} // end createCommunityMenu
|
||||
|
||||
String getDefaultServletAddress(RenderData rdat, CommunityContext comm)
|
||||
{
|
||||
return comm_menu_fact.getDefaultServletAddress(rdat,comm);
|
||||
|
||||
} // end getDefaultServletAddress
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static operations for use by VeniceServlet
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -25,6 +25,7 @@ import javax.servlet.http.*;
|
|||
import org.apache.log4j.*;
|
||||
import com.silverwrist.util.IOUtil;
|
||||
import com.silverwrist.util.StringUtil;
|
||||
import com.silverwrist.venice.core.CommunityContext;
|
||||
import com.silverwrist.venice.core.IDUtils;
|
||||
import com.silverwrist.venice.core.UserContext;
|
||||
import com.silverwrist.venice.core.VeniceEngine;
|
||||
|
@ -334,6 +335,12 @@ public class RenderData implements ColorSelectors
|
|||
|
||||
} // end getPhotoNotAvailURL
|
||||
|
||||
public String getDefaultServletAddress(CommunityContext comm)
|
||||
{
|
||||
return rconf.getDefaultServletAddress(this,comm);
|
||||
|
||||
} // end getDefaultServletAddress
|
||||
|
||||
public String formatDateForDisplay(Date date)
|
||||
{
|
||||
if (display_date==null)
|
||||
|
|
|
@ -23,6 +23,7 @@ import javax.servlet.*;
|
|||
import javax.servlet.http.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.Role;
|
||||
|
||||
public class ViewCommunityMembers implements JSPRender, SearchMode
|
||||
{
|
||||
|
@ -329,4 +330,12 @@ public class ViewCommunityMembers implements JSPRender, SearchMode
|
|||
|
||||
} // end getItem
|
||||
|
||||
public boolean isCommunityAdmin(UserFound uf)
|
||||
{
|
||||
SecurityInfo sinf = comm.getSecurityInfo();
|
||||
Role r = sinf.getRole("Community.Host");
|
||||
return r.isSatisfiedBy(uf.getLevel());
|
||||
|
||||
} // end isCommunityAdmin
|
||||
|
||||
} // end class ViewCommunityMembers
|
||||
|
|
|
@ -20,6 +20,7 @@ package com.silverwrist.venice.servlets.format.menus;
|
|||
import java.util.Map;
|
||||
import org.w3c.dom.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
import com.silverwrist.venice.util.XMLLoader;
|
||||
|
||||
class CommunityLeftMenuEntry implements Comparable
|
||||
|
@ -114,4 +115,10 @@ class CommunityLeftMenuEntry implements Comparable
|
|||
|
||||
} // end resolveItem
|
||||
|
||||
final String getServletAddress(RenderData rdat, Map vars)
|
||||
{
|
||||
return item.getAddress(rdat,vars);
|
||||
|
||||
} // end getServletAddress
|
||||
|
||||
} // end class CommunityLeftMenuEntry
|
||||
|
|
|
@ -21,6 +21,7 @@ import java.util.*;
|
|||
import org.w3c.dom.*;
|
||||
import com.silverwrist.venice.core.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.servlets.format.RenderData;
|
||||
|
||||
public class CommunityLeftMenuFactory
|
||||
{
|
||||
|
@ -30,6 +31,7 @@ public class CommunityLeftMenuFactory
|
|||
*/
|
||||
|
||||
private List entries;
|
||||
private Map map_symbol;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -42,6 +44,7 @@ public class CommunityLeftMenuFactory
|
|||
{ // look for community services
|
||||
NodeList nl = comm_sect.getChildNodes();
|
||||
ArrayList tmp_entries = new ArrayList(nl.getLength());
|
||||
HashMap tmp_map = new HashMap();
|
||||
for (int i=0; i<nl.getLength(); i++)
|
||||
{ // get each node and see if it's a service node
|
||||
Node n = nl.item(i);
|
||||
|
@ -49,25 +52,35 @@ public class CommunityLeftMenuFactory
|
|||
{ // create a template LeftMenuEntry and add it
|
||||
CommunityLeftMenuEntry ent = new CommunityLeftMenuEntry((Element)n);
|
||||
tmp_entries.add(ent);
|
||||
tmp_map.put(ent.getSymbol(),ent);
|
||||
|
||||
} // end if
|
||||
|
||||
} // end for
|
||||
|
||||
if (tmp_entries.isEmpty())
|
||||
{ // dummy it all out
|
||||
entries = Collections.EMPTY_LIST;
|
||||
map_symbol = Collections.EMPTY_MAP;
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // sort the list by sequence before we save it
|
||||
if (tmp_entries.size()>1)
|
||||
Collections.sort(tmp_entries);
|
||||
tmp_entries.trimToSize();
|
||||
entries = Collections.unmodifiableList(tmp_entries);
|
||||
map_symbol = Collections.unmodifiableMap(tmp_map);
|
||||
|
||||
} // end else
|
||||
|
||||
} // end if
|
||||
else // no communty services - initialize to null
|
||||
else
|
||||
{ // no communty services - initialize to null
|
||||
entries = Collections.EMPTY_LIST;
|
||||
map_symbol = Collections.EMPTY_MAP;
|
||||
|
||||
} // end else
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -78,19 +91,15 @@ public class CommunityLeftMenuFactory
|
|||
|
||||
public CommunityLeftMenu createMenu(CommunityContext comm)
|
||||
{
|
||||
// N.B. This implementation will change once the engine uses the SCM to return the defined
|
||||
// community services.
|
||||
|
||||
List items;
|
||||
if (entries.size()>0)
|
||||
{ // Get the community features list and stash the indexes in a set.
|
||||
{ // Get the community services and stash the symbols in a set.
|
||||
HashSet defined = new HashSet();
|
||||
List ftr_list = comm.getCommunityFeaturesList();
|
||||
Iterator it = ftr_list.iterator();
|
||||
Iterator it = comm.getServices().iterator();
|
||||
while (it.hasNext())
|
||||
{ // add each index to the set
|
||||
CommunityFeature ftr = (CommunityFeature)(it.next());
|
||||
defined.add(new Integer(ftr.getFeatureCode()));
|
||||
{ // add each symbol to the set
|
||||
ServiceToken token = (ServiceToken)(it.next());
|
||||
defined.add(token.getSymbol());
|
||||
|
||||
} // end while
|
||||
|
||||
|
@ -104,7 +113,7 @@ public class CommunityLeftMenuFactory
|
|||
while (it.hasNext())
|
||||
{ // get this entry and see if there's a match in the set
|
||||
CommunityLeftMenuEntry ntry = (CommunityLeftMenuEntry)(it.next());
|
||||
if (defined.contains(new Integer(ntry.getIndex())))
|
||||
if (defined.contains(ntry.getSymbol()))
|
||||
tmp_items.add(ntry.resolveItem(vars));
|
||||
|
||||
} // end while
|
||||
|
@ -127,4 +136,21 @@ public class CommunityLeftMenuFactory
|
|||
|
||||
} // end createMenu
|
||||
|
||||
public String getDefaultServletAddress(RenderData rdat, CommunityContext comm)
|
||||
{
|
||||
ServiceToken token = comm.getDefaultService();
|
||||
if (token==null)
|
||||
return null;
|
||||
CommunityLeftMenuEntry ent = (CommunityLeftMenuEntry)(map_symbol.get(token.getSymbol()));
|
||||
if (ent==null)
|
||||
return null;
|
||||
|
||||
// Create the map used to replace the variables in the servlet address.
|
||||
HashMap vars = new HashMap();
|
||||
vars.put("cid",String.valueOf(comm.getCommunityID()));
|
||||
|
||||
return ent.getServletAddress(rdat,vars);
|
||||
|
||||
} // end getDefaultServletAddress
|
||||
|
||||
} // end class CommunityLeftMenuFactory
|
||||
|
|
|
@ -145,4 +145,23 @@ class LinkItem implements ComponentRender, ColorSelectors
|
|||
|
||||
} // end renderHere
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
final String getAddress(RenderData rdat, Map vars)
|
||||
{
|
||||
String s = StringUtil.replaceAllVariables(href,vars);
|
||||
if (type.equals(ABSOLUTE))
|
||||
return s;
|
||||
else if (type.equals(SERVLET))
|
||||
return rdat.getEncodedServletPath(s);
|
||||
else if (type.equals(FRAME))
|
||||
return rdat.getEncodedServletPath("frame/" + s);
|
||||
else
|
||||
return null;
|
||||
|
||||
} // end getAddress
|
||||
|
||||
} // end class LinkItem
|
||||
|
|
|
@ -18,18 +18,18 @@
|
|||
package com.silverwrist.venice.svc;
|
||||
|
||||
import org.w3c.dom.Element;
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
import com.silverwrist.venice.except.ConfigException;
|
||||
import com.silverwrist.venice.security.Role;
|
||||
import com.silverwrist.venice.security.SecurityMonitor;
|
||||
|
||||
public interface CommService
|
||||
public interface CommService extends Service
|
||||
{
|
||||
public abstract void initialize(Element root, SecurityMonitor sm, CommServiceSite site)
|
||||
public abstract void initialize(ServiceToken token, Element root, SecurityMonitor sm, CommServiceSite site)
|
||||
throws ConfigException;
|
||||
|
||||
public abstract void shutdown();
|
||||
public abstract String getPermission();
|
||||
|
||||
public abstract String getSymbol();
|
||||
|
||||
public abstract int getIndex();
|
||||
public abstract Role getRole();
|
||||
|
||||
} // end interface CommService
|
||||
|
|
32
src/com/silverwrist/venice/svc/Service.java
Normal file
32
src/com/silverwrist/venice/svc/Service.java
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* 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.svc;
|
||||
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
|
||||
public interface Service
|
||||
{
|
||||
public abstract void shutdown();
|
||||
|
||||
public abstract ServiceToken getToken();
|
||||
|
||||
public abstract boolean isDefault();
|
||||
|
||||
public abstract boolean isLocked();
|
||||
|
||||
} // end interface Service
|
38
src/com/silverwrist/venice/svc/ServiceControl.java
Normal file
38
src/com/silverwrist/venice/svc/ServiceControl.java
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* 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.svc;
|
||||
|
||||
import java.util.Set;
|
||||
import com.silverwrist.venice.core.ServiceGroup;
|
||||
import com.silverwrist.venice.core.ServiceToken;
|
||||
|
||||
public interface ServiceControl extends ServiceGroup
|
||||
{
|
||||
public abstract Set getAllServices(int group);
|
||||
|
||||
public abstract Set getDefaultServices(int group);
|
||||
|
||||
public abstract Service getServiceForSymbol(int group, String sym);
|
||||
|
||||
public abstract Service getServiceForToken(ServiceToken token);
|
||||
|
||||
public abstract ServiceToken getTokenForIndex(int group, int ndx);
|
||||
|
||||
public abstract ServiceToken getTokenForSymbol(int group, String sym);
|
||||
|
||||
} // end interface ServiceControl
|
|
@ -18,7 +18,6 @@
|
|||
<%@ page import = "java.util.*" %>
|
||||
<%@ page import = "com.silverwrist.util.StringUtil" %>
|
||||
<%@ page import = "com.silverwrist.venice.core.*" %>
|
||||
<%@ page import = "com.silverwrist.venice.security.Capability" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.Variables" %>
|
||||
<%@ page import = "com.silverwrist.venice.servlets.format.*" %>
|
||||
<%
|
||||
|
@ -129,7 +128,7 @@
|
|||
<%= StringUtil.encodeHTML(uf.getGivenName()) %> <%= StringUtil.encodeHTML(uf.getFamilyName()) %>,
|
||||
from <%= StringUtil.encodeHTML(uf.getLocality()) %>, <%= StringUtil.encodeHTML(uf.getRegion()) %>
|
||||
<%= uf.getCountry() %>
|
||||
<% if (Capability.isCommunityAdmin(uf.getLevel())) { %>
|
||||
<% if (data.isCommunityAdmin(uf)) { %>
|
||||
<IMG SRC="<%= rdat.getFullImagePath("tag_host.gif") %>" ALT="Host!" HSPACE=2 VSPACE=0 BORDER=0
|
||||
WIDTH=40 HEIGHT=20 ALIGN=BOTTOM>
|
||||
<% } // end if %>
|
||||
|
|
Loading…
Reference in New Issue
Block a user