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