Ate, Thank you very much. I am now creating a PortletURL which is kicking off my Action class within the portal context. Now to plugin the Hibernate backend. But that will be tomorrow, eyes to blurred now. Your assistance has been very much appreciated. Best regards, Jonathan
-----Original Message----- From: Ate Douma [mailto:[EMAIL PROTECTED] Sent: 19 October 2005 20:03 To: [email protected] Subject: RE: Struts Bridge and Inter Portlet Communication What is going wrong here is hat the lc_item component is rendering an plain webapp based url, not a PortletURL. The /cedar/setURL.do is invoked as is and thus not resulting in a portlet invokation... What you need to do is modifying the lc_item component to transform its url to a StrutsPortlet url using the StrutsPortletURL class. Normally within a Struts Portlet application, this is automatically handled by the extended struts tags (html:link, html:rewrite etc.). You can do that yourself by calling StrutsPortletURL.createActionURL(request, path) or .createRenderURL(request, path). Jonathan Hawkins said: > I have a portlet deployed within jetspeed that uses struts-layout to > display a tree. The nodes of the tree can be either a folder or > element, each element is acting as an anchor. So, the user can setup a > link to http://www.google.co.uk and this is added as an element to the > tree. When they click on that element it will display googlein an > IFrame portlet that is deployed within the same webapp. > > The element is defined as > > lc_item = new MenuComponent(); > lc_item.setTitle(\"Google\"); > lc_item.setLocation(\"/cedar/setURL.do?forward=cedarIFrame&initialPa ge=http://www.google.co.uk\"); > lc_item.setImage(\"is.gif\"); > lc_menu.addMenuComponent(lc_item); > > > This is how it is invoked. > > What I want to do is send a message to the IFrame to tell it what > it\'s source is, we also have another portlet which performs silent > logins to other products in our product suite, so InterPortlet > Communication is a major requirement. In Jetspeed1.6 this was easily achieved using forwards. > My job at the moment is to migrate our Jetspeed Portlets to JSR-168 > compliant portlets exposing me to all this good new stuff !!! > > Jonathan > > > ________________________________ > > From: Ate Douma [mailto:[EMAIL PROTECTED] > Sent: Wed 19/10/2005 19:28 > To: [email protected] > Subject: RE: Struts Bridge and Inter Portlet Communication > > > > How are you invoking this??? > It looks like you are accessing the webapp directly and not through > the portal. You\\\'re not running inside the portlet container and > thus the StrutsPortlet isn\\\'t invoked. > > Ate > > Jonathan Hawkins said: >> Thread [http-8088-Processor25] (Suspended (breakpoint at line 64 in >> SetURLAction)) >> SetURLAction.execute(ActionMapping, ActionForm, HttpServletRequest, >> HttpServletResponse) line: 64 >> >> PortletRequestProcessor(RequestProcessor).processActionPerform(HttpSe >> rvletRequest, HttpServletResponse, Action, ActionForm, ActionMapping) >> line: 419 >> PortletRequestProcessor(RequestProcessor).process(HttpServletRequest, >> HttpServletResponse) line: 224 >> PortletRequestProcessor.process(HttpServletRequest, >> HttpServletResponse) >> line: 50 >> PortletServlet(ActionServlet).process(HttpServletRequest, >> HttpServletResponse) line: 1194 >> PortletServlet(ActionServlet).doGet(HttpServletRequest, >> HttpServletResponse) line: 414 >> PortletServlet(HttpServlet).service(HttpServletRequest, >> HttpServletResponse) line: 689 >> PortletServlet(HttpServlet).service(ServletRequest, ServletResponse) >> line: 802 >> ApplicationFilterChain.internalDoFilter(ServletRequest, >> ServletResponse) >> line: 252 >> ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: >> 173 >> StandardWrapperValve.invoke(Request, Response, ValveContext) line: >> 214 StandardValveContext.invokeNext(Request, Response) line: 104 >> StandardPipeline.invoke(Request, Response) line: 520 >> StandardContextValve.invokeInternal(Wrapper, Request, Response) line: >> 198 >> StandardContextValve.invoke(Request, Response, ValveContext) line: >> 152 StandardValveContext.invokeNext(Request, Response) line: 104 >> StandardPipeline.invoke(Request, Response) line: 520 >> StandardHostValve.invoke(Request, Response, ValveContext) line: 137 >> StandardValveContext.invokeNext(Request, Response) line: 104 >> ErrorReportValve.invoke(Request, Response, ValveContext) line: 118 >> StandardValveContext.invokeNext(Request, Response) line: 102 >> StandardPipeline.invoke(Request, Response) line: 520 >> StandardEngineValve.invoke(Request, Response, ValveContext) line: 109 >> StandardValveContext.invokeNext(Request, Response) line: 104 >> StandardPipeline.invoke(Request, Response) line: 520 >> StandardEngine(ContainerBase).invoke(Request, Response) line: 929 >> CoyoteAdapter.service(Request, Response) line: 160 >> Http11Processor.process(InputStream, OutputStream) line: 799 >> Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnectio >> n, >> Object[]) line: 705 >> TcpWorkerThread.runIt(Object[]) line: 577 >> ThreadPool$ControlRunnable.run() line: 684 >> ThreadWithAttributes(Thread).run() line: 534 >> >> >> >> and this also >> >> >> >> >> >> this= SetURLAction (id=70) >> mapping= ActionMapping (id=73) >> form= null >> request= CoyoteRequestFacade (id=4188) request (RequestFacade)= >> CoyoteRequest (id=4190) >> attributes= HashMap (id=4192) >> entrySet= null >> keySet= null >> loadFactor= 0.75 >> modCount= 608 >> size= 3 >> table= HashMap$Entry[128] (id=4208) >> [0...99] >> [0]= null >> [1]= null >> [2]= null >> [3]= null >> [4]= null >> [5]= null >> [6]= null >> [7]= null >> [8]= null >> [9]= null >> [10]= null >> [11]= null >> [12]= null >> [13]= null >> [14]= null >> [15]= null >> [16]= null >> [17]= null >> [18]= null >> [19]= null >> [20]= null >> [21]= null >> [22]= null >> [23]= null >> [24]= null >> [25]= null >> [26]= null >> [27]= null >> [28]= null >> [29]= null >> [30]= HashMap$Entry (id=4219) >> [31]= null >> [32]= null >> [33]= null >> [34]= null >> [35]= null >> [36]= null >> [37]= null >> [38]= null >> [39]= null >> [40]= null >> [41]= null >> [42]= null >> [43]= null >> [44]= null >> [45]= null >> [46]= null >> [47]= null >> [48]= null >> [49]= null >> [50]= null >> [51]= null >> [52]= null >> [53]= null >> [54]= null >> [55]= null >> [56]= null >> [57]= null >> [58]= null >> [59]= null >> [60]= null >> [61]= null >> [62]= null >> [63]= null >> [64]= null >> [65]= null >> [66]= null >> [67]= null >> [68]= null >> [69]= null >> [70]= null >> [71]= null >> [72]= HashMap$Entry (id=4220) >> hash= 1428559048 >> key= \\\"org.apache.struts.action.mapping.instance\\\" >> next= null >> value= ActionMapping (id=73) >> [73]= null >> [74]= null >> [75]= null >> [76]= null >> [77]= null >> [78]= null >> [79]= null >> [80]= null >> [81]= null >> [82]= null >> [83]= null >> [84]= null >> [85]= null >> [86]= null >> [87]= null >> [88]= null >> [89]= null >> [90]= null >> [91]= null >> [92]= null >> [93]= null >> [94]= null >> [95]= null >> [96]= HashMap$Entry (id=4221) >> hash= 1107355616 >> key= \\\"org.apache.struts.action.MODULE\\\" >> next= null >> value= ModuleConfigImpl (id=2075) >> [97]= null >> [98]= null >> [99]= null >> [100...127] >> threshold= 96 >> values= null >> authType= null >> connector= CoyoteConnector (id=2043) >> context= StandardContext (id=2044) >> cookies= null >> cookiesParsed= false >> coyoteRequest= Request (id=4193) >> dispatcherType= Integer (id=2046) >> facade= CoyoteRequestFacade (id=4188) >> filterChain= ApplicationFilterChain (id=2156) >> formats= SimpleDateFormat[3] (id=4194) >> inputBuffer= InputBuffer (id=4195) >> inputStream= CoyoteInputStream (id=4196) >> localAddr= null >> locales= ArrayList (id=4197) >> localesParsed= false >> localName= null >> localPort= -1 >> log= null >> mappingData= MappingData (id=4198) >> notes= HashMap (id=4199) >> parameterMap= ParameterMap (id=4200) >> parser= StringParser (id=4201) >> postData= null >> reader= CoyoteReader (id=4202) >> readOnlyAttributes= HashMap (id=4203) >> remoteAddr= null >> remoteHost= null >> remotePort= -1 >> requestDispatcherPath= MessageBytes (id=4204) >> requestedSessionCookie= true >> requestedSessionId= \\\"B63999FD6331EBA568F30C0FFB4B5CF0\\\" >> requestedSessionURL= false >> requestParametersParsed= false >> response= CoyoteResponse (id=4206) >> secure= false >> session= StandardSession (id=4207) >> sessionParsed= false >> socket= null >> subject= null >> URIConverter= null >> userPrincipal= null >> usingInputStream= false >> usingReader= false >> valveContext= StandardValveContext (id=2158) >> wrapper= StandardWrapper (id=2062) request (CoyoteRequestFacade)= >> CoyoteRequest (id=4190) response= CoyoteResponseFacade (id=4189) >> >> >> Thanks >> >> Jonathan >> >> >> ________________________________ >> >> From: Jonathan Hawkins [mailto:[EMAIL PROTECTED] >> Sent: Wed 19/10/2005 19:13 >> To: [email protected] >> Cc: [EMAIL PROTECTED] >> Subject: RE: Struts Bridge and Inter Portlet Communication >> >> >> >> >> >> ________________________________ >> >> From: Ate Douma [mailto:[EMAIL PROTECTED] >> Sent: Wed 19/10/2005 18:57 >> To: [email protected] >> Subject: RE: Struts Bridge and Inter Portlet Communication >> >> >> >> Jonathan Hawkins said: >>> Ate, >>> >>> I\\\\\\\'ve built the latest portals-bridges-struts-1.2.7-0.4-SNAPSHOT.jar >>> and >>> deployed it in my webapp. >>> >>> I\\\\\\\'m using Eclipse to step through the code. This is my >>> Execute method >>> :- >>> >>> public ActionForward execute(ActionMapping mapping, ActionForm form, >>> HttpServletRequest request, HttpServletResponse response) { >>> logger = Logger.getLogger(\\\\\\\"Cedar-Portlets\\\\\\\"); >>> logger.debug(\\\\\\\"SetURLAction::execute - starting\\\\\\\"); >>> try { >>> >>> >>> ActionRequest actionRequest = (ActionRequest) request >>> .getAttribute(ContainerConstants.PORTLET_REQUEST); >>> String id = this.getInstanceID(actionRequest); >>> String msg_session_id = MessageHelper.getSessionID(actionRequest); >>> MessageHelper.loadPrefs(actionRequest, id, msg_session_id); >>> MessageHelper msgh = new MessageHelper(actionRequest >>> .getPortletSession(true), id, msg_session_id); >>> msgh.send(\\\\\\\"a_val\\\\\\\", >>> \\\\\\\"this is a message from SetURLAction in portlet webapp \\\\\\\" >>> + actionRequest.getContextPath()); >>> } catch (RuntimeException e) { >>> // TODO Auto-generated catch block >>> e.printStackTrace(); >>> return mapping.findForward(\\\\\\\"failure\\\\\\\"); >>> } >>> return mapping.findForward(\\\\\\\"success\\\\\\\"); >>> } >>> >>> actionRequest is always coming back as null, if I take a look at the >>> attributes that are set within the HttpServletRequest, the only ones >>> I can see being set are :- >>> >>> org.apache.struts.action.MESSAGE >>> >>> org.apache.struts.action.mapping.instance >>> >>> org.apache.struts.action.MODULE >>> >>> no sign of javax.portlet.request. >>> >>> This is driving me round the bend !!!!! >>> >> That is very strange. >> Could you provide the full stacktrace of the call to your execute >> method? >> >> Note: on line 354 of the StrutsPortlet.java the javax.portlet.request >> attribute is/should be set. >> >> Ate >>> >>> >>> Any further assistance would be greatly appreciated, examples or >>> otherwise. >>> >>> >>> >>> Jonathan >>> >>> >>> >>> >>> >>> ________________________________ >>> >>> From: [EMAIL PROTECTED] >>> [mailto:[EMAIL PROTECTED] >>> Sent: Wed 19/10/2005 13:34 >>> To: [email protected] >>> Cc: [EMAIL PROTECTED]; [email protected] >>> Subject: Re: Struts Bridge and Inter Portlet Communication >>> >>> >>> >>> Thanks Ate, >>> >>> I was getting null pointer exceptions. I\\\\\\\'ll subscribe to the >>> other list as well andbuild the struts bridge and see what I can get >>> hold of this time. >>> >>> I\\\\\\\'ve created my own constants file with an entry for >>> javax.portlet.request. >>> >>> All assistance is very much appreciated. >>> >>> Jonathan >>> >>> >>>> Jonathan, >>>> First of all, I cc\\\\\\\'d this to the bridges-user mailing list >>>> so we can continue the discussion there. >>>> (if you haven\\\\\\\'t subscribed yet: >>>> http://portals.apache.org/bridges/mail-lists.html) >>>> >>>> It is not clear to me *what* is not working with the example you >>>> provided. Do you get an exception/stacktrace or is the >>>> ContainerConstants.PORTLET_REQUEST not set? >>>> >>>> In the latter case, it might be a case of which version of the >>>> struts-bridge you are using. Since august 8, the struts-bridge >>>> trunk now *does* provide the \\\\\\\"javax.portlet.request\\\\\\\" attribute, even >>>> when >>>> accessed from an ActionRequest. See: >>>> http://issues.apache.org/jira/browse/PB-2. >>>> To be able to use it, you need to checkout and build the bridges >>>> yourself. >>>> >>>> If you get an exception, could you please provide that? >>>> >>>> Note: Using ContainerConstants.PORTLET_REQUEST (instead of >>>> \\\\\\\"javax.portlet.request\\\\\\\") binds you to the jetspeed-commons jar. >>>> If >>>> you >>>> really want to be JSR-168 compliant, you should *not* use >>>> jetspeed-commons. >>>> >>>> Regards, >>>> >>>> Ate >>>> >>>> >>>> [EMAIL PROTECTED] wrote: >>>>> I am trying integrate a Struts Portlet using Struts Bridge and an >>>>> InterPortlet Communication library, >>>>> http://www.doc.ic.ac.uk/~mo197/portlets/portlet_messaging/crosscon >>>>> text.php , which works well with ordinary portlets. >>>>> >>>>> The library requires that I retrieve the PortletRequest / >>>>> ActionRequest / RenderRequest. However within my Struts Portlet I >>>>> only action and form classes and with execute I only have >>>>> httpServletRequest available. Given that my action classes are >>>>> running within s struts portlet how can I retrieve the >>>>> PortletRequest that I need. >>>>> >>>>> The following code shows a simple portlet that works fine. >>>>> >>>>> public class Portlet1 extends GenericPortlet{ >>>>> >>>>> >>>>> protected void doEdit(RenderRequest request, RenderResponse >>>>> response) >>>>> throws PortletException, IOException { >>>>> String id = this.getInstanceID(request); >>>>> String msg_session_id = MessageHelper.getSessionID(request); >>>>> MessageHelper.loadPrefs(request, id, msg_session_id); >>>>> MessageUtils.prepareMappingForm(request, id, >>>>> msg_session_id); >>>>> >>>>> >>> getPortletContext().getRequestDispatcher(\\\\\\\"/WEB-INF/pages/edit_map pings.jsp\\\\\\\").include(request,response);>> >>> } >>>>> >>>>> >>>>> protected void doView(RenderRequest request, RenderResponse >>>>> response) >>>>> throws PortletException, IOException { >>>>> String id = this.getInstanceID(request); >>>>> String msg_session_id = MessageHelper.getSessionID(request); >>>>> MessageHelper.loadPrefs(request, id, msg_session_id); >>>>> >>>>> response.setContentType(\\\\\\\"text/html\\\\\\\"); >>>>> PrintWriter out = response.getWriter(); >>>>> >>>>> PortletURL aURL = response.createActionURL(); >>>>> aURL.setParameter(\\\\\\\"ACTION\\\\\\\", \\\\\\\"sendmsg\\\\\\\"); >>>>> >>>>> out.println(\\\\\\\"<b>Message Session ID:</b> >>>>> \\\\\\\"+msg_session_id+\\\\\\\"<br/>\\\\\\\"); >>>>> out.println(\\\\\\\"<b>Portlet App:</b> >>>>> >>>>> \\\\\\\"+request.getContextPath()+\\\\\\\"<br/>\\\\\\\"); >>>>> >>>>> out.println(\\\\\\\"<b>Portlet1</b>:<br/>\\\\\\\"); >>>>> out.println(\\\\\\\"<a >>>>> href=\\\\\\\\\\\\\\\"\\\\\\\"+aURL+\\\\\\\"\\\\\\\\\\\\\\\">send >>>>> message</a><br/><br/>\\\\\\\"); >>>>> >>>>> MessageHelper msgh = new >>>>> MessageHelper(request.getPortletSession(true), >>>>> id, msg_session_id); >>>>> String msg = (String)msgh.get(\\\\\\\"a_val\\\\\\\"); >>>>> out.println(\\\\\\\"my a_val msg: \\\\\\\"+msg); >>>>> >>>>> } >>>>> >>>>> public void processAction(ActionRequest request, ActionResponse >>>>> response) >>>>> throws PortletException, IOException { >>>>> String id = this.getInstanceID(request); >>>>> String msg_session_id = MessageHelper.getSessionID(request); >>>>> MessageHelper.loadPrefs(request, id, msg_session_id); >>>>> >>>>> >>>>> if (request.getPortletMode().equals(PortletMode.EDIT)) { >>>>> >>>>> MessageUtils.processMappingForm(request, >>>>> response, id, >>>>> msg_session_id); >>>>> } >>>>> >>>>> if >>>>> (\\\\\\\"sendmsg\\\\\\\".equals(request.getParameter(\\\\\\\"ACTION\\\\\ \\"))){ >>>>> System.out.println(\\\\\\\"try sending >>>>> message from >>>>> Portlet 1 in webapp >>>>> \\\\\\\"+request.getContextPath()); >>>>> MessageHelper msgh = new >>>>> >>>>> MessageHelper(request.getPortletSession(true), >>>>> id, msg_session_id); >>>>> msgh.send(\\\\\\\"a_val\\\\\\\", \\\\\\\"this is a message >>>>> from >>>>> Portlet1 in portlet >>>>> webapp >>>>> \\\\\\\"+request.getContextPath()); >>>>> } >>>>> } >>>>> >>>>> public String getInstanceID(PortletRequest request){ >>>>> return > \\\\\\\"Portlet1.\\\\\\\"+MessageHelper.getPortletID(request); >>>>> } >>>>> >>>>> >>>>> } >>>>> >>>>> >>>>> Hopefully from that you can see what I am trying to retrieve from >>>>> within my action class. The following is my current execute method >>>>> >>>>> logger = Logger.getLogger(\\\\\\\"Cedar-Portlets\\\\\\\"); >>>>> >>>>> logger.debug(\\\\\\\"SetURLAction::execute - starting\\\\\\\"); >>>>> >>>>> try { >>>>> >>>>> >>>>> ActionRequest actionRequest = (ActionRequest) >>>>> request >>>>> .getAttribute(ContainerConstants.PORTLET_REQUEST); >>>>> String id = this.getInstanceID(actionRequest); >>>>> String msg_session_id >>> >>>>> MessageHelper.getSessionID(actionRequest); >>>>> MessageHelper.loadPrefs(actionRequest, id, >>>>> msg_session_id); >>>>> MessageHelper msgh = new >>>>> MessageHelper(actionRequest >>>>> .getPortletSession(true), id, >>>>> msg_session_id); >>>>> msgh.send(\\\\\\\"a_val\\\\\\\", >>>>> \\\\\\\"this is a message >>>>> from SetURLAction in portlet webapp \\\\\\\" >>>>> + >>>>> actionRequest.getContextPath()); >>>>> >>>>> } catch (RuntimeException e) { >>>>> // TODO Auto-generated catch block >>>>> e.printStackTrace(); >>>>> return mapping.findForward(\\\\\\\"failure\\\\\\\"); >>>>> } >>>>> return mapping.findForward(\\\\\\\"success\\\\\\\"); >>>>> >>>>> >>>>> >>>>> >>>>> Which doesn\\\\\\\'t work, any ideas would be greatly appreciated. >>>>> >>>>> Jon Hawkins >>>>> >>>>> >>>>> >>>>> ------------------------------------------------------------------ >>>>> --- To unsubscribe, e-mail: >>>>> [EMAIL PROTECTED] >>>>> For additional commands, e-mail: >>>>> [EMAIL PROTECTED] >>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> ------------------------------------------------------------------- >>>> -- To unsubscribe, e-mail: >>>> [EMAIL PROTECTED] >>>> For additional commands, e-mail: >>>> [EMAIL PROTECTED] >>> >>> >>> >>> >>> -------------------------------------------------------------------- >>> - To unsubscribe, e-mail: >>> [EMAIL PROTECTED] >>> For additional commands, e-mail: >>> [EMAIL PROTECTED] >>> >>> >>> >>> >>> >>> This email and any files transmitted with it are confidential and >>> intended solely for the use of the individual or entity to whom they >>> are addressed. Any unauthorised distribution or copying is strictly >>> prohibited. Whilst CedarOpenAccounts takes steps to prevent the >>> transmission of viruses via e-mail, we cannot guarantee that any >>> email or attachment is free from computer viruses and you are >>> strongly advised to undertake your own anti-virus precautions. >>> CedarOpenAccounts grants no warranties regarding performance, use or >>> quality of any e-mail or attachment and undertakes no liability for >>> loss or damage, howsoever caused. >>> >>> CedarOpenAccounts is a trading name of Cedar Software Ltd and >>> OpenAccounts Ltd. >>> >>> For more information on CedarOpenAccounts and our products, please >>> visit our web site at http://www.cedaropenaccounts.com >>> >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> >> >> >> >> This email and any files transmitted with it are confidential and >> intended solely for the use of the individual or entity to whom they >> are addressed. Any unauthorised distribution or copying is strictly >> prohibited. Whilst CedarOpenAccounts takes steps to prevent the >> transmission of viruses via e-mail, we cannot guarantee that any >> email or attachment is free from computer viruses and you are >> strongly advised to undertake your own anti-virus precautions. >> CedarOpenAccounts grants no warranties regarding performance, use or >> quality of any e-mail or attachment and undertakes no liability for >> loss or damage, howsoever caused. >> >> CedarOpenAccounts is a trading name of Cedar Software Ltd and >> OpenAccounts Ltd. >> >> For more information on CedarOpenAccounts and our products, please >> visit our web site at http://www.cedaropenaccounts.com >> >> >> >> >> >> This email and any files transmitted with it are confidential and >> intended solely for the use of the individual or entity to whom they >> are addressed. Any unauthorised distribution or copying is strictly >> prohibited. Whilst CedarOpenAccounts takes steps to prevent the >> transmission of viruses via e-mail, we cannot guarantee that any >> email or attachment is free from computer viruses and you are >> strongly advised to undertake your own anti-virus precautions. >> CedarOpenAccounts grants no warranties regarding performance, use or >> quality of any e-mail or attachment and undertakes no liability for >> loss or damage, howsoever caused. >> >> CedarOpenAccounts is a trading name of Cedar Software Ltd and >> OpenAccounts Ltd. >> >> For more information on CedarOpenAccounts and our products, please >> visit our web site at http://www.cedaropenaccounts.com >> >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > This email and any files transmitted with it are confidential and > intended solely for the use of the individual or entity to whom they > are addressed. Any unauthorised distribution or copying is strictly > prohibited. Whilst CedarOpenAccounts takes steps to prevent the > transmission of viruses via e-mail, we cannot guarantee that any email > or attachment is free from computer viruses and you are strongly > advised to undertake your own anti-virus precautions. > CedarOpenAccounts grants no warranties regarding performance, use or > quality of any e-mail or attachment and undertakes no liability for > loss or damage, howsoever caused. > > CedarOpenAccounts is a trading name of Cedar Software Ltd and > OpenAccounts Ltd. > > For more information on CedarOpenAccounts and our products, please > visit our web site at http://www.cedaropenaccounts.com > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed. Any unauthorised distribution or copying is strictly prohibited. Whilst CedarOpenAccounts takes steps to prevent the transmission of viruses via e-mail, we cannot guarantee that any email or attachment is free from computer viruses and you are strongly advised to undertake your own anti-virus precautions. CedarOpenAccounts grants no warranties regarding performance, use or quality of any e-mail or attachment and undertakes no liability for loss or damage, howsoever caused. CedarOpenAccounts is a trading name of Cedar Software Ltd and OpenAccounts Ltd. For more information on CedarOpenAccounts and our products, please visit our web site at http://www.cedaropenaccounts.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
