You are reading the articles stored in English
Apr 12, 2013
How to automatically refresh your database in "silent mode"
Break away from dependence on the Lotus Notes client to update your database: an easy tutorial to get applications with the latest update every morning
Scenario: a development server, a release server and many production customers' servers: nothing more classic.
Every time a change is deployed on the release server, the best thing would be to "push" it automatically on production server, or as soon as possible (at least).
Document Actions
Mar 26, 2013
Funkload: a simple buildout to spread and run your test!
Load testing can be one of the key for a successful website deployment. Moreover it can help to solve many situations. Let's see a way to spread your tests!
Recently we faced a performance issue on a Plone site, which has been reported to be slower than expected.
The application, after a migration to a new hardware, has shown to be a bit lazy compared to the expectations.
Because of the weird behaviour and confident on our Plone installation, we assumed a hardware misconfiguration.
But without evidence (numbers in this case), a claim is merely an opinion.
So, to get ride of the problem, we decided to perform multiple load test on different servers, and then compare the results.
Document Actions
Mar 08, 2013
Merging odf files using XDocReport and XPages
Often there is the need to create documents from templates, and the need to fill these templates with data available from other sources: let's take a look at this brief solution
In this scenario, we have a odf template to merge with data.
Working in the Lotus Domino environment, one way to achieve this goal could be a server-side component invoked by an XPagdies, to make the casting process: first, I need something in Java that could do the job for me, and after some search I came across XDocReport.
XDocReport means XML Document reporting
XDocReport provides Java API to merge XML document created with MS Office (docx, pptx) or OpenOffice (odt), LibreOffice (odt) with a Java model to generate report and convert it in another format (PDF, XHTML...).
Basicly, to make the template, main steps are:
- create a template document with MS Word (docx) or OpenOffice (odt, ods)
- compose the body of the document itself with variables to fill in
- use Velocity or Freemarker syntax to set variables to replace.
In this case, I opted to use Velocity inside an ODF file.
Now let's start by explaining how to set up the whole project.
Installing server libraries
External libraries (.jar) that serve the purpose have been installed in the installation directory of the Domino server (jvm/lib/ext path).
These are the files:
commons-collections-3.2.1.jar commons-lang-2.4.jar fr.opensagres.xdocreport.converter-1.0.0.jar fr.opensagres.xdocreport.converter.odt.odfdom-1.0.0.jar fr.opensagres.xdocreport.core-1.0.0.jar fr.opensagres.xdocreport.document-1.0.0.jar fr.opensagres.xdocreport.document.odt-1.0.0.jar fr.opensagres.xdocreport.itext.extension-1.0.0.jar fr.opensagres.xdocreport.template-1.0.0.jar fr.opensagres.xdocreport.template.velocity-1.0.0.jar itext-2.1.7.jar odfdom-java-0.8.7.jar org.odftoolkit.odfdom.converter-0.9.0.jar org.odftoolkit.odfdom.converter.core-1.0.0.jar org.odftoolkit.odfdom.converter.pdf-1.0.0.jar org.odftoolkit.odfdom.converter.xhtml-1.0.0.jar oro-2.0.8.jar velocity-1.7.jar
Dont' forget an important security setting in java.policy file:
Server-side tools
To manage the whole process I used an HTML page with a button that calls (via Ajax) an XPages, that deals with the fusion of the data (HTML string) in the template. At the end, I create the PDF file using iText libraries.
Related to XPages, it only call the servlet in the afterPageLoad event:
com.redturtle.XDocReport.mergeAndPDF( facesContext.getExternalContext().getRequest(), facesContext.getExternalContext().getResponse() );
This is how it looks the package, which includes the servlet:
Finally, this is the servlet code:
package com.redturtle;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.odftoolkit.odfdom.converter.pdf.PdfConverter;
import org.odftoolkit.odfdom.converter.pdf.PdfOptions;
import org.odftoolkit.odfdom.doc.OdfTextDocument;
import fr.opensagres.xdocreport.core.document.SyntaxKind;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import lotus.domino.NotesException;
import lotus.domino.Session;
public class XDocReport {
private static String VERSION = "XDocReport Version 1.0.0";
static PrintWriter outClass = null;
private static Session session = null;
public static void mergeAndPDF (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, InterruptedException, NotesException {
// NO DIIOP
session=DominoAccess.getCurrentSession();
try {
// 1) Load ODT file by filling Velocity template engine
InputStream in = new FileInputStream("/tmp/template.odt");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
FieldsMetadata metadata = report.createFieldsMetadata();
metadata.addFieldAsTextStyling("comments",SyntaxKind.Html,false);
// 2) Create context Java model
IContext context = report.createContext();
context.put("comments", "<b>hello world</b>");
// 3) Generate report by merging Java model with the ODT
OutputStream out = new FileOutputStream(new File("/tmp/ODTProjectWithVelocity_Out.odt"));
report.process(context, out);
// 1) Load ODT into ODFDOM OdfTextDocument
in= new FileInputStream(new File("/tmp/ODTProjectWithVelocity_Out.odt"));
OdfTextDocument document = OdfTextDocument.loadDocument(in);
// 2) Prepare Pdf options
PdfOptions options = PdfOptions.create();
// 3) Convert OdfTextDocument to PDF via IText
out = new FileOutputStream(new File("/tmp/ODTProjectWithVelocityList_Out.pdf"));
PdfConverter.getInstance().convert(document, out, options);
// Only manage response to Ajax call
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
outClass = new PrintWriter(response.getWriter());
printAgent("OK");
return;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected static void printAgent(String string) {
outClass.println(string);
}
}
Pay attention to these points:
- comments - variable name inside ODF template
- metadata.addFieldAsTextStyling("comments",SyntaxKind.Html,false); - fill variable with something in HTML syntax
- <b>hello world</b> - HTML string to merge
NOTE: DominoAccess and JSFUtil are two very helpful classes written by Karsten Lehmann: see the full code. Thanks to them, DIIOP process for communication is not required.
Pro & Cons.
I think that it's a very powerful approach; the only limitation I've found is the restricted set of styles supported by the merge process (see there for details). Feel free to make some test using this approach, and let me know what you think :-)
Document Actions
Feb 25, 2013
How to transform a dexterity Item in to a dexterity Container
The use case of adding container capabilities to content types is common in the Plone world. I show a nifty solution that applies to dexterity content types
This is a rather technical post, full of code. Faint of hearth you are advised!
The story
Not all the content types are designed from the beginning with a container behaviour, a feature that can become a requirement in consequence of specification changes.
It happened also to me and in my case I had to deal with dexterity based content types. I started googling around and found this unresolved question on the dexterity mailing list.
Starting from the suggestions in the thread, I managed to find out a nifty solution that reveals some interesting aspects of the software we work with.
Document Actions
Jan 30, 2013
Caution: in 2013 a "Meteor" will impact the World (Wide Web)
Meteor is a very powerful Javascript framework: this short article demonstrate how to install, configure and create your first application using "Meteor"
Nothing to do with the Mayan prophecies, quiet!
Some time ago I came across a tweet that talked about Meteor and, as usual, I tried to investigate the simple reading.
Meteor runs on Node.js. Has it's own server