some of the underpinnings of community services
This commit is contained in:
parent
ce27befa54
commit
80d4ba4212
|
@ -434,6 +434,28 @@ CREATE TABLE commprops (
|
|||
PRIMARY KEY (cid, nsid, prop_name)
|
||||
);
|
||||
|
||||
# The master table of community services.
|
||||
CREATE TABLE commsvc_master (
|
||||
svcid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, # internal ID number for service
|
||||
svc_nsid INT NOT NULL, # service namespace ID
|
||||
svc_name VARCHAR(255) BINARY NOT NULL, # service name
|
||||
mod_nsid INT NOT NULL, # namespace ID of module containing this service
|
||||
mod_name VARCHAR(255) BINARY NOT NULL, # name of module containing this service
|
||||
mod_filename VARCHAR(255) NOT NULL, # filename of module containing this service
|
||||
obj_nsid INT NOT NULL, # namespace ID of object implementing service controller
|
||||
obj_name VARCHAR(255) BINARY NOT NULL, # name of object implementing service controller
|
||||
shortvar VARCHAR(255) NOT NULL, # short variable name for service
|
||||
UNIQUE INDEX by_name (svc_nsid, svc_name)
|
||||
);
|
||||
|
||||
# Indicates which services are enabled for which communities.
|
||||
CREATE TABLE commsvc (
|
||||
cid INT NOT NULL, # community ID
|
||||
svcid INT NOT NULL, # ID number of enabled service
|
||||
PRIMARY KEY (cid, svcid),
|
||||
UNIQUE INDEX rev_index (svcid, cid)
|
||||
);
|
||||
|
||||
# The master table of sideboxes.
|
||||
CREATE TABLE sbox_master (
|
||||
sbid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, # sidebox identifier
|
||||
|
@ -1328,6 +1350,17 @@ INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link) VALUES
|
|||
(4, 2, 'TEXT', 'Categories', 'SERVLET', 'find_categories.js.vs' );
|
||||
UPDATE menuitems SET ifdef_var = 'use_categories' WHERE menuid = 4 AND sequence = 2;
|
||||
|
||||
# Create the standard community menu. (ID #5)
|
||||
INSERT INTO menus (menuid, menu_nsid, menu_name, title, subtitle)
|
||||
VALUES (5, 16, 'community.menu', '', NULL);
|
||||
INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link) VALUES
|
||||
(5, 0, 'TEXT', 'Home Page', 'SERVLET', 'TODO'),
|
||||
(5, 60000, 'TEXT', 'Members', 'SERVLET', 'TODO'),
|
||||
(5, 60100, 'TEXT', 'Profile', 'SERVLET', 'TODO'),
|
||||
(5, 60200, 'TEXT', 'Administration', 'SERVLET', 'TODO'),
|
||||
(5, 60300, 'SEPARATOR', NULL, NULL, NULL ),
|
||||
(5, 60400, 'TEXT', 'Unjoin', 'SERVLET', 'TODO');
|
||||
|
||||
# Create the sideboxes tables.
|
||||
INSERT INTO sbox_master (sbid, sb_nsid, sb_name, type_nsid, type_name, descr) VALUES
|
||||
(1, 19, 'community.list', 19, 'community.list', 'Community Membership List'),
|
||||
|
|
|
@ -47,7 +47,8 @@ import com.silverwrist.dynamo.util.*;
|
|||
public class ApplicationContainer
|
||||
implements ResourceProvider, ResourceProviderManager, RendererRegistration, ObjectProvider,
|
||||
EventListenerRegistration, OutputObjectFilterRegistration, QueryRenderer, PostDynamicUpdate,
|
||||
RenderImmediate, RequestPreprocessorRegistration, ExceptionTranslatorRegistration
|
||||
RenderImmediate, RequestPreprocessorRegistration, ExceptionTranslatorRegistration,
|
||||
FinalStageRegistration
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class recording renderer registrations and providing a
|
||||
|
@ -178,6 +179,8 @@ public class ApplicationContainer
|
|||
private HashMap m_update_listeners = new HashMap(); // update listeners
|
||||
private Vector m_request_preprocessors = new Vector(); // request preprocessors
|
||||
private Vector m_exception_xlators = new Vector(); // exception translators
|
||||
private LinkedList m_final_stage_inits = new LinkedList(); // final-stage initialization hooks
|
||||
private LinkedList m_prestage_shutdown = new LinkedList(); // pre-stage shutdown hooks
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -219,6 +222,7 @@ public class ApplicationContainer
|
|||
m_app_sm.addInitService(PostDynamicUpdate.class,(PostDynamicUpdate)this);
|
||||
m_app_sm.addInitService(RequestPreprocessorRegistration.class,(RequestPreprocessorRegistration)this);
|
||||
m_app_sm.addInitService(ExceptionTranslatorRegistration.class,(ExceptionTranslatorRegistration)this);
|
||||
m_app_sm.addInitService(FinalStageRegistration.class,(FinalStageRegistration)this);
|
||||
|
||||
m_app_sm.addRuntimeService(ResourceProvider.class,(ResourceProvider)this);
|
||||
m_app_sm.addRuntimeService(ObjectProvider.class,(ObjectProvider)this);
|
||||
|
@ -327,6 +331,28 @@ public class ApplicationContainer
|
|||
m_identity = buf.toString();
|
||||
logger.info("Server: " + m_identity);
|
||||
|
||||
try
|
||||
{ // Call the "final stage" initialization hooks.
|
||||
logger.info(m_final_stage_inits.size() + " final-stage init hook(s) to call");
|
||||
while (!(m_final_stage_inits.isEmpty()))
|
||||
{ // call the hooks in FIFO order
|
||||
FinalStageInitHook hook = (FinalStageInitHook)(m_final_stage_inits.removeFirst());
|
||||
hook.initialize(m_application,init_svcs);
|
||||
|
||||
} // end while
|
||||
|
||||
m_final_stage_inits = null; // done with this list
|
||||
|
||||
} // end try
|
||||
catch (DynamoException e)
|
||||
{ // final-stage initialization failed - post an error
|
||||
ConfigException ce = new ConfigException(ApplicationContainer.class,"ApplicationContainerMessages",
|
||||
"finalinit.fail",e);
|
||||
ce.setParameter(0,e.getMessage());
|
||||
throw ce;
|
||||
|
||||
} // end catch
|
||||
|
||||
// Fire the "application initialized" events.
|
||||
ApplicationListener[] listeners =
|
||||
(ApplicationListener[])(m_application_listeners.toArray(APP_LISTENER_TEMPLATE));
|
||||
|
@ -390,6 +416,16 @@ public class ApplicationContainer
|
|||
|
||||
} // end if
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("ApplicationContainer.destroy(): " + m_prestage_shutdown.size()
|
||||
+ " pre-stage shutdown hooks to call");
|
||||
while (m_prestage_shutdown.size()>0)
|
||||
{ // call the appropriate pre-stage shutdown hooks
|
||||
ComponentShutdown sd = (ComponentShutdown)(m_prestage_shutdown.removeFirst());
|
||||
sd.shutdown();
|
||||
|
||||
} // end while
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
logger.debug("ApplicationContainer.destroy(): " + m_shutdown_list.size() + " objects to blow away");
|
||||
|
||||
|
@ -981,6 +1017,26 @@ public class ApplicationContainer
|
|||
|
||||
} // end registerExceptionTranslator
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface FinalStageRegistration
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public synchronized boolean registerFinalStageInitHook(FinalStageInitHook hook)
|
||||
{
|
||||
if ((m_final_stage_inits==null) || (m_application!=null))
|
||||
return false; // too late to register
|
||||
m_final_stage_inits.addLast(hook);
|
||||
return true;
|
||||
|
||||
} // end registerFinalStageInitHook
|
||||
|
||||
public synchronized void registerPreStageShutdown(ComponentShutdown cs)
|
||||
{
|
||||
m_prestage_shutdown.addFirst(cs);
|
||||
|
||||
} // end registerPreStageShutdown
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -25,3 +25,4 @@ resource.rootErr=The resource root directory {0} does not exist.
|
|||
mountRP.badName=Invalid mount path for resources: {0}
|
||||
mountRP.already=Resource provider already mounted on path {0}.
|
||||
registerRenderer.already=Renderer already registered for class {0}.
|
||||
finalinit.fail=Final-stage initialization failed: {0}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* 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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.dynamo.iface;
|
||||
|
||||
import com.silverwrist.dynamo.except.DynamoException;
|
||||
|
||||
public interface FinalStageInitHook
|
||||
{
|
||||
public void initialize(Application application, ServiceProvider services) throws DynamoException;
|
||||
|
||||
} // end interface FinalStageInitHook
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* 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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.dynamo.iface;
|
||||
|
||||
public interface FinalStageRegistration
|
||||
{
|
||||
public boolean registerFinalStageInitHook(FinalStageInitHook hook);
|
||||
|
||||
public void registerPreStageShutdown(ComponentShutdown cs);
|
||||
|
||||
} // end interface FinalStageRegistration
|
|
@ -19,6 +19,8 @@ package com.silverwrist.dynamo.iface;
|
|||
|
||||
public interface ModuleSite
|
||||
{
|
||||
public String getFilename();
|
||||
|
||||
public ResourceProvider getResourceProvider();
|
||||
|
||||
} // end interface ModuleSite
|
||||
|
|
|
@ -49,6 +49,12 @@ class ModuleLoader extends URLClassLoader implements Module
|
|||
*====================================================================
|
||||
*/
|
||||
|
||||
public String getFilename()
|
||||
{
|
||||
return m_filename;
|
||||
|
||||
} // end getFilename
|
||||
|
||||
public ResourceProvider getResourceProvider()
|
||||
{
|
||||
return (ResourceProvider)this;
|
||||
|
@ -106,20 +112,22 @@ class ModuleLoader extends URLClassLoader implements Module
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private URL m_jar_url;
|
||||
private String m_resource_path;
|
||||
private ModuleFunctions m_modfuncs;
|
||||
private boolean m_initialized = false;
|
||||
private URL m_jar_url; // URL to the module JAR file
|
||||
private String m_filename; // filename of the original JAR file relative to module directory
|
||||
private String m_resource_path; // resource path for the JAR file
|
||||
private ModuleFunctions m_modfuncs; // module functions (the bridge into the module)
|
||||
private boolean m_initialized = false; // have we been initialized?
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
ModuleLoader(File modfile) throws ModuleException, MalformedURLException
|
||||
ModuleLoader(File modfile, String filename) throws ModuleException, MalformedURLException
|
||||
{
|
||||
super(new URL[] { modfile.toURL() },ModuleLoader.class.getClassLoader());
|
||||
logger.info("Loading module " + modfile.getAbsolutePath());
|
||||
m_filename = filename;
|
||||
String main_class_name = null;
|
||||
try
|
||||
{ // create a JAR URL and use it to get the JAR attributes
|
||||
|
|
|
@ -198,7 +198,7 @@ public class ModuleManager implements NamedObject, ComponentInitialize, Componen
|
|||
|
||||
try
|
||||
{ // create a new ModuleLoader
|
||||
rc = new ModuleLoader(mod_file);
|
||||
rc = new ModuleLoader(mod_file,name);
|
||||
|
||||
} // end try
|
||||
catch (MalformedURLException e)
|
||||
|
|
|
@ -94,6 +94,7 @@ class CommunityImpl implements VeniceCommunity
|
|||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private CommunityManager m_base; // base object
|
||||
private CommunityOps m_ops; // community operations object
|
||||
private NamespaceCache m_nscache; // namespace cache object
|
||||
private SecurityReferenceMonitor m_srm; // security reference monitor
|
||||
|
@ -114,6 +115,7 @@ class CommunityImpl implements VeniceCommunity
|
|||
private java.util.Date m_lastaccessed; // date last accessed
|
||||
private java.util.Date m_lastupdate; // date last updated
|
||||
private ReferenceMap m_properties; // properties cache
|
||||
private List m_service_list = null; // cached service list
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
|
@ -141,9 +143,11 @@ class CommunityImpl implements VeniceCommunity
|
|||
* corresponding to static fields of the
|
||||
* {@link com.silverwrist.venice.community.CommunityManagerOps CommunityManagerOps} object.
|
||||
*/
|
||||
CommunityImpl(CommunityOps ops, NamespaceCache nscache, SecurityReferenceMonitor srm, UserManagement users,
|
||||
AuthenticatorLookup alook, PostDynamicUpdate post, CategoryService cats, Map data)
|
||||
CommunityImpl(CommunityManager base, CommunityOps ops, NamespaceCache nscache, SecurityReferenceMonitor srm,
|
||||
UserManagement users, AuthenticatorLookup alook, PostDynamicUpdate post, CategoryService cats,
|
||||
Map data)
|
||||
{
|
||||
m_base = base;
|
||||
m_ops = ops;
|
||||
m_nscache = nscache;
|
||||
m_srm = srm;
|
||||
|
@ -1065,4 +1069,43 @@ class CommunityImpl implements VeniceCommunity
|
|||
|
||||
} // end isAdministrator
|
||||
|
||||
public List getServices() throws DatabaseException
|
||||
{
|
||||
if (m_service_list==null)
|
||||
{ // need to fake up the service list
|
||||
int[] svcids = m_ops.getServiceIDs(m_id);
|
||||
if (svcids.length>0)
|
||||
{ // convert this to a list of ServiceDescriptors
|
||||
ArrayList rc = new ArrayList(svcids.length);
|
||||
for (int i=0; i<svcids.length; i++)
|
||||
rc.add(m_base.getServiceForID(svcids[i]));
|
||||
Collections.sort(rc,new Comparator()
|
||||
{
|
||||
public int compare(Object o1, Object o2)
|
||||
{
|
||||
String s1 = ((CommunityServiceDescriptor)o1).getDescription();
|
||||
String s2 = ((CommunityServiceDescriptor)o2).getDescription();
|
||||
return s1.compareTo(s2);
|
||||
|
||||
} // end compare
|
||||
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
return false;
|
||||
|
||||
} // end equals
|
||||
|
||||
}); // end Comparator object
|
||||
m_service_list = Collections.unmodifiableList(rc);
|
||||
|
||||
} // end if
|
||||
else // just use the empty list as a return value
|
||||
m_service_list = Collections.EMPTY_LIST;
|
||||
|
||||
} // end if
|
||||
|
||||
return m_service_list;
|
||||
|
||||
} // end getServices
|
||||
|
||||
} // end class CommunityImpl
|
||||
|
|
|
@ -27,11 +27,13 @@ import com.silverwrist.dynamo.db.NamespaceCache;
|
|||
import com.silverwrist.dynamo.db.UserManagement;
|
||||
import com.silverwrist.dynamo.except.*;
|
||||
import com.silverwrist.dynamo.iface.*;
|
||||
import com.silverwrist.dynamo.module.ModuleOperations;
|
||||
import com.silverwrist.dynamo.security.SecurityReferenceMonitor;
|
||||
import com.silverwrist.dynamo.util.*;
|
||||
import com.silverwrist.venice.CommunitySearchField;
|
||||
import com.silverwrist.venice.SearchMode;
|
||||
import com.silverwrist.venice.VeniceNamespaces;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.iface.*;
|
||||
|
||||
public class CommunityManager
|
||||
|
@ -140,6 +142,129 @@ public class CommunityManager
|
|||
|
||||
} // end class CommunitySerializer
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class that initializes the services
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private class ServiceInit implements FinalStageInitHook
|
||||
{
|
||||
/*====================================================================
|
||||
* Constructor
|
||||
*====================================================================
|
||||
*/
|
||||
|
||||
ServiceInit()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
/*====================================================================
|
||||
* Implementations from interface FinalStageInitHook
|
||||
*====================================================================
|
||||
*/
|
||||
|
||||
public void initialize(Application application, ServiceProvider services) throws DynamoException
|
||||
{
|
||||
logger.info("Initializing community service list");
|
||||
List svclist = m_ops.getMasterServiceList();
|
||||
ModuleOperations module_ops = (ModuleOperations)(services.queryService(ModuleOperations.class));
|
||||
Iterator it = svclist.iterator();
|
||||
while (it.hasNext())
|
||||
{ // get the Map full of data
|
||||
Map item = (Map)(it.next());
|
||||
|
||||
// make sure we have the module
|
||||
PropertyKey pk = (PropertyKey)(item.get(CommunityManagerOps.KEY_MODNAME));
|
||||
Module module = module_ops.findModule(m_ns_cache.namespaceIdToName(pk.getNamespaceID()),pk.getName());
|
||||
if (module==null)
|
||||
{ // the module is not loaded - we have to load it
|
||||
String filename = (String)(item.get(CommunityManagerOps.KEY_MODFILENAME));
|
||||
module = module_ops.loadModule(filename,true);
|
||||
QualifiedNameKey modid = module.getModuleID();
|
||||
PropertyKey pk2 = new PropertyKey(m_ns_cache.namespaceNameToId(modid.getNamespace()),modid.getName());
|
||||
if (!(pk.equals(pk2)))
|
||||
{ // module name does not match what we expect - throw exception
|
||||
CommunityServiceException cse = new CommunityServiceException(CommunityManager.class,"CommunityMessages",
|
||||
"svc.modname.mismatch");
|
||||
cse.setParameter(0,filename);
|
||||
throw cse;
|
||||
|
||||
} // end if
|
||||
|
||||
} // end if
|
||||
|
||||
// now get the CommunityServiceController from the module
|
||||
pk = (PropertyKey)(item.get(CommunityManagerOps.KEY_OBJNAME));
|
||||
DynamicObject dobj = module.getProvidedObject(m_ns_cache.namespaceIdToName(pk.getNamespaceID()),pk.getName());
|
||||
if (!(dobj instanceof CommunityServiceController))
|
||||
{ // invalid controller object - throw exception
|
||||
CommunityServiceException cse = new CommunityServiceException(CommunityManager.class,"CommunityMessages",
|
||||
"svc.object.badType");
|
||||
cse.setParameter(0,m_ns_cache.namespaceIdToName(pk.getNamespaceID()));
|
||||
cse.setParameter(1,pk.getName());
|
||||
throw cse;
|
||||
|
||||
} // end if
|
||||
|
||||
CommunityServiceController csc = (CommunityServiceController)dobj;
|
||||
|
||||
// preserve the descriptors
|
||||
pk = (PropertyKey)(item.get(CommunityManagerOps.KEY_SVCNAME));
|
||||
CommunityServiceDescriptor csdesc =
|
||||
new CommunityServiceDescriptor((Integer)(item.get(CommunityManagerOps.KEY_SVCID)),
|
||||
new QualifiedNameKey(m_ns_cache.namespaceIdToName(pk.getNamespaceID()),
|
||||
pk.getName()),
|
||||
(String)(item.get(CommunityManagerOps.KEY_SHORTVAR)),csc);
|
||||
m_qname_to_service.put(csdesc.getName(),csdesc);
|
||||
m_index_to_service.put(item.get(CommunityManagerOps.KEY_SVCID),csdesc);
|
||||
|
||||
} // end while
|
||||
|
||||
// Now register our ServiceShutdown class as a pre-stage shutdown hook.
|
||||
FinalStageRegistration fsreg = (FinalStageRegistration)(services.queryService(FinalStageRegistration.class));
|
||||
fsreg.registerPreStageShutdown(new ServiceShutdown());
|
||||
|
||||
} // end initialize
|
||||
|
||||
} // end class ServiceInit
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal class that shuts down the services
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private class ServiceShutdown implements ComponentShutdown
|
||||
{
|
||||
/*====================================================================
|
||||
* Constructor
|
||||
*====================================================================
|
||||
*/
|
||||
|
||||
ServiceShutdown()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
/*====================================================================
|
||||
* Implementations from interface ComponentShutdown
|
||||
*====================================================================
|
||||
*/
|
||||
|
||||
public void shutdown()
|
||||
{
|
||||
LinkedList shut_list = new LinkedList(m_qname_to_service.values());
|
||||
m_qname_to_service.clear();
|
||||
m_index_to_service.clear();
|
||||
while (shut_list.size()>0)
|
||||
{ // shut down this community service
|
||||
CommunityServiceController csc = ((CommunityServiceDescriptor)(shut_list.removeFirst())).getController();
|
||||
csc.shutdown();
|
||||
|
||||
} // end while
|
||||
|
||||
} // end shutdown
|
||||
|
||||
} // end class ServiceShutdown
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -162,6 +287,8 @@ public class CommunityManager
|
|||
private CategoryService m_cats; // category service object
|
||||
private ReferenceMap m_id_to_comm; // ReferenceMap of community IDs to communities
|
||||
private ReferenceMap m_alias_to_comm; // ReferenceMap of community aliases to communities
|
||||
private Hashtable m_qname_to_service; // maps service QualifiedNameKeys to descriptord
|
||||
private Hashtable m_index_to_service; // maps service index numbers to descriptors
|
||||
private ComponentShutdown m_pszreg; // property serializer registration
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -173,6 +300,8 @@ public class CommunityManager
|
|||
{
|
||||
m_id_to_comm = new ReferenceMap(ReferenceMap.HARD,ReferenceMap.SOFT);
|
||||
m_alias_to_comm = new ReferenceMap(ReferenceMap.HARD,ReferenceMap.SOFT);
|
||||
m_qname_to_service = new Hashtable();
|
||||
m_index_to_service = new Hashtable();
|
||||
|
||||
} // end constructor
|
||||
|
||||
|
@ -307,6 +436,10 @@ public class CommunityManager
|
|||
(PropertySerializerRegistration)(services.queryService(PropertySerializerRegistration.class));
|
||||
m_pszreg = psreg.registerPropertySerializer(new CommunitySerializer());
|
||||
|
||||
// Register our ServiceInit class as a pre-stage init hook.
|
||||
FinalStageRegistration fsreg = (FinalStageRegistration)(services.queryService(FinalStageRegistration.class));
|
||||
fsreg.registerFinalStageInitHook(new ServiceInit());
|
||||
|
||||
} // end initialize
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -379,7 +512,7 @@ public class CommunityManager
|
|||
rc = (CommunityImpl)(m_alias_to_comm.get(data.get(CommunityManagerOps.KEY_ALIAS)));
|
||||
if (rc==null)
|
||||
{ // create the CommunityImpl object
|
||||
rc = new CommunityImpl(m_ops.getCommunityOps(),m_ns_cache,m_srm,m_users,m_alook,m_post,m_cats,data);
|
||||
rc = new CommunityImpl(this,m_ops.getCommunityOps(),m_ns_cache,m_srm,m_users,m_alook,m_post,m_cats,data);
|
||||
|
||||
// poke the maps with the new object
|
||||
m_id_to_comm.put(key,rc);
|
||||
|
@ -416,7 +549,7 @@ public class CommunityManager
|
|||
rc = (CommunityImpl)(m_id_to_comm.get(key));
|
||||
if (rc==null)
|
||||
{ // create the CommunityImpl object
|
||||
rc = new CommunityImpl(m_ops.getCommunityOps(),m_ns_cache,m_srm,m_users,m_alook,m_post,m_cats,data);
|
||||
rc = new CommunityImpl(this,m_ops.getCommunityOps(),m_ns_cache,m_srm,m_users,m_alook,m_post,m_cats,data);
|
||||
|
||||
// poke the maps with the new object
|
||||
m_id_to_comm.put(key,rc);
|
||||
|
@ -495,6 +628,38 @@ public class CommunityManager
|
|||
|
||||
} // end getNumCommunitiesInCategory
|
||||
|
||||
public List getAvailableServices()
|
||||
{
|
||||
if (m_qname_to_service.isEmpty())
|
||||
return Collections.EMPTY_LIST;
|
||||
ArrayList rc = new ArrayList(m_qname_to_service.values());
|
||||
Collections.sort(rc,new Comparator()
|
||||
{
|
||||
public int compare(Object o1, Object o2)
|
||||
{
|
||||
String s1 = ((CommunityServiceDescriptor)o1).getDescription();
|
||||
String s2 = ((CommunityServiceDescriptor)o2).getDescription();
|
||||
return s1.compareTo(s2);
|
||||
|
||||
} // end compare
|
||||
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
return false;
|
||||
|
||||
} // end equals
|
||||
|
||||
}); // end Comparator object
|
||||
return Collections.unmodifiableList(rc);
|
||||
|
||||
} // end getAvailableServices
|
||||
|
||||
public CommunityServiceDescriptor getServiceForID(int id)
|
||||
{
|
||||
return (CommunityServiceDescriptor)(m_index_to_service.get(new Integer(id)));
|
||||
|
||||
} // end getServiceForID
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface CommunityProxyService
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -43,6 +43,13 @@ abstract class CommunityManagerOps extends OpsBase
|
|||
static final String KEY_ACCESS = "access";
|
||||
static final String KEY_UPDATE = "update";
|
||||
|
||||
static final String KEY_SVCID = "svcid";
|
||||
static final String KEY_SVCNAME = "svcname";
|
||||
static final String KEY_MODNAME = "modname";
|
||||
static final String KEY_MODFILENAME = "modfilename";
|
||||
static final String KEY_OBJNAME = "objname";
|
||||
static final String KEY_SHORTVAR = "shortvar";
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -83,6 +90,8 @@ abstract class CommunityManagerOps extends OpsBase
|
|||
|
||||
abstract int searchNameCount(SearchMode mode, String term, boolean show_all) throws DatabaseException;
|
||||
|
||||
abstract List getMasterServiceList() throws DatabaseException;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External static operations
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -22,6 +22,7 @@ import java.util.*;
|
|||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.dynamo.except.*;
|
||||
import com.silverwrist.dynamo.iface.*;
|
||||
import com.silverwrist.dynamo.util.*;
|
||||
import com.silverwrist.venice.CommunityVisibility;
|
||||
import com.silverwrist.venice.SearchMode;
|
||||
|
||||
|
@ -543,4 +544,52 @@ public class CommunityManagerOps_mysql extends CommunityManagerOps
|
|||
|
||||
} // end searchNameCount
|
||||
|
||||
List getMasterServiceList() throws DatabaseException
|
||||
{
|
||||
Connection conn = null;
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{ // get a connection
|
||||
conn = getConnection();
|
||||
|
||||
// create and execute the statement
|
||||
stmt = conn.prepareStatement("SELECT svcid, svc_nsid, svc_name, mod_nsid, mod_name, mod_filename, obj_nsid, "
|
||||
+ "obj_name, shortvar FROM commsvc_master;");
|
||||
rs = stmt.executeQuery();
|
||||
|
||||
// prepare the return value
|
||||
ArrayList rc = new ArrayList();
|
||||
while (rs.next())
|
||||
{ // load values into a Map
|
||||
HashMap tmp = new HashMap();
|
||||
tmp.put(KEY_SVCID,new Integer(rs.getInt(1)));
|
||||
tmp.put(KEY_SVCNAME,new PropertyKey(rs.getInt(2),rs.getString(3)));
|
||||
tmp.put(KEY_MODNAME,new PropertyKey(rs.getInt(4),rs.getString(5)));
|
||||
tmp.put(KEY_MODFILENAME,rs.getString(6));
|
||||
tmp.put(KEY_OBJNAME,new PropertyKey(rs.getInt(7),rs.getString(8)));
|
||||
tmp.put(KEY_SHORTVAR,rs.getString(9));
|
||||
rc.add(tmp);
|
||||
|
||||
} // end while
|
||||
|
||||
rc.trimToSize();
|
||||
return rc;
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // translate to a general DatabaseException
|
||||
throw generalException(e);
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // shut everything down
|
||||
SQLUtils.shutdown(rs);
|
||||
SQLUtils.shutdown(stmt);
|
||||
SQLUtils.shutdown(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
} // end getMasterServiceList
|
||||
|
||||
} // end class CommunityManagerOps_mysql
|
||||
|
|
|
@ -31,3 +31,5 @@ auth.grantAccess=You are not authorized to grant access to community "{0}."
|
|||
auth.revokeAccess=You are not authorized to revoke access grants in community "{0}."
|
||||
join.disallowed=You are not permitted to join community "{0}."
|
||||
join.authFail=Unable to authenticate to community "{0}"; cannot join.
|
||||
svc.modname.mismatch=The name of the service module "{0}" did not match the name stored in the database.
|
||||
svc.object.badType=The service controller object {0}::{1} was of the wrong type.
|
||||
|
|
|
@ -80,4 +80,6 @@ abstract class CommunityOps extends OpsBase
|
|||
|
||||
abstract void deleteSingleUseAuthData(int cid, int ugid, boolean is_group) throws DatabaseException;
|
||||
|
||||
abstract int[] getServiceIDs(int cid) throws DatabaseException;
|
||||
|
||||
} // end class CommunityOps
|
||||
|
|
|
@ -1011,4 +1011,45 @@ class CommunityOps_mysql extends CommunityOps
|
|||
|
||||
} // end deleteSingleUseAuthData
|
||||
|
||||
int[] getServiceIDs(int cid) throws DatabaseException
|
||||
{
|
||||
Connection conn = null;
|
||||
PreparedStatement stmt = null;
|
||||
ResultSet rs = null;
|
||||
try
|
||||
{ // get a connection
|
||||
conn = getConnection();
|
||||
|
||||
// create and execute the statement
|
||||
stmt = conn.prepareStatement("SELECT svcid FROM commsvc WHERE cid = ?;");
|
||||
stmt.setInt(1,cid);
|
||||
rs = stmt.executeQuery();
|
||||
|
||||
// extract the initial results
|
||||
ArrayList tmp = new ArrayList();
|
||||
while (rs.next())
|
||||
tmp.add(new Integer(rs.getInt(1)));
|
||||
|
||||
// create the actual return value
|
||||
int[] rc = new int[tmp.size()];
|
||||
for (int i=0; i<tmp.size(); i++)
|
||||
rc[i] = ((Integer)(tmp.get(i))).intValue();
|
||||
return rc;
|
||||
|
||||
} // end try
|
||||
catch (SQLException e)
|
||||
{ // translate to a general DatabaseException
|
||||
throw generalException(e);
|
||||
|
||||
} // end catch
|
||||
finally
|
||||
{ // shut everything down
|
||||
SQLUtils.shutdown(rs);
|
||||
SQLUtils.shutdown(stmt);
|
||||
SQLUtils.shutdown(conn);
|
||||
|
||||
} // end finally
|
||||
|
||||
} // end getServiceIDs
|
||||
|
||||
} // end class CommunityOps_mysql
|
||||
|
|
|
@ -609,6 +609,12 @@ abstract class CommunityProxy implements VeniceCommunity, DynamicWrapper
|
|||
|
||||
} // end isAdministrator
|
||||
|
||||
public List getServices() throws DatabaseException
|
||||
{
|
||||
return getRealCommunity().getServices();
|
||||
|
||||
} // end getServices
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface DynamicWrapper
|
||||
*--------------------------------------------------------------------------------
|
||||
|
|
|
@ -50,4 +50,8 @@ public interface CommunityService
|
|||
|
||||
public int getNumCommunitiesInCategory(DynamoUser caller, VeniceCategory cat) throws DatabaseException;
|
||||
|
||||
public List getAvailableServices();
|
||||
|
||||
public CommunityServiceDescriptor getServiceForID(int id);
|
||||
|
||||
} // end interface CommunityService
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* 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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.community;
|
||||
|
||||
import com.silverwrist.dynamo.util.*;
|
||||
import com.silverwrist.venice.iface.*;
|
||||
|
||||
public final class CommunityServiceDescriptor
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private int m_index;
|
||||
private QualifiedNameKey m_qname;
|
||||
private String m_shortvar;
|
||||
private CommunityServiceController m_csc;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
CommunityServiceDescriptor(Integer index, QualifiedNameKey qname, String shortvar, CommunityServiceController csc)
|
||||
{
|
||||
m_index = index.intValue();
|
||||
m_qname = qname;
|
||||
m_shortvar = shortvar;
|
||||
m_csc = csc;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Package-internal operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
CommunityServiceController getController()
|
||||
{
|
||||
return m_csc;
|
||||
|
||||
} // end getController
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public int getIndex()
|
||||
{
|
||||
return m_index;
|
||||
|
||||
} // end getindex
|
||||
|
||||
public QualifiedNameKey getName()
|
||||
{
|
||||
return m_qname;
|
||||
|
||||
} // end getName
|
||||
|
||||
public String getDescription()
|
||||
{
|
||||
return m_csc.getDescription();
|
||||
|
||||
} // end getDescription
|
||||
|
||||
} // end class CommunityServiceDescriptor
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* 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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.except;
|
||||
|
||||
import com.silverwrist.dynamo.except.ExternalException;
|
||||
|
||||
public class CommunityServiceException extends ExternalException
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constructs a new <CODE>CommunityServiceException</CODE> instance.
|
||||
*
|
||||
* @param caller The classname of the class that's creating the exception. Its class loader
|
||||
* and package name will be used, together with <CODE>bundle</CODE>, to find the
|
||||
* resource bundle.
|
||||
* @param bundle The name of the resource bundle to be loaded.
|
||||
* @param message_id The identifier of the message to be loaded from the bundle.
|
||||
*/
|
||||
public CommunityServiceException(Class caller, String bundle, String message_id)
|
||||
{
|
||||
super(caller,bundle,message_id);
|
||||
|
||||
} // end constructor
|
||||
|
||||
/**
|
||||
* Constructs a new <CODE>CommunityServiceException</CODE> instance.
|
||||
*
|
||||
* @param caller The classname of the class that's creating the exception. Its class loader
|
||||
* and package name will be used, together with <CODE>bundle</CODE>, to find the
|
||||
* resource bundle.
|
||||
* @param bundle The name of the resource bundle to be loaded.
|
||||
* @param message_id The identifier of the message to be loaded from the bundle.
|
||||
* @param inner The exception to be nested inside this one.
|
||||
*/
|
||||
public CommunityServiceException(Class caller, String bundle, String message_id, Throwable inner)
|
||||
{
|
||||
super(caller,bundle,message_id,inner);
|
||||
|
||||
} // end constructor
|
||||
|
||||
} // end class CommunityServiceException
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* 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) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.iface;
|
||||
|
||||
import com.silverwrist.dynamo.iface.ComponentShutdown;
|
||||
import com.silverwrist.dynamo.iface.DynamicObject;
|
||||
|
||||
public interface CommunityServiceController extends DynamicObject, ComponentShutdown
|
||||
{
|
||||
public String getDescription();
|
||||
|
||||
} // end interface CommunityServiceController
|
|
@ -20,6 +20,7 @@ package com.silverwrist.venice.iface;
|
|||
import java.security.Principal;
|
||||
import java.security.acl.AclNotFoundException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import com.silverwrist.dynamo.except.AuthenticationException;
|
||||
import com.silverwrist.dynamo.except.DatabaseException;
|
||||
import com.silverwrist.dynamo.except.DynamoSecurityException;
|
||||
|
@ -313,4 +314,6 @@ public interface VeniceCommunity extends NamedObject, SecureObjectStore
|
|||
|
||||
public boolean isAdministrator(DynamoUser user);
|
||||
|
||||
public List getServices() throws DatabaseException;
|
||||
|
||||
} // end interface VeniceCommunity
|
||||
|
|
Loading…
Reference in New Issue
Block a user