FormUtils.java
/*
* Copyright (c) 2002-2014, Mairie de Paris
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice
* and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice
* and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* License 1.0
*/
package fr.paris.lutece.plugins.form.utils;
import fr.paris.lutece.plugins.form.business.EntryFilter;
import fr.paris.lutece.plugins.form.business.EntryHome;
import fr.paris.lutece.plugins.form.business.EntryType;
import fr.paris.lutece.plugins.form.business.EntryTypeHome;
import fr.paris.lutece.plugins.form.business.Field;
import fr.paris.lutece.plugins.form.business.FieldHome;
import fr.paris.lutece.plugins.form.business.Form;
import fr.paris.lutece.plugins.form.business.FormError;
import fr.paris.lutece.plugins.form.business.FormFilter;
import fr.paris.lutece.plugins.form.business.FormHome;
import fr.paris.lutece.plugins.form.business.FormSubmit;
import fr.paris.lutece.plugins.form.business.IEntry;
import fr.paris.lutece.plugins.form.business.Response;
import fr.paris.lutece.plugins.form.business.StatisticFormSubmit;
import fr.paris.lutece.portal.business.mailinglist.Recipient;
import fr.paris.lutece.portal.business.user.AdminUser;
import fr.paris.lutece.portal.service.captcha.CaptchaSecurityService;
import fr.paris.lutece.portal.service.i18n.I18nService;
import fr.paris.lutece.portal.service.mail.MailService;
import fr.paris.lutece.portal.service.mailinglist.AdminMailingListService;
import fr.paris.lutece.portal.service.plugin.Plugin;
import fr.paris.lutece.portal.service.plugin.PluginService;
import fr.paris.lutece.portal.service.template.AppTemplateService;
import fr.paris.lutece.portal.service.util.AppLogService;
import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
import fr.paris.lutece.util.ReferenceList;
import fr.paris.lutece.util.html.HtmlTemplate;
import fr.paris.lutece.util.xml.XmlUtil;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.Week;
import org.jfree.data.xy.XYDataset;
import java.awt.Color;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* class FormUtils
*
*/
public final class FormUtils
{
// other constants
public static final String CONSTANT_GROUP_BY_DAY = "0";
public static final String CONSTANT_GROUP_BY_WEEK = "1";
public static final String CONSTANT_GROUP_BY_MONTH = "2";
public static final String EMPTY_STRING = "";
private static final String MARK_LOCALE = "locale";
private static final String MARK_URL_ACTION = "url_action";
private static final String MARK_ENTRY = "entry";
private static final String MARK_FIELD = "field";
private static final String MARK_STR_LIST_CHILDREN = "str_list_entry_children";
private static final String MARK_FORM = "form";
private static final String MARK_JCAPTCHA = "jcaptcha";
private static final String MARK_STR_ENTRY = "str_entry";
private static final String PARAMETER_ID_ENTRY_TYPE = "id_type";
private static final String JCAPTCHA_PLUGIN = "jcaptcha";
private static final String CONSTANT_WHERE = " WHERE ";
private static final String CONSTANT_AND = " AND ";
// Xml Tags
private static final String TAG_FORM = "form";
private static final String TAG_FORM_TITLE = "form-title";
private static final String TAG_FORM_SUBMIT = "submit";
private static final String TAG_FORM_SUBMITS = "submits";
private static final String TAG_FORM_SUBMIT_ID = "submit-id";
private static final String TAG_FORM_SUBMIT_DATE = "submit-date";
private static final String TAG_FORM_SUBMIT_IP = "submit-ip";
private static final String TAG_QUESTIONS = "questions";
private static final String TAG_QUESTION = "question";
private static final String TAG_QUESTION_TITLE = "question-title";
private static final String TAG_RESPONSES = "responses";
private static final String TAG_RESPONSE = "response";
//TEMPLATE
private static final String TEMPLATE_DIV_CONDITIONAL_ENTRY = "admin/plugins/form/html_code_div_conditional_entry.html";
private static final String TEMPLATE_HTML_CODE_FORM = "admin/plugins/form/html_code_form.html";
private static final String TEMPLATE_NOTIFICATION_MAIL_END_DISPONIBILITY = "admin/plugins/form/notification_mail_end_disponibility.html";
private static final String TEMPLATE_NOTIFICATION_MAIL_FORM_SUBMIT = "admin/plugins/form/notification_mail_form_submit.html";
//property
private static final String PROPERTY_NOTIFICATION_MAIL_END_DISPONIBILITY_SUBJECT = "form.notificationMailEndDisponibility.subject";
private static final String PROPERTY_NOTIFICATION_MAIL_END_DISPONIBILITY_SENDER_NAME = "form.notificationMailEndDisponibility.senderName";
private static final String PROPERTY_NOTIFICATION_MAIL_FORM_SUBMIT_SUBJECT = "form.notificationMailFormSubmit.subject";
private static final String PROPERTY_NOTIFICATION_MAIL_FORM_SUBMIT_SENDER_NAME = "form.notificationMailFormSubmit.senderName";
/**
* FormUtils
*
*/
private FormUtils( )
{
}
/**
* sendMail to the mailing list associate to the form a mail of end disponibility
* @param form the form
* @param locale the locale
*/
public static void sendNotificationMailEndDisponibility( Form form, Locale locale )
{
try
{
String strSubject = I18nService.getLocalizedString( PROPERTY_NOTIFICATION_MAIL_END_DISPONIBILITY_SUBJECT,
locale );
String strSenderName = I18nService.getLocalizedString( PROPERTY_NOTIFICATION_MAIL_END_DISPONIBILITY_SENDER_NAME,
locale );
String strSenderEmail = MailService.getNoReplyEmail( );
Collection<Recipient> listRecipients = AdminMailingListService.getRecipients( form.getIdMailingList( ) );
HashMap model = new HashMap( );
model.put( MARK_FORM, form );
HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_NOTIFICATION_MAIL_END_DISPONIBILITY, locale, model );
// Send Mail
for ( Recipient recipient : listRecipients )
{
// Build the mail message
MailService.sendMailHtml( recipient.getEmail( ), strSenderName, strSenderEmail, strSubject,
t.getHtml( ) );
}
}
catch ( Exception e )
{
AppLogService.error( "Error during Notify end disponibilty of form : " + e.getMessage( ) );
}
}
/**
* sendMail to the mailing list associate to the form a mail of new form submit
* @param form the form
* @param locale the locale
*/
public static void sendNotificationMailFormSubmit( Form form, Locale locale )
{
try
{
String strSubject = I18nService.getLocalizedString( PROPERTY_NOTIFICATION_MAIL_FORM_SUBMIT_SUBJECT, locale );
String strSenderName = I18nService.getLocalizedString( PROPERTY_NOTIFICATION_MAIL_FORM_SUBMIT_SENDER_NAME,
locale );
String strSenderEmail = MailService.getNoReplyEmail( );
Collection<Recipient> listRecipients = AdminMailingListService.getRecipients( form.getIdMailingList( ) );
HashMap model = new HashMap( );
model.put( MARK_FORM, form );
HtmlTemplate t = AppTemplateService.getTemplate( TEMPLATE_NOTIFICATION_MAIL_FORM_SUBMIT, locale, model );
// Send Mail
for ( Recipient recipient : listRecipients )
{
// Build the mail message
MailService.sendMailHtml( recipient.getEmail( ), strSenderName, strSenderEmail, strSubject,
t.getHtml( ) );
}
}
catch ( Exception e )
{
AppLogService.error( "Error during Notify a new form submit" + e.getMessage( ) );
}
}
/**
* return a timestamp Object which correspond with the string specified in parameter.
* @param date the date who must convert
* @param locale the locale
* @return a timestamp Object which correspond with the string specified in parameter.
*/
public static Timestamp getDateLastMinute( Date date, Locale locale )
{
if ( date == null )
{
return null;
}
Calendar caldate = new GregorianCalendar( );
caldate.setTime( date );
caldate.set( Calendar.MILLISECOND, 0 );
caldate.set( Calendar.SECOND, 0 );
caldate.set( Calendar.HOUR_OF_DAY, caldate.getActualMaximum( Calendar.HOUR_OF_DAY ) );
caldate.set( Calendar.MINUTE, caldate.getActualMaximum( Calendar.MINUTE ) );
Timestamp timeStamp = new Timestamp( caldate.getTimeInMillis( ) );
return timeStamp;
}
/**
* return a timestamp Object which correspond with the string specified in parameter.
* @param date the date who must convert
* @param locale the locale
* @return a timestamp Object which correspond with the string specified in parameter.
*/
public static Timestamp getDateFirstMinute( Date date, Locale locale )
{
if ( date == null )
{
return null;
}
Calendar caldate = new GregorianCalendar( );
caldate.setTime( date );
caldate.set( Calendar.MILLISECOND, 0 );
caldate.set( Calendar.SECOND, 0 );
caldate.set( Calendar.HOUR_OF_DAY, caldate.getActualMinimum( Calendar.HOUR_OF_DAY ) );
caldate.set( Calendar.MINUTE, caldate.getActualMinimum( Calendar.MINUTE ) );
Timestamp timeStamp = new Timestamp( caldate.getTimeInMillis( ) );
return timeStamp;
}
/**
* return the day of the timestamp
* in parameter
* @param timestamp date
* @return the day of the timestamp in parameter
*/
public static int getDay( Timestamp timestamp )
{
Calendar caldate = new GregorianCalendar( );
caldate.setTime( timestamp );
return caldate.get( Calendar.DAY_OF_MONTH );
}
/**
* return the week of the timestamp
* in parameter
* @param timestamp date
* @return the week of the timestamp in parameter
*/
public static int getWeek( Timestamp timestamp )
{
Calendar caldate = new GregorianCalendar( );
caldate.setTime( timestamp );
return caldate.get( Calendar.WEEK_OF_YEAR );
}
/**
* return the month of the timestamp
* in parameter
* @param timestamp date
* @return the month of the timestamp in parameter
*/
public static int getMonth( Timestamp timestamp )
{
Calendar caldate = new GregorianCalendar( );
caldate.setTime( timestamp );
return caldate.get( Calendar.MONTH );
}
/**
* return the year of the timestamp
* in parameter
* @param timestamp date
* @return the year of the timestamp in parameter
*/
public static int getYear( Timestamp timestamp )
{
Calendar caldate = new GregorianCalendar( );
caldate.setTime( timestamp );
return caldate.get( Calendar.YEAR );
}
/**
* return a timestamp Object which correspond to the timestamp
* in parameter add with a number of times unit (day,week,month)specify in strTimesUnit .
* @param timestamp date
* @param strTimesUnit (day,week,month)
* @param nDecal the number of timesUnit
* @return a timestamp Object which correspond with the string specified in parameter
* add with a number of times unit (day,week,month)specify in strTimesUnit.
*/
public static Timestamp addStatisticInterval( Timestamp timestamp, String strTimesUnit, int nDecal )
{
int nTimesUnit = Calendar.DAY_OF_MONTH;
if ( strTimesUnit.equals( FormUtils.CONSTANT_GROUP_BY_WEEK ) )
{
nTimesUnit = Calendar.WEEK_OF_MONTH;
}
else if ( strTimesUnit.equals( FormUtils.CONSTANT_GROUP_BY_MONTH ) )
{
nTimesUnit = Calendar.MONTH;
}
Calendar caldate = new GregorianCalendar( );
caldate.setTime( timestamp );
caldate.set( Calendar.MILLISECOND, 0 );
caldate.set( Calendar.SECOND, 0 );
caldate.set( Calendar.HOUR_OF_DAY, caldate.getActualMaximum( Calendar.HOUR_OF_DAY ) );
caldate.set( Calendar.MINUTE, caldate.getActualMaximum( Calendar.MINUTE ) );
caldate.add( nTimesUnit, nDecal );
Timestamp timeStamp1 = new Timestamp( caldate.getTimeInMillis( ) );
return timeStamp1;
}
/**
* Compare two timestamp and return true if they have the same times unit(Day,week,month)
* @param timestamp1 timestamp1
* @param timestamp2 timestamp2
* @param strTimesUnit (day,week,month)
* @return Compare two timestamp and return true if they have the same times unit(Day,week,month)
*/
public static boolean sameDate( Timestamp timestamp1, Timestamp timestamp2, String strTimesUnit )
{
Calendar caldate1 = new GregorianCalendar( );
caldate1.setTime( timestamp1 );
Calendar caldate2 = new GregorianCalendar( );
caldate2.setTime( timestamp2 );
if ( strTimesUnit.equals( CONSTANT_GROUP_BY_DAY ) &&
( caldate1.get( Calendar.YEAR ) == caldate2.get( Calendar.YEAR ) ) &&
( caldate1.get( Calendar.DAY_OF_YEAR ) == caldate2.get( Calendar.DAY_OF_YEAR ) ) )
{
return true;
}
else if ( strTimesUnit.equals( CONSTANT_GROUP_BY_WEEK ) &&
( caldate1.get( Calendar.YEAR ) == caldate2.get( Calendar.YEAR ) ) &&
( caldate1.get( Calendar.WEEK_OF_YEAR ) == caldate2.get( Calendar.WEEK_OF_YEAR ) ) )
{
return true;
}
else if ( strTimesUnit.equals( CONSTANT_GROUP_BY_MONTH ) &&
( caldate1.get( Calendar.YEAR ) == caldate2.get( Calendar.YEAR ) ) &&
( caldate1.get( Calendar.MONTH ) == caldate2.get( Calendar.MONTH ) ) )
{
return true;
}
return false;
}
/**
* Converts une java.sql.Timestamp date in a String date in a "jj/mm/aaaa" format
*
* @param date java.sql.Timestamp date to convert
* @param locale the locale
* @return strDate The String date in the short locale format or the emmpty String if the date is null
* @deprecated
*/
public static String getDateString( Timestamp date, Locale locale )
{
DateFormat dateFormat = DateFormat.getDateInstance( DateFormat.SHORT, locale );
return dateFormat.format( date );
}
/**
* return current Timestamp
* @return return current Timestamp
*/
public static Timestamp getCurrentTimestamp( )
{
return new Timestamp( GregorianCalendar.getInstance( ).getTimeInMillis( ) );
}
/**
* return current date without hours, minutes and milliseconds
* @return return current date
*/
public static Date getCurrentDate( )
{
Calendar cal1 = Calendar.getInstance( );
cal1.setTime( new Date( ) );
cal1.set( Calendar.HOUR_OF_DAY, 0 );
cal1.set( Calendar.MINUTE, 0 );
cal1.set( Calendar.SECOND, 0 );
cal1.set( Calendar.MILLISECOND, 0 );
return cal1.getTime( );
}
/**
* return an instance of IEntry function of type entry
* @param request the request
* @param plugin the plugin
* @return an instance of IEntry function of type entry
*/
public static IEntry createEntryByType( HttpServletRequest request, Plugin plugin )
{
String strIdType = request.getParameter( PARAMETER_ID_ENTRY_TYPE );
int nIdType = -1;
IEntry entry = null;
EntryType entryType;
if ( ( strIdType != null ) && !strIdType.equals( EMPTY_STRING ) )
{
try
{
nIdType = Integer.parseInt( strIdType );
}
catch ( NumberFormatException ne )
{
AppLogService.error( ne );
return null;
}
}
if ( nIdType == -1 )
{
return null;
}
entryType = EntryTypeHome.findByPrimaryKey( nIdType, plugin );
try
{
entry = (IEntry) Class.forName( entryType.getClassName( ) ).newInstance( );
entry.setEntryType( entryType );
}
catch ( ClassNotFoundException e )
{
// class doesn't exist
AppLogService.error( e );
}
catch ( InstantiationException e )
{
// Class is abstract or is an interface or haven't accessible builder
AppLogService.error( e );
}
catch ( IllegalAccessException e )
{
// can't access to rhe class
AppLogService.error( e );
}
return entry;
}
/**
* return the index in the list of the entry whose key is specified in parameter
* @param nIdEntry the key of the entry
* @param listEntry the list of the entry
* @return the index in the list of the entry whose key is specified in parameter
*/
public static int getIndexEntryInTheEntryList( int nIdEntry, List<IEntry> listEntry )
{
int nIndex = 0;
for ( IEntry entry : listEntry )
{
if ( entry.getIdEntry( ) == nIdEntry )
{
return nIndex;
}
nIndex++;
}
return nIndex;
}
/**
* return the index in the list of the field whose key is specified in parameter
* @param nIdField the key of the field
* @param listField the list of field
* @return the index in the list of the field whose key is specified in parameter
*/
public static int getIndexFieldInTheFieldList( int nIdField, List<Field> listField )
{
int nIndex = 0;
for ( Field field : listField )
{
if ( field.getIdField( ) == nIdField )
{
return nIndex;
}
nIndex++;
}
return nIndex;
}
/**
* return the html code of the form
* @param form the form which html code must be return
* @param strUrlAction the url who must be call after the form submit
* @param plugin the plugin
* @param locale the locale
* @return the html code of the form
*/
public static String getHtmlForm( Form form, String strUrlAction, Plugin plugin, Locale locale )
{
List<IEntry> listEntryFirstLevel;
HashMap model = new HashMap( );
HtmlTemplate template;
EntryFilter filter;
StringBuffer strBuffer = new StringBuffer( );
filter = new EntryFilter( );
filter.setIdForm( form.getIdForm( ) );
filter.setEntryParentNull( EntryFilter.FILTER_TRUE );
filter.setFieldDependNull( EntryFilter.FILTER_TRUE );
listEntryFirstLevel = EntryHome.getEntryList( filter, plugin );
for ( IEntry entry : listEntryFirstLevel )
{
FormUtils.getHtmlEntry( entry.getIdEntry( ), plugin, strBuffer, locale );
}
if ( form.isActiveCaptcha( ) && PluginService.isPluginEnable( JCAPTCHA_PLUGIN ) )
{
CaptchaSecurityService captchaSecurityService = new CaptchaSecurityService( );
model.put( MARK_JCAPTCHA, captchaSecurityService.getHtmlCode( ) );
}
model.put( MARK_FORM, form );
model.put( MARK_URL_ACTION, strUrlAction );
model.put( MARK_STR_ENTRY, strBuffer.toString( ) );
model.put( MARK_LOCALE, locale );
template = AppTemplateService.getTemplate( TEMPLATE_HTML_CODE_FORM, locale, model );
return template.getHtml( );
}
/**
* insert in the string buffer the content of the html code of the entry
* @param nIdEntry the key of the entry which html code must be insert in the stringBuffer
* @param plugin the plugin
* @param stringBuffer the buffer which contains the html code
* @param locale the locale
*/
public static void getHtmlEntry( int nIdEntry, Plugin plugin, StringBuffer stringBuffer, Locale locale )
{
HashMap model = new HashMap( );
StringBuffer strConditionalQuestionStringBuffer = null;
HtmlTemplate template;
IEntry entry = EntryHome.findByPrimaryKey( nIdEntry, plugin );
if ( entry.getEntryType( ).getGroup( ) )
{
StringBuffer strGroupStringBuffer = new StringBuffer( );
for ( IEntry entryChild : entry.getChildren( ) )
{
getHtmlEntry( entryChild.getIdEntry( ), plugin, strGroupStringBuffer, locale );
}
model.put( MARK_STR_LIST_CHILDREN, strGroupStringBuffer.toString( ) );
}
else
{
if ( entry.getNumberConditionalQuestion( ) != 0 )
{
for ( Field field : entry.getFields( ) )
{
field.setConditionalQuestions( FieldHome.findByPrimaryKey( field.getIdField( ), plugin )
.getConditionalQuestions( ) );
}
}
}
if ( entry.getNumberConditionalQuestion( ) != 0 )
{
strConditionalQuestionStringBuffer = new StringBuffer( );
for ( Field field : entry.getFields( ) )
{
if ( field.getConditionalQuestions( ).size( ) != 0 )
{
StringBuffer strGroupStringBuffer = new StringBuffer( );
for ( IEntry entryConditional : field.getConditionalQuestions( ) )
{
getHtmlEntry( entryConditional.getIdEntry( ), plugin, strGroupStringBuffer, locale );
}
model.put( MARK_STR_LIST_CHILDREN, strGroupStringBuffer.toString( ) );
model.put( MARK_FIELD, field );
template = AppTemplateService.getTemplate( TEMPLATE_DIV_CONDITIONAL_ENTRY, locale, model );
strConditionalQuestionStringBuffer.append( template.getHtml( ) );
}
}
model.put( MARK_STR_LIST_CHILDREN, strConditionalQuestionStringBuffer.toString( ) );
}
model.put( MARK_ENTRY, entry );
template = AppTemplateService.getTemplate( entry.getHtmlCode( ), locale, model );
stringBuffer.append( template.getHtml( ) );
}
/**
* perform in the object formSubmit the responses associates with a entry specify in parameter.
* return null if there is no error in the response else return a FormError Object
* @param request the request
* @param nIdEntry the key of the entry
* @param plugin the plugin
* @param formSubmit Form Submit Object
* @param bResponseNull true if the response create must be null
* @param locale the locale
* @return null if there is no error in the response else return a FormError Object
*/
public static FormError getResponseEntry( HttpServletRequest request, int nIdEntry, Plugin plugin,
FormSubmit formSubmit, boolean bResponseNull, Locale locale )
{
FormError formError = null;
Response response = null;
IEntry entry = null;
List<Response> listResponse = new ArrayList<Response>( );
entry = EntryHome.findByPrimaryKey( nIdEntry, plugin );
List<Field> listField = new ArrayList<Field>( );
for ( Field field : entry.getFields( ) )
{
field = FieldHome.findByPrimaryKey( field.getIdField( ), plugin );
listField.add( field );
}
entry.setFields( listField );
if ( entry.getEntryType( ).getGroup( ) )
{
for ( IEntry entryChild : entry.getChildren( ) )
{
formError = getResponseEntry( request, entryChild.getIdEntry( ), plugin, formSubmit, false, locale );
if ( formError != null )
{
return formError;
}
}
}
else if ( !entry.getEntryType( ).getComment( ) )
{
if ( !bResponseNull )
{
formError = entry.getResponseData( request, listResponse, locale );
}
else
{
response = new Response( );
response.setEntry( entry );
listResponse.add( response );
}
if ( formError != null )
{
return formError;
}
formSubmit.getListResponse( ).addAll( listResponse );
if ( entry.getNumberConditionalQuestion( ) != 0 )
{
for ( Field field : entry.getFields( ) )
{
if ( isFieldInTheResponseList( field.getIdField( ), listResponse ) )
{
for ( IEntry conditionalEntry : field.getConditionalQuestions( ) )
{
formError = getResponseEntry( request, conditionalEntry.getIdEntry( ), plugin, formSubmit,
false, locale );
if ( formError != null )
{
return formError;
}
}
}
else
{
for ( IEntry conditionalEntry : field.getConditionalQuestions( ) )
{
getResponseEntry( request, conditionalEntry.getIdEntry( ), plugin, formSubmit, true, locale );
}
}
}
}
}
return null;
}
/**
* return the field which key is specified in parameter
* @param nIdField the id of the field who is search
* @param listField the list of field
* @return the field which key is specified in parameter
*/
public static Field findFieldByIdInTheList( int nIdField, List<Field> listField )
{
for ( Field field : listField )
{
if ( field.getIdField( ) == nIdField )
{
return field;
}
}
return null;
}
/**
* return true if the field which key is specified in parameter is in the response list
* @param nIdField the id of the field who is search
* @param listResponse the list of object Response
* @return true if the field which key is specified in parameter is in the response list
*/
public static Boolean isFieldInTheResponseList( int nIdField, List<Response> listResponse )
{
for ( Response response : listResponse )
{
if ( ( response.getField( ) != null ) && ( response.getField( ).getIdField( ) == nIdField ) )
{
return true;
}
}
return false;
}
/**
* return the xml of form's response
* @param request the request
* @param form the form
* @param listFormSubmit the form submit list
* @param locale the locale
* @param plugin the plugin
* @return the xml of the response of a form
*/
public static String getXmlResponses( HttpServletRequest request, Form form, List<FormSubmit> listFormSubmit,
Locale locale, Plugin plugin )
{
StringBuffer buffer = new StringBuffer( );
XmlUtil.beginElement( buffer, TAG_FORM );
XmlUtil.addElementHtml( buffer, TAG_FORM_TITLE, form.getTitle( ) );
XmlUtil.beginElement( buffer, TAG_FORM_SUBMITS );
//ResponseFilter filter=new ResponseFilter();
//filter.setIdForm(form.getIdForm());
//List<FormSubmit> listFormSubmit=FormSubmitHome.getFormSubmitList(filter, plugin);
for ( FormSubmit formSubmit : listFormSubmit )
{
XmlUtil.beginElement( buffer, TAG_FORM_SUBMIT );
XmlUtil.addElement( buffer, TAG_FORM_SUBMIT_ID, formSubmit.getIdFormSubmit( ) );
XmlUtil.addElement( buffer, TAG_FORM_SUBMIT_DATE, getDateString( formSubmit.getDateResponse( ), locale ) );
if ( formSubmit.getIp( ) != null )
{
XmlUtil.addElement( buffer, TAG_FORM_SUBMIT_IP, formSubmit.getIp( ) );
}
else
{
XmlUtil.addElement( buffer, TAG_FORM_SUBMIT_IP, EMPTY_STRING );
}
//filter.setIdForm(formSubmit.getIdFormSubmit());
//List<Response> listResponses=ResponseHome.getResponseList(filter, plugin);
Response responseStore = null;
XmlUtil.beginElement( buffer, TAG_QUESTIONS );
if ( ( formSubmit.getListResponse( ) != null ) && ( formSubmit.getListResponse( ).size( ) != 0 ) )
{
for ( Response response : formSubmit.getListResponse( ) )
{
if ( ( responseStore != null ) &&
( response.getEntry( ).getIdEntry( ) != responseStore.getEntry( ).getIdEntry( ) ) )
{
XmlUtil.endElement( buffer, TAG_RESPONSES );
XmlUtil.endElement( buffer, TAG_QUESTION );
}
if ( ( responseStore == null ) ||
( ( responseStore != null ) &&
( response.getEntry( ).getIdEntry( ) != responseStore.getEntry( ).getIdEntry( ) ) ) )
{
XmlUtil.beginElement( buffer, TAG_QUESTION );
XmlUtil.addElementHtml( buffer, TAG_QUESTION_TITLE, response.getEntry( ).getTitle( ) );
XmlUtil.beginElement( buffer, TAG_RESPONSES );
}
if ( response.getValueResponse( ) != null )
{
XmlUtil.addElementHtml( buffer, TAG_RESPONSE,
response.getEntry( ).getResponseValueForExport( request, response, locale ) );
}
else
{
XmlUtil.addElement( buffer, TAG_RESPONSE, EMPTY_STRING );
}
responseStore = response;
}
XmlUtil.endElement( buffer, TAG_RESPONSES );
XmlUtil.endElement( buffer, TAG_QUESTION );
}
XmlUtil.endElement( buffer, TAG_QUESTIONS );
XmlUtil.endElement( buffer, TAG_FORM_SUBMIT );
}
XmlUtil.endElement( buffer, TAG_FORM_SUBMITS );
XmlUtil.endElement( buffer, TAG_FORM );
return buffer.toString( );
}
/**
* write the http header in the response
* @param request the httpServletRequest
* @param response the http response
* @param strFileName the name of the file who must insert in the response
* @param strFileExtension the file extension
*/
public static void addHeaderResponse( HttpServletRequest request, HttpServletResponse response, String strFileName,
String strFileExtension )
{
response.setHeader( "Content-Disposition", "attachment ;filename=\"" + strFileName + "\"" );
if ( strFileExtension.equals( "csv" ) )
{
response.setContentType( "application/csv" );
}
else
{
String strMimeType = request.getSession( ).getServletContext( ).getMimeType( strFileName );
if ( strMimeType != null )
{
response.setContentType( strMimeType );
}
else
{
response.setContentType( "application/octet-stream" );
}
}
response.setHeader( "Pragma", "public" );
response.setHeader( "Expires", "0" );
response.setHeader( "Cache-Control", "must-revalidate,post-check=0,pre-check=0" );
}
/**
* create a JFreeChart Graph function of the statistic form submit
* @param listStatistic the list of statistic of form submit
* @param strLabelX the label of axis x
* @param strLableY the label of axis x
* @param strTimesUnit the times unit of axis x(Day,Week,Month)
* @return a JFreeChart Graph function of the statistic form submit
*/
public static JFreeChart createXYGraph( List<StatisticFormSubmit> listStatistic, String strLabelX,
String strLableY, String strTimesUnit )
{
XYDataset xyDataset = createDataset( listStatistic, strTimesUnit );
JFreeChart jfreechart = ChartFactory.createTimeSeriesChart( EMPTY_STRING, strLabelX, strLableY, xyDataset,
false, false, false );
jfreechart.setBackgroundPaint( Color.white );
XYPlot xyplot = jfreechart.getXYPlot( );
//xyplot.setBackgroundPaint(Color.gray);
//xyplot.setRangeGridlinesVisible(true);
xyplot.setBackgroundPaint( Color.white );
xyplot.setBackgroundPaint( Color.lightGray );
xyplot.setDomainGridlinePaint( Color.white );
xyplot.setRangeGridlinePaint( Color.white );
// DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis( );
// dateaxis.setLowerMargin(0);
// DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy");
// dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,7,formatter));
//dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,7));
//dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,7));
//dateaxis.setMinimumDate((Date)listStatistic.get(0).getTimesUnit());
//dateaxis.setMaximumDate((Date)listStatistic.get(listStatistic.size()-1).getTimesUnit());
//dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH,1));
//dateaxis.setTickUnit(new DateTickUnit(1, 1, DateFormat.getDateInstance(DateFormat.SHORT, Locale.FRENCH)));
//dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1, new SimpleDateFormat("MM/YY")));
//dateaxis.setVerticalTickLabels( true );
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) xyplot.getRenderer( );
renderer.setBaseShapesVisible( true );
renderer.setSeriesFillPaint( 0, Color.RED );
renderer.setUseFillPaint( true );
// renderer.setToolTipGenerator( new StandardXYToolTipGenerator( "{0} {1} {2}",
// DateFormat.getDateInstance( DateFormat.SHORT, Locale.FRENCH ), NumberFormat.getInstance( ) ) );
//
// ChartRenderingInfo info = new ChartRenderingInfo( new StandardEntityCollection( ) );
return jfreechart;
}
/**
* create graph dataset function of the statistic form submit
* @param listStatistic the list of statistic of form submit
* @param strTimesUnit the times unit of axis x(Day,Week,Month)
* @return create graph dataset function of the statistic form submit
*/
private static XYDataset createDataset( List<StatisticFormSubmit> listStatistic, String strTimesUnit )
{
TimeSeries series = null;
if ( strTimesUnit.equals( CONSTANT_GROUP_BY_DAY ) )
{
series = new TimeSeries( EMPTY_STRING, Day.class );
for ( StatisticFormSubmit statistic : listStatistic )
{
series.add( new Day( (Date) statistic.getStatisticDate( ) ), statistic.getNumberResponse( ) );
}
}
else if ( strTimesUnit.equals( CONSTANT_GROUP_BY_WEEK ) )
{
series = new TimeSeries( EMPTY_STRING, Week.class );
for ( StatisticFormSubmit statistic : listStatistic )
{
series.add( new Week( (Date) statistic.getStatisticDate( ) ), statistic.getNumberResponse( ) );
}
}
else if ( strTimesUnit.equals( CONSTANT_GROUP_BY_MONTH ) )
{
series = new TimeSeries( EMPTY_STRING, Month.class );
for ( StatisticFormSubmit statistic : listStatistic )
{
series.add( new Month( (Date) statistic.getStatisticDate( ) ), statistic.getNumberResponse( ) );
}
}
TimeSeriesCollection dataset = new TimeSeriesCollection( );
dataset.addSeries( series );
return dataset;
}
/**
* Load the data of all form that the user is authorized to see depends workgroups user
* @param plugin the plugin
* @param user the current user
* @return a reference list of form
*/
public static ReferenceList getFormList( Plugin plugin, AdminUser user )
{
List<Form> listForms = FormHome.getFormList( new FormFilter( ), plugin );
listForms = (List) AdminWorkgroupService.getAuthorizedCollection( listForms, user );
ReferenceList refListForms = new ReferenceList( );
for ( Form form : listForms )
{
refListForms.addItem( form.getIdForm( ), form.getTitle( ) );
}
return refListForms;
}
public static ReferenceList getRefListAllQuestions( int nIdForm, Plugin plugin )
{
ReferenceList refListQuestions = new ReferenceList( );
for ( IEntry entry : getAllQuestionList( nIdForm, plugin ) )
{
if ( entry.getTitle( ) != null )
{
refListQuestions.addItem( entry.getIdEntry( ), entry.getTitle( ) );
}
else
{
refListQuestions.addItem( entry.getIdEntry( ), entry.getComment( ) );
}
}
return refListQuestions;
}
/**
* return the questions list
* @param nIdForm the form id
* @param plugin the plugin
* @return the questions list
*/
public static List<IEntry> getAllQuestionList( int nIdForm, Plugin plugin )
{
List<IEntry> listEntry = new ArrayList<IEntry>( );
EntryFilter filter = new EntryFilter( );
filter.setIdForm( nIdForm );
filter.setEntryParentNull( EntryFilter.FILTER_TRUE );
filter.setIdIsComment( EntryFilter.FILTER_FALSE );
filter.setFieldDependNull( EntryFilter.FILTER_TRUE );
for ( IEntry entryFirstLevel : EntryHome.getEntryList( filter, plugin ) )
{
if ( entryFirstLevel.getEntryType( ).getGroup( ) )
{
filter = new EntryFilter( );
filter.setIdForm( nIdForm );
filter.setIdEntryParent( entryFirstLevel.getIdEntry( ) );
for ( IEntry entryChild : EntryHome.getEntryList( filter, plugin ) )
{
listEntry.add( entryChild );
addConditionnalsEntry( entryChild, listEntry, plugin );
}
}
else
{
listEntry.add( entryFirstLevel );
addConditionnalsEntry( entryFirstLevel, listEntry, plugin );
}
}
return listEntry;
}
/**
* add children question of the root entryParent node
* @param entryParent the parent entry
* @param listEntry the entry list
* @param plugin the plugin
*/
private static void addConditionnalsEntry( IEntry entryParent, List<IEntry> listEntry, Plugin plugin )
{
entryParent = EntryHome.findByPrimaryKey( entryParent.getIdEntry( ), plugin );
for ( Field field : entryParent.getFields( ) )
{
field = FieldHome.findByPrimaryKey( field.getIdField( ), plugin );
if ( field.getConditionalQuestions( ) != null )
{
for ( IEntry entryConditionnal : field.getConditionalQuestions( ) )
{
listEntry.add( entryConditionnal );
addConditionnalsEntry( entryConditionnal, listEntry, plugin );
}
}
}
}
/**
* return all entries of form
* @param nIdForm the form id
* @param plugin the plugin
* @return the all entries of form
*/
public static List<IEntry> getEntriesList( int nIdForm, Plugin plugin )
{
List<IEntry> listEntry = new ArrayList<IEntry>( );
EntryFilter filter = new EntryFilter( );
filter.setIdForm( nIdForm );
filter.setEntryParentNull( EntryFilter.FILTER_TRUE );
filter.setFieldDependNull( EntryFilter.FILTER_TRUE );
for ( IEntry entryFirstLevel : EntryHome.getEntryList( filter, plugin ) )
{
if ( entryFirstLevel.getEntryType( ).getGroup( ) )
{
filter = new EntryFilter( );
filter.setIdForm( nIdForm );
filter.setIdEntryParent( entryFirstLevel.getIdEntry( ) );
List<IEntry> listEntryChild = new ArrayList<IEntry>( );
for ( IEntry entryChild : EntryHome.getEntryList( filter, plugin ) )
{
listEntryChild.add( entryChild );
addConditionnalsEntry( entryChild, listEntryChild, plugin );
}
entryFirstLevel.setChildren( listEntryChild );
listEntry.add( entryFirstLevel );
}
else
{
listEntry.add( entryFirstLevel );
addConditionnalsEntry( entryFirstLevel, listEntry, plugin );
}
}
return listEntry;
}
/**
* Builds a query with filters placed in parameters
* @param strSelect the select of the query
* @param listStrFilter the list of filter to add in the query
* @param listStrGroupBy the list of group by to add in the query
* @param strOrder the order by of the query
* @return a query
*/
public static String buildRequestWithFilter( String strSelect, List<String> listStrFilter,
List<String> listStrGroupBy, String strOrder )
{
StringBuffer strBuffer = new StringBuffer( );
strBuffer.append( strSelect );
int nCount = 0;
for ( String strFilter : listStrFilter )
{
if ( ++nCount == 1 )
{
strBuffer.append( CONSTANT_WHERE );
}
strBuffer.append( strFilter );
if ( nCount != listStrFilter.size( ) )
{
strBuffer.append( CONSTANT_AND );
}
}
if ( listStrGroupBy != null )
{
for ( String strGroupBy : listStrGroupBy )
{
strBuffer.append( strGroupBy );
}
}
if ( strOrder != null )
{
strBuffer.append( strOrder );
}
return strBuffer.toString( );
}
}