some more minor mods to the module manager, and implementation of the module

uninstallation page
This commit is contained in:
Eric J. Bowersox 2003-06-19 20:21:20 +00:00
parent 0f0f4a4a4e
commit c8b6a513b9
12 changed files with 230 additions and 11 deletions

View File

@ -1444,6 +1444,7 @@ INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link, perm_ns
(8, 6, 'TEXT', 'Edit Password Reminder E-Mail Message', 'SERVLET', 'sysadmin/pwremind_email.js.vs', 12, (8, 6, 'TEXT', 'Edit Password Reminder E-Mail Message', 'SERVLET', 'sysadmin/pwremind_email.js.vs', 12,
'set.property'); 'set.property');
# Create the sysadmin modules menu. (ID #9)
INSERT INTO menus (menuid, menu_nsid, menu_name, title, subtitle) INSERT INTO menus (menuid, menu_nsid, menu_name, title, subtitle)
VALUES (9, 13, 'system.admin.module', 'Manage Modules', NULL); VALUES (9, 13, 'system.admin.module', 'Manage Modules', NULL);
INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link, perm_nsid, perm_name) VALUES INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link, perm_nsid, perm_name) VALUES
@ -1451,7 +1452,7 @@ INSERT INTO menuitems (menuid, sequence, itemtype, text, linktype, link, perm_ns
NULL ), NULL ),
(9, 1, 'TEXT', 'Install New Modules', 'SERVLET', 'sysadmin/module_install.js.vs', 13, (9, 1, 'TEXT', 'Install New Modules', 'SERVLET', 'sysadmin/module_install.js.vs', 13,
'install.modules' ), 'install.modules' ),
(9, 2, 'TEXT', 'Uninstall Modules', 'SERVLET', 'sysadmin/TODO', 13, (9, 2, 'TEXT', 'Uninstall Modules', 'SERVLET', 'sysadmin/module_uninstall.js.vs', 13,
'uninstall.modules'), 'uninstall.modules'),
(9, 100, 'MARKER', 'begin-module-sysadmin', NULL, NULL, NULL, (9, 100, 'MARKER', 'begin-module-sysadmin', NULL, NULL, NULL,
NULL ), NULL ),

View File

@ -26,6 +26,8 @@ public interface Module
{ {
public QualifiedNameKey getModuleID(); public QualifiedNameKey getModuleID();
public String getDescription();
public void install(Principal installer, DynamoLog log) throws DatabaseException, ModuleException; public void install(Principal installer, DynamoLog log) throws DatabaseException, ModuleException;
public void uninstall(Principal uninstaller, DynamoLog log) throws DatabaseException, ModuleException; public void uninstall(Principal uninstaller, DynamoLog log) throws DatabaseException, ModuleException;

View File

@ -25,6 +25,8 @@ public interface ModuleFunctions
{ {
public QualifiedNameKey getModuleID(); public QualifiedNameKey getModuleID();
public String getDescription();
public void initialize(ModuleSite site, ServiceProvider services) throws ModuleException; public void initialize(ModuleSite site, ServiceProvider services) throws ModuleException;
public void shutdown(); public void shutdown();

View File

@ -298,7 +298,7 @@ class IndexServiceImpl implements IndexService
private final List doQuery(Query query, int offset, int count) throws IndexException private final List doQuery(Query query, int offset, int count) throws IndexException
{ {
SubsetCollector subc = new SubsetCollector(offset,count); SubsetCollector subc = new SubsetCollector(offset,count+1);
List rc = null; List rc = null;
IndexReader irdr = null; IndexReader irdr = null;
IndexSearcher srch = null; IndexSearcher srch = null;

View File

@ -284,6 +284,12 @@ class ModuleLoader extends URLClassLoader implements Module
} // end getModuleID } // end getModuleID
public String getDescription()
{
return m_modfuncs.getDescription();
} // end getDescription
public synchronized void install(Principal installer, DynamoLog log) throws DatabaseException, ModuleException public synchronized void install(Principal installer, DynamoLog log) throws DatabaseException, ModuleException
{ {
if (m_ops.isModuleInstalled(m_filename)) if (m_ops.isModuleInstalled(m_filename))

View File

@ -261,16 +261,19 @@ public class ModuleManager implements NamedObject, ComponentInitialize, Componen
QualifiedNameKey qname = new QualifiedNameKey(namespace,name); QualifiedNameKey qname = new QualifiedNameKey(namespace,name);
synchronized (this) synchronized (this)
{ // look up module in hash table { // look up module in hash table
ModuleLoader rc = (ModuleLoader)(m_qname_to_module.get(qname)); return (Module)(m_qname_to_module.get(qname));
if (rc!=null)
return (Module)rc;
} // end synchronized block } // end synchronized block
return null;
} // end findModule } // end findModule
public synchronized Module findModuleByFilename(String filename)
{
// look for the right module already in the map
return (Module)(m_jar_to_module.get(filename));
} // end findModuleByFilename
public Module loadModule(String name, boolean initialize) throws ModuleException public Module loadModule(String name, boolean initialize) throws ModuleException
{ {
ModuleLoader rc = null; ModuleLoader rc = null;

View File

@ -29,6 +29,8 @@ public interface ModuleOperations
{ {
public Module findModule(String namespace, String name); public Module findModule(String namespace, String name);
public Module findModuleByFilename(String filename);
public Module loadModule(String name, boolean initialize) throws ModuleException; public Module loadModule(String name, boolean initialize) throws ModuleException;
public void freeUnusedModules(); public void freeUnusedModules();

View File

@ -35,6 +35,8 @@ public class Main implements ModuleFunctions
private static final QualifiedNameKey ID = private static final QualifiedNameKey ID =
new QualifiedNameKey("http://www.silverwrist.com/NS/dynamo/2003/05/18/testapp","testmodule"); new QualifiedNameKey("http://www.silverwrist.com/NS/dynamo/2003/05/18/testapp","testmodule");
private static final String DESCR = "Dynamo Test Module";
/*-------------------------------------------------------------------------------- /*--------------------------------------------------------------------------------
* Attributes * Attributes
*-------------------------------------------------------------------------------- *--------------------------------------------------------------------------------
@ -62,6 +64,12 @@ public class Main implements ModuleFunctions
} // end getModuleID } // end getModuleID
public String getDescription()
{
return DESCR;
} // end getDescription
public void initialize(ModuleSite site, ServiceProvider services) throws ModuleException public void initialize(ModuleSite site, ServiceProvider services) throws ModuleException
{ {
m_site = site; m_site = site;

View File

@ -29,6 +29,12 @@ req = bsf.lookupBean("request");
req_help = bsf.lookupBean("request_help"); req_help = bsf.lookupBean("request_help");
user = vlib.getUser(req); user = vlib.getUser(req);
// Make sure we are permitted to be here.
srm = cast.querySecurityReferenceMonitor(req_help.getRequestObject(Namespaces.DYNAMO_OBJECT_NAMESPACE,"srm"));
acl = srm.getGlobalAcl();
if (!(acl.testPermission(user,VeniceNamespaces.SYSTEM_PERMS_NAMESPACE,"install.modules")))
dynamo.scriptReturn(vlib.stdErrorBox(req,"Security Error","You are not permitted to install modules."));
modops = cast.queryModuleOperations(req); modops = cast.queryModuleOperations(req);
the_module = req_help.getParameterString("mod"); the_module = req_help.getParameterString("mod");

View File

@ -0,0 +1,109 @@
// 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):
importPackage(java.util);
importClass(Packages.com.silverwrist.dynamo.Namespaces);
importPackage(Packages.com.silverwrist.dynamo.except);
importPackage(Packages.com.silverwrist.dynamo.iface);
importPackage(Packages.com.silverwrist.dynamo.module);
importPackage(Packages.com.silverwrist.dynamo.security);
importPackage(Packages.com.silverwrist.dynamo.util);
importClass(Packages.com.silverwrist.venice.VeniceNamespaces);
importPackage(Packages.com.silverwrist.venice.content);
importPackage(Packages.com.silverwrist.venice.iface);
req = bsf.lookupBean("request");
req_help = bsf.lookupBean("request_help");
user = vlib.getUser(req);
// Make sure we are permitted to be here.
srm = cast.querySecurityReferenceMonitor(req_help.getRequestObject(Namespaces.DYNAMO_OBJECT_NAMESPACE,"srm"));
acl = srm.getGlobalAcl();
if (!(acl.testPermission(user,VeniceNamespaces.SYSTEM_PERMS_NAMESPACE,"uninstall.modules")))
dynamo.scriptReturn(vlib.stdErrorBox(req,"Security Error","You are not permitted to uninstall modules."));
modops = cast.queryModuleOperations(req);
the_module = rhelp.getParameterString("mod");
if (the_module!=null)
{ // we want to uninstall this module
rc = null;
if (vlib.confirmed(req,"/sysadmin/module_uninstall.js.vs","confirmation","confnum"))
{ // OK, they have confirmed they want to uninstall the module...do it!
mod = modops.findModuleByFilename(n);
except = null;
log = new SimpleMemoryLog();
try
{ // uninstall the module
mod.uninstall(user,log);
modops.freeUnusedModules(); // GC the module list, as it were
} // end try
catch (e)
{ // save the exception
except = e;
} // end catch
// Return the results.
rc = new VelocityView("Module Uninstallation","sysadmin/module_uninstall_result.vm");
rc.setParameter("module",the_module);
rc.setParameter("log",log.getLog());
if (except!=null)
rc.setParameter("except",except);
} // end if
else
{ // generate a confirmation number box
msg = "You are about to uninstall module '" + the_module + "'! This will cause any and all data associated with "
+ "this module (such as database tables and their contents) to be <b>DESTROYED AND IRREVOCABLY LOST!</b> "
+ "Are you <em>really</em> sure you want to do this?";
ok_url = "sysadmin/module_uninstall.js.vs?mod=" + stringutils.encodeURL(the_module);
rc = new ConfirmBox(req,"/sysadmin/module_uninstall.js.vs","confirmation","confnum",
"Module Uninstall Confirmation",msg,"SERVLET",ok_url,"SERVLET",
"sysadmin/module_uninstall.js.vs");
} // end else
dynamo.scriptReturn(rc);
} // end if
// Get the set of all installed module files.
instmod = modops.listInstalledModuleNames();
// Turn it into a list of name/description pairs.
namelist = new ArrayList();
it = instmod.iterator();
while (it.hasNext())
{ // get each module name in turn, and get the module reference
n = it.next() + "";
mod = modops.findModuleByFilename(n);
if (mod!=null)
{ // get the module's description and add it
tmp = new HashMap();
tmp.put("name",n);
tmp.put("descr",mod.getDescription());
namelist.add(tmp);
} // end if
} // end while
// Return the Velocity view.
rc = new VelocityView("Uninstall Modules","sysadmin/module_uninstall.vm");
rc.setParameter("modlist",namelist);
dynamo.scriptOutput(rc);

View File

@ -0,0 +1,41 @@
#*
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):
*#
#*
Parameters:
modlist = List of module file names which are not yet installed.
*#
#header1( "Uninstall Modules" )
<p><a href="#formatURL( "SERVLET" "sysadmin/modules.js.vs" )">Return to Previous Menu</a></p>
#if( $modlist.isEmpty() )
<p><em>No modules are curently installed in the system.</em></p>
#else
<p>The following modules are presently installed on the system. Click a module's name to uninstall it.</p>
<div align="center"><table border="1" cellpadding="2" cellspacing="0">
<tr>
<th><b>Name</b></th>
<th><b>Description</b></th>
</tr>
#foreach( $x in $modlist )
#set( $en = "#encodeURL( $x.name )" )
<tr>
<td><a href="#formatURL( "SERVLET" "sysadmin/module_uninstall.js.vs?mod=$en" )">#encodeHTML( $x.name )</a></td>
<td>#encodeHTML( $x.descr )</td>
</tr>
#end
</table></div>
#end

View File

@ -0,0 +1,39 @@
#*
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):
*#
#*
Parameters:
module = The name of the module we were uninstalling
except = The exception that occurred if uninstall failed (null on success)
log = List containing log messages from the uninstallation
*#
#header2( "Uninstall Module:" $module )
#if( $except )
<p>The uninstallation of module <b>#encodeHTML( $module )</b> failed. The following is the exception that was
thrown by uninstallation:</p>
<pre>#stacktrace( $except )</pre>
#else
<p>The uninstallation of module <b>#encodeHTML( $module )</b> was completed successfully.</p>
#end
<p>The following are the log messages generated by module uninstallation:</p>
<table border="1" width="100%" cellpadding="3" cellspacing="0"><tr><td class="content">
#foreach( $x in $log )
#encodeHTML( $x )<br />
#end
</td></tr></table>
<p><a href="sysadmin/module_uninstall.js.vs">Uninstall more modules</a></p>
<p><a href="sysadmin/modules.js.vs">Return to previous menu</a></p>