View Javadoc
1   /*
2    * Copyright (C) 2003-2008 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.services.cms.views.impl;
18  
19  import org.exoplatform.services.cms.BasePath;
20  import org.exoplatform.services.cms.impl.DMSConfiguration;
21  import org.exoplatform.services.cms.impl.DMSRepositoryConfiguration;
22  import org.exoplatform.services.cms.impl.Utils;
23  import org.exoplatform.services.cms.templates.TemplateService;
24  import org.exoplatform.services.cms.views.ApplicationTemplateManagerService;
25  import org.exoplatform.services.cms.views.PortletTemplatePlugin;
26  import org.exoplatform.services.cms.views.PortletTemplatePlugin.PortletTemplateConfig;
27  import org.exoplatform.services.jcr.RepositoryService;
28  import org.exoplatform.services.jcr.config.RepositoryEntry;
29  import org.exoplatform.services.jcr.core.ManageableRepository;
30  import org.exoplatform.services.jcr.ext.common.SessionProvider;
31  import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
32  import org.exoplatform.services.log.ExoLogger;
33  import org.exoplatform.services.log.Log;
34  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
35  import org.picocontainer.Startable;
36  
37  import javax.jcr.*;
38  import java.io.ByteArrayInputStream;
39  import java.util.*;
40  
41  /**
42   * Created by The eXo Platform SAS
43   * Author : Hoa Pham
44   * hoa.phamvu@exoplatform.com
45   * Oct 15, 2008
46   */
47  public class ApplicationTemplateManagerServiceImpl implements ApplicationTemplateManagerService, Startable {
48  
49    private static final Log LOG = ExoLogger.getLogger(ApplicationTemplateManagerServiceImpl.class.getName());
50    public static final String EDITED_CONFIGURED_TEMPLATES = "EditedConfiguredTemplates";
51    private RepositoryService repositoryService;
52  
53    private List<PortletTemplatePlugin> portletTemplatePlugins = new ArrayList<PortletTemplatePlugin>();
54    Map<String,List<String>> managedApplicationNames = new HashMap<String,List<String>>();
55    private Map<String, String> storedWorkspaces = new HashMap<String,String>();
56  
57    private String basedApplicationTemplatesPath;
58  
59    private DMSConfiguration dmsConfiguration_;
60  
61    private NodeHierarchyCreator hierarchyCreator;
62  
63    private TemplateService templateService;
64  
65    private Map<String,Set<String>> configuredTemplates_;
66  
67    /**
68     * Instantiates a new application template manager service impl.
69     *
70     * @param repositoryService       RepositoryService
71     * @param hierarchyCreator        NodeHierarchyCreator
72     * @param dmsConfiguration        DMSConfiguration
73     * @see RepositoryService
74     * @see NodeHierarchyCreator
75     * @see DMSConfiguration
76     *
77     * @throws Exception the exception
78     */
79    public ApplicationTemplateManagerServiceImpl(RepositoryService repositoryService,
80        NodeHierarchyCreator hierarchyCreator, DMSConfiguration dmsConfiguration) throws Exception {
81      this.repositoryService = repositoryService;
82      dmsConfiguration_ = dmsConfiguration;
83      this.hierarchyCreator = hierarchyCreator;
84      templateService = WCMCoreUtils.getService(TemplateService.class);
85    }
86  
87    /**
88     * {@inheritDoc}
89     */
90    public void addPlugin(PortletTemplatePlugin portletTemplatePlugin) throws Exception {
91      portletTemplatePlugins.add(portletTemplatePlugin);
92    }
93  
94    /**
95     * {@inheritDoc}
96     */
97    public void addTemplate(Node portletTemplateHome, PortletTemplateConfig config) throws Exception {
98      Node category = null;
99      try {
100       category = portletTemplateHome.getNode(config.getCategory());
101     } catch (Exception e) {
102       category = portletTemplateHome.addNode(config.getCategory(),"nt:unstructured");
103       portletTemplateHome.save();
104     }
105     if (!category.hasNode(config.getTemplateName())) {
106       templateService.createTemplate(category,
107                                      config.getTitle(),
108                                      config.getTemplateName(),
109                                      new ByteArrayInputStream(config.getTemplateData().getBytes()),
110                                      new String[] { "*" });
111     }
112     Set<String> templateSet = configuredTemplates_.get(portletTemplateHome.getName());
113     if (templateSet == null) {
114       templateSet = new HashSet<String>();
115     }
116     templateSet.add(category.getName() + "/" + config.getTemplateName());
117     configuredTemplates_.put(portletTemplateHome.getName(), templateSet);
118   }
119 
120   /**
121    * {@inheritDoc}
122    */
123   public Node getApplicationTemplateHome(String portletName, SessionProvider provider) throws Exception {
124     Node basedApplicationTemplateHome = getBasedApplicationTemplatesHome(provider);
125     try {
126       return basedApplicationTemplateHome.getNode(portletName);
127     } catch(PathNotFoundException pne) {
128       Node templateHome = basedApplicationTemplateHome.addNode(portletName);
129       basedApplicationTemplateHome.save();
130       return templateHome;
131     }
132   }
133 
134   /**
135    * {@inheritDoc}
136    */
137   public List<String> getAllManagedPortletName(String repository) throws Exception {
138     return managedApplicationNames.get(repository);
139   }
140 
141   /**
142    * {@inheritDoc}
143    */
144   public Node getTemplateByName(String portletName, String category,
145       String templateName, SessionProvider sessionProvider) throws Exception {
146     Node basedApplicationTemplateHome = getBasedApplicationTemplatesHome(sessionProvider);
147     return basedApplicationTemplateHome.getNode(portletName + "/" + category + "/" + templateName);
148   }
149 
150   /**
151    * {@inheritDoc}
152    */
153   public List<Node> getTemplatesByCategory(String portletName, String category,
154       SessionProvider sessionProvider) throws Exception {
155     Node basedApplicationTemplateHome = getBasedApplicationTemplatesHome(sessionProvider);
156     Node applicationHome = basedApplicationTemplateHome.getNode(portletName);
157     Node categoryNode = applicationHome.getNode(category);
158     List<Node> templateNodes = new ArrayList<Node>();
159     for(NodeIterator iterator = categoryNode.getNodes();iterator.hasNext();) {
160       templateNodes.add(iterator.nextNode());
161     }
162     return templateNodes;
163   }
164 
165   /**
166    * {@inheritDoc}
167    */
168   public Node getTemplateByPath(String templatePath, SessionProvider sessionProvider) throws Exception {
169     Node basedTemplateNode = getBasedApplicationTemplatesHome(sessionProvider);
170     return (Node) basedTemplateNode.getSession().getItem(templatePath);
171   }
172 
173   /**
174    * {@inheritDoc}
175    */
176   public void removeTemplate(String portletName, String category,
177       String templateName, SessionProvider sessionProvider) throws Exception {
178     Node templateNode = getTemplateByName(portletName,category,templateName, sessionProvider );
179     Session session = templateNode.getSession();
180     templateNode.remove();
181     session.save();
182   }
183 
184   /**
185    * Gets the based application templates home.
186    *
187    * @param sessionProvider       SessionProvider
188    * @return the based application templates home
189    * @see SessionProvider
190    * @throws Exception the exception
191    */
192   private Node getBasedApplicationTemplatesHome(SessionProvider sessionProvider) throws Exception {
193     DMSRepositoryConfiguration dmsRepoConfig = dmsConfiguration_.getConfig();
194     ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
195     Session session =
196       sessionProvider.getSession(dmsRepoConfig.getSystemWorkspace(),manageableRepository);
197     Node basedTemplateHome = (Node)session.getItem(basedApplicationTemplatesPath);
198     return basedTemplateHome;
199   }
200 
201   /**
202    * Import predefined template to db.
203    *
204    * @param storedTemplateHomeNode the stored template home node
205    * @see   Node
206    * @throws Exception the exception
207    */
208   private void importPredefinedTemplateToDB(Node storedTemplateHomeNode) throws Exception {
209     HashMap<String, List<PortletTemplateConfig>>  map = new HashMap<String,List<PortletTemplateConfig>>();
210     String repository = ((ManageableRepository) storedTemplateHomeNode.getSession().getRepository()).getConfiguration()
211                                                                                                     .getName();
212     List<String> managedApplicationsPerRepo = managedApplicationNames.get(repository);
213     if(managedApplicationsPerRepo == null) {
214       managedApplicationsPerRepo = new ArrayList<String>();
215     }
216     for(PortletTemplatePlugin plugin:portletTemplatePlugins) {
217       String portletName = plugin.getPortletName();
218       if(!managedApplicationsPerRepo.contains(portletName)) {
219         managedApplicationsPerRepo.add(portletName);
220       }
221       List<PortletTemplateConfig> list = map.get(portletName);
222       if(list == null) {
223         list = new ArrayList<PortletTemplateConfig>();
224       }
225       list.addAll(plugin.getPortletTemplateConfigs());
226       map.put(portletName,list);
227     }
228     for(String portletName: managedApplicationsPerRepo) {
229       Node templateNode = storedTemplateHomeNode.hasNode(portletName) ?
230                           storedTemplateHomeNode.getNode(portletName) :
231                           storedTemplateHomeNode.addNode(portletName,"nt:unstructured");
232       storedTemplateHomeNode.save();
233       for(PortletTemplateConfig config: map.get(portletName)) {
234         StringBuilder tBuilder = new StringBuilder();
235         tBuilder.append(config.getCategory()).append("/").append(config.getTemplateName());
236         if(Utils.getAllEditedConfiguredData(this.getClass().getSimpleName(), EDITED_CONFIGURED_TEMPLATES, true).contains(tBuilder.toString())) continue;
237         addTemplate(templateNode,config);
238       }
239     }
240     managedApplicationNames.put(repository,managedApplicationsPerRepo);
241     storedTemplateHomeNode.save();
242   }
243   
244   /**
245    * {@inheritDoc}
246    */
247   public void start() {
248     configuredTemplates_ = new HashMap<String, Set<String>>();
249     RepositoryEntry repositoryEntry = null;
250     try {
251       repositoryEntry = repositoryService.getCurrentRepository().getConfiguration();
252     } catch (RepositoryException e) {
253       if (LOG.isErrorEnabled()) {
254         LOG.error(e.getMessage(), e);
255       }
256     }
257 
258     String repoName = repositoryEntry.getName();
259     String workspaceName = repositoryEntry.getSystemWorkspaceName();
260     storedWorkspaces.put(repoName,workspaceName);
261     basedApplicationTemplatesPath = hierarchyCreator.getJcrPath(BasePath.CMS_VIEWTEMPLATES_PATH);
262 
263     SessionProvider sessionProvider = SessionProvider.createSystemProvider();
264     for(Iterator<String> repositories = storedWorkspaces.keySet().iterator(); repositories.hasNext();) {
265       String repository = repositories.next();
266       try {
267         Node storedTemplateHome = getBasedApplicationTemplatesHome(sessionProvider);
268         importPredefinedTemplateToDB(storedTemplateHome);
269       } catch (Exception e) {
270         if (LOG.isErrorEnabled()) {
271           LOG.error("Exception when import predefine application template into repository: " + repository, e);
272         }
273       }
274     }
275     sessionProvider.close();
276   }
277 
278   /**
279    * {@inheritDoc}
280    */
281   public void stop() {
282   }
283 
284   @Override
285   public Set<String> getConfiguredAppTemplateMap(String portletName) {
286     return configuredTemplates_ == null ? null : configuredTemplates_.get(portletName);
287   }
288 }