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.GNickname;
018    import com.liferay.portal.kernel.googleapps.GNicknameManager;
019    import com.liferay.portal.kernel.googleapps.GUser;
020    import com.liferay.portal.kernel.googleapps.GUserManager;
021    import com.liferay.portal.kernel.googleapps.GoogleAppsException;
022    import com.liferay.portal.kernel.log.Log;
023    import com.liferay.portal.kernel.log.LogFactoryUtil;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.util.StringBundler;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.Validator;
028    import com.liferay.portal.kernel.xml.Document;
029    import com.liferay.portal.kernel.xml.Element;
030    import com.liferay.portal.kernel.xml.SAXReaderUtil;
031    import com.liferay.portal.model.User;
032    import com.liferay.portal.service.UserLocalServiceUtil;
033    
034    import java.util.ArrayList;
035    import java.util.List;
036    
037    /**
038     * @author Brian Wing Shun Chan
039     */
040    public class GUserManagerImpl extends GBaseManagerImpl implements GUserManager {
041    
042            public GUserManagerImpl(GoogleApps googleApps) {
043                    super(googleApps);
044    
045                    GAuthenticator gAuthenticator = googleApps.getGAuthenticator();
046    
047                    StringBundler sb = new StringBundler(4);
048    
049                    sb.append(APPS_URL);
050                    sb.append(StringPool.SLASH);
051                    sb.append(gAuthenticator.getDomain());
052                    sb.append("/user/2.0");
053    
054                    userURL = sb.toString();
055            }
056    
057            public void addGUser(
058                            long userId, String password, String firstName, String lastName)
059                    throws GoogleAppsException {
060    
061                    Document document = SAXReaderUtil.createDocument();
062    
063                    Element atomEntryElement = addAtomEntry(document);
064    
065                    addAtomCategory(atomEntryElement, "user");
066    
067                    Element appsLoginElement = atomEntryElement.addElement(
068                            "apps:login");
069    
070                    appsLoginElement.addAttribute("password", password);
071                    appsLoginElement.addAttribute("userName", String.valueOf(userId));
072    
073                    Element appsNameElement = atomEntryElement.addElement("apps:name");
074    
075                    appsNameElement.addAttribute("familyName", lastName);
076                    appsNameElement.addAttribute("givenName", firstName);
077    
078                    submitAdd(userURL, document);
079            }
080    
081            public void deleteGUser(long userId) throws GoogleAppsException {
082                    submitDelete(getUserURL(userId));
083            }
084    
085            public GUser getGUser(long userId) throws GoogleAppsException {
086                    Document document = getDocument(getUserURL(userId));
087    
088                    if (hasError(document)) {
089                            if (_log.isInfoEnabled()) {
090                                    _log.info(getErrorMessage(document));
091                            }
092    
093                            return null;
094                    }
095    
096                    Element atomEntryElement = document.getRootElement();
097    
098                    return getGUser(atomEntryElement);
099            }
100    
101            public GUser getGUser(String emailAddress) throws GoogleAppsException {
102                    int pos = emailAddress.indexOf(StringPool.AT);
103    
104                    if (pos == -1) {
105                            return null;
106                    }
107    
108                    String nickname = emailAddress.substring(0, pos);
109    
110                    if (Validator.isNumber(nickname)) {
111                            long userId = GetterUtil.getLong(nickname);
112    
113                            return getGUser(userId);
114                    }
115                    else {
116                            try {
117                                    User user = UserLocalServiceUtil.getUserByEmailAddress(
118                                            getCompanyId(), emailAddress);
119    
120                                    return getGUser(user.getUserId());
121                            }
122                            catch (Exception e) {
123                            }
124    
125                            GNicknameManager gNicknameManager =
126                                    googleApps.getGNicknameManager();
127    
128                            GNickname gNickname = gNicknameManager.getGNickname(nickname);
129    
130                            if (gNickname != null) {
131                                    return getGUser(gNickname.getUserId());
132                            }
133    
134                            return null;
135                    }
136            }
137    
138            public List<GUser> getGUsers() throws GoogleAppsException {
139                    List<GUser> gUsers = new ArrayList<GUser>();
140    
141                    getGUsers(gUsers, userURL);
142    
143                    return gUsers;
144            }
145    
146            public void updateActive(long userId, boolean active)
147                    throws GoogleAppsException {
148    
149                    Document document = getDocument(getUserURL(userId));
150    
151                    if (hasError(document)) {
152                            if (_log.isInfoEnabled()) {
153                                    _log.info(getErrorMessage(document));
154                            }
155    
156                            return;
157                    }
158    
159                    Element atomEntryElement = document.getRootElement();
160    
161                    Element appsLoginElement = atomEntryElement.element(
162                            getAppsQName("login"));
163    
164                    appsLoginElement.addAttribute("suspended", String.valueOf(!active));
165    
166                    submitUpdate(getUserURL(userId), document);
167            }
168    
169            public void updatePassword(long userId, String password)
170                    throws GoogleAppsException {
171    
172                    Document document = getDocument(getUserURL(userId));
173    
174                    if (hasError(document)) {
175                            if (_log.isInfoEnabled()) {
176                                    _log.info(getErrorMessage(document));
177                            }
178    
179                            return;
180                    }
181    
182                    Element atomEntryElement = document.getRootElement();
183    
184                    Element appsLoginElement = atomEntryElement.element(
185                            getAppsQName("login"));
186    
187                    appsLoginElement.addAttribute("password", password);
188    
189                    submitUpdate(getUserURL(userId), document);
190            }
191    
192            protected GUser getGUser(Element atomEntryElement) {
193                    GUser gUser = new GUser();
194    
195                    Element appsLoginElement = atomEntryElement.element(
196                            getAppsQName("login"));
197                    Element appsNameElement = atomEntryElement.element(
198                            getAppsQName("name"));
199    
200                    boolean active = !GetterUtil.getBoolean(
201                            appsLoginElement.attributeValue("suspended"));
202    
203                    gUser.setActive(active);
204    
205                    boolean administrator = GetterUtil.getBoolean(
206                            appsLoginElement.attributeValue("admin"));
207    
208                    gUser.setAdministrator(administrator);
209    
210                    boolean agreedToTermsOfUse = GetterUtil.getBoolean(
211                            appsLoginElement.attributeValue("agreedToTerms"));
212    
213                    gUser.setAgreedToTermsOfUse(agreedToTermsOfUse);
214    
215                    String firstName = appsNameElement.attributeValue("givenName");
216    
217                    gUser.setFirstName(firstName);
218    
219                    String lastName = appsNameElement.attributeValue("familyName");
220    
221                    gUser.setLastName(lastName);
222    
223                    long userId = GetterUtil.getLong(
224                            appsLoginElement.attributeValue("userName"));
225    
226                    gUser.setUserId(userId);
227    
228                    return gUser;
229            }
230    
231            protected void getGUsers(final List<GUser> gUsers, String url)
232                    throws GoogleAppsException {
233    
234                    Document document = getDocument(url);
235    
236                    Element atomFeedElement = document.getRootElement();
237    
238                    List<Element> atomEntryElements = atomFeedElement.elements(
239                            getAtomQName("entry"));
240    
241                    for (Element atomEntryElement : atomEntryElements) {
242                            GUser gUser = getGUser(atomEntryElement);
243    
244                            gUsers.add(gUser);
245                    }
246    
247                    new GetNextItems(url, atomFeedElement) {
248    
249                            public void getNextItems(String nextURL)
250                                    throws GoogleAppsException {
251    
252                                    getGUsers(gUsers, nextURL);
253                            }
254    
255                    };
256            }
257    
258            protected String getUserURL(long userId) {
259                    return userURL.concat(StringPool.SLASH).concat(String.valueOf(userId));
260            }
261    
262            protected String userURL;
263    
264            private static Log _log = LogFactoryUtil.getLog(GUserManagerImpl.class);
265    
266    }