1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
43
44
45
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
69
70
71
72
73
74
75
76
77
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
89
90 public void addPlugin(PortletTemplatePlugin portletTemplatePlugin) throws Exception {
91 portletTemplatePlugins.add(portletTemplatePlugin);
92 }
93
94
95
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
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
136
137 public List<String> getAllManagedPortletName(String repository) throws Exception {
138 return managedApplicationNames.get(repository);
139 }
140
141
142
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
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
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
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
186
187
188
189
190
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
203
204
205
206
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
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
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 }