implemented the initial XML-RPC APIs in Venice - for creating and destroying
"sessions," logging in, posting messages to topics, attaching files to messages, and a couple of minor things that aren't as important right now
This commit is contained in:
parent
f463834ef0
commit
25c5817a67
|
@ -276,19 +276,58 @@
|
||||||
|
|
||||||
<!-- Configuration for the RPC interfaces. -->
|
<!-- Configuration for the RPC interfaces. -->
|
||||||
<rpc>
|
<rpc>
|
||||||
|
<!-- Timeout for RPC sessions -->
|
||||||
|
<session-timeout>60</session-timeout>
|
||||||
|
|
||||||
<xmlrpc-methods>
|
<xmlrpc-methods>
|
||||||
<!-- XML-RPC validation suite -->
|
<!-- XML-RPC validation suite -->
|
||||||
<method name="validator1\.[a-zA-Z]*"><script name="test/validation.js"/></method>
|
<method name="validator1\.[:alpha:]+"><script name="test/validation.js"/></method>
|
||||||
|
|
||||||
<!-- Multicall "boxcar" marshaller (see http://www.xmlrpc.com/discuss/msgReader$1208) -->
|
<!-- Multicall "boxcar" marshaller (see http://www.xmlrpc.com/discuss/msgReader$1208) -->
|
||||||
<method name="system.multicall"><object class="com.silverwrist.venice.ui.rpc.XmlRpcMulticall"/></method>
|
<method name="system.multicall"><object class="com.silverwrist.venice.ui.rpc.XmlRpcMulticall"/></method>
|
||||||
|
|
||||||
|
<!-- The session creation API -->
|
||||||
|
<method name="venice:session\.create">
|
||||||
|
<object class="com.silverwrist.venice.ui.rpc.XmlRpcCreateSession"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- The other session APIs -->
|
||||||
|
<method name="venice:session\.([:alnum:]+)">
|
||||||
|
<script name="session.js"/>
|
||||||
|
<session param="0"/>
|
||||||
|
<env name="call" value="${match.1}"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- The conferencing APIs for conferences -->
|
||||||
|
<method name="venice:conferencing\.conference\.([:alnum:]+)">
|
||||||
|
<script name="conf/conference.js"/>
|
||||||
|
<session param="0"/>
|
||||||
|
<env name="call" value="${match.1}"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- The conferencing APIs for topics -->
|
||||||
|
<method name="venice:conferencing\.topic\.([:alnum:]+)">
|
||||||
|
<script name="conf/topic.js"/>
|
||||||
|
<session param="0"/>
|
||||||
|
<env name="call" value="${match.1}"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- The conferencing APIs for messages -->
|
||||||
|
<method name="venice:conferencing\.message\.([:alnum:]+)">
|
||||||
|
<script name="conf/message.js"/>
|
||||||
|
<session param="0"/>
|
||||||
|
<env name="call" value="${match.1}"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- A test method -->
|
||||||
<method name="venice:test\.sumDifference">
|
<method name="venice:test\.sumDifference">
|
||||||
<!-- <object class="com.silverwrist.venice.ui.rpc.XmlRpcTestHandler"/> -->
|
<!-- <object class="com.silverwrist.venice.ui.rpc.XmlRpcTestHandler"/> -->
|
||||||
|
<!-- <session param="0"/> -->
|
||||||
<script name="test/test1.js"/>
|
<script name="test/test1.js"/>
|
||||||
<env name="e1" value="foo"/>
|
<env name="e1" value="foo"/>
|
||||||
<env name="p1" value="${param.0}"/>
|
<env name="p1" value="${param.0}"/>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
</xmlrpc-methods>
|
</xmlrpc-methods>
|
||||||
</rpc>
|
</rpc>
|
||||||
|
|
||||||
|
|
59
rpcscripts/conf/conference.js
Normal file
59
rpcscripts/conf/conference.js
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
// 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Contributor(s):
|
||||||
|
|
||||||
|
// Implements the conferencing topic API
|
||||||
|
|
||||||
|
importPackage(java.util);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.core);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.ui.rpc);
|
||||||
|
|
||||||
|
rinput = bsf.lookupBean("request");
|
||||||
|
xreq = bsf.lookupBean("xmlrpc");
|
||||||
|
env = bsf.lookupBean("environment");
|
||||||
|
call_name = env.get("call");
|
||||||
|
|
||||||
|
// All methods have at least three parameters: session, community, conference.
|
||||||
|
if (xreq.paramCount<3)
|
||||||
|
{ // not enough parameters
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
comm = xreq.getParamCommunity(1);
|
||||||
|
conf = xreq.getParamConference(2,comm);
|
||||||
|
|
||||||
|
if ("name"==call_name)
|
||||||
|
{ // venice:conferencing.conference.name <session-id> <community> <conference> [<new-name>]
|
||||||
|
// Retrieves or sets the conference name.
|
||||||
|
if (xreq.paramCount==3)
|
||||||
|
vlib.output(conf.name);
|
||||||
|
else if (xreq.paramCount==4)
|
||||||
|
{ // set the name
|
||||||
|
name = xreq.getParamString(3);
|
||||||
|
conf.name = name;
|
||||||
|
vlib.output(name); // output the new name on success
|
||||||
|
|
||||||
|
} // end else if
|
||||||
|
else // wrong parameter count
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// just in case there's a method name that wasn't listed
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"invalid method name: " + xreq.method));
|
60
rpcscripts/conf/message.js
Normal file
60
rpcscripts/conf/message.js
Normal file
|
@ -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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Contributor(s):
|
||||||
|
|
||||||
|
// Implements the conferencing message API
|
||||||
|
|
||||||
|
importPackage(java.util);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.core);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.ui.rpc);
|
||||||
|
|
||||||
|
rinput = bsf.lookupBean("request");
|
||||||
|
xreq = bsf.lookupBean("xmlrpc");
|
||||||
|
env = bsf.lookupBean("environment");
|
||||||
|
call_name = env.get("call");
|
||||||
|
|
||||||
|
// All methods have at least five parameters: session, community, conference, topic, message.
|
||||||
|
if (xreq.paramCount<5)
|
||||||
|
{ // not enough parameters
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
comm = xreq.getParamCommunity(1);
|
||||||
|
conf = xreq.getParamConference(2,comm);
|
||||||
|
topic = xreq.getParamTopic(3,conf);
|
||||||
|
msg = xreq.getParamPost(4,topic);
|
||||||
|
|
||||||
|
if ("attach"==call_name)
|
||||||
|
{ // venice:conferencing.message.attach <session-id> <community> <conference> <topic> <message> <mime-type>
|
||||||
|
// <filename> <data>
|
||||||
|
if (xreq.paramCount!=8)
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
else if ("base64"!=xreq.getParamType(7))
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"data parameter type mismatch"));
|
||||||
|
else
|
||||||
|
{ // attach the data and return
|
||||||
|
msg.attachData(xreq.getParamString(5),xreq.getParamString(6),vlib.castByteArray(xreq.getParam(7)));
|
||||||
|
vlib.output(vlib.booleanObject(true));
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// just in case there's a method name that wasn't listed
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"invalid method name: " + xreq.method));
|
57
rpcscripts/conf/topic.js
Normal file
57
rpcscripts/conf/topic.js
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Contributor(s):
|
||||||
|
|
||||||
|
// Implements the conferencing topic API
|
||||||
|
|
||||||
|
importPackage(java.util);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.core);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.ui.rpc);
|
||||||
|
|
||||||
|
rinput = bsf.lookupBean("request");
|
||||||
|
xreq = bsf.lookupBean("xmlrpc");
|
||||||
|
env = bsf.lookupBean("environment");
|
||||||
|
call_name = env.get("call");
|
||||||
|
|
||||||
|
// All methods have at least four parameters: session, community, conference, topic.
|
||||||
|
if (xreq.paramCount<4)
|
||||||
|
{ // not enough parameters
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
comm = xreq.getParamCommunity(1);
|
||||||
|
conf = xreq.getParamConference(2,comm);
|
||||||
|
topic = xreq.getParamTopic(3,conf);
|
||||||
|
|
||||||
|
if ("postMessage"==call_name)
|
||||||
|
{ // venice:conferencing.topic.postMessage <session-id> <community> <conference> <topic> <pseud> <text>
|
||||||
|
// Posts a message, returns the message number within the topic
|
||||||
|
if (xreq.paramCount!=6)
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
else
|
||||||
|
{ // post the message
|
||||||
|
msg = topic.postNewMessage(0,xreq.getParamString(4),xreq.getParamString(5));
|
||||||
|
vlib.output(vlib.createInteger(msg.postNumber));
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// just in case there's a method name that wasn't listed
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"invalid method name: " + xreq.method));
|
66
rpcscripts/session.js
Normal file
66
rpcscripts/session.js
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
// 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Contributor(s):
|
||||||
|
|
||||||
|
// Implements the session API
|
||||||
|
|
||||||
|
importPackage(java.util);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.core);
|
||||||
|
importPackage(Packages.com.silverwrist.venice.ui.rpc);
|
||||||
|
|
||||||
|
rinput = bsf.lookupBean("request");
|
||||||
|
xreq = bsf.lookupBean("xmlrpc");
|
||||||
|
env = bsf.lookupBean("environment");
|
||||||
|
call_name = env.get("call");
|
||||||
|
//logger.debug("call selector = " + call_name);
|
||||||
|
|
||||||
|
if ("destroy"==call_name)
|
||||||
|
{ // venice:session.destroy <session-id> - destroys a session
|
||||||
|
if (xreq.paramCount!=1)
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
else
|
||||||
|
{ // end the session
|
||||||
|
rinput.endSession();
|
||||||
|
vlib.output(vlib.booleanObject(true));
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if ("login"==call_name)
|
||||||
|
{ // venice:session.login <session-id> <username> <password> - logs in the session
|
||||||
|
if (xreq.paramCount!=3)
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter count mismatch"));
|
||||||
|
else
|
||||||
|
{ // get the user name and password and log in
|
||||||
|
username = xreq.getParamString(1);
|
||||||
|
password = xreq.getParamString(2);
|
||||||
|
|
||||||
|
if (rinput.user.isLoggedIn())
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.DEFAULT_ERROR,"user already logged in"));
|
||||||
|
else
|
||||||
|
rinput.user.authenticate(username,password);
|
||||||
|
vlib.output(vlib.booleanObject(true));
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
vlib.done();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
// just in case there's a method name that wasn't listed
|
||||||
|
vlib.output(new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"invalid method name: " + xreq.method));
|
|
@ -75,6 +75,8 @@ public interface TopicMessageContext
|
||||||
public abstract void attachData(String m_type, String file, int length, InputStream data)
|
public abstract void attachData(String m_type, String file, int length, InputStream data)
|
||||||
throws AccessError, DataException;
|
throws AccessError, DataException;
|
||||||
|
|
||||||
|
public abstract void attachData(String m_type, String file, byte[] data) throws AccessError, DataException;
|
||||||
|
|
||||||
public abstract boolean canPublish();
|
public abstract boolean canPublish();
|
||||||
|
|
||||||
public abstract void publish() throws DataException, AccessError;
|
public abstract void publish() throws DataException, AccessError;
|
||||||
|
|
|
@ -923,6 +923,12 @@ class TopicMessageUserContextImpl implements TopicMessageContext
|
||||||
|
|
||||||
} // end attachData
|
} // end attachData
|
||||||
|
|
||||||
|
public void attachData(String m_type, String file, byte[] data) throws AccessError, DataException
|
||||||
|
{
|
||||||
|
attachData(m_type,file,data.length,new ByteArrayInputStream(data));
|
||||||
|
|
||||||
|
} // end attachData
|
||||||
|
|
||||||
public boolean canPublish()
|
public boolean canPublish()
|
||||||
{
|
{
|
||||||
if (!(env.testPermission(EnvUser.PERM_PUBLISH_FP)))
|
if (!(env.testPermission(EnvUser.PERM_PUBLISH_FP)))
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
* 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
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
@ -19,6 +19,18 @@ package com.silverwrist.venice.except;
|
||||||
|
|
||||||
public class AccessError extends VeniceException
|
public class AccessError extends VeniceException
|
||||||
{
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final int FAULTCODE_BASE = 20000;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
public AccessError()
|
public AccessError()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
|
@ -43,4 +55,15 @@ public class AccessError extends VeniceException
|
||||||
|
|
||||||
} // end constructor
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Overrides from class VeniceException
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getFaultCode()
|
||||||
|
{
|
||||||
|
return FAULTCODE_BASE;
|
||||||
|
|
||||||
|
} // end getFaultCode
|
||||||
|
|
||||||
} // end class AccessError
|
} // end class AccessError
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
* 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
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
@ -19,6 +19,18 @@ package com.silverwrist.venice.except;
|
||||||
|
|
||||||
public class DataException extends VeniceException
|
public class DataException extends VeniceException
|
||||||
{
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final int FAULTCODE_BASE = 10000;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructors
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
public DataException()
|
public DataException()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
|
@ -43,4 +55,15 @@ public class DataException extends VeniceException
|
||||||
|
|
||||||
} // end constructor
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Overrides from class VeniceException
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getFaultCode()
|
||||||
|
{
|
||||||
|
return FAULTCODE_BASE;
|
||||||
|
|
||||||
|
} // end getFaultCode
|
||||||
|
|
||||||
} // end class DataException
|
} // end class DataException
|
||||||
|
|
24
src/com/silverwrist/venice/except/SupplyFaultCode.java
Normal file
24
src/com/silverwrist/venice/except/SupplyFaultCode.java
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.except;
|
||||||
|
|
||||||
|
public interface SupplyFaultCode
|
||||||
|
{
|
||||||
|
public abstract int getFaultCode();
|
||||||
|
|
||||||
|
} // end interface SupplyFaultCode
|
|
@ -11,7 +11,7 @@
|
||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
* 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
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
@ -27,7 +27,7 @@ import java.io.PrintWriter;
|
||||||
* @author Eric J. Bowersox <erbo@silcom.com>
|
* @author Eric J. Bowersox <erbo@silcom.com>
|
||||||
* @version X
|
* @version X
|
||||||
*/
|
*/
|
||||||
public class VeniceException extends Exception
|
public class VeniceException extends Exception implements SupplyFaultCode
|
||||||
{
|
{
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Attributes
|
* Attributes
|
||||||
|
@ -139,6 +139,17 @@ public class VeniceException extends Exception
|
||||||
|
|
||||||
} // end printStackTrace
|
} // end printStackTrace
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface SupplyFaultCode
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public int getFaultCode()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} // end getFaultCode
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* External operations
|
* External operations
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -188,4 +188,8 @@ public interface RequestInput extends LinkTypes
|
||||||
|
|
||||||
public abstract void registerCleanup(AutoCleanup ac);
|
public abstract void registerCleanup(AutoCleanup ac);
|
||||||
|
|
||||||
|
public abstract void pushSession(VeniceUISession sess);
|
||||||
|
|
||||||
|
public abstract void popSession();
|
||||||
|
|
||||||
} // end interface RequestInput
|
} // end interface RequestInput
|
||||||
|
|
|
@ -81,6 +81,7 @@ public class RootConfig implements LinkTypes, ColorSelectors
|
||||||
private ButtonHolder buttons; // the button definitions
|
private ButtonHolder buttons; // the button definitions
|
||||||
private String[] content_hdr; // the content header parts
|
private String[] content_hdr; // the content header parts
|
||||||
private Remapper remapper; // the URL remapper
|
private Remapper remapper; // the URL remapper
|
||||||
|
private int rpc_timeout = 60; // RPC session timeout
|
||||||
private List xmlrpc_methods; // the list of XML-RPC methods
|
private List xmlrpc_methods; // the list of XML-RPC methods
|
||||||
private StockMessages stock_messages; // the stock messages
|
private StockMessages stock_messages; // the stock messages
|
||||||
private Map menus; // the menus
|
private Map menus; // the menus
|
||||||
|
@ -391,6 +392,18 @@ public class RootConfig implements LinkTypes, ColorSelectors
|
||||||
sect = loader.configGetSubSection(root_h,"rpc");
|
sect = loader.configGetSubSection(root_h,"rpc");
|
||||||
sect_h = new DOMElementHelper(sect);
|
sect_h = new DOMElementHelper(sect);
|
||||||
|
|
||||||
|
// Get the <session-timeout/> figure.
|
||||||
|
if (sect_h.hasChildElement("session-timeout"))
|
||||||
|
{ // get the timeout value
|
||||||
|
Integer xtmp = sect_h.getSubElementInt("session-timeout");
|
||||||
|
if (xtmp==null)
|
||||||
|
throw new ConfigException("<session-timeout/> value is not an integer",sect);
|
||||||
|
rpc_timeout = xtmp.intValue();
|
||||||
|
if (rpc_timeout<=0)
|
||||||
|
throw new ConfigException("<session-timeout/> value is invalid",sect);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
// Get the <xmlrpc-methods/> section.
|
// Get the <xmlrpc-methods/> section.
|
||||||
sect1 = loader.configGetSubSection(sect_h,"xmlrpc-methods");
|
sect1 = loader.configGetSubSection(sect_h,"xmlrpc-methods");
|
||||||
nl = sect1.getChildNodes();
|
nl = sect1.getChildNodes();
|
||||||
|
@ -773,6 +786,12 @@ public class RootConfig implements LinkTypes, ColorSelectors
|
||||||
|
|
||||||
} // end getDefaultServletAddress
|
} // end getDefaultServletAddress
|
||||||
|
|
||||||
|
public final int getRpcSessionTimeout()
|
||||||
|
{
|
||||||
|
return rpc_timeout;
|
||||||
|
|
||||||
|
} // end getRpcSessionTimeout
|
||||||
|
|
||||||
public final List getXmlRpcMethods()
|
public final List getXmlRpcMethods()
|
||||||
{
|
{
|
||||||
return xmlrpc_methods;
|
return xmlrpc_methods;
|
||||||
|
|
203
src/com/silverwrist/venice/ui/rpc/RpcSessionBroker.java
Normal file
203
src/com/silverwrist/venice/ui/rpc/RpcSessionBroker.java
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
/*
|
||||||
|
* 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.ui.rpc;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import javax.servlet.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.except.*;
|
||||||
|
import com.silverwrist.venice.ui.*;
|
||||||
|
import com.silverwrist.venice.ui.config.RootConfig;
|
||||||
|
import com.silverwrist.venice.ui.servlet.RequestImpl;
|
||||||
|
|
||||||
|
class RpcSessionBroker
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal class for sweeping the sessions
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class SessionSweeper extends TimerTask
|
||||||
|
{
|
||||||
|
private LinkedList workspace = new LinkedList();
|
||||||
|
|
||||||
|
SessionSweeper()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
synchronized (RpcSessionBroker.this)
|
||||||
|
{ // seek and destroy all expired sessions
|
||||||
|
Iterator it = sessions.values().iterator();
|
||||||
|
while (it.hasNext())
|
||||||
|
{ // find all the tasks that are due to be invalidated
|
||||||
|
RpcVeniceUISession s = (RpcVeniceUISession)(it.next());
|
||||||
|
if (s.canUnloadNow())
|
||||||
|
workspace.addLast(s);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
while (workspace.size()>0)
|
||||||
|
{ // invalidate all sessions that have not been accessed recently
|
||||||
|
RpcVeniceUISession s = (RpcVeniceUISession)(workspace.removeFirst());
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("session sweeper removing session with ID " + s.getID());
|
||||||
|
s.invalidate();
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
} // end run
|
||||||
|
|
||||||
|
} // end class SessionSweeper
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(RpcSessionBroker.class);
|
||||||
|
|
||||||
|
private static final String ATTRIBUTE = "ui.rpc.SessionBroker";
|
||||||
|
|
||||||
|
private static final long INTERVAL = 1000;
|
||||||
|
|
||||||
|
private static final String PREFIX = "rpcsess:";
|
||||||
|
private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
|
||||||
|
private static final int ID_LENGTH = 40;
|
||||||
|
|
||||||
|
private static Random rng = new Random(); // random number generator
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private HashMap sessions = new HashMap(); // the actual sessions
|
||||||
|
private VeniceEngine engine; // the Venice engine
|
||||||
|
private int timeout_value; // the timeout value
|
||||||
|
private Timer timer = new Timer(true); // the interval timer used to schedule sweeps
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private RpcSessionBroker(VeniceEngine engine, RootConfig root)
|
||||||
|
{
|
||||||
|
this.engine = engine;
|
||||||
|
this.timeout_value = root.getRpcSessionTimeout();
|
||||||
|
timer.scheduleAtFixedRate(new SessionSweeper(),INTERVAL,INTERVAL);
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String generateID()
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer(PREFIX);
|
||||||
|
for (int i=0; i<ID_LENGTH; i++)
|
||||||
|
buf.append(ALPHABET.charAt(rng.nextInt(ALPHABET.length())));
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end generateID
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
final int getTimeout()
|
||||||
|
{
|
||||||
|
return timeout_value;
|
||||||
|
|
||||||
|
} // end getTimeout
|
||||||
|
|
||||||
|
final VeniceEngine getEngine()
|
||||||
|
{
|
||||||
|
return engine;
|
||||||
|
|
||||||
|
} // end getEngine
|
||||||
|
|
||||||
|
final synchronized VeniceUISession getSession(String id)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("looking up session with ID " + id + " - current session count is " + sessions.size());
|
||||||
|
RpcVeniceUISession rc = (RpcVeniceUISession)(sessions.get(id));
|
||||||
|
if (rc!=null)
|
||||||
|
rc.touch();
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end getSession
|
||||||
|
|
||||||
|
final synchronized VeniceUISession createSession(String remote_address) throws DataException
|
||||||
|
{
|
||||||
|
String new_id = generateID();
|
||||||
|
while (sessions.containsKey(new_id))
|
||||||
|
new_id = generateID();
|
||||||
|
RpcVeniceUISession rc = new RpcVeniceUISession(new_id,remote_address,this);
|
||||||
|
sessions.put(new_id,rc);
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("created new session with ID " + new_id + " - session count now " + sessions.size());
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end createSession
|
||||||
|
|
||||||
|
final synchronized void detachSession(String id)
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("removing session with ID " + id + " - current session count is " + sessions.size());
|
||||||
|
sessions.remove(id);
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("session count now " + sessions.size());
|
||||||
|
|
||||||
|
} // end detachSession
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static RpcSessionBroker get(ServletContext ctxt)
|
||||||
|
{
|
||||||
|
return (RpcSessionBroker)(RequestImpl.getAppAttribute(ctxt,ATTRIBUTE));
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
public static RpcSessionBroker get(RequestInput ri)
|
||||||
|
{
|
||||||
|
return (RpcSessionBroker)(ri.getAppAttribute(ATTRIBUTE));
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
public static synchronized void init(ServletContext ctxt, VeniceEngine engine, RootConfig root)
|
||||||
|
{
|
||||||
|
if (RequestImpl.getAppAttribute(ctxt,ATTRIBUTE)==null)
|
||||||
|
RequestImpl.setAppAttribute(ctxt,ATTRIBUTE,new RpcSessionBroker(engine,root));
|
||||||
|
|
||||||
|
} // end init
|
||||||
|
|
||||||
|
} // end class RpcSessionBroker
|
161
src/com/silverwrist/venice/ui/rpc/RpcVeniceUISession.java
Normal file
161
src/com/silverwrist/venice/ui/rpc/RpcVeniceUISession.java
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.ui.rpc;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
|
import com.silverwrist.venice.except.*;
|
||||||
|
import com.silverwrist.venice.ui.*;
|
||||||
|
|
||||||
|
class RpcVeniceUISession implements VeniceUISession
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private RpcSessionBroker broker; // session broker
|
||||||
|
private long create_time; // session creation time
|
||||||
|
private long access_time; // session last access time
|
||||||
|
private String id; // the session ID
|
||||||
|
private String remote_addr; // the remote address
|
||||||
|
private int max_inactive; // the maximum inactive interval
|
||||||
|
private HashMap attrs = new HashMap(); // storage for attributes
|
||||||
|
private UserContext user; // user context in this session
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
RpcVeniceUISession(String id, String remote_addr, RpcSessionBroker broker) throws DataException
|
||||||
|
{
|
||||||
|
this.broker = broker;
|
||||||
|
this.id = id;
|
||||||
|
this.remote_addr = remote_addr;
|
||||||
|
this.max_inactive = broker.getTimeout() * 60;
|
||||||
|
this.user = broker.getEngine().createUserContext(remote_addr);
|
||||||
|
this.create_time = this.access_time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface VeniceUISession
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public long getCreationTime()
|
||||||
|
{
|
||||||
|
return create_time;
|
||||||
|
|
||||||
|
} // end getCreationTime
|
||||||
|
|
||||||
|
public String getID()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
|
||||||
|
} // end getID
|
||||||
|
|
||||||
|
public long getLastAccessedTime()
|
||||||
|
{
|
||||||
|
return access_time;
|
||||||
|
|
||||||
|
} // end getLastAccessedTime
|
||||||
|
|
||||||
|
public synchronized void setMaxInactiveInterval(int interval)
|
||||||
|
{
|
||||||
|
max_inactive = interval;
|
||||||
|
touch();
|
||||||
|
|
||||||
|
} // end setMaxInactiveInterval
|
||||||
|
|
||||||
|
public int getMaxInactiveInterval()
|
||||||
|
{
|
||||||
|
return max_inactive;
|
||||||
|
|
||||||
|
} // end getMaxInactiveInterval
|
||||||
|
|
||||||
|
public Object getAttribute(String name)
|
||||||
|
{
|
||||||
|
return attrs.get(name);
|
||||||
|
|
||||||
|
} // end getAttribute
|
||||||
|
|
||||||
|
public Enumeration getAttributeNames()
|
||||||
|
{
|
||||||
|
return Collections.enumeration(attrs.keySet());
|
||||||
|
|
||||||
|
} // end getAttributeNames
|
||||||
|
|
||||||
|
public synchronized void setAttribute(String name, Object o)
|
||||||
|
{
|
||||||
|
attrs.put(name,o);
|
||||||
|
touch();
|
||||||
|
|
||||||
|
} // end setAttribute
|
||||||
|
|
||||||
|
public synchronized void removeAttribute(String name)
|
||||||
|
{
|
||||||
|
attrs.remove(name);
|
||||||
|
touch();
|
||||||
|
|
||||||
|
} // end removeAttribute
|
||||||
|
|
||||||
|
public synchronized void invalidate()
|
||||||
|
{
|
||||||
|
broker.detachSession(id);
|
||||||
|
broker = null;
|
||||||
|
attrs.clear();
|
||||||
|
|
||||||
|
} // end invalidate
|
||||||
|
|
||||||
|
public UserContext getUser()
|
||||||
|
{
|
||||||
|
return user;
|
||||||
|
|
||||||
|
} // end getUser
|
||||||
|
|
||||||
|
public synchronized void setUser(UserContext user)
|
||||||
|
{
|
||||||
|
this.user = user;
|
||||||
|
touch();
|
||||||
|
|
||||||
|
} // end setUser
|
||||||
|
|
||||||
|
public void preprocess(RequestInput ri)
|
||||||
|
{ // do nothing
|
||||||
|
} // end preprocess
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
final synchronized boolean canUnloadNow()
|
||||||
|
{
|
||||||
|
return ((System.currentTimeMillis() - access_time) > ((long)1000 * max_inactive));
|
||||||
|
|
||||||
|
} // end canUnloadNow
|
||||||
|
|
||||||
|
final synchronized void touch()
|
||||||
|
{
|
||||||
|
access_time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
} // end touch
|
||||||
|
|
||||||
|
} // end class RpcVeniceUISession
|
50
src/com/silverwrist/venice/ui/rpc/XmlRpcCreateSession.java
Normal file
50
src/com/silverwrist/venice/ui/rpc/XmlRpcCreateSession.java
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.ui.rpc;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import com.silverwrist.venice.ui.*;
|
||||||
|
|
||||||
|
public class XmlRpcCreateSession implements XmlRpcDispatch
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(XmlRpcCreateSession.class);
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface XmlRpcDispatch
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Object dispatch(RequestInput req, XmlRpcRequest xreq, Map environment) throws Exception, XmlRpcFault
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Dispatching a Create Session call");
|
||||||
|
VeniceUISession session = RpcSessionBroker.get(req).createSession(req.getSourceAddress());
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Created new session with ID " + session.getID());
|
||||||
|
return session.getID();
|
||||||
|
|
||||||
|
} // end dispatch
|
||||||
|
|
||||||
|
} // end class XmlRpcSession
|
||||||
|
|
|
@ -19,6 +19,7 @@ package com.silverwrist.venice.ui.rpc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import com.silverwrist.util.StringUtil;
|
import com.silverwrist.util.StringUtil;
|
||||||
|
import com.silverwrist.venice.except.SupplyFaultCode;
|
||||||
import com.silverwrist.venice.ui.*;
|
import com.silverwrist.venice.ui.*;
|
||||||
import com.silverwrist.venice.ui.helpers.ThrowableContent;
|
import com.silverwrist.venice.ui.helpers.ThrowableContent;
|
||||||
|
|
||||||
|
@ -67,6 +68,12 @@ public class XmlRpcFault extends ThrowableContent implements ContentExecute
|
||||||
public XmlRpcFault(Throwable t)
|
public XmlRpcFault(Throwable t)
|
||||||
{
|
{
|
||||||
super(t);
|
super(t);
|
||||||
|
if (t instanceof SupplyFaultCode)
|
||||||
|
{ // retrieve the fault code
|
||||||
|
SupplyFaultCode sfc = (SupplyFaultCode)t;
|
||||||
|
fault_code = sfc.getFaultCode();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
} // end constructor
|
} // end constructor
|
||||||
|
|
||||||
|
@ -80,6 +87,12 @@ public class XmlRpcFault extends ThrowableContent implements ContentExecute
|
||||||
public XmlRpcFault(String msg, Throwable t)
|
public XmlRpcFault(String msg, Throwable t)
|
||||||
{
|
{
|
||||||
super(msg,t);
|
super(msg,t);
|
||||||
|
if (t instanceof SupplyFaultCode)
|
||||||
|
{ // retrieve the fault code
|
||||||
|
SupplyFaultCode sfc = (SupplyFaultCode)t;
|
||||||
|
fault_code = sfc.getFaultCode();
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
} // end constructor
|
} // end constructor
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ public class XmlRpcMethod
|
||||||
private Class obj_class = null; // "class" handler for object
|
private Class obj_class = null; // "class" handler for object
|
||||||
private String script_name = null; // script name to use as a handler
|
private String script_name = null; // script name to use as a handler
|
||||||
private Map raw_env; // "raw" environment
|
private Map raw_env; // "raw" environment
|
||||||
|
private int session_param = -1; // session parameter
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -119,7 +120,15 @@ public class XmlRpcMethod
|
||||||
else // no handler - this is an error
|
else // no handler - this is an error
|
||||||
throw new ConfigException("method \"" + method_name + "\" does not have a valid handler",cfg);
|
throw new ConfigException("method \"" + method_name + "\" does not have a valid handler",cfg);
|
||||||
|
|
||||||
NodeList nl = sub.getChildNodes();
|
if ((sub = cfg_h.getSubElement("session"))!=null)
|
||||||
|
{ // find the session parameter index
|
||||||
|
session_param = loader.configGetAttributeInt(sub,"param");
|
||||||
|
if (session_param<0)
|
||||||
|
throw new ConfigException("invalid session parameter index",sub);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
NodeList nl = cfg.getChildNodes();
|
||||||
HashMap tmp_env = new HashMap();
|
HashMap tmp_env = new HashMap();
|
||||||
for (int i=0; i<nl.getLength(); i++)
|
for (int i=0; i<nl.getLength(); i++)
|
||||||
{ // look for specific nodes
|
{ // look for specific nodes
|
||||||
|
@ -141,6 +150,38 @@ public class XmlRpcMethod
|
||||||
|
|
||||||
} // end constructor
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private final void bindSession(RequestInput req, XmlRpcRequest xreq) throws XmlRpcFault
|
||||||
|
{
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("trying to bind parameter at index " + session_param + " to session");
|
||||||
|
if (session_param>=xreq.getParamCount())
|
||||||
|
{ // too few parameters - bail out!
|
||||||
|
logger.error("session parameter is at index " + session_param + " but only " + xreq.getParamCount()
|
||||||
|
+ " parameter(s) present");
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.SERVER_ERROR,"invalid parameter index for session binding");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
String session_id = xreq.getParamString(session_param).trim();
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Passed session ID = " + session_id);
|
||||||
|
VeniceUISession vuis = RpcSessionBroker.get(req).getSession(session_id);
|
||||||
|
if (vuis==null)
|
||||||
|
{ // the session cannot be acquired
|
||||||
|
logger.debug("Cannot get session for session ID " + session_id);
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"session not found");
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
req.pushSession(vuis); // push the session into the request
|
||||||
|
|
||||||
|
} // end bindSession
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* External operations
|
* External operations
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
@ -181,7 +222,20 @@ public class XmlRpcMethod
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
return disp.dispatch(req,xreq,env); // dispatch the call
|
if (session_param>=0)
|
||||||
|
bindSession(req,xreq);
|
||||||
|
|
||||||
|
try
|
||||||
|
{ // dispatch the call
|
||||||
|
return disp.dispatch(req,xreq,env);
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // pop the session we pushed
|
||||||
|
if (session_param>=0)
|
||||||
|
req.popSession();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
|
@ -193,18 +247,35 @@ public class XmlRpcMethod
|
||||||
logger.debug("EXECUTING " + full_name);
|
logger.debug("EXECUTING " + full_name);
|
||||||
try
|
try
|
||||||
{ // execute the script!
|
{ // execute the script!
|
||||||
|
if (session_param>=0)
|
||||||
|
bindSession(req,xreq);
|
||||||
|
|
||||||
ScriptManager smgr = req.getScriptManager();
|
ScriptManager smgr = req.getScriptManager();
|
||||||
smgr.pushContext();
|
smgr.pushContext();
|
||||||
smgr.register("xmlrpc",xreq);
|
smgr.register("xmlrpc",xreq);
|
||||||
smgr.register("environment",env);
|
smgr.register("environment",env);
|
||||||
|
try
|
||||||
|
{ // execute the script
|
||||||
ScriptReturn sro = new ScriptReturn();
|
ScriptReturn sro = new ScriptReturn();
|
||||||
smgr.exec(new File(full_name),logger_name,sro);
|
smgr.exec(new File(full_name),logger_name,sro);
|
||||||
smgr.popContext();
|
|
||||||
return sro.get();
|
return sro.get();
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
finally
|
||||||
|
{ // make sure and pop the context before we return
|
||||||
|
smgr.popContext();
|
||||||
|
if (session_param>=0)
|
||||||
|
req.popSession();
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
} // end try
|
} // end try
|
||||||
catch (ScriptingException se)
|
catch (ScriptingException se)
|
||||||
{ // script error! we are not amused...
|
{ // script error! we are not amused...
|
||||||
|
Throwable t = se.getException();
|
||||||
|
if (t instanceof SupplyFaultCode)
|
||||||
|
return new XmlRpcFault(t);
|
||||||
|
else
|
||||||
return new XmlRpcFault(XmlRpcFault.APPLICATION_ERROR,"scripting error: " + se.toString());
|
return new XmlRpcFault(XmlRpcFault.APPLICATION_ERROR,"scripting error: " + se.toString());
|
||||||
|
|
||||||
} // end catch
|
} // end catch
|
||||||
|
|
|
@ -99,7 +99,7 @@ public class XmlRpcMulticall implements XmlRpcDispatch
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{ // parse out a request and dispatch it
|
{ // parse out a request and dispatch it
|
||||||
try
|
try
|
||||||
{ // parse the request
|
{ // parse the request, execute it, and add its result to the return array
|
||||||
XmlRpcRequest sub_xreq = parseRequest(req,it.next());
|
XmlRpcRequest sub_xreq = parseRequest(req,it.next());
|
||||||
Object sub_rc = XmlRpcServlet.dispatchMethodCall(req,sub_xreq);
|
Object sub_rc = XmlRpcServlet.dispatchMethodCall(req,sub_xreq);
|
||||||
if (sub_rc instanceof XmlRpcFault)
|
if (sub_rc instanceof XmlRpcFault)
|
||||||
|
|
|
@ -24,6 +24,7 @@ import javax.mail.internet.*;
|
||||||
import org.apache.log4j.*;
|
import org.apache.log4j.*;
|
||||||
import org.w3c.dom.*;
|
import org.w3c.dom.*;
|
||||||
import com.silverwrist.util.*;
|
import com.silverwrist.util.*;
|
||||||
|
import com.silverwrist.venice.core.*;
|
||||||
import com.silverwrist.venice.except.*;
|
import com.silverwrist.venice.except.*;
|
||||||
import com.silverwrist.venice.ui.*;
|
import com.silverwrist.venice.ui.*;
|
||||||
import com.silverwrist.venice.util.XMLLoader;
|
import com.silverwrist.venice.util.XMLLoader;
|
||||||
|
@ -59,8 +60,7 @@ public class XmlRpcRequest
|
||||||
throw new XmlRpcFault(XmlRpcFault.INVALID_REQUEST,"no XML call structure found");
|
throw new XmlRpcFault(XmlRpcFault.INVALID_REQUEST,"no XML call structure found");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{ // load the initial structure and method name
|
||||||
// load the initial structure and method name
|
|
||||||
XMLLoader loader = XMLLoader.get();
|
XMLLoader loader = XMLLoader.get();
|
||||||
Element root = loader.postGetRootElement(req_doc,"methodCall");
|
Element root = loader.postGetRootElement(req_doc,"methodCall");
|
||||||
DOMElementHelper root_h = new DOMElementHelper(root);
|
DOMElementHelper root_h = new DOMElementHelper(root);
|
||||||
|
@ -475,4 +475,49 @@ public class XmlRpcRequest
|
||||||
|
|
||||||
} // end getParamString
|
} // end getParamString
|
||||||
|
|
||||||
|
public final CommunityContext getParamCommunity(int ndx) throws XmlRpcFault, DataException
|
||||||
|
{
|
||||||
|
Object foo = method_params.get(ndx);
|
||||||
|
if ((foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean))
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch");
|
||||||
|
if (foo instanceof Integer)
|
||||||
|
return req.getUser().getCommunityContext(((Integer)foo).intValue());
|
||||||
|
else
|
||||||
|
return req.getUser().getCommunityContext(foo.toString().trim());
|
||||||
|
|
||||||
|
} // end getParamCommunity
|
||||||
|
|
||||||
|
public final ConferenceContext getParamConference(int ndx, CommunityContext comm)
|
||||||
|
throws XmlRpcFault, DataException, AccessError
|
||||||
|
{
|
||||||
|
Object foo = method_params.get(ndx);
|
||||||
|
if ((foo instanceof byte[]) || (foo instanceof List) || (foo instanceof Map) || (foo instanceof Boolean))
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch");
|
||||||
|
if (foo instanceof Integer)
|
||||||
|
return comm.getConferenceContext(((Integer)foo).intValue());
|
||||||
|
else
|
||||||
|
return comm.getConferenceContext(foo.toString().trim());
|
||||||
|
|
||||||
|
} // end getParamConference
|
||||||
|
|
||||||
|
public final TopicContext getParamTopic(int ndx, ConferenceContext conf)
|
||||||
|
throws XmlRpcFault, DataException, AccessError
|
||||||
|
{
|
||||||
|
Object foo = method_params.get(ndx);
|
||||||
|
if (!(foo instanceof Integer))
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch");
|
||||||
|
return conf.getTopic(((Integer)foo).shortValue());
|
||||||
|
|
||||||
|
} // end getParamTopic
|
||||||
|
|
||||||
|
public final TopicMessageContext getParamPost(int ndx, TopicContext topic)
|
||||||
|
throws XmlRpcFault, DataException, AccessError
|
||||||
|
{
|
||||||
|
Object foo = method_params.get(ndx);
|
||||||
|
if (!(foo instanceof Integer))
|
||||||
|
throw new XmlRpcFault(XmlRpcFault.INVALID_PARAMS,"parameter type mismatch");
|
||||||
|
return topic.getMessage(((Integer)foo).intValue());
|
||||||
|
|
||||||
|
} // end getParamPost
|
||||||
|
|
||||||
} // end class XmlRpcRequest
|
} // end class XmlRpcRequest
|
||||||
|
|
|
@ -21,6 +21,7 @@ import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
import javax.servlet.http.*;
|
import javax.servlet.http.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
import org.apache.regexp.*;
|
import org.apache.regexp.*;
|
||||||
import com.silverwrist.util.*;
|
import com.silverwrist.util.*;
|
||||||
import com.silverwrist.venice.core.*;
|
import com.silverwrist.venice.core.*;
|
||||||
|
@ -76,6 +77,8 @@ public class XmlRpcServlet extends BaseServlet
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
private static Category logger = Category.getInstance(XmlRpcServlet.class);
|
||||||
|
|
||||||
private static final String METHOD_LIST_ATTR = "ui.xmlrpc.MethodList";
|
private static final String METHOD_LIST_ATTR = "ui.xmlrpc.MethodList";
|
||||||
|
|
||||||
public static final String OBJECT_CLASS_CACHE_ATTR = "ui.xmlrpc.class.ObjectCache";
|
public static final String OBJECT_CLASS_CACHE_ATTR = "ui.xmlrpc.class.ObjectCache";
|
||||||
|
@ -91,6 +94,7 @@ public class XmlRpcServlet extends BaseServlet
|
||||||
List methods = root.getXmlRpcMethods();
|
List methods = root.getXmlRpcMethods();
|
||||||
RequestImpl.setAppAttribute(ctxt,METHOD_LIST_ATTR,methods);
|
RequestImpl.setAppAttribute(ctxt,METHOD_LIST_ATTR,methods);
|
||||||
RequestImpl.setAppAttribute(ctxt,OBJECT_CLASS_CACHE_ATTR,Collections.synchronizedMap(new HashMap()));
|
RequestImpl.setAppAttribute(ctxt,OBJECT_CLASS_CACHE_ATTR,Collections.synchronizedMap(new HashMap()));
|
||||||
|
RpcSessionBroker.init(ctxt,engine,root);
|
||||||
|
|
||||||
} // end init
|
} // end init
|
||||||
|
|
||||||
|
@ -135,7 +139,10 @@ public class XmlRpcServlet extends BaseServlet
|
||||||
|
|
||||||
static Object dispatchMethodCall(RequestInput req, XmlRpcRequest xreq)
|
static Object dispatchMethodCall(RequestInput req, XmlRpcRequest xreq)
|
||||||
{
|
{
|
||||||
// Prepare the parameters map
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("XML-RPC Method Call: " + xreq.getMethod());
|
||||||
|
|
||||||
|
// Prepare the parameters map.
|
||||||
int i;
|
int i;
|
||||||
HashMap param_repl_map = new HashMap();
|
HashMap param_repl_map = new HashMap();
|
||||||
for (i=0; i<xreq.getParamCount(); i++)
|
for (i=0; i<xreq.getParamCount(); i++)
|
||||||
|
@ -166,19 +173,26 @@ public class XmlRpcServlet extends BaseServlet
|
||||||
|
|
||||||
} // end while
|
} // end while
|
||||||
|
|
||||||
if (!found) // method not found
|
if (!found)
|
||||||
|
{ // method not found
|
||||||
|
logger.error("Method not found: " + the_name);
|
||||||
return new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"Method not found: " + the_name);
|
return new XmlRpcFault(XmlRpcFault.METHOD_NOT_FOUND,"Method not found: " + the_name);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
// prepare the substitution map
|
// prepare the substitution map
|
||||||
sub_map = (HashMap)(param_repl_map.clone());
|
sub_map = (HashMap)(param_repl_map.clone());
|
||||||
int ct = matcher.getParenCount();
|
int ct = matcher.getParenCount();
|
||||||
for (i=0; i<=ct; i++)
|
for (i=0; i<=ct; i++)
|
||||||
sub_map.put("match." + i,matcher.getParen(i));
|
sub_map.put("match." + i,matcher.getParen(i));
|
||||||
|
|
||||||
|
// test for method remapping
|
||||||
String remap = meth.getRemap();
|
String remap = meth.getRemap();
|
||||||
if (remap!=null)
|
if (remap!=null)
|
||||||
{ // substitute in variables and rescan
|
{ // substitute in variables and rescan
|
||||||
the_name = StringUtil.replaceAllVariables(remap,sub_map);
|
the_name = StringUtil.replaceAllVariables(remap,sub_map);
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("-- call remapped to method: " + the_name);
|
||||||
rescan = true;
|
rescan = true;
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
* 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
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
@ -31,6 +31,20 @@ public class ScriptLibrary
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
public final Boolean booleanObject(boolean b)
|
||||||
|
{
|
||||||
|
return (b ? Boolean.TRUE : Boolean.FALSE);
|
||||||
|
|
||||||
|
} // end booleanObject
|
||||||
|
|
||||||
|
public final byte[] castByteArray(Object o)
|
||||||
|
{
|
||||||
|
if (o instanceof byte[])
|
||||||
|
return (byte[])o;
|
||||||
|
throw new ClassCastException("ScriptLibrary.castByteArray: invalid cast");
|
||||||
|
|
||||||
|
} // end castByteArray
|
||||||
|
|
||||||
public final ConferenceContext castConferenceContext(Object o)
|
public final ConferenceContext castConferenceContext(Object o)
|
||||||
{
|
{
|
||||||
if (o instanceof ConferenceContext)
|
if (o instanceof ConferenceContext)
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
* 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
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
* Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
* Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Contributor(s):
|
* Contributor(s):
|
||||||
*/
|
*/
|
||||||
|
@ -264,8 +264,12 @@ public class ScriptManager
|
||||||
{ // throw a ScriptingException
|
{ // throw a ScriptingException
|
||||||
logger.error("Execution exception while running script",t);
|
logger.error("Execution exception while running script",t);
|
||||||
if (t!=null)
|
if (t!=null)
|
||||||
|
{ // throw THIS exception
|
||||||
|
logger.error("Exception type: " + t.getClass().getName());
|
||||||
throw new ScriptingException(source,lang,e.getMessage(),t);
|
throw new ScriptingException(source,lang,e.getMessage(),t);
|
||||||
else
|
|
||||||
|
} // end if
|
||||||
|
else // throw the regular old name
|
||||||
throw new ScriptingException(source,lang,e.getMessage(),e);
|
throw new ScriptingException(source,lang,e.getMessage(),e);
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
@ -273,15 +277,20 @@ public class ScriptManager
|
||||||
{ // usually indicates a compiler error in the scripting engine
|
{ // usually indicates a compiler error in the scripting engine
|
||||||
logger.error("Script compilation error",e);
|
logger.error("Script compilation error",e);
|
||||||
if (t!=null)
|
if (t!=null)
|
||||||
logger.error("Root cause:",t);
|
{ // throw THIS exception
|
||||||
throw new ScriptingException(source,lang,e.getMessage());
|
logger.error("Exception type: " + t.getClass().getName());
|
||||||
|
throw new ScriptingException(source,lang,e.getMessage(),t);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else // throw the regular old name
|
||||||
|
throw new ScriptingException(source,lang,e.getMessage(),e);
|
||||||
|
|
||||||
} // end else if
|
} // end else if
|
||||||
else
|
else
|
||||||
{ // unknown exception type here!
|
{ // unknown exception type here!
|
||||||
logger.error("Unknown BSFException in script execution (reason " + e.getReason() + ")",e);
|
logger.error("Unknown BSFException in script execution (reason " + e.getReason() + ")",e);
|
||||||
if (t!=null)
|
if (t!=null)
|
||||||
logger.error("Root cause:",t);
|
logger.error("Root cause (type " + t.getClass().getName() + "):",t);
|
||||||
throw new ScriptingException("unexpected exception while executing " + source + " [" + lang + "]",e);
|
throw new ScriptingException("unexpected exception while executing " + source + " [" + lang + "]",e);
|
||||||
|
|
||||||
} // end else
|
} // end else
|
||||||
|
|
|
@ -583,6 +583,7 @@ public class RequestImpl implements RequestInput
|
||||||
private CommunityContext community = null; // the current community
|
private CommunityContext community = null; // the current community
|
||||||
private LinkedList auto_cleanup = null; // auto-cleanup callbacks
|
private LinkedList auto_cleanup = null; // auto-cleanup callbacks
|
||||||
private Document request_doc = null; // request parsed as an XML document
|
private Document request_doc = null; // request parsed as an XML document
|
||||||
|
private LinkedList session_stack = null; // session stack
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -1555,6 +1556,22 @@ public class RequestImpl implements RequestInput
|
||||||
|
|
||||||
} // end registerCleanup
|
} // end registerCleanup
|
||||||
|
|
||||||
|
public void pushSession(VeniceUISession sess)
|
||||||
|
{
|
||||||
|
if (session_stack==null)
|
||||||
|
session_stack = new LinkedList();
|
||||||
|
session_stack.addFirst(session);
|
||||||
|
session = sess;
|
||||||
|
|
||||||
|
} // end pushSession
|
||||||
|
|
||||||
|
public void popSession()
|
||||||
|
{
|
||||||
|
if ((session_stack!=null) && (session_stack.size()>0))
|
||||||
|
session = (VeniceUISession)(session_stack.removeFirst());
|
||||||
|
|
||||||
|
} // end popSession
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* External static operations
|
* External static operations
|
||||||
*--------------------------------------------------------------------------------
|
*--------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue
Block a user