/* 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; import com.google.gdata.client.appsforyourdomain.AppsForYourDomainService; import com.google.gdata.data.appsforyourdomain.generic.GenericEntry; import com.google.gdata.data.appsforyourdomain.generic.GenericFeed; import com.google.gdata.util.AuthenticationException; import com.google.gdata.util.ServiceException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; /** * This is the client library for the Google Apps Gmail Settings API. It * shows how to use the services for creating Gmail filters, send-as aliases, or * labels or changing Gmail forwarding, POP3, IMAP, vacation-responder, * signature, web clip or general settings. */ public class GmailSettingsService extends AppsForYourDomainService { protected static final Logger logger = Logger.getLogger(GmailSettingsService.class.getName()); protected final String domain; /** * Constructs a GmailSettingsService for the given domain using the given * admin credentials. * * @param applicationName the name of the application making the modifications. * @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. * @throws AuthenticationException the Exception thrown when invalid * credentials are supplied. */ public GmailSettingsService(String applicationName, String domain, String username, String password) throws AuthenticationException { super(applicationName, Constants.PROTOCOL, Constants.APPS_APIS_DOMAIN); this.domain = domain; new GenericFeed().declareExtensions(getExtensionProfile()); this.setUserCredentials(username + "@" + domain, password); } /** * Retrieve the specified Gmail settings as a GenericFeed * * @param username the user name for which to get the settings. * @param setting the setting field to get. * @return a GenericEntry of requested settings * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public GenericFeed retrieveSettingsFeed(String username, String setting) throws IOException, ServiceException { URL singleUrl = new URL( Constants.PROTOCOL + "://" + Constants.APPS_APIS_DOMAIN + Constants.APPS_APIS_URL + "/" + domain + "/" + username + "/" + setting); return getFeed(singleUrl, GenericFeed.class); } /** * Retrieve the specified Gmail settings as a GenericEntry * * @param username the user name for which to get the settings. * @param setting the setting field to get. * @return a GenericEntry of requested settings * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public GenericEntry retrieveSettingsEntry(String username, String setting) throws IOException, ServiceException { URL singleUrl = new URL( Constants.PROTOCOL + "://" + Constants.APPS_APIS_DOMAIN + Constants.APPS_APIS_URL + "/" + domain + "/" + username + "/" + setting); return getEntry(singleUrl, GenericEntry.class); } /** * Inserts a new Gmail settings entity - eg a filter. * * @param username the user name of a domain administrator. * @param entry an {@link GenericEntry} object containing all the properties * of the new entity. * @return an entry with the result of the operation. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public GenericEntry insertSettings(String username, GenericEntry entry, String setting) throws IOException, MalformedURLException, ServiceException { URL singleUrl = new URL(Constants.PROTOCOL + "://" + Constants.APPS_APIS_DOMAIN + Constants.APPS_APIS_URL + "/" + domain + "/" + username + "/" + setting); return insert(singleUrl, entry); } /** * Update Gmail settings. * * @param username the user name of a domain administrator. * @param entry a {@link GenericEntry} object containing the new Gmail * settings. * @return an entry with the result of the operation. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the insert request failed due to system error. */ public GenericEntry updateSettings(String username, GenericEntry entry, String setting) throws IOException, MalformedURLException, ServiceException { URL singleUrl = new URL(Constants.PROTOCOL + "://" + Constants.APPS_APIS_DOMAIN + Constants.APPS_APIS_URL + "/" + domain + "/" + username + "/" + setting); return update(singleUrl, entry); } /** * Creates a filter. * * @param users a list of the users to create the filter for. * @param from the email must come from this address in order to be filtered. * @param to the email must be sent to this address in order to be filtered. * @param subject a string the email must have in it's subject line to be * filtered. * @param hasTheWord a string the email can have anywhere in it's subject or * body. * @param doesNotHaveTheWord a string that the email cannot have anywhere in * its subject or body. * @param hasAttachment a boolean representing whether or not the email * contains an attachment. Values are "true" or "false". * @param shouldMarkAsRead a boolean field that represents automatically * moving the message to. "Archived" state if it matches the specified * filter criteria. * @param shouldArchive a boolean field that represents automatically moving * the message to. "Archived" state if it matches the specified filter * criteria. * @param label a string that represents the name of the label to apply if a * message matches the specified filter criteria. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void createFilter(List users, String from, String to, String subject, String hasTheWord, String doesNotHaveTheWord, boolean hasAttachment, boolean shouldMarkAsRead, boolean shouldArchive, String label) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.FROM, from); entry.addProperty(Constants.TO, to); entry.addProperty(Constants.SUBJECT, subject); entry.addProperty(Constants.HAS_THE_WORD, hasTheWord); entry.addProperty(Constants.DOESNT_HAVE_THE_WORD, doesNotHaveTheWord); entry.addProperty(Constants.HAS_ATTACHMENT, String.valueOf(hasAttachment)); entry.addProperty(Constants.SHOULD_MARK_AS_READ, String.valueOf(shouldMarkAsRead)); entry.addProperty(Constants.SHOULD_ARCHIVE, String.valueOf(shouldArchive)); entry.addProperty(Constants.LABEL, label); for (String user : users) { logger.log(Level.INFO, "Creating filter ( " + "from: " + from + ", to: " + to + ", subject: " + subject + ", hasTheWord: " + hasTheWord + ", doesNotHaveTheWord: " + doesNotHaveTheWord + ", hasAttachment: " + hasAttachment + ", shouldMarkAsRead: " + shouldMarkAsRead + ", shouldArchive: " + shouldArchive + ", label: " + label + " ) for user " + user + " ..."); insertSettings(user, entry, "filter"); logger.log(Level.INFO, "Successfully created filter."); } } /** * Retrieves the send-as alias settings * * @param user * @return a list of send-as aliases * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public List> retrieveSendAs(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting send-as settings for user " + user + " ..."); GenericFeed sendAsFeed = retrieveSettingsFeed(user, Constants.SEND_AS); if (sendAsFeed != null) { List> sendAs = new ArrayList>(); List sendAsEntries = sendAsFeed.getEntries(); for (GenericEntry sendAsEntry : sendAsEntries) { Map sendAsMap = new HashMap(); sendAsMap.put(Constants.ADDRESS, sendAsEntry.getProperty(Constants.ADDRESS)); sendAsMap.put(Constants.NAME, sendAsEntry.getProperty(Constants.NAME)); sendAsMap.put(Constants.REPLY_TO, sendAsEntry.getProperty(Constants.REPLY_TO)); sendAsMap.put(Constants.IS_DEFAULT, sendAsEntry.getProperty(Constants.IS_DEFAULT)); sendAsMap.put(Constants.VERIFIED, sendAsEntry.getProperty(Constants.VERIFIED)); sendAs.add(sendAsMap); } return sendAs; } return null; } /** * Creates a send-as alias. * * @param users a list of the users to create the send-as alias for. * @param name the name which e-mails sent using the alias are from. * @param address the e-mail address which e-mails sent using the alias are * from. * @param replyTo (Optional) if set, this address will be included as the * reply-to address in e-mails sent using the alias. * @param makeDefault (Optional) if set to true, this user will have this * send-as alias selected by default from now on. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void createSendAs(List users, String name, String address, String replyTo, boolean makeDefault) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.NAME, name); entry.addProperty(Constants.ADDRESS, address); entry.addProperty(Constants.REPLY_TO, replyTo); entry.addProperty(Constants.MAKE_DEFAULT, String.valueOf(makeDefault)); for (String user : users) { logger.log(Level.INFO, "Creating send-as alias ( " + "name: " + name + ", address: " + address + ", replyTo: " + replyTo + ", makeDefault: " + makeDefault + " ) for user " + user + " ..."); insertSettings(user, entry, "sendas"); logger.log(Level.INFO, "Successfully created send-as alias."); } } /** * Retrieves all mail labels * * @param user * @return List of mail labels * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public List> retrieveLabels(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting mail labels for user " + user + " ..."); GenericFeed labelsFeed = retrieveSettingsFeed(user, Constants.LABEL); if (labelsFeed != null) { List> labels = new ArrayList>(); List labelEntries = labelsFeed.getEntries(); for (GenericEntry labelEntry : labelEntries) { Map labelMap = new HashMap(); labelMap.put(Constants.LABEL, labelEntry.getProperty(Constants.LABEL)); labelMap.put(Constants.UNREAD_COUNT, labelEntry.getProperty(Constants.UNREAD_COUNT)); labelMap.put(Constants.VISIBILITY, labelEntry.getProperty(Constants.VISIBILITY)); labels.add(labelMap); } return labels; } return null; } /** * Creates a label. * * @param users a list of the users to create the label for. * @param label a string that represents the name of the label. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void createLabel(List users, String label) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.LABEL, label); for (String user : users) { logger.log(Level.INFO, "Creating label ( label: " + label + " ) for user " + user + " ..."); insertSettings(user, entry, Constants.LABEL); logger.log(Level.INFO, "Successfully created label."); } } /** * Retrieves mail forwarding settings * * @param user * @return The value of forwarding settings * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public Map retrieveForwarding(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting forwarding settings for user " + user + " ..."); GenericEntry forwardingEntry = retrieveSettingsEntry(user, Constants.FORWARDING); if (forwardingEntry != null) { Map forwarding = new HashMap(); forwarding.put(Constants.ENABLE, forwardingEntry.getProperty(Constants.ENABLE)); forwarding.put(Constants.FORWARD_TO, forwardingEntry.getProperty(Constants.FORWARD_TO)); forwarding.put(Constants.ACTION, forwardingEntry.getProperty(Constants.ACTION)); return forwarding; } return null; } /** * Changes forwarding settings. * * @param users a list of the users to change the forwarding for. * @param enable whether to enable forwarding of incoming mail. * @param forwardTo the email will be forwarded to this address. * @param action what Gmail should do with its copy of the e-mail after * forwarding it on. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeForwarding(List users, boolean enable, String forwardTo, String action) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); if (enable) { entry.addProperty(Constants.ENABLE, Constants.TRUE); entry.addProperty(Constants.FORWARD_TO, forwardTo); entry.addProperty(Constants.ACTION, action); } else { entry.addProperty(Constants.ENABLE, Constants.FALSE); } for (String user : users) { if (enable) { logger.log(Level.INFO, "Updating forwarding settings ( " + "enable: true" + ", forwardTo: " + forwardTo + ", action: " + action + " ) for user" + user + " ..."); } else { logger.log(Level.INFO, "Updating forwarding settings ( enable: false ) " + "for user" + user + " ..."); } updateSettings(user, entry, Constants.FORWARDING); logger.log(Level.INFO, "Successfully updated forwarding settings."); } } /** * Retrieves POP3 settings * * @param user * @return The POP settings * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public Map retrievePop(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting POP settings for user " + user + " ..."); GenericEntry popEntry = retrieveSettingsEntry(user, Constants.POP); if (popEntry != null) { Map pop = new HashMap(); pop.put(Constants.ENABLE, popEntry.getProperty(Constants.ENABLE)); pop.put(Constants.ACTION, popEntry.getProperty(Constants.ACTION)); return pop; } return null; } /** * Changes POP3 settings. * * @param users a list of the users to change the POP3 settings for. * @param enable whether to enable POP3 access. * @param enableFor whether to enable POP3 for all mail, or mail from now on. * @param action what Gmail should do with its copy of the e-mail after it is * retrieved using POP. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changePop(List users, boolean enable, String enableFor, String action) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); if (enable) { entry.addProperty(Constants.ENABLE, Constants.TRUE); entry.addProperty(Constants.ENABLE_FOR, enableFor); entry.addProperty(Constants.ACTION, action); } else { entry.addProperty(Constants.ENABLE, Constants.FALSE); } for (String user : users) { if (enable) { logger.log(Level.INFO, "Updating POP3 settings ( " + "enable: true" + ", enableFor: " + enableFor + ", action: " + action + " ) for user " + user + " ..."); } else { logger.log(Level.INFO, "Updating POP3 settings ( enable: false ) for " + "user " + user + " ..."); } updateSettings(user, entry, Constants.POP); logger.log(Level.INFO, "Successfully updated POP3 settings."); } } /** * Retrieves IMAP settings * * @param user * @return A boolean indicating whether IMAP settings are enabled * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public boolean retrieveImap(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting IMAP settings for user " + user + " ..."); GenericEntry imapEntry = retrieveSettingsEntry(user, Constants.IMAP); if (imapEntry != null && imapEntry.getProperty(Constants.ENABLE).equals(Constants.TRUE)) return true; return false; } /** * Changes IMAP settings. * * @param users a list of the users to change the IMAP settings for. * @param enable whether to enable IMAP access. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeImap(List users, boolean enable) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.ENABLE, String.valueOf(enable)); for (String user : users) { logger.log(Level.INFO, "Updating IMAP settings ( enable: " + enable + " ) " + "for user " + user + " ..."); updateSettings(user, entry, Constants.IMAP); logger.log(Level.INFO, "Successfully updated IMAP settings."); } } /** * Retrieves vacation settings * * @param user * @return The vacation auto-responder settings * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public Map retrieveVacation(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting vacation settings for user " + user + " ..."); GenericEntry vacationEntry = retrieveSettingsEntry(user, Constants.VACATION); if (vacationEntry != null) { Map vacation = new HashMap(); vacation.put(Constants.ENABLE, vacationEntry.getProperty(Constants.ENABLE)); vacation.put(Constants.SUBJECT, vacationEntry.getProperty(Constants.SUBJECT)); vacation.put(Constants.MESSAGE, vacationEntry.getProperty(Constants.MESSAGE)); vacation.put(Constants.CONTACTS_ONLY, vacationEntry.getProperty(Constants.CONTACTS_ONLY)); return vacation; } return null; } /** * Changes vacation-responder settings. * * @param users a list of the users to change the vacation-responder for. * @param enable whether to enable the vacation responder. * @param subject the subject line of the vacation responder autoresponse. * @param message the message body of the vacation responder autoresponse. * @param contactsOnly whether to only send the autoresponse to known contacts. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeVacation(List users, boolean enable, String subject, String message, boolean contactsOnly) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); if (enable) { entry.addProperty(Constants.ENABLE, Constants.TRUE); entry.addProperty(Constants.SUBJECT, subject); entry.addProperty(Constants.MESSAGE, message); entry.addProperty(Constants.CONTACTS_ONLY, String.valueOf(contactsOnly)); } else { entry.addProperty(Constants.ENABLE, Constants.FALSE); } for (String user : users) { if (enable) { logger.log(Level.INFO, "Updating vacation-responder settings ( " + "enable: " + enable + ", subject: " + subject + ", message: " + message + ", contactsOnly: " + contactsOnly + " ) for user " + user + " ..."); } else { logger.log(Level.INFO, "Updating vacation-responder settings ( " + "enable: false ) for user " + user + " ..."); } updateSettings(user, entry, Constants.VACATION); logger.log(Level.INFO, "Successfully updated vacation-responder settings."); } } /** * Retrieves signature * * @param user * @return The signature * @throws IllegalArgumentException if the user hasn't been passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws ServiceException if the retrieve request failed due to system * error. */ public String retrieveSignature(String user) throws IllegalArgumentException, IOException, ServiceException { if (user == null || user.length() == 0) { throw new IllegalArgumentException(); } logger.log(Level.INFO, "Getting signature settings for user " + user + " ..."); GenericEntry signatureEntry = retrieveSettingsEntry(user, Constants.SIGNATURE); if (signatureEntry != null) return signatureEntry.getProperty(Constants.SIGNATURE); return null; } /** * Changes signature. * * @param users a list of the users to change the signature for. * @param signature the signature to be appended to outgoing messages. Don't * want a signature? Set the signature to "" (empty string). * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeSignature(List users, String signature) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.SIGNATURE, signature); for (String user : users) { logger.log(Level.INFO, "Updating signature ( signature: " + signature + " ) for user " + user + " ..."); updateSettings(user, entry, Constants.SIGNATURE); logger.log(Level.INFO, "Successfully updated signature."); } } /** * Changes general settings. * * @param users a list of the users to change the general settings for. * @param pageSize the number of conversations to be shown per page. * @param enableShortcuts whether to enable keyboard shortcuts * @param enableArrows whether to display arrow-shaped personal indicators * next to emails that were sent specifically to the user. (> and >>). * @param enableSnippets whether to display snippets of messages in the inbox * and when searching. * @param enableUnicode whether to use UTF-8 (unicode) encoding for all * outgoing messages, instead of the default text encoding. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeGeneral(List users, String pageSize, boolean enableShortcuts, boolean enableArrows, boolean enableSnippets, boolean enableUnicode) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.PAGE_SIZE, pageSize); entry.addProperty(Constants.SHORTCUTS, String.valueOf(enableShortcuts)); entry.addProperty(Constants.ARROWS, String.valueOf(enableArrows)); entry.addProperty(Constants.SNIPPETS, String.valueOf(enableSnippets)); entry.addProperty(Constants.UNICODE, String.valueOf(enableUnicode)); for (String user : users) { logger.log(Level.INFO, "Updating general settings ( " + "pageSize: " + pageSize + ", shortcuts: " + enableShortcuts + ", arrows: " + enableArrows + ", snippets: " + enableSnippets + ", unicode: " + enableUnicode + " ) for user " + user + " ..."); updateSettings(user, entry, "general"); logger.log(Level.INFO, "Successfully updated general settings."); } } /** * Changes language settings. * * @param users a list of the users to change the language for. * @param language Gmail's display language. * @throws IllegalArgumentException if no users are passed in. * @throws IOException if an error occurs while communicating with the GData * service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws ServiceException if the insert request failed due to system error. */ public void changeLanguage(List users, String language) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.LANGUAGE, language); for (String user : users) { logger.log(Level.INFO, "Updating language settings ( language: " + language + " ) for user " + user + " ..."); updateSettings(user, entry, Constants.LANGUAGE); logger.log(Level.INFO, "Successfully updated language settings."); } } /** * Change web clip settings. * * @param users a list of the users to change the web clip settings for. * @param enable whether to enable web clip. * @throws IllegalArgumentException if no users are passed in. * @throws ServiceException if an error occurs while communicating with the * GData service. * @throws MalformedURLException if the batch feed URL cannot be constructed. * @throws IOException if the insert request failed due to system error. */ public void changeWebClip(List users, boolean enable) throws IllegalArgumentException, ServiceException, MalformedURLException, IOException { if (users.size() == 0) { throw new IllegalArgumentException(); } GenericEntry entry = new GenericEntry(); entry.addProperty(Constants.ENABLE, String.valueOf(enable)); for (String user : users) { logger.log(Level.INFO, "Updating web clip settings ( enable: " + enable + " ) for user " + user + " ..."); updateSettings(user, entry, "webclip"); logger.log(Level.INFO, "Successfully updated web clip settings."); } } }