diff --git a/doc/xmlrpc-functions-reference.sxw b/doc/xmlrpc-functions-reference.sxw new file mode 100644 index 0000000..cfab457 Binary files /dev/null and b/doc/xmlrpc-functions-reference.sxw differ diff --git a/src/com/silverwrist/venice/ui/rpc/XmlRpcLibrary.java b/src/com/silverwrist/venice/ui/rpc/XmlRpcLibrary.java new file mode 100644 index 0000000..aeaccd7 --- /dev/null +++ b/src/com/silverwrist/venice/ui/rpc/XmlRpcLibrary.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) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * + * Contributor(s): + */ +package com.silverwrist.venice.ui.rpc; + +import java.util.*; +import com.silverwrist.util.*; + +public class XmlRpcLibrary +{ + /*-------------------------------------------------------------------------------- + * Static data members + *-------------------------------------------------------------------------------- + */ + + private static XmlRpcLibrary s_self = null; + + /*-------------------------------------------------------------------------------- + * Constructor + *-------------------------------------------------------------------------------- + */ + + private XmlRpcLibrary() + { // no external access + } // end constructor + + /*-------------------------------------------------------------------------------- + * External operations + *-------------------------------------------------------------------------------- + */ + + public final void setIfNotNull(Map struct, String name, Object value) + { + if (value!=null) + struct.put(name,value); + + } // end setIfNotNull + + public final int structMemberAsInt(Map struct, String name) throws XmlRpcFault + { + Object foo = struct.get(name); + if (foo instanceof Integer) + return ((Integer)foo).intValue(); + else if (foo instanceof Boolean) + return ((Boolean)foo).booleanValue() ? 1 : 0; + else + throw new XmlRpcFault(10000,"type mismatch in structure member \"" + name + "\""); + + } // end structMemberAsInt + + public final String structMemberAsString(Map struct, String name) throws XmlRpcFault + { + Object foo = struct.get(name); + if ((foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map)) + throw new XmlRpcFault(10000,"type mismatch in structure member \"" + name + "\""); + return foo.toString(); + + } // end structMemberAsString + + public final boolean structMemberAsBoolean(Map struct, String name) throws XmlRpcFault + { + Object foo = struct.get(name); + if (foo instanceof Boolean) + return ((Boolean)foo).booleanValue(); + else if (foo instanceof Integer) + return (((Integer)foo).intValue()!=0); + else if (foo instanceof String) + return !StringUtil.isStringEmpty((String)foo); + else + throw new XmlRpcFault(10000,"type mismatch in structure member \"" + name + "\""); + + } // end structMemberAsBoolean + + public final java.util.Date structMemberAsDate(Map struct, String name) throws XmlRpcFault + { + Object foo = struct.get(name); + if (!(foo instanceof java.util.Date)) + throw new XmlRpcFault(10000,"type mismatch in structure member \"" + name + "\""); + return (java.util.Date)foo; + + } // end structMemberAsDate + + /*-------------------------------------------------------------------------------- + * External static operations + *-------------------------------------------------------------------------------- + */ + + public static final XmlRpcLibrary get() + { + if (s_self==null) + s_self = new XmlRpcLibrary(); + return s_self; + + } // end get + +} // end class XmlRpcLibrary diff --git a/src/com/silverwrist/venice/ui/rpc/XmlRpcRequest.java b/src/com/silverwrist/venice/ui/rpc/XmlRpcRequest.java index 2a8c241..4d6d8de 100644 --- a/src/com/silverwrist/venice/ui/rpc/XmlRpcRequest.java +++ b/src/com/silverwrist/venice/ui/rpc/XmlRpcRequest.java @@ -441,6 +441,44 @@ public class XmlRpcRequest } // end getParamType + public final boolean isParamCompatible(int ndx, String type) + { + Object foo = m_method_params.get(ndx); + if (type.equals("int")) + return ((foo instanceof Boolean) || (foo instanceof Integer)); + if (type.equals("boolean")) + return ((foo instanceof Boolean) || (foo instanceof Integer) || (foo instanceof String)); + if (type.equals("string")) + return ( (foo instanceof Boolean) || (foo instanceof Integer) || (foo instanceof Double) + || (foo instanceof String) || (foo instanceof java.util.Date)); + if (type.equals("double")) + return ((foo instanceof Boolean) || (foo instanceof Integer) || (foo instanceof Double)); + if (type.equals("dateTime")) + return (foo instanceof java.util.Date); + if (type.equals("base64")) + return (foo instanceof byte[]); + if (type.equals("struct")) + return (foo instanceof Map); + if (type.equals("array")) + return (foo instanceof List); + return false; + + } // end isParamCompatible + + public final boolean getParamBoolean(int ndx) throws XmlRpcFault + { + Object foo = m_method_params.get(ndx); + if (foo instanceof Boolean) + return ((Boolean)foo).booleanValue(); + else if (foo instanceof Integer) + return (((Integer)foo).intValue()!=0); + else if (foo instanceof String) + return !StringUtil.isStringEmpty((String)foo); + else + throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); + + } // end getParamBoolean + public final int getParamInt(int ndx) throws XmlRpcFault { Object foo = m_method_params.get(ndx); @@ -496,10 +534,42 @@ public class XmlRpcRequest } // end getParamSQLDate + public final Map getParamStruct(int ndx) throws XmlRpcFault + { + Object foo = m_method_params.get(ndx); + if (foo instanceof Map) + return (Map)foo; + throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); + + } // end getParamStruct + + public final List getParamArray(int ndx) throws XmlRpcFault + { + Object foo = m_method_params.get(ndx); + if (foo instanceof List) + return (List)foo; + throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); + + } // end getParamArray + + public final AdminUserContext getParamUser(int ndx, AdminOperations adm) throws XmlRpcFault, DataException + { + Object foo = m_method_params.get(ndx); + if ( (foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean) + || (foo instanceof java.util.Date)) + throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); + if (foo instanceof Number) + return adm.getUserContext(((Number)foo).intValue()); + else + return adm.getUserContext(foo.toString().trim()); + + } // end getParamUser + public final CommunityContext getParamCommunity(int ndx) throws XmlRpcFault, DataException { Object foo = m_method_params.get(ndx); - if ((foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean)) + if ( (foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean) + || (foo instanceof java.util.Date)) throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); if (foo instanceof Integer) return m_req.getUser().getCommunityContext(((Integer)foo).intValue()); @@ -512,7 +582,8 @@ public class XmlRpcRequest throws XmlRpcFault, DataException, AccessError { Object foo = m_method_params.get(ndx); - if ((foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean)) + if ( (foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean) + || (foo instanceof java.util.Date)) throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch"); if (foo instanceof Integer) return comm.getConferenceContext(((Integer)foo).intValue()); diff --git a/src/com/silverwrist/venice/ui/script/ScriptManager.java b/src/com/silverwrist/venice/ui/script/ScriptManager.java index 084c9d2..95f315f 100644 --- a/src/com/silverwrist/venice/ui/script/ScriptManager.java +++ b/src/com/silverwrist/venice/ui/script/ScriptManager.java @@ -9,7 +9,7 @@ * * The Original Code is the Venice Web Communities System. * - * The Initial Developer of the Original Code is Eric J. Bowersox , + * 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-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * @@ -25,6 +25,7 @@ import org.apache.log4j.*; import com.silverwrist.util.*; import com.silverwrist.venice.ui.*; import com.silverwrist.venice.ui.helpers.ThrowableContent; +import com.silverwrist.venice.ui.rpc.XmlRpcLibrary; public class ScriptManager { @@ -52,9 +53,9 @@ public class ScriptManager public void output(Object o) { - if (return_stack.size()>0) + if (m_return_stack.size()>0) { // set the return value - ScriptReturn sro = (ScriptReturn)(return_stack.getFirst()); + ScriptReturn sro = (ScriptReturn)(m_return_stack.getFirst()); sro.set(o); } // end if @@ -72,30 +73,30 @@ public class ScriptManager { public void fatal(Object message) { - if (logger_stack.size()>0) - ((Logger)(logger_stack.getFirst())).fatal(message); + if (m_logger_stack.size()>0) + ((Logger)(m_logger_stack.getFirst())).fatal(message); } // end fatal public void error(Object message) { - if (logger_stack.size()>0) - ((Logger)(logger_stack.getFirst())).error(message); + if (m_logger_stack.size()>0) + ((Logger)(m_logger_stack.getFirst())).error(message); } // end error public void warn(Object message) { - if (logger_stack.size()>0) - ((Logger)(logger_stack.getFirst())).warn(message); + if (m_logger_stack.size()>0) + ((Logger)(m_logger_stack.getFirst())).warn(message); } // end warn public void info(Object message) { - if (logger_stack.size()>0) + if (m_logger_stack.size()>0) { // check to make sure info is enabled first - Logger l = (Logger)(logger_stack.getFirst()); + Logger l = (Logger)(m_logger_stack.getFirst()); if (l.isInfoEnabled()) l.info(message); @@ -105,9 +106,9 @@ public class ScriptManager public void debug(Object message) { - if (logger_stack.size()>0) + if (m_logger_stack.size()>0) { // check to make sure debug is enabled first - Logger l = (Logger)(logger_stack.getFirst()); + Logger l = (Logger)(m_logger_stack.getFirst()); if (l.isDebugEnabled()) l.debug(message); @@ -132,10 +133,10 @@ public class ScriptManager *-------------------------------------------------------------------------------- */ - private BSFManager mgr; // Bean Scripting Framework manager - private LinkedList registered_names; // stack of lists of registered names - private LinkedList logger_stack; // stack of loggers for nested evaluation - private LinkedList return_stack; // stack of return values + private BSFManager m_bsf; // Bean Scripting Framework manager + private LinkedList m_registered_names; // stack of lists of registered names + private LinkedList m_logger_stack; // stack of loggers for nested evaluation + private LinkedList m_return_stack; // stack of return values /*-------------------------------------------------------------------------------- * Constructor @@ -154,14 +155,14 @@ public class ScriptManager logger.debug("creating new ScriptManager"); // initialize the BSFManager - mgr = new BSFManager(); - mgr.setTempDir(temp_dir); + m_bsf = new BSFManager(); + m_bsf.setTempDir(temp_dir); if (BSFManager.isLanguageRegistered("javascript")) { // we need to so some fixing up to make Rhino work try { // ensure the engine is loaded, and do our fixup routine - mgr.loadScriptingEngine("javascript"); + m_bsf.loadScriptingEngine("javascript"); fixupRhino(); } // end if @@ -173,8 +174,9 @@ public class ScriptManager try { // declare beans used by the scripting engines - mgr.declareBean("vlib",new MyScriptLibrary(),MyScriptLibrary.class); - mgr.declareBean("logger",new ScriptLogger(),ScriptLogger.class); + m_bsf.declareBean("vlib",new MyScriptLibrary(),MyScriptLibrary.class); + m_bsf.declareBean("logger",new ScriptLogger(),ScriptLogger.class); + m_bsf.declareBean("rpclib",XmlRpcLibrary.get(),XmlRpcLibrary.class); } // end try catch (BSFException e) @@ -185,10 +187,10 @@ public class ScriptManager } // end catch // initialize the rest of the object - registered_names = new LinkedList(); - registered_names.addFirst(new HashSet()); - logger_stack = new LinkedList(); - return_stack = new LinkedList(); + m_registered_names = new LinkedList(); + m_registered_names.addFirst(new HashSet()); + m_logger_stack = new LinkedList(); + m_return_stack = new LinkedList(); } // end constructor @@ -320,9 +322,9 @@ public class ScriptManager public void shutdown() { - mgr.terminate(); - registered_names.clear(); - logger_stack.clear(); + m_bsf.terminate(); + m_registered_names.clear(); + m_logger_stack.clear(); } // end shutdown @@ -337,7 +339,7 @@ public class ScriptManager try { // look up the scripting language for this file - lang = mgr.getLangFromFilename(filename); + lang = m_bsf.getLangFromFilename(filename); code = IOUtil.loadText(file); if (logger.isDebugEnabled()) logger.debug("Code language is " + lang + ", loaded " + code.length() + " characters"); @@ -355,13 +357,13 @@ public class ScriptManager } // end catch if (logger_name!=null) // push a new logger onto the stack - logger_stack.addFirst(Logger.getLogger(logger_name)); + m_logger_stack.addFirst(Logger.getLogger(logger_name)); if (sro!=null) - return_stack.addFirst(sro); + m_return_stack.addFirst(sro); try { // execute the script! - mgr.exec(lang,filename,1,1,code); + m_bsf.exec(lang,filename,1,1,code); } // end try catch (BSFException e) @@ -372,9 +374,9 @@ public class ScriptManager finally { // pop the logger stack if necessary if (logger_name!=null) - logger_stack.removeFirst(); + m_logger_stack.removeFirst(); if (sro!=null) - return_stack.removeFirst(); + m_return_stack.removeFirst(); } // end finally @@ -386,32 +388,32 @@ public class ScriptManager public void register(String name, Object obj) { - mgr.registerBean(name,obj); - HashSet tbl = (HashSet)(registered_names.getFirst()); + m_bsf.registerBean(name,obj); + HashSet tbl = (HashSet)(m_registered_names.getFirst()); tbl.add(name); } // end register public void pushContext() { - registered_names.addFirst(new HashSet()); + m_registered_names.addFirst(new HashSet()); } // end pushContext public void popContext() { - HashSet tbl = (HashSet)(registered_names.removeFirst()); + HashSet tbl = (HashSet)(m_registered_names.removeFirst()); Iterator it = tbl.iterator(); while (it.hasNext()) - mgr.unregisterBean((String)(it.next())); - if (registered_names.isEmpty()) - registered_names.addFirst(new HashSet()); + m_bsf.unregisterBean((String)(it.next())); + if (m_registered_names.isEmpty()) + m_registered_names.addFirst(new HashSet()); } // end popContext public Object lookupObject(String name) { - return mgr.lookupBean(name); + return m_bsf.lookupBean(name); } // end lookupObject