KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > exoplatform > services > cms > impl > NewUserListener


1  /**************************************************************************
2  * Copyright 2001-2003 The eXo Platform SARL All rights reserved. *
3  * Please look at license.txt in info directory for more license detail. *
4  **************************************************************************/

5
6 package org.exoplatform.services.cms.impl;
7
8 import java.util.Collection JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11
12 import javax.jcr.Node;
13 import javax.jcr.PathNotFoundException;
14 import javax.jcr.Repository;
15 import javax.jcr.RepositoryException;
16 import javax.jcr.StringValue;
17 import javax.jcr.Ticket;
18
19 import org.apache.commons.lang.StringUtils;
20 import org.apache.commons.logging.Log;
21 import org.exoplatform.commons.utils.IOUtil;
22 import org.exoplatform.container.configuration.ConfigurationManager;
23 import org.exoplatform.container.configuration.ServiceConfiguration;
24 import org.exoplatform.services.database.XResources;
25 import org.exoplatform.services.jcr.RepositoryService;
26 import org.exoplatform.services.log.LogService;
27 import org.exoplatform.services.organization.OrganizationService;
28 import org.exoplatform.services.organization.User;
29 import org.exoplatform.services.organization.UserEventListener;
30 import org.exoplatform.services.resources.LocaleConfig;
31 import org.exoplatform.services.resources.LocaleConfigService;
32 import org.picocontainer.Startable;
33
34 /**
35  * @author Benjamin Mestrallet
36  * benjamin.mestrallet@exoplatform.com
37  */

38 public class NewUserListener extends UserEventListener implements Startable {
39   private NewUserConfig config_;
40   private ConfigurationManager cservice_;
41   private Collection JavaDoc localeConfigs_;
42   private RepositoryService jcrService_;
43   private Log log_;
44
45   public NewUserListener(ConfigurationManager cservice, LocaleConfigService localeService,
46       OrganizationService orgService, RepositoryService jcrService, LogService logService) throws Exception JavaDoc {
47     orgService.addUserEventListener(this) ;
48     cservice_ = cservice;
49     jcrService_ = jcrService;
50     log_ = logService.getLog(getClass().getName());
51     ServiceConfiguration sconf = cservice.getServiceConfiguration(getClass()) ;
52     config_ = (NewUserConfig) sconf.getObjectParam("new.user.configuration").getObject() ;
53     localeConfigs_ = localeService.getLocalConfigs();
54   }
55
56   public void start() {
57   }
58
59   public void stop() {
60   }
61   
62   public void preSave(User user, boolean isNew, XResources xresources) throws Exception JavaDoc {
63     if(!isNew) return ;
64     if(!isUserPredefined(user) && !config_.isCreateHome()) return;
65     //use a anonymous connection for the configuration as the user is not authentified at that time
66
Repository jcrRepository = jcrService_.getRepository();
67     Ticket ticket = jcrRepository.login(null, config_.getWorkspace());
68     Node root = ticket.getRootNode();
69     Node home = null;
70     boolean firstAdd = false;
71     if(!root.hasNode(config_.getJcrPath())){
72       home = makePath(root, config_.getJcrPath());
73       firstAdd = true;
74     } else {
75       home = root.getNode(config_.getJcrPath());
76     }
77     String JavaDoc defaultLocale = config_.getDefaultLocale();
78     Node userHome = home.addNode(user.getUserName(), "nt:folder");
79     List JavaDoc users = config_.getUsers();
80     boolean userFound = false;
81     NewUserConfig.User templateConfig = null;
82     for (Iterator JavaDoc iter = users.iterator(); iter.hasNext();) {
83       NewUserConfig.User userConfig = (NewUserConfig.User) iter.next();
84       String JavaDoc currentName = userConfig.getUserName();
85       if(config_.getTemplate().equals(currentName))
86         templateConfig = userConfig;
87       if(currentName.equals(user.getUserName())){
88         List JavaDoc files = userConfig.getReferencedFiles();
89         importInJCR(files, localeConfigs_, userHome, user.getUserName());
90         userFound = true;
91         break;
92       }
93     }
94     if(!userFound){
95       //use template conf
96
if(!config_.isCreateHome()) {
97         ticket.revert();
98         return;
99       }
100       List JavaDoc files = templateConfig.getReferencedFiles();
101       importInJCR(files, localeConfigs_, userHome, templateConfig.getUserName());
102     }
103     if(firstAdd == true){
104       ticket.save();
105     } else {
106       userHome.save(false);
107     }
108   }
109   
110   private boolean isUserPredefined(User user){
111     List JavaDoc users = config_.getUsers();
112     for (Iterator JavaDoc iter = users.iterator(); iter.hasNext();) {
113       NewUserConfig.User userConfig = (NewUserConfig.User) iter.next();
114       String JavaDoc currentName = userConfig.getUserName();
115       if(currentName.equals(user.getUserName())){
116         return true;
117       }
118     }
119     return false;
120   }
121   
122   
123   private void importInJCR(List JavaDoc files, Collection JavaDoc
124       locales, Node userHome, String JavaDoc userName)
125        throws PathNotFoundException, RepositoryException{
126     for (Iterator JavaDoc iterator = files.iterator(); iterator.hasNext();) {
127       String JavaDoc file = (String JavaDoc) iterator.next();
128       Node fileNode = makePath(userHome, file);
129       for (Iterator JavaDoc iterator2 = locales.iterator(); iterator2.hasNext();) {
130         LocaleConfig localeConfig = (LocaleConfig) iterator2.next();
131         String JavaDoc locale = localeConfig.getLanguage();
132         String JavaDoc[] splittedName = StringUtils.split(file, "/");
133         String JavaDoc realNameFile = splittedName[splittedName.length - 1];
134         String JavaDoc warPath = config_.getContentLocation() + "/" + userName +
135             file + "_" + locale + ".html";
136         try {
137           String JavaDoc fileValue = IOUtil.getStreamContentAsString(cservice_.getInputStream(warPath)) ;
138           Node realFileNode = fileNode.addNode(realNameFile + "_" + locale + ".html", "nt:file");
139           Node contentNode = realFileNode.getNode("jcr:content");
140           contentNode.setProperty("exo:content", new StringValue(fileValue));
141         } catch (Exception JavaDoc e1) {
142           //means the version of the file for that locale does not exist
143
}
144       }
145     }
146   }
147   
148   public Node makePath(Node rootNode, String JavaDoc path)
149       throws PathNotFoundException, RepositoryException {
150     String JavaDoc[] tokens = StringUtils.split(path, '/');
151     Node node = rootNode;
152     for (int i = 0; i < tokens.length; i++) {
153       String JavaDoc token = tokens[i];
154       if (!node.hasNode(token)) {
155         node = node.addNode(token, "nt:folder");
156       } else {
157         node = node.getNode(token);
158       }
159     }
160     return node;
161   }
162
163   public void postSave(User user, boolean isNew, XResources xresources) {
164   }
165
166   public void preDelete(User user, XResources xresources) {
167     Ticket ticket;
168     try {
169       //use a anonymous connection for the configuration as the user is not authentified at that time
170
Repository jcrRepository = jcrService_.getRepository();
171       ticket = jcrRepository.login(null, config_.getWorkspace());
172       Node root = ticket.getRootNode();
173       Node home = ticket.getNodeByAbsPath(config_.getJcrPath());
174       Node userNode = home.getNode(user.getUserName());
175       home.remove(user.getUserName());
176       userNode.save(false);
177     } catch (PathNotFoundException ex){
178       log_.info("Can not delete home dir of user "+ user.getUserName());
179     } catch (RepositoryException e) {
180       log_.error("RepositoryException while trying to delete a user home dir", e);
181     }
182   }
183
184   public void postDelete(User user, XResources xresources) {
185   }
186 }
187
Popular Tags