/* * Copyright (C) 2003-2011 eXo Platform. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.platform.gadget.services.newspaces; import org.exoplatform.commons.utils.ISO8601; import org.exoplatform.container.PortalContainer; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.identity.model.Profile; import org.exoplatform.social.core.identity.provider.SpaceIdentityProvider; import org.exoplatform.social.core.manager.IdentityManager; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; import org.exoplatform.webui.utils.TimeConvertUtils; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; /** * * @author <a href="tungdt@exoplatform.com">Do Thanh Tung </a> * @version $Revision$ */ public class IntranetSpaceServiceImpl implements IntranetSpaceService { private static final Log LOG = ExoLogger.getLogger(IntranetSpaceServiceImpl.class); private RepositoryService _repoService; private final String SOCIAL_WORKSPACE ="social"; private final String SPACE_HOME = "production/soc:spaces"; private static final String JCR_ROOT = "/jcr:root"; /** * IntranetSpaceServiceImpl constructor * @param repoService * @throws Exception */ public IntranetSpaceServiceImpl(RepositoryService repoService) throws Exception{ this._repoService = repoService; } private Node getSpaceHome() throws Exception { if(this._repoService != null){ SessionProvider sProvider = null; Session session = null; try { sProvider = SessionProvider.createSystemProvider(); session = this.getSession(sProvider); Node rootNode = session.getRootNode(); if(rootNode.hasNode(SPACE_HOME)) { return rootNode.getNode(SPACE_HOME); } } catch (Exception e) { LOG.error("Can not get get SpaceHome", e); sProvider.close(); } finally { if (session != null) { session.logout(); } if (sProvider != null) { sProvider.close(); } } } return null; } /** * * @see org.exoplatform.platform.gadget.services.newspaces.IntranetSpaceService#getLatestCreatedSpace(int, String, List) */ public List<IntranetSpace> getLatestCreatedSpace(int maxday, String language, List<String> allGroupAndMembershipOfUser) { //check permission if(allGroupAndMembershipOfUser==null || allGroupAndMembershipOfUser.size() ==0){ return new ArrayList<IntranetSpace>(); } if (maxday <=0) maxday = 10; String userName = (allGroupAndMembershipOfUser!=null && allGroupAndMembershipOfUser.size()>0)? allGroupAndMembershipOfUser.get(0):null; List<IntranetSpace> listSpaces = new ArrayList<IntranetSpace>(); SessionProvider sProvider = SessionProvider.createSystemProvider(); try { Node spaceHomeNode = getSpaceHome(); if(spaceHomeNode ==null){ return listSpaces; } Calendar pastTime = Calendar.getInstance(); pastTime.setTime(new Date(new Date().getTime() - maxday*24*60*60*1000)); // the days ago //query here QueryManager qm = spaceHomeNode.getSession().getWorkspace().getQueryManager(); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(JCR_ROOT).append(spaceHomeNode.getPath()).append("//element(*,soc:spacedefinition)"); stringBuffer.append("[@exo:dateCreated >= xs:dateTime('" + ISO8601.format(pastTime)+ "')]"); stringBuffer.append(" order by @exo:dateCreated descending"); String pathQuery = stringBuffer.toString(); Query query = qm.createQuery(pathQuery, Query.XPATH); QueryResult result = query.execute(); //end query NodeIterator iter = result.getNodes(); IntranetSpace space; while (iter.hasNext()) { Node spaceNode = iter.nextNode(); space = new IntranetSpace(); space.setDisplayName(spaceNode.getProperty("soc:displayName").getString()); space.setDescription(spaceNode.getProperty("soc:description").getString()); space.setUrl(spaceNode.getProperty("soc:url").getString()); Date createdDate = spaceNode.getProperty("exo:dateCreated").getDate().getTime(); space.setCreatedDate(createdDate); Locale local = new Locale(language); String createdTimeAgo = TimeConvertUtils.convertXTimeAgo(getGreenwichMeanTime(createdDate).getTime(), "yyyy/MM/dd", local, TimeConvertUtils.MONTH); space.setCreatedTimeAgo(createdTimeAgo); space.setRegistration(spaceNode.getProperty("soc:registration").getString()); space.setVisibility(spaceNode.getProperty("soc:visibility").getString()); //check user is member of space String groupId= spaceNode.getProperty("soc:groupId").getString(); if(allGroupAndMembershipOfUser.contains(groupId)){ space.setIsMember(true); } //check user is invitedUsers of space if(spaceNode.hasProperty("soc:invitedMembersId")){ String[] invitedUsers = convertValuesToStrings(spaceNode.getProperty("soc:invitedMembersId").getValues()); for (String user : invitedUsers) { if (user.equals(userName)){ space.setIsInvitedUser(true); break; } } } //check user is pendingUsers of space if(spaceNode.hasProperty("soc:pendingMembersId")){ String[] pendingUsers = convertValuesToStrings(spaceNode.getProperty("soc:pendingMembersId").getValues()); for (String user : pendingUsers) { if (user.equals(userName)){ space.setIsPendingUser(true); break; } } } //get space avatar String avartarUrl = null; PortalContainer portalContainer = PortalContainer.getInstance(); IdentityManager iManager = (IdentityManager) portalContainer.getComponentInstanceOfType(IdentityManager.class); Identity spaceIdentity = iManager.getOrCreateIdentity(SpaceIdentityProvider.NAME, spaceNode.getProperty("soc:name").getString(), true); Profile profile = spaceIdentity.getProfile(); avartarUrl =profile.getAvatarUrl(); space.setAvatarURL(avartarUrl); listSpaces.add(space); } return listSpaces; } catch (Exception e) { LOG.error("Can not get Latest Created Space", e); return null; } finally { sProvider.close(); } } public List<IntranetSpace> requestToJoinOpenSpace(String spaceUrl,String userId) { if(userId == null){ return new ArrayList<IntranetSpace>(); } try { PortalContainer portalContainer = PortalContainer.getInstance(); SpaceService spaceService = (SpaceService) portalContainer.getComponentInstanceOfType(SpaceService.class); Space space = spaceService.getSpaceByUrl(spaceUrl); if (space != null) { if (spaceService.isInvitedUser(space, userId)) { spaceService.addMember(space, userId); } else if(!spaceService.isMember(space, userId)){ spaceService.addPendingUser( space, userId); } } //return space if success Space result = spaceService.getSpaceByUrl(spaceUrl); if(spaceService.isMember(result, userId)){ IntranetSpace intranetSpaceBean = new IntranetSpace(); intranetSpaceBean.setUrl(result.getUrl()); intranetSpaceBean.setDisplayName(result.getDisplayName()); intranetSpaceBean.setIsMember(true); List<IntranetSpace> listIntranetSpace = new ArrayList<IntranetSpace>(); listIntranetSpace.add(intranetSpaceBean); return listIntranetSpace; } } catch (Exception e) { LOG.warn("Can not join space " + spaceUrl ,e); } return new ArrayList<IntranetSpace>(); } private Session getSession(SessionProvider sessionProvider) throws Exception { ManageableRepository currentRepo = this._repoService.getCurrentRepository(); return sessionProvider.getSession(SOCIAL_WORKSPACE, currentRepo); } private String [] convertValuesToStrings(Value[] values) throws Exception { if(values.length == 1) return new String[]{values[0].getString()}; String[] strArrays = new String[values.length]; for(int i = 0; i < values.length; ++i) { strArrays[i] = values[i].getString(); } return strArrays; } /** * Get time GMT/Zulu or UTC,(zone time is 0+GMT) * @return Calendar */ public static Calendar getGreenwichMeanTime(Date date) { Calendar calendar = GregorianCalendar.getInstance(); calendar.setLenient(false); int gmtoffset = calendar.get(Calendar.DST_OFFSET) + calendar.get(Calendar.ZONE_OFFSET); calendar.setTimeInMillis(date.getTime()- gmtoffset); return calendar; } }