/* 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.contacts; import com.google.gdata.client.authn.oauth.GoogleOAuthParameters; import com.google.gdata.client.authn.oauth.OAuthException; import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer; import com.google.gdata.client.contacts.ContactsService; import com.google.gdata.data.batch.BatchOperationType; import com.google.gdata.data.batch.BatchStatus; import com.google.gdata.data.batch.BatchUtils; import com.google.gdata.data.contacts.ContactEntry; import com.google.gdata.data.contacts.ContactFeed; import com.google.gdata.data.contacts.Status; import com.google.gdata.util.ServiceException; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * UnshareProfiles sample main class. * * */ public class UnshareProfiles { /** * Class holding batch processing results. * * */ public static class BatchResult { private int success; private int error; private List<ContactEntry> errorEntries = new ArrayList<ContactEntry>(); /** * @return the success */ public int getSuccess() { return this.success; } /** * @param success the success to set */ public void setSuccess(int success) { this.success = success; } /** * @return the error */ public int getError() { return this.error; } /** * @param error the error to set */ public void setError(int error) { this.error = error; } /** * @return the errorEntries */ public List<ContactEntry> getErrorEntries() { return this.errorEntries; } public List<ContactEntry> addErrorEntry(ContactEntry erroEntry) { this.errorEntries.add(erroEntry); return this.errorEntries; } } /** * Sample main class. Retrieve all profiles for the domain and unshare their * contacts information. * * */ public static class ProfilesManager { private String domain; private String adminEmail; private int batchSize = 100; private List<ContactEntry> profiles; private ContactsService myService; /** * Constructor initializing the ContactsService object using 2-Legged OAuth authentication * @param consumerKey domain consumer key * @param consumerSecret domain consumer secret * @param adminEmail domain administrator to authenticate as */ public ProfilesManager(String consumerKey, String consumerSecret, String adminEmail) throws OAuthException { this.adminEmail = adminEmail; this.domain = adminEmail.substring(adminEmail.indexOf('@') + 1); GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(consumerKey); oauthParameters.setOAuthConsumerSecret(consumerSecret); this.myService = new ContactsService("GoogleInc-UnshareProfiles-1"); this.myService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); } /** * @return batch processing size */ public int getBatchSize() { return this.batchSize; } /** * @param value the batch processing size to set */ public void setBatchSize(int value) { this.batchSize = value; } /** * @return domain's profiles list */ public List<ContactEntry> getProfiles() { return this.profiles; } /** * Retrieve all porfiles for the domain */ public void getAllProfiles() throws IOException, ServiceException { ArrayList<ContactEntry> profiles = new ArrayList<ContactEntry>(); URL feedUrl = new URL("https://www.google.com/m8/feeds/profiles/domain/" + this.domain + "/full?xoauth_requestor_id=" + this.adminEmail); while (feedUrl != null) { ContactFeed resultFeed = this.myService.getFeed(feedUrl, ContactFeed.class); profiles.addAll(resultFeed.getEntries()); if (resultFeed.getNextLink() != null && resultFeed.getNextLink().getHref() != null && resultFeed.getNextLink().getHref().length() > 0) { feedUrl = new URL(resultFeed.getNextLink().getHref()); } else { feedUrl = null; } } this.profiles = profiles; } /** * Unshare all profiles information from the GAD/Google Apps Directory * @return batch processing result * @throws IOException * @throws ServiceException */ public BatchResult unshareProfiles() throws IOException, ServiceException { if (this.profiles == null) { this.getAllProfiles(); } BatchResult result = new BatchResult(); Status status = new Status(); int index = 0; status.setIndexed(false); while (index < this.profiles.size()) { ContactFeed requestFeed = new ContactFeed(); for (int i = 0; i < this.batchSize && index < this.profiles.size(); ++i, ++index) { ContactEntry entry = this.profiles.get(index); entry.setStatus(status); BatchUtils.setBatchOperationType(entry, BatchOperationType.UPDATE); requestFeed.getEntries().add(entry); } ContactFeed responseFeed = myService.batch(new URL("https://www.google.com/m8/feeds/profiles/domain/" + this.domain + "/full/batch?xoauth_requestor_id=" + this.adminEmail), requestFeed); // Check the status of each operation. for (ContactEntry entry : responseFeed.getEntries()) { BatchStatus batchStatus = BatchUtils.getBatchStatus(entry); if (batchStatus.getCode() == 200) { result.setSuccess(result.getSuccess() + 1); } else { result.setError(result.getError() + 1); result.addErrorEntry(entry); } } } return result; } } /** * Run the sample app with the provided arguments. * @param args * @throws OAuthException * @throws IOException * @throws ServiceException */ public static void main(String[] args) throws OAuthException, IOException, ServiceException { if (args.length != 3) { System.out.println("Usage: unshare_profile <consumerKey> <consumerSecret> <adminEmail>"); } else { String consumerKey = args[0]; String consumerSecret = args[1]; String adminEmail = args[2]; ProfilesManager manager = new ProfilesManager(consumerKey, consumerSecret, adminEmail); BatchResult result = manager.unshareProfiles(); System.out.println("Success: " + result.getSuccess() + " - Error: " + result.getError()); for (ContactEntry entry : result.getErrorEntries()) { BatchStatus status = BatchUtils.getBatchStatus(entry); System.out.println(" > Failed to update " + entry.getId() + ": (" + status.getCode() + ") " + status.getReason()); } } } }