001    /**
002     * Copyright (c) 2000-2012 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            public void addGUser(
059                            long userId, String password, String firstName, String lastName)
060                    throws GoogleAppsException {
061    
062                    Document document = SAXReaderUtil.createDocument();
063    
064                    Element atomEntryElement = addAtomEntry(document);
065    
066                    addAtomCategory(atomEntryElement, "user");
067    
068                    Element appsLoginElement = atomEntryElement.addElement("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(CharPool.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                            @Override
250                            public void getNextItems(String nextURL)
251                                    throws GoogleAppsException {
252    
253                                    getGUsers(gUsers, nextURL);
254                            }
255    
256                    };
257            }
258    
259            protected String getUserURL(long userId) {
260                    return userURL.concat(StringPool.SLASH).concat(String.valueOf(userId));
261            }
262    
263            protected String userURL;
264    
265            private static Log _log = LogFactoryUtil.getLog(GUserManagerImpl.class);
266    
267    }