/* Copyright (c) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.appsforyourdomain.gmailsettings.gui;
import com.google.gdata.client.appsforyourdomain.AppsForYourDomainQuery;
import com.google.gdata.client.appsforyourdomain.UserService;
import com.google.gdata.data.Link;
import com.google.gdata.data.appsforyourdomain.provisioning.UserEntry;
import com.google.gdata.data.appsforyourdomain.provisioning.UserFeed;
import com.google.gdata.util.ServiceException;
import java.awt.GridLayout;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/**
* Panel that uses the provisioning API to display all the users from a domain.
*/
public class UsersPanel extends JPanel {
protected JList users;
protected DefaultListModel usersListModel;
protected JScrollPane usersPane;
/**
* Sets up the panel.
*/
public UsersPanel() {
usersListModel = new DefaultListModel();
users = new JList();
users.setModel(usersListModel);
usersPane = new JScrollPane(users);
setLayout(new GridLayout(1, 1));
add(usersPane);
}
/**
* @return Returns a list of all the users that were selected in the panel.
*/
public List<String> getSelectedUsers() {
Object[] tmp = users.getSelectedValues();
List<String> susers = new ArrayList<String>();
for (int i = 0; i < tmp.length; i++) {
susers.add(tmp[i].toString());
}
return susers;
}
/**
* Refreshes the panel to display the users.
*
* @param domain The domain in which settings will be modified.
* @param username The user name (not email) of a domain administrator.
* @param password The user's password on the domain.
*/
public void refresh(String domain, String username, String password) {
try {
UserFeed usersFeed = getUsers(domain, username, password);
usersListModel.clear();
Iterator<UserEntry> userIterator = usersFeed.getEntries().iterator();
while (userIterator.hasNext()) {
usersListModel.addElement(userIterator.next().getLogin().getUserName());
}
} catch (MalformedURLException e) {
JOptionPane.showMessageDialog(null, e, GmailSettingsClient.APP_TITLE,
JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e, GmailSettingsClient.APP_TITLE,
JOptionPane.ERROR_MESSAGE);
} catch (ServiceException e) {
JOptionPane.showMessageDialog(null, e, GmailSettingsClient.APP_TITLE,
JOptionPane.ERROR_MESSAGE);
}
}
/**
* Retrieves the first 100 users from the domain.
*
* @param domain The domain in which settings will be modified.
* @param username The user name (not email) of a domain administrator.
* @param password The user's password on the domain.
* @return UserFeed containing all the user accounts in the domain.
* @throws MalformedURLException if the batch feed URL cannot be constructed.
* @throws IOException if an error occurs while communicating with the GData
* service.
* @throws ServiceException if the insert request failed due to system error.
*/
protected UserFeed getUsers(String domain, String username, String password)
throws MalformedURLException, IOException, ServiceException {
String domainUrlBase = null;
UserFeed allUsers = null;
UserService userService = new UserService(GmailSettingsClient.APP_TITLE);
userService.setUserCredentials(username + "@" + domain, password);
domainUrlBase = "https://www.google.com/a/feeds/" + domain + "/";
URL retrieveUrl = new URL(domainUrlBase + "user/2.0/");
AppsForYourDomainQuery query = new AppsForYourDomainQuery(retrieveUrl);
query.setStartUsername(null);
allUsers = new UserFeed();
UserFeed currentPage;
Link nextLink;
do {
currentPage = userService.query(query, UserFeed.class);
allUsers.getEntries().addAll(currentPage.getEntries());
nextLink = currentPage.getLink(Link.Rel.NEXT, Link.Type.ATOM);
if (nextLink != null) {
retrieveUrl = new URL(nextLink.getHref());
}
} while (nextLink != null);
return allUsers;
}
}