View Javadoc
1   package fr.paris.lutece.plugins.workflow.modules.fillingdirectory.service;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.Locale;
6   import java.util.Map;
7   
8   import javax.inject.Inject;
9   import javax.inject.Named;
10  import javax.servlet.http.HttpServletRequest;
11  
12  import org.apache.commons.lang.StringUtils;
13  
14  import fr.paris.lutece.plugins.directory.business.Directory;
15  import fr.paris.lutece.plugins.directory.business.Record;
16  import fr.paris.lutece.plugins.directory.business.RecordField;
17  import fr.paris.lutece.plugins.directory.service.DirectoryPlugin;
18  import fr.paris.lutece.plugins.directory.service.DirectoryResourceIdService;
19  import fr.paris.lutece.plugins.directory.service.record.IRecordService;
20  import fr.paris.lutece.plugins.directory.service.upload.DirectoryAsynchronousUploadHandler;
21  import fr.paris.lutece.plugins.directory.utils.DirectoryErrorException;
22  import fr.paris.lutece.plugins.directory.utils.DirectoryUtils;
23  import fr.paris.lutece.plugins.workflowcore.service.config.ITaskConfigService;
24  import fr.paris.lutece.plugins.workflowcore.service.task.SimpleTask;
25  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
26  import fr.paris.lutece.portal.service.admin.AdminUserService;
27  import fr.paris.lutece.portal.service.message.AdminMessage;
28  import fr.paris.lutece.portal.service.message.AdminMessageService;
29  import fr.paris.lutece.portal.service.plugin.Plugin;
30  import fr.paris.lutece.portal.service.plugin.PluginService;
31  import fr.paris.lutece.portal.service.rbac.RBACService;
32  import fr.paris.lutece.portal.service.util.AppLogService;
33  import fr.paris.lutece.portal.service.util.AppPathService;
34  
35  /**
36   * 
37   * TaskHelpFilling Task
38   *
39   */
40  public class TaskHelpFilling extends SimpleTask 
41  {
42  	   
43      private static final String MESSAGE_ACCESS_DENIED = "Acces denied";
44      private static final String PARAMETER_CANCEL = "cancel";
45      private static final String MESSAGE_DIRECTORY_ERROR_MANDATORY_FIELD = DirectoryUtils.MESSAGE_DIRECTORY_ERROR_MANDATORY_FIELD;
46      private static final String MESSAGE_DIRECTORY_ERROR = DirectoryUtils.MESSAGE_DIRECTORY_ERROR;
47      private static final String JSP_CREATE_DIRECTORY_RECORD = "jsp/admin/plugins/directory/CreateDirectoryRecord.jsp";
48      private static final String PARAMETER_ID_DIRECTORY = DirectoryUtils.PARAMETER_ID_DIRECTORY;
49      private static final String PARAMETER_ID_DIRECTORY_RECORD = "id_directory_record";
50      
51      //MARK
52      private static final String MARK_POPUP_ACTIVE = "popup_active";
53      private static final String MARK_TRUE = "true";
54      private static final String MARK_CONSTANT_STR_NULL = "";
55      
56      //PARAMETERS
57      private boolean _bIn;
58      // SERVICES
59      @Inject
60      @Named( TaskHelpFillingConfigService.BEAN_SERVICE )
61      private ITaskConfigService _taskHelpFillingConfigService;
62      @Inject
63      private IRecordService _recordService ;
64      
65  	/**
66       * {@inheritDoc}
67       */
68      @Override
69      public void processTask( int nIdResourceHistory, HttpServletRequest request, Locale locale )
70      {
71      	String strIdDirectoryRecord = request.getParameter( PARAMETER_ID_DIRECTORY_RECORD );
72      	String strPopupActive = request.getParameter( MARK_POPUP_ACTIVE ) == null ? String.valueOf( MARK_CONSTANT_STR_NULL ) : request.getParameter( MARK_POPUP_ACTIVE ) ;
73          int nIdDirectoryRecord = DirectoryUtils.convertStringToInt( strIdDirectoryRecord );
74          
75      	if ( !( strPopupActive.equals( MARK_TRUE ) ) && !_bIn )
76      	{
77      		_bIn = true;
78  	    	Plugin pluginDirectory = PluginService.getPlugin( DirectoryPlugin.PLUGIN_NAME );
79  	        
80  	        Record record = _recordService.findByPrimaryKey( nIdDirectoryRecord, pluginDirectory );
81  	        
82  	        record.setListRecordField( record.getListRecordField(  ) == null? new ArrayList<RecordField>( ) :record.getListRecordField(  ) );
83  	
84  	        if ( ( record == null ) ||
85  	                !RBACService.isAuthorized( Directory.RESOURCE_TYPE,
86  	                    record.getDirectory(  ).getIdDirectory(  ) + DirectoryUtils.EMPTY_STRING,
87  	                    DirectoryResourceIdService.PERMISSION_MODIFY_RECORD, AdminUserService.getAdminUser( request ) ) )
88  	        {
89  	            try 
90  	            {
91  					throw new AccessDeniedException( MESSAGE_ACCESS_DENIED );
92  					
93  				} 
94  	            catch ( AccessDeniedException e ) 
95  	            {
96  					AppLogService.error( e );
97  				}
98  	        }
99  	
100 	        if ( request.getParameter( PARAMETER_CANCEL ) == null )
101 	        {
102 	        	 String strRedirectUrl = getDirectoryRecordData( record, request,locale, pluginDirectory );
103 	
104 	             if ( StringUtils.isNotBlank( strRedirectUrl ) )
105 	             {
106 	            	 try 
107 	            	 {
108 						throw new AccessDeniedException( MESSAGE_ACCESS_DENIED );
109 	            	 } 
110 	            	 	catch ( AccessDeniedException e ) 
111 	            	 {
112 						AppLogService.error( e );
113 	            	 }
114 	             }
115 	             else
116 	             {
117 		            try
118 		            {
119 		                _recordService.updateWidthRecordField( record, pluginDirectory );
120 		            }
121 		            catch ( Exception ex )
122 		            {
123 		                // something very wrong happened... a database check might be needed
124 		                AppLogService.error( ex.getMessage(  ) + " when updating Record " + record.getIdRecord(  ), ex );
125 		            }
126 	             }
127 	        }
128 	    }
129     }
130     
131     /**
132      * 
133      * @param record the record to fill
134      * @param request the HTTP request
135      * @param locale the Locale local
136      * @param plugin the Plugin plugin 
137      * @return directory record
138      */
139     private String getDirectoryRecordData( Record record, HttpServletRequest request, Locale locale, Plugin plugin )
140     {
141 
142         String strUploadAction = DirectoryAsynchronousUploadHandler.getHandler(  ).getUploadAction( request );
143 
144         try
145         {
146             DirectoryUtils.getDirectoryRecordData( request, record, plugin , locale );
147         }
148         catch ( DirectoryErrorException error )
149         {
150             // Case if the user does not upload a file, then throw the error message
151             if ( StringUtils.isBlank( strUploadAction ) )
152             {
153                 String strErrorMessage = DirectoryUtils.EMPTY_STRING;
154 
155                 if ( error.isMandatoryError(  ) )
156                 {
157                     Object[] tabRequiredFields = { error.getTitleField(  ) };
158                     strErrorMessage = AdminMessageService.getMessageUrl( request,
159                             MESSAGE_DIRECTORY_ERROR_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
160                 }
161                 else
162                 {
163                     Object[] tabRequiredFields = { error.getTitleField(  ), error.getErrorMessage(  ) };
164                     strErrorMessage = AdminMessageService.getMessageUrl( request, MESSAGE_DIRECTORY_ERROR,
165                             tabRequiredFields, AdminMessage.TYPE_STOP );
166                 }
167 
168                 return strErrorMessage;
169             }
170         }
171 
172         // Special case for upload fields : if no action is specified, a submit
173         // button associated with an upload might have been pressed :
174         if ( StringUtils.isNotBlank( strUploadAction ) )
175         {
176             Map<String, List<RecordField>> mapListRecordFields = DirectoryUtils.buildMapIdEntryListRecordField( record );
177 
178             // Upload the file
179             try
180             {
181                 DirectoryAsynchronousUploadHandler.getHandler(  )
182                                                   .doUploadAction( request, strUploadAction, mapListRecordFields,
183                     record, plugin );
184             }
185             catch ( DirectoryErrorException error )
186             {
187                 String strErrorMessage = DirectoryUtils.EMPTY_STRING;
188 
189                 if ( error.isMandatoryError(  ) )
190                 {
191                     Object[] tabRequiredFields = { error.getTitleField(  ) };
192                     strErrorMessage = AdminMessageService.getMessageUrl( request,
193                             MESSAGE_DIRECTORY_ERROR_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
194                 }
195                 else
196                 {
197                     Object[] tabRequiredFields = { error.getTitleField(  ), error.getErrorMessage(  ) };
198                     strErrorMessage = AdminMessageService.getMessageUrl( request, MESSAGE_DIRECTORY_ERROR,
199                             tabRequiredFields, AdminMessage.TYPE_STOP );
200                 }
201 
202                 return strErrorMessage;
203             }
204 
205             // Put the map <idEntry, RecordFields> in the session
206             request.getSession(  )
207                    .setAttribute( DirectoryUtils.SESSION_DIRECTORY_LIST_SUBMITTED_RECORD_FIELDS, mapListRecordFields );
208 
209             return getJspCreateDirectoryRecord( request, record.getDirectory(  ).getIdDirectory(  ) );
210         }
211 
212         return StringUtils.EMPTY;
213     
214     }
215     /**
216      * 
217      * @param request the HTTP request
218      * @param nIdDirectory Id directory
219      * @return url path
220      */
221     private String getJspCreateDirectoryRecord( HttpServletRequest request, int nIdDirectory )
222     {
223         return AppPathService.getBaseUrl( request ) + JSP_CREATE_DIRECTORY_RECORD + "?" + PARAMETER_ID_DIRECTORY + "=" +
224         nIdDirectory;
225     }
226     /**
227      * {@inheritDoc}
228      */
229     @Override
230     public void doRemoveConfig(  )
231     {
232          _taskHelpFillingConfigService.remove( this.getId(  ) );
233     }
234     /**
235      * {@inheritDoc}
236      */
237     @Override
238     public String getTitle( Locale locale )
239     {
240 
241         return StringUtils.EMPTY;
242     }
243 
244 }