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                    else {
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 =
130                                    googleApps.getGNicknameManager();
131    
132                            GNickname gNickname = gNicknameManager.getGNickname(nickname);
133    
134                            if (gNickname != null) {
135                                    return getGUser(gNickname.getUserId());
136                            }
137    
138                            return null;
139                    }
140            }
141    
142            @Override
143            public List<GUser> getGUsers() throws GoogleAppsException {
144                    List<GUser> gUsers = new ArrayList<GUser>();
145    
146                    getGUsers(gUsers, userURL);
147    
148                    return gUsers;
149            }
150    
151            @Override
152            public void updateActive(long userId, boolean active)
153                    throws GoogleAppsException {
154    
155                    Document document = getDocument(getUserURL(userId));
156    
157                    if (hasError(document)) {
158                            if (_log.isInfoEnabled()) {
159                                    _log.info(getErrorMessage(document));
160                            }
161    
162                            return;
163                    }
164    
165                    Element atomEntryElement = document.getRootElement();
166    
167                    Element appsLoginElement = atomEntryElement.element(
168                            getAppsQName("login"));
169    
170                    appsLoginElement.addAttribute("suspended", String.valueOf(!active));
171    
172                    submitUpdate(getUserURL(userId), document);
173            }
174    
175            @Override
176            public void updatePassword(long userId, String password)
177                    throws GoogleAppsException {
178    
179                    Document document = getDocument(getUserURL(userId));
180    
181                    if (hasError(document)) {
182                            if (_log.isInfoEnabled()) {
183                                    _log.info(getErrorMessage(document));
184                            }
185    
186                            return;
187                    }
188    
189                    Element atomEntryElement = document.getRootElement();
190    
191                    Element appsLoginElement = atomEntryElement.element(
192                            getAppsQName("login"));
193    
194                    appsLoginElement.addAttribute("password", password);
195    
196                    submitUpdate(getUserURL(userId), document);
197            }
198    
199            protected GUser getGUser(Element atomEntryElement) {
200                    GUser gUser = new GUser();
201    
202                    Element appsLoginElement = atomEntryElement.element(
203                            getAppsQName("login"));
204                    Element appsNameElement = atomEntryElement.element(
205                            getAppsQName("name"));
206    
207                    boolean active = !GetterUtil.getBoolean(
208                            appsLoginElement.attributeValue("suspended"));
209    
210                    gUser.setActive(active);
211    
212                    boolean administrator = GetterUtil.getBoolean(
213                            appsLoginElement.attributeValue("admin"));
214    
215                    gUser.setAdministrator(administrator);
216    
217                    boolean agreedToTermsOfUse = GetterUtil.getBoolean(
218                            appsLoginElement.attributeValue("agreedToTerms"));
219    
220                    gUser.setAgreedToTermsOfUse(agreedToTermsOfUse);
221    
222                    String firstName = appsNameElement.attributeValue("givenName");
223    
224                    gUser.setFirstName(firstName);
225    
226                    String lastName = appsNameElement.attributeValue("familyName");
227    
228                    gUser.setLastName(lastName);
229    
230                    long userId = GetterUtil.getLong(
231                            appsLoginElement.attributeValue("userName"));
232    
233                    gUser.setUserId(userId);
234    
235                    return gUser;
236            }
237    
238            protected void getGUsers(final List<GUser> gUsers, String url)
239                    throws GoogleAppsException {
240    
241                    Document document = getDocument(url);
242    
243                    Element atomFeedElement = document.getRootElement();
244    
245                    List<Element> atomEntryElements = atomFeedElement.elements(
246                            getAtomQName("entry"));
247    
248                    for (Element atomEntryElement : atomEntryElements) {
249                            GUser gUser = getGUser(atomEntryElement);
250    
251                            gUsers.add(gUser);
252                    }
253    
254                    new GetNextItems(url, atomFeedElement) {
255    
256                            @Override
257                            public void getNextItems(String nextURL)
258                                    throws GoogleAppsException {
259    
260                                    getGUsers(gUsers, nextURL);
261                            }
262    
263                    };
264            }
265    
266            protected String getUserURL(long userId) {
267                    return userURL.concat(StringPool.SLASH).concat(String.valueOf(userId));
268            }
269    
270            protected String userURL;
271    
272            private static Log _log = LogFactoryUtil.getLog(GUserManagerImpl.class);
273    
274    }