Loading, Saving and Loading Custom Data
Before running, the application should be configured. For configuration the my.servlet.ApplicationInitializer class that is specified in the web.xml is used. The code init reports:
web.xml
...
package my.servlet;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import my.actions.MyLoadAction;
import my.actions.MyLoadDataAction;
import my.actions.MyLocalizationAction;
import my.actions.MyMailAction;
import my.actions.MyRenderReportAction;
import my.actions.MySaveAction;
import com.stimulsoft.base.exception.StiException;
import com.stimulsoft.flex.StiFlexConfig;
/**
* Application initialization.
*/
public class ApplicationInitializer implements ServletContextListener {
@Override
public void contextInitialized(final ServletContextEvent event) {
try {
// configuration application
StiFlexConfig stiConfig = initConfigWithoutDir();
// ---------------------------------------------------------
// need to override the standard methods
// another comment
stiConfig.setLoadClass(MyLoadAction.class);
stiConfig.setSaveClass(MySaveAction.class);
stiConfig.setLoadDataClass(MyLoadDataAction.class);
stiConfig.setMailAction(MyMailAction.class);
stiConfig.setLocalizationAction(MyLocalizationAction.class);
stiConfig.setRenderReportAction(MyRenderReportAction.class);
// ---------------------------------------------------------
StiFlexConfig.init(stiConfig);
// set variable in servlet context attribute
// Map<String, String> myVariableMap = new HashMap<String, String>();
// myVariableMap.put("Variable1", "myVariableMap");
// event.getServletContext().setAttribute("myMap", myVariableMap);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void contextDestroyed(final ServletContextEvent event) {
// empty
}
public StiFlexConfig initConfigWithoutDir() throws StiException, IOException {
Properties properties = new Properties();
// load your own Properties;
// InputStream inStream = getClass().getResourceAsStream("RESOURCE_PATH");
// properties.load(inStream);
return new StiFlexConfig(properties);
}
}
...
In which the main application directory with the file stimulsoft.properties will be defined. In order to make your own reports saving or loading, it is necessary to specify these classes in a configuration, just the same way as you can specify a class to load data from xml. Classes are as follow: Listing MyLoadAction.java
web.xml
...
package my.actions;
import java.io.InputStream;
import com.stimulsoft.flex.StiLoadAction;
import com.stimulsoft.flex.utils.StiSaveLoadFileReport;
public class MyLoadAction extends StiLoadAction {
@Override
public InputStream load(String repotrName) {
System.out.println("must override this method to specify your own load repotr");
return new StiSaveLoadFileReport().getReport(repotrName);
}
}
...
Listing MySaveAction.java:
web.xml
...
package my.actions;
import com.stimulsoft.flex.StiSaveAction;
import com.stimulsoft.flex.utils.StiOperationResult;
import com.stimulsoft.flex.utils.StiSaveLoadFileReport;
public class MySaveAction extends StiSaveAction {
@Override
public StiOperationResult save(String report, String reportName, boolean newReportFlag) {
System.out.println("must override this method to specify your own save report");
return new StiSaveLoadFileReport().save(report, reportName, newReportFlag);
}
}
...
Listing MyLoadDataAction.java:
web.xml
...
package my.actions;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import com.stimulsoft.flex.StiLoadDataAction;
public class MyLoadDataAction extends StiLoadDataAction {
@Override
protected String getConnectionString() {
System.out.println("must override this method to specify your own connection string");
// return
// "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Mybase;User ID=UserName; Password=Password;";
return super.getConnectionString();
}
@Override
protected String getUserName() {
System.out.println("must override this method to specify your own user name");
// return "UserName";
return super.getUserName();
}
@Override
protected String getPassword() {
System.out.println("must override this method to specify your own password");
// return "Password";
return super.getPassword();
}
@Override
protected String getQuery() {
System.out.println("my Query " + super.getQuery());
return super.getQuery();
}
@Override
public Connection getConnection() throws ClassNotFoundException, SQLException {
System.out.println("must override this method to specify your own connection");
boolean overrideByConnectionString = getConnectionString() != null
&& getConnectionString().equals("needOverride");
boolean overrideByDataSource = getDataSourceName() != null
&& getDataSourceName().equals("DataSourceOverride");
if (overrideByConnectionString || overrideByDataSource) {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Properties info = new Properties();
info.setProperty("user", "test");
info.setProperty("password", "test");
String connectionString = "jdbc:sqlserver://localhost\\SQLEXPRESS1:1433;databaseName=mybase;";
return DriverManager.getConnection(connectionString, info);
} else {
return super.getConnection();
}
}
}
...
Listing MyLocalizationAction.java:
web.xml
...
package my.actions;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.stimulsoft.base.exception.StiException;
import com.stimulsoft.base.utils.StiXmlMarshalUtil;
import com.stimulsoft.flex.StiLocalizationAction;
import com.stimulsoft.flex.StiLocalizationInfo;
import com.stimulsoft.lib.io.StiFileUtil;
public class MyLocalizationAction extends StiLocalizationAction {
@Override
public List<StiLocalizationInfo> getLocalizations() throws StiException, FileNotFoundException {
System.out.println("must override this method to specify your own Localizations");
List<StiLocalizationInfo> list = new ArrayList<StiLocalizationInfo>();
File localizationDir = getLocalizationDir();
if (localizationDir.exists()) {
Iterator<File> iterateLocalization = StiFileUtil.iterateFiles(localizationDir,
new String[] { "xml" }, false);
for (; iterateLocalization.hasNext();) {
File fileLoc = iterateLocalization.next();
InputStream is = new BufferedInputStream(new FileInputStream(fileLoc));
StiLocalizationInfo localization = StiXmlMarshalUtil.unmarshal(is,
StiLocalizationInfo.class);
localization.setKey(fileLoc.getName());
list.add(localization);
}
}
return list;
}
@Override
protected File getLocalizationDir() {
System.out.println("must override this method to specify your own LocalizationDir");
return new File("Localization");
}
@Override
public InputStream getLocalization(String key) throws StiException, FileNotFoundException {
System.out.println("must override this method to specify your own load Localization");
File file = new File(getLocalizationDir(), key);
return new BufferedInputStream(new FileInputStream(file));
}
}
...
Listing MyMailAction.java:
web.xml
...
package my.actions;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.PreencodedMimeBodyPart;
import com.stimulsoft.base.mail.StiMailProperties;
import com.stimulsoft.flex.StiMailAction;
import com.stimulsoft.flex.interactionObject.StiMailData;
/**
* MyMailAction.
*
* @Copyright Stimulsoft
*
*/
public class MyMailAction extends StiMailAction {
@Override
public void init(StiMailData mailData, StiMailProperties mailConf) {
System.out.println("must override this method to specify your own init");
this.mailData = mailData;
this.mailConf = mailConf;
session = getSession();
}
@Override
protected Session getSession() {
System.out.println("must override this method to specify your own Session");
Properties props = getProperties();
return Session.getInstance(props);
}
@Override
protected Properties getProperties() {
System.out.println("must override this method to specify your own mail Properties");
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
return props;
}
@Override
protected Message getMessage() throws MessagingException {
System.out.println("must override this method to specify your own mail Message");
Message message = new MimeMessage(session);
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailConf.getFrom()));
message.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(mailConf.getRecipients()));
message.setSubject(mailConf.getSubject());
BodyPart text = getTextPart();
BodyPart body = getFilePart();
Multipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(body);
message.setContent(mp);
return message;
}
@Override
protected BodyPart getTextPart() throws MessagingException {
System.out.println("must override this method to specify your own mail TextPart");
MimeBodyPart text = new MimeBodyPart();
text.setText(mailConf.getBody(), "UTF-8", "plain");
return text;
}
@Override
protected BodyPart getFilePart() throws MessagingException {
System.out.println("must override this method to specify your own mail FilePart");
PreencodedMimeBodyPart body = new PreencodedMimeBodyPart("base64");
body.setFileName(mailData.getFileName());
body.setContent(mailData.getData(), mailData.getMIMEType());
return body;
}
private Transport getTransport() throws MessagingException {
System.out.println("must override this method to specify your own mail Transport");
Transport transport = session.getTransport("smtp");
transport.connect(mailConf.getHost(), mailConf.getSmtpPort(), mailConf.getUserName(),
mailConf.getPassword());
return transport;
}
@Override
public void sendMessage() throws MessagingException {
System.out.println("must override this method to specify your own send Message");
Message message = getMessage();
Transport transport = getTransport();
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
}
...
Listing MyRenderReportAction.java:
web.xml
...
package my.actions;
import java.io.IOException;
import com.stimulsoft.base.exception.StiException;
import com.stimulsoft.flex.StiRenderReportAction;
import com.stimulsoft.report.StiReport;
public class MyRenderReportAction extends StiRenderReportAction {
@Override
public StiReport render(StiReport report) throws IOException, StiException {
System.out.println("must override this method to specify your own render report");
return report.render();
}
}
...
Template JDBC connections
...
jdbc.driver={myDriver};
jdbc.url={myConnectionUrl};
jdbc.username={myUserName };
jdbc.password={ myUserPassword };
...
An example for a SQLServer
...
jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver;
jdbc.url= jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]];
jdbc.username={myUserName };
jdbc.password={ myUserPassword };
...
http://msdn.microsoft.com/en-us/library/ms378428
An example for a Oracle
...
jdbc.driver=oracle.jdbc.driver.OracleDriver;
jdbc.url=jdbc:oracle:thin:@[HOST][:PORT]:SID;
jdbc.username={myUserName };
jdbc.password={ myUserPassword };
...
http://www.orafaq.com/wiki/JDBC
An example for a postgresql
...
jdbc.driver= org.postgresql.Driver
jdbc.url= jdbc:postgresql://[host]:[port]/[database]
jdbc.username={myUserName };
jdbc.password={ myUserPassword };
...
http://jdbc.postgresql.org/documentation/80/connect.html