View Javadoc
1   package fr.paris.lutece.plugins.newsletter.modules.htmldocs.service;
2   
3   import fr.paris.lutece.plugins.htmldocs.business.portlet.HtmlDocsListPortletHome;
4   import fr.paris.lutece.plugins.htmldocs.business.portlet.HtmldocsPortletHome;
5   import fr.paris.lutece.plugins.htmldocs.service.HtmldocsPlugin;
6   import fr.paris.lutece.plugins.htmldocs.service.PublishingService;
7   import fr.paris.lutece.plugins.newsletter.business.NewsLetter;
8   import fr.paris.lutece.plugins.newsletter.business.NewsLetterHome;
9   import fr.paris.lutece.plugins.newsletter.business.NewsLetterTemplate;
10  import fr.paris.lutece.plugins.newsletter.business.NewsLetterTemplateHome;
11  import fr.paris.lutece.plugins.newsletter.business.topic.NewsletterTopic;
12  import fr.paris.lutece.plugins.newsletter.modules.htmldocs.business.NewsletterHtmlDoc;
13  import fr.paris.lutece.plugins.newsletter.modules.htmldocs.business.NewsletterHtmlDocHome;
14  import fr.paris.lutece.plugins.newsletter.service.NewsletterPlugin;
15  import fr.paris.lutece.plugins.newsletter.service.NewsletterService;
16  import fr.paris.lutece.plugins.newsletter.service.topic.INewsletterTopicService;
17  import fr.paris.lutece.plugins.newsletter.util.NewsletterUtils;
18  import fr.paris.lutece.portal.business.portlet.Portlet;
19  import fr.paris.lutece.portal.business.portlet.PortletTypeHome;
20  import fr.paris.lutece.portal.business.user.AdminUser;
21  import fr.paris.lutece.portal.service.i18n.I18nService;
22  import fr.paris.lutece.portal.service.plugin.Plugin;
23  import fr.paris.lutece.portal.service.plugin.PluginService;
24  import fr.paris.lutece.portal.service.template.AppTemplateService;
25  import fr.paris.lutece.portal.service.util.AppPathService;
26  import fr.paris.lutece.util.ReferenceList;
27  import fr.paris.lutece.util.html.HtmlTemplate;
28  
29  import java.util.HashMap;
30  import java.util.List;
31  import java.util.Locale;
32  import java.util.Map;
33  
34  import org.apache.commons.lang.StringUtils;
35  
36  /**
37   * The newsletter document topic service
38   */
39  public class NewsletterHtmlDocTopicService implements INewsletterTopicService
40  {
41      /**
42       * Newsletter document topic type
43       */
44      public static final String NEWSLETTER_DOCUMENT_TOPIC_TYPE = "NEWSLETTER_HTMLDOC";
45      private static final String HTMLDOCSLIST_PORTLET = "HTMLDOCSLIST_PORTLET";
46  
47      // PARAMETERS
48      private static final String PARAMETER_CATEGORY_LIST_ID = "category_list_id";
49      private static final String PARAMETER_TEMPLATE_ID = "template_id";
50      private static final String PARAMETER_PORTLETS_ID = "portlets_id";
51  
52      // PROPERTIES
53      private static final String CONSTANT_UNCATEGORIZED_DOCUMENTS_KEY = "-1";
54  
55      // MESSAGES AND LABELS
56      private static final String LABEL_MODIFY_UNCATEGORIZED_DOCUMENTS = "module.newsletter.htmldocs.modify_document_topic.uncategorizedDocuments.label";
57      private static final String MESSAGE_NEWSLETTER_DOCUMENT_TOPIC_TYPE_NAME = "module.newsletter.htmldocs.topicType.name";
58  
59      // MARKS
60      private static final String MARK_CATEGORY_LIST = "category_list";
61      private static final String MARK_DOCUMENT_LIST_PORTLETS = "document_list_portlets";
62      private static final String MARK_TEMPLATES_LIST = "templates_list";
63      private static final String MARK_NEWSLETTER_DOCUMENT = "newsletterDocument";
64      private static final String MARK_IMG_PATH = "img_path";
65      private static final String MARK_USE_CATEGORIES = "use_categories";
66  
67      // TEMPLATES
68      private static final String TEMPLATE_MODIFY_NEWSLETTER_DOCUMENT_TOPIC_CONFIG = "admin/plugins/newsletter/modules/htmldocs/modify_newsletter_htmldocs_topic_config.html";
69  
70      private Plugin _newsletterDocumentPlugin;
71      private Plugin _newsletterPlugin;
72      private NewsletterService _newsletterService;
73  
74      /**
75       * {@inheritDoc}
76       */
77      @Override
78      public String getNewsletterTopicTypeCode( )
79      {
80          return NEWSLETTER_DOCUMENT_TOPIC_TYPE;
81      }
82  
83      /**
84       * {@inheritDoc}
85       */
86      @Override
87      public String getNewsletterTopicTypeName( Locale locale )
88      {
89          return I18nService.getLocalizedString( MESSAGE_NEWSLETTER_DOCUMENT_TOPIC_TYPE_NAME, locale );
90      }
91  
92      /**
93       * {@inheritDoc}
94       * 
95       * @return Always return true
96       */
97      @Override
98      public boolean hasConfiguration( )
99      {
100         return true;
101     }
102 
103     /**
104      * {@inheritDoc}
105      */
106     @Override
107     public String getConfigurationPage( NewsletterTopic newsletterTopic, String strBaseUrl, AdminUser user, Locale locale )
108     {
109         Map<String, Object> model = new HashMap<String, Object>( );
110 
111         // We get the categories associated with the topic
112         int [ ] arrayCategoryListIds = NewsletterHtmlDocHome.findNewsletterTagIds( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
113 
114         // We get the list of categories available for this topic type
115         ReferenceList listCategoryList = NewsletterHtmlDocHome.getAllTag( user );
116         listCategoryList.addItem( CONSTANT_UNCATEGORIZED_DOCUMENTS_KEY, I18nService.getLocalizedString( LABEL_MODIFY_UNCATEGORIZED_DOCUMENTS, locale ) );
117         String [ ] strSelectedCategoryList = new String [ arrayCategoryListIds.length];
118 
119         for ( int i = 0; i < arrayCategoryListIds.length; i++ )
120         {
121             strSelectedCategoryList [i] = String.valueOf( arrayCategoryListIds [i] );
122         }
123         // We check categories associated with this topic
124         listCategoryList.checkItems( strSelectedCategoryList );
125 
126         // We get the list of document list portlets containing published documents
127         ReferenceList listDocumentPortlets = NewsletterHtmlDocService.getInstance().getPortletHtmlDocList( );
128         int [ ] arrayPortletIds = NewsletterHtmlDocHome.findNewsletterPortletsIds( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
129         String [ ] strSelectedPortlets = new String [ arrayPortletIds.length];
130 
131         for ( int i = 0; i < arrayPortletIds.length; i++ )
132         {
133             strSelectedPortlets [i] = String.valueOf( arrayPortletIds [i] );
134         }
135         // We check portlets associated with this topic
136         listDocumentPortlets.checkItems( strSelectedPortlets );
137 
138         NewsletterHtmlDoc newsletterDocument = NewsletterHtmlDocHome.findByPrimaryKey( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
139 
140         String strPathImageTemplate = getNewsletterService( ).getImageFolderPath( strBaseUrl );
141 
142         model.put( MARK_CATEGORY_LIST, listCategoryList );
143         model.put( MARK_DOCUMENT_LIST_PORTLETS, listDocumentPortlets );
144         model.put( MARK_NEWSLETTER_DOCUMENT, newsletterDocument );
145         model.put( MARK_TEMPLATES_LIST, NewsLetterTemplateHome.getTemplatesCollectionByType( NEWSLETTER_DOCUMENT_TOPIC_TYPE, getNewsletterPlugin( ) ) );
146         model.put( MARK_IMG_PATH, strPathImageTemplate );
147 
148         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_NEWSLETTER_DOCUMENT_TOPIC_CONFIG, locale, model );
149         return template.getHtml( );
150     }
151 
152     /**
153      * {@inheritDoc}
154      */
155     @Override
156     public void saveConfiguration( Map<String, String [ ]> mapParameters, NewsletterTopic newsletterTopic, AdminUser user, Locale locale )
157     {
158         String [ ] strCategoryIds = mapParameters.get( PARAMETER_CATEGORY_LIST_ID );
159 
160         NewsletterHtmlDocHome.removeNewsLetterDocumentTags( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
161 
162         if ( ( strCategoryIds != null ) )
163         {
164             // recreate the category list with the new selection
165             for ( int i = 0; i < strCategoryIds.length; i++ )
166             {
167                 int nCategoryId = Integer.parseInt( strCategoryIds [i] );
168                 NewsletterHtmlDocHome.associateNewsLetterDocumentCategory( newsletterTopic.getId( ), nCategoryId, getNewsletterDocumentPlugin( ) );
169             }
170         }
171 
172         NewsletterHtmlDocHome.removeNewsLetterDocumentPortlet( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
173         String [ ] strPortletsIds = mapParameters.get( PARAMETER_PORTLETS_ID );
174         if ( ( strPortletsIds != null ) )
175         {
176             // recreate the category list with the new selection
177             for ( int i = 0; i < strPortletsIds.length; i++ )
178             {
179                 int nPortletId = Integer.parseInt( strPortletsIds [i] );
180                 NewsletterHtmlDocHome.associateNewsLetterDocumentPortlet( newsletterTopic.getId( ), nPortletId, getNewsletterDocumentPlugin( ) );
181             }
182         }
183 
184         String strTemplateId = NewsletterUtils.getStringFromStringArray( mapParameters.get( PARAMETER_TEMPLATE_ID ) );
185         if ( StringUtils.isNumeric( strTemplateId ) )
186         {
187             NewsletterHtmlDoc newsletterDocument = NewsletterHtmlDocHome.findByPrimaryKey( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
188 
189             String strUseCategories = NewsletterUtils.getStringFromStringArray( mapParameters.get( MARK_USE_CATEGORIES ) );
190             boolean bUseCategories = Boolean.parseBoolean( strUseCategories );
191             newsletterDocument.setUseDocumentTags( bUseCategories );
192 
193             newsletterDocument.setIdTemplate( Integer.parseInt( strTemplateId ) );
194             NewsletterHtmlDocHome.updateDocumentTopic( newsletterDocument, getNewsletterDocumentPlugin( ) );
195         }
196     }
197 
198     /**
199      * {@inheritDoc}
200      */
201     @Override
202     public void createNewsletterTopic( NewsletterTopic newsletterTopic, AdminUser user, Locale locale )
203     {
204         NewsletterHtmlDoc topic = new NewsletterHtmlDoc( );
205         topic.setId( newsletterTopic.getId( ) );
206 
207         List<NewsLetterTemplate> listTemplates = NewsLetterTemplateHome.getTemplatesCollectionByType( NEWSLETTER_DOCUMENT_TOPIC_TYPE, getNewsletterPlugin( ) );
208         if ( listTemplates != null && listTemplates.size( ) > 0 )
209         {
210             // We default to the first template
211             topic.setIdTemplate( listTemplates.get( 0 ).getId( ) );
212         }
213         else
214         {
215             topic.setIdTemplate( 0 );
216         }
217         topic.setUseDocumentTags( true );
218         NewsletterHtmlDocHome.createDocumentTopic( topic, getNewsletterDocumentPlugin( ) );
219         NewsletterHtmlDocHome.associateNewsLetterDocumentCategory( newsletterTopic.getId( ), Integer.parseInt( CONSTANT_UNCATEGORIZED_DOCUMENTS_KEY ),
220                 getNewsletterDocumentPlugin( ) );
221     }
222 
223     /**
224      * {@inheritDoc}
225      */
226     @Override
227     public void removeNewsletterTopic( int nNewsletterTopicId )
228     {
229         // removes relationship between the topic and document list
230         NewsletterHtmlDocHome.removeNewsLetterDocumentTags( nNewsletterTopicId, getNewsletterDocumentPlugin( ) );
231 
232         // removes relationship between the topic and portlets
233         NewsletterHtmlDocHome.removeNewsLetterDocumentPortlet( nNewsletterTopicId, getNewsletterDocumentPlugin( ) );
234 
235         // Remove the newsletter document topic
236         NewsletterHtmlDocHome.deleteDocumentTopic( nNewsletterTopicId, getNewsletterDocumentPlugin( ) );
237     }
238 
239     /**
240      * {@inheritDoc}
241      */
242     @Override
243     public String getHtmlContent( NewsletterTopic newsletterTopic, AdminUser user, Locale locale )
244     {
245         NewsLetter newsletter = NewsLetterHome.findByPrimaryKey( newsletterTopic.getIdNewsletter( ), getNewsletterPlugin( ) );
246         NewsletterHtmlDoc newsletterDocument = NewsletterHtmlDocHome.findByPrimaryKey( newsletterTopic.getId( ), getNewsletterDocumentPlugin( ) );
247         String strContent = NewsletterHtmlDocService.getInstance( ).generateDocumentsList( newsletterDocument, newsletterDocument.getIdTemplate( ),
248                 newsletter.getDateLastSending( ), AppPathService.getProdUrl( "" ), user, locale );
249 
250         return strContent;
251     }
252 
253     /**
254      * Get the newsletter service instance of this service
255      * 
256      * @return The newsletter service of this service
257      */
258     private NewsletterService getNewsletterService( )
259     {
260         if ( _newsletterService == null )
261         {
262             _newsletterService = NewsletterService.getService( );
263         }
264         return _newsletterService;
265     }
266 
267     /**
268      * Get the newsletter document plugin
269      * 
270      * @return The newsletter document plugin
271      */
272     private Plugin getNewsletterDocumentPlugin( )
273     {
274         if ( _newsletterDocumentPlugin == null )
275         {
276             _newsletterDocumentPlugin = PluginService.getPlugin( NewsletterHtmlDocPlugin.PLUGIN_NAME );
277         }
278         return _newsletterDocumentPlugin;
279     }
280 
281     /**
282      * Get the newsletter plugin
283      * 
284      * @return The newsletter plugin
285      */
286     private Plugin getNewsletterPlugin( )
287     {
288         if ( _newsletterPlugin == null )
289         {
290             _newsletterPlugin = PluginService.getPlugin( NewsletterPlugin.PLUGIN_NAME );
291         }
292         return _newsletterPlugin;
293     }
294 
295    
296     
297    
298 }