diff --git a/etc/services-config.xml b/etc/services-config.xml
index d64b7f8..8d5b834 100644
--- a/etc/services-config.xml
+++ b/etc/services-config.xml
@@ -53,7 +53,7 @@
-
+
Members
diff --git a/setup/database.sql b/setup/database.sql
index 6f9c306..a84bae8 100644
--- a/setup/database.sql
+++ b/setup/database.sql
@@ -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'),
diff --git a/src/com/silverwrist/venice/core/CommunityContext.java b/src/com/silverwrist/venice/core/CommunityContext.java
index 09bc585..2e5daec 100644
--- a/src/com/silverwrist/venice/core/CommunityContext.java
+++ b/src/com/silverwrist/venice/core/CommunityContext.java
@@ -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;
diff --git a/src/com/silverwrist/venice/core/CommunityFeature.java b/src/com/silverwrist/venice/core/ServiceGroup.java
similarity index 77%
rename from src/com/silverwrist/venice/core/CommunityFeature.java
rename to src/com/silverwrist/venice/core/ServiceGroup.java
index 392a8f7..d10ba04 100644
--- a/src/com/silverwrist/venice/core/CommunityFeature.java
+++ b/src/com/silverwrist/venice/core/ServiceGroup.java
@@ -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
diff --git a/src/com/silverwrist/venice/core/ServiceToken.java b/src/com/silverwrist/venice/core/ServiceToken.java
new file mode 100644
index 0000000..d386f8a
--- /dev/null
+++ b/src/com/silverwrist/venice/core/ServiceToken.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/com/silverwrist/venice/core/VeniceEngine.java b/src/com/silverwrist/venice/core/VeniceEngine.java
index b5d8e82..341026b 100644
--- a/src/com/silverwrist/venice/core/VeniceEngine.java
+++ b/src/com/silverwrist/venice/core/VeniceEngine.java
@@ -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;
diff --git a/src/com/silverwrist/venice/core/impl/CommunityCoreData.java b/src/com/silverwrist/venice/core/impl/CommunityCoreData.java
index 423cc3e..9ee39a0 100644
--- a/src/com/silverwrist/venice/core/impl/CommunityCoreData.java
+++ b/src/com/silverwrist/venice/core/impl/CommunityCoreData.java
@@ -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; i0)
- { // 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; i0)
- 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))
+ 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; imax_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))
- { // 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; i1)
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
diff --git a/src/com/silverwrist/venice/servlets/format/menus/LinkItem.java b/src/com/silverwrist/venice/servlets/format/menus/LinkItem.java
index fa0e7e0..acdee30 100644
--- a/src/com/silverwrist/venice/servlets/format/menus/LinkItem.java
+++ b/src/com/silverwrist/venice/servlets/format/menus/LinkItem.java
@@ -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
diff --git a/src/com/silverwrist/venice/svc/CommService.java b/src/com/silverwrist/venice/svc/CommService.java
index ba7f085..bd757b0 100644
--- a/src/com/silverwrist/venice/svc/CommService.java
+++ b/src/com/silverwrist/venice/svc/CommService.java
@@ -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
diff --git a/src/com/silverwrist/venice/svc/Service.java b/src/com/silverwrist/venice/svc/Service.java
new file mode 100644
index 0000000..6acdd4c
--- /dev/null
+++ b/src/com/silverwrist/venice/svc/Service.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/src/com/silverwrist/venice/svc/ServiceControl.java b/src/com/silverwrist/venice/svc/ServiceControl.java
new file mode 100644
index 0000000..429647c
--- /dev/null
+++ b/src/com/silverwrist/venice/svc/ServiceControl.java
@@ -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 .
+ *
+ * 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 ,
+ * 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
diff --git a/web/format/view_member.jsp b/web/format/view_member.jsp
index 000b340..3dd5289 100644
--- a/web/format/view_member.jsp
+++ b/web/format/view_member.jsp
@@ -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)) { %>
" ALT="Host!" HSPACE=2 VSPACE=0 BORDER=0
WIDTH=40 HEIGHT=20 ALIGN=BOTTOM>
<% } // end if %>