1 5 6 package org.exoplatform.services.cms.impl; 7 8 import java.util.Collection ; 9 import java.util.Iterator ; 10 import java.util.List ; 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 38 public class NewUserListener extends UserEventListener implements Startable { 39 private NewUserConfig config_; 40 private ConfigurationManager cservice_; 41 private Collection 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 { 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 { 63 if(!isNew) return ; 64 if(!isUserPredefined(user) && !config_.isCreateHome()) return; 65 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 defaultLocale = config_.getDefaultLocale(); 78 Node userHome = home.addNode(user.getUserName(), "nt:folder"); 79 List users = config_.getUsers(); 80 boolean userFound = false; 81 NewUserConfig.User templateConfig = null; 82 for (Iterator iter = users.iterator(); iter.hasNext();) { 83 NewUserConfig.User userConfig = (NewUserConfig.User) iter.next(); 84 String currentName = userConfig.getUserName(); 85 if(config_.getTemplate().equals(currentName)) 86 templateConfig = userConfig; 87 if(currentName.equals(user.getUserName())){ 88 List files = userConfig.getReferencedFiles(); 89 importInJCR(files, localeConfigs_, userHome, user.getUserName()); 90 userFound = true; 91 break; 92 } 93 } 94 if(!userFound){ 95 if(!config_.isCreateHome()) { 97 ticket.revert(); 98 return; 99 } 100 List 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 users = config_.getUsers(); 112 for (Iterator iter = users.iterator(); iter.hasNext();) { 113 NewUserConfig.User userConfig = (NewUserConfig.User) iter.next(); 114 String 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 files, Collection 124 locales, Node userHome, String userName) 125 throws PathNotFoundException, RepositoryException{ 126 for (Iterator iterator = files.iterator(); iterator.hasNext();) { 127 String file = (String ) iterator.next(); 128 Node fileNode = makePath(userHome, file); 129 for (Iterator iterator2 = locales.iterator(); iterator2.hasNext();) { 130 LocaleConfig localeConfig = (LocaleConfig) iterator2.next(); 131 String locale = localeConfig.getLanguage(); 132 String [] splittedName = StringUtils.split(file, "/"); 133 String realNameFile = splittedName[splittedName.length - 1]; 134 String warPath = config_.getContentLocation() + "/" + userName + 135 file + "_" + locale + ".html"; 136 try { 137 String 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 e1) { 142 } 144 } 145 } 146 } 147 148 public Node makePath(Node rootNode, String path) 149 throws PathNotFoundException, RepositoryException { 150 String [] tokens = StringUtils.split(path, '/'); 151 Node node = rootNode; 152 for (int i = 0; i < tokens.length; i++) { 153 String 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 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 |