001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.googleapps;
016    
017    import com.liferay.portal.kernel.googleapps.GGroup;
018    import com.liferay.portal.kernel.googleapps.GGroupManager;
019    import com.liferay.portal.kernel.googleapps.GGroupMember;
020    import com.liferay.portal.kernel.googleapps.GGroupOwner;
021    import com.liferay.portal.kernel.googleapps.GUser;
022    import com.liferay.portal.kernel.googleapps.GUserManager;
023    import com.liferay.portal.kernel.googleapps.GoogleAppsException;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.util.GetterUtil;
027    import com.liferay.portal.kernel.util.StringBundler;
028    import com.liferay.portal.kernel.util.StringPool;
029    import com.liferay.portal.kernel.xml.Attribute;
030    import com.liferay.portal.kernel.xml.Document;
031    import com.liferay.portal.kernel.xml.Element;
032    import com.liferay.portal.kernel.xml.SAXReaderUtil;
033    
034    import java.util.ArrayList;
035    import java.util.List;
036    
037    /**
038     * @author Brian Wing Shun Chan
039     */
040    public class GGroupManagerImpl
041            extends GBaseManagerImpl implements GGroupManager {
042    
043            public GGroupManagerImpl(GoogleApps googleApps) {
044                    super(googleApps);
045    
046                    GAuthenticator gAuthenticator = googleApps.getGAuthenticator();
047    
048                    groupURL = APPS_URL.concat("/group/2.0/").concat(
049                            gAuthenticator.getDomain());
050            }
051    
052            public void addGGroupMember(
053                            String groupEmailAddress, String memberEmailAddress)
054                    throws GoogleAppsException {
055    
056                    Document document = SAXReaderUtil.createDocument();
057    
058                    Element atomEntryElement = addAtomEntry(document);
059    
060                    addAppsProperty(atomEntryElement, "memberId", memberEmailAddress);
061    
062                    StringBundler sb = new StringBundler(4);
063    
064                    sb.append(groupURL);
065                    sb.append(StringPool.SLASH);
066                    sb.append(groupEmailAddress);
067                    sb.append("/member");
068    
069                    submitAdd(sb.toString(), document);
070            }
071    
072            public void addGGroupOwner(
073                            String groupEmailAddress, String ownerEmailAddress)
074                    throws GoogleAppsException {
075    
076                    Document document = SAXReaderUtil.createDocument();
077    
078                    Element atomEntryElement = addAtomEntry(document);
079    
080                    addAppsProperty(atomEntryElement, "email", ownerEmailAddress);
081    
082                    StringBundler sb = new StringBundler(4);
083    
084                    sb.append(groupURL);
085                    sb.append(StringPool.SLASH);
086                    sb.append(groupEmailAddress);
087                    sb.append("/owner");
088    
089                    submitAdd(sb.toString(), document);
090            }
091    
092            public void deleteGGroup(String emailAddress) throws GoogleAppsException {
093                    submitDelete(getGroupURL(emailAddress));
094            }
095    
096            public void deleteGGroupMember(
097                            String groupEmailAddress, String memberEmailAddress)
098                    throws GoogleAppsException {
099    
100                    StringBundler sb = new StringBundler(5);
101    
102                    sb.append(groupURL);
103                    sb.append(StringPool.SLASH);
104                    sb.append(groupEmailAddress);
105                    sb.append("/member/");
106                    sb.append(memberEmailAddress);
107    
108                    submitDelete(sb.toString());
109            }
110    
111            public void deleteGGroupOwner(
112                            String groupEmailAddress, String ownerEmailAddress)
113                    throws GoogleAppsException {
114    
115                    StringBundler sb = new StringBundler(5);
116    
117                    sb.append(groupURL);
118                    sb.append(StringPool.SLASH);
119                    sb.append(groupEmailAddress);
120                    sb.append("/owner/");
121                    sb.append(ownerEmailAddress);
122    
123                    submitDelete(sb.toString());
124            }
125    
126            public GGroup getGGroup(String emailAddress) throws GoogleAppsException {
127                    Document document = getDocument(getGroupURL(emailAddress));
128    
129                    if (hasError(document)) {
130                            if (_log.isInfoEnabled()) {
131                                    _log.info(getErrorMessage(document));
132                            }
133    
134                            return null;
135                    }
136    
137                    Element atomEntryElement = document.getRootElement();
138    
139                    return getGGroup(atomEntryElement);
140            }
141    
142            public GGroupMember getGGroupMember(
143                            String groupEmailAddress, String memberEmailAddress)
144                    throws GoogleAppsException {
145    
146                    StringBundler sb = new StringBundler(5);
147    
148                    sb.append(groupURL);
149                    sb.append(StringPool.SLASH);
150                    sb.append(groupEmailAddress);
151                    sb.append("/member/");
152                    sb.append(memberEmailAddress);
153    
154                    Document document = getDocument(sb.toString());
155    
156                    if (hasError(document)) {
157                            if (_log.isInfoEnabled()) {
158                                    _log.info(getErrorMessage(document));
159                            }
160    
161                            return null;
162                    }
163    
164                    Element atomEntryElement = document.getRootElement();
165    
166                    return getGGroupMember(atomEntryElement);
167            }
168    
169            public List<GGroupMember> getGGroupMembers(String emailAddress)
170                    throws GoogleAppsException {
171    
172                    List<GGroupMember> gGroupMembers = new ArrayList<GGroupMember>();
173    
174                    StringBundler sb = new StringBundler(4);
175    
176                    sb.append(groupURL);
177                    sb.append(StringPool.SLASH);
178                    sb.append(emailAddress);
179                    sb.append("/member");
180    
181                    getGGroupMembers(gGroupMembers, sb.toString());
182    
183                    return gGroupMembers;
184            }
185    
186            public GGroupOwner getGGroupOwner(
187                            String groupEmailAddress, String ownerEmailAddress)
188                    throws GoogleAppsException {
189    
190                    StringBundler sb = new StringBundler(5);
191    
192                    sb.append(groupURL);
193                    sb.append(StringPool.SLASH);
194                    sb.append(groupEmailAddress);
195                    sb.append("/owner/");
196                    sb.append(ownerEmailAddress);
197    
198                    Document document = getDocument(sb.toString());
199    
200                    if (hasError(document)) {
201                            if (_log.isInfoEnabled()) {
202                                    _log.info(getErrorMessage(document));
203                            }
204    
205                            return null;
206                    }
207    
208                    Element atomEntryElement = document.getRootElement();
209    
210                    return getGGroupOwner(atomEntryElement);
211            }
212    
213            public List<GGroupOwner> getGGroupOwners(String emailAddress)
214                    throws GoogleAppsException {
215    
216                    List<GGroupOwner> gGroupOwners = new ArrayList<GGroupOwner>();
217    
218                    StringBundler sb = new StringBundler(4);
219    
220                    sb.append(groupURL);
221                    sb.append(StringPool.SLASH);
222                    sb.append(emailAddress);
223                    sb.append("/owner");
224    
225                    getGGroupOwners(gGroupOwners, sb.toString());
226    
227                    return gGroupOwners;
228            }
229    
230            public List<GGroup> getGGroups() throws GoogleAppsException {
231                    List<GGroup> gGroups = new ArrayList<GGroup>();
232    
233                    getGGroups(gGroups, groupURL);
234    
235                    return gGroups;
236            }
237    
238            public List<GGroup> getGGroups(long userId, boolean directOnly)
239                    throws GoogleAppsException {
240    
241                    List<GGroup> gGroups = new ArrayList<GGroup>();
242    
243                    StringBundler sb = new StringBundler(4);
244    
245                    sb.append(groupURL);
246                    sb.append("?member=");
247                    sb.append(userId);
248                    sb.append("&directOnly=");
249                    sb.append(directOnly);
250    
251                    getGGroups(gGroups, sb.toString());
252    
253                    return gGroups;
254            }
255    
256            public void updateDescription(String emailAddress, String description)
257                    throws GoogleAppsException {
258    
259                    Document document = getDocument(getGroupURL(emailAddress));
260    
261                    if (hasError(document)) {
262                            if (_log.isInfoEnabled()) {
263                                    _log.info(getErrorMessage(document));
264                            }
265    
266                            return;
267                    }
268    
269                    Element atomEntryElement = document.getRootElement();
270    
271                    List<Element> appsPropertyElements = atomEntryElement.elements(
272                            getAppsQName("property"));
273    
274                    for (Element appsPropertyElement : appsPropertyElements) {
275                            String name = appsPropertyElement.attributeValue("name");
276    
277                            if (name.equals("description")) {
278                                    Attribute valueAttribute = appsPropertyElement.attribute(
279                                            "value");
280    
281                                    valueAttribute.setValue(description);
282                            }
283                    }
284    
285                    submitUpdate(getGroupURL(emailAddress), document);
286            }
287    
288            protected GGroup getGGroup(Element atomEntryElement) {
289                    GGroup gGroup = new GGroup();
290    
291                    List<Element> appsPropertyElements = atomEntryElement.elements(
292                            getAppsQName("property"));
293    
294                    for (Element appsPropertyElement : appsPropertyElements) {
295                            String name = appsPropertyElement.attributeValue("name");
296                            String value = appsPropertyElement.attributeValue("value");
297    
298                            if (name.equals("description")) {
299                                    gGroup.setDescription(value);
300                            }
301                            else if (name.equals("emailPermission")) {
302                                    gGroup.setEmailPermission(value);
303                            }
304                            else if (name.equals("groupId")) {
305                                    gGroup.setEmailAddress(value);
306                            }
307                            else if (name.equals("groupName")) {
308                                    gGroup.setName(value);
309                            }
310                            else if (name.equals("permissionPreset")) {
311                                    gGroup.setPermissionPreset(value);
312                            }
313                    }
314    
315                    return gGroup;
316            }
317    
318            protected GGroupMember getGGroupMember(Element atomEntryElement)
319                    throws GoogleAppsException {
320    
321                    GGroupMember gGroupMember = new GGroupMember();
322    
323                    List<Element> appsPropertyElements = atomEntryElement.elements(
324                            getAppsQName("property"));
325    
326                    for (Element appsPropertyElement : appsPropertyElements) {
327                            String name = appsPropertyElement.attributeValue("name");
328                            String value = appsPropertyElement.attributeValue("value");
329    
330                            if (name.equals("directMember")) {
331                                    gGroupMember.setDirect(GetterUtil.getBoolean(value));
332                            }
333                            else if (name.equals("memberId")) {
334                                    gGroupMember.setEmailAddress(value);
335                            }
336                            else if (name.equals("memberType")) {
337                                    gGroupMember.setType(value);
338                            }
339                    }
340    
341                    String type = gGroupMember.getType();
342    
343                    if (type.equals("Group")) {
344                            GGroup gGroup = getGGroup(gGroupMember.getEmailAddress());
345    
346                            gGroupMember.setGGroup(gGroup);
347                    }
348                    else if (type.equals("User")) {
349                            GUserManager gUserManager = googleApps.getGUserManager();
350    
351                            GUser gUser = gUserManager.getGUser(gGroupMember.getEmailAddress());
352    
353                            gGroupMember.setGUser(gUser);
354                    }
355    
356                    return gGroupMember;
357            }
358    
359            protected void getGGroupMembers(
360                            final List<GGroupMember> gGroupMembers, String url)
361                    throws GoogleAppsException {
362    
363                    Document document = getDocument(url);
364    
365                    Element atomFeedElement = document.getRootElement();
366    
367                    List<Element> atomEntryElements = atomFeedElement.elements(
368                            getAtomQName("entry"));
369    
370                    for (Element atomEntryElement : atomEntryElements) {
371                            GGroupMember gGroupMember = getGGroupMember(atomEntryElement);
372    
373                            gGroupMembers.add(gGroupMember);
374                    }
375    
376                    new GetNextItems(url, atomFeedElement) {
377    
378                            public void getNextItems(String nextURL)
379                                    throws GoogleAppsException {
380    
381                                    getGGroupMembers(gGroupMembers, nextURL);
382                            }
383    
384                    };
385            }
386    
387            protected GGroupOwner getGGroupOwner(Element atomEntryElement)
388                    throws GoogleAppsException {
389    
390                    GGroupOwner gGroupOwner = new GGroupOwner();
391    
392                    List<Element> appsPropertyElements = atomEntryElement.elements(
393                            getAppsQName("property"));
394    
395                    for (Element appsPropertyElement : appsPropertyElements) {
396                            String name = appsPropertyElement.attributeValue("name");
397                            String value = appsPropertyElement.attributeValue("value");
398    
399                            if (name.equals("email")) {
400                                    gGroupOwner.setEmailAddress(value);
401                            }
402                            else if (name.equals("type")) {
403                                    gGroupOwner.setType(value);
404                            }
405                    }
406    
407                    String type = gGroupOwner.getType();
408    
409                    if (type.equals("Group")) {
410                            GGroup gGroup = getGGroup(gGroupOwner.getEmailAddress());
411    
412                            gGroupOwner.setGGroup(gGroup);
413                    }
414                    else if (type.equals("User")) {
415                            GUserManager gUserManager = googleApps.getGUserManager();
416    
417                            GUser gUser = gUserManager.getGUser(gGroupOwner.getEmailAddress());
418    
419                            gGroupOwner.setGUser(gUser);
420                    }
421    
422                    return gGroupOwner;
423            }
424    
425            protected void getGGroupOwners(
426                            final List<GGroupOwner> gGroupOwners, String url)
427                    throws GoogleAppsException {
428    
429                    Document document = getDocument(url);
430    
431                    Element atomFeedElement = document.getRootElement();
432    
433                    List<Element> atomEntryElements = atomFeedElement.elements(
434                            getAtomQName("entry"));
435    
436                    for (Element atomEntryElement : atomEntryElements) {
437                            GGroupOwner gGroupOwner = getGGroupOwner(atomEntryElement);
438    
439                            gGroupOwners.add(gGroupOwner);
440                    }
441    
442                    new GetNextItems(url, atomFeedElement) {
443    
444                            public void getNextItems(String nextURL)
445                                    throws GoogleAppsException {
446    
447                                    getGGroupOwners(gGroupOwners, nextURL);
448                            }
449    
450                    };
451            }
452    
453            protected void getGGroups(final List<GGroup> gGroups, String url)
454                    throws GoogleAppsException {
455    
456                    Document document = getDocument(url);
457    
458                    Element atomFeedElement = document.getRootElement();
459    
460                    List<Element> atomEntryElements = atomFeedElement.elements(
461                            getAtomQName("entry"));
462    
463                    for (Element atomEntryElement : atomEntryElements) {
464                            GGroup gGroup = getGGroup(atomEntryElement);
465    
466                            gGroups.add(gGroup);
467                    }
468    
469                    new GetNextItems(url, atomFeedElement) {
470    
471                            public void getNextItems(String nextURL)
472                                    throws GoogleAppsException {
473    
474                                    getGGroups(gGroups, nextURL);
475                            }
476    
477                    };
478            }
479    
480            protected String getGroupURL(String emailAddress) {
481                    return groupURL.concat(StringPool.SLASH).concat(emailAddress);
482            }
483    
484            protected String groupURL;
485    
486            private static Log _log = LogFactoryUtil.getLog(GGroupManagerImpl.class);
487    
488    }