/** * */ package com.googlecode.flickr2twitter.impl.twitter; import java.util.List; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import twitter4j.GeoLocation; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.conf.PropertyConfiguration; import twitter4j.http.AccessToken; import twitter4j.http.Authorization; import twitter4j.http.OAuthAuthorization; import com.googlecode.flickr2twitter.core.GlobalDefaultConfiguration; import com.googlecode.flickr2twitter.datastore.MyPersistenceManagerFactory; import com.googlecode.flickr2twitter.datastore.model.GlobalTargetApplicationService; import com.googlecode.flickr2twitter.datastore.model.UserTargetServiceConfig; import com.googlecode.flickr2twitter.intf.ITargetServiceProvider; import com.googlecode.flickr2twitter.model.IDescriptiveItem; import com.googlecode.flickr2twitter.model.IGeoItem; import com.googlecode.flickr2twitter.model.IItem; import com.googlecode.flickr2twitter.model.IItemList; import com.googlecode.flickr2twitter.model.ILinkableItem; import com.googlecode.flickr2twitter.model.IMedia; import com.googlecode.flickr2twitter.model.IPhoto; import com.googlecode.flickr2twitter.model.IShortUrl; import com.googlecode.flickr2twitter.urlshorteners.BitLyUtils; /** * @author Toby Yu(yuyang226@gmail.com) * */ public class TargetServiceProviderTwitter extends AbstractServiceProviderTwitter <GlobalTargetApplicationService, UserTargetServiceConfig> implements ITargetServiceProvider { private static final Logger log = LoggerFactory.getLogger(TargetServiceProviderTwitter.class); /** * */ public TargetServiceProviderTwitter() { super(); } /* * (non-Javadoc) * * @see * com.googlecode.flickr2twitter.intf.ITargetServiceProvider#postUpdate * (com.googlecode.flickr2twitter.model.IItem) */ @Override public void postUpdate(GlobalTargetApplicationService globalAppConfig, UserTargetServiceConfig targetConfig, List<IItemList<IItem>> items) throws Exception { // The factory instance is re-useable and thread safe. AccessToken accessToken = new AccessToken( targetConfig.getServiceAccessToken(), targetConfig.getServiceTokenSecret()); PropertyConfiguration conf = new PropertyConfiguration(new Properties()); Authorization auth = new OAuthAuthorization(conf, globalAppConfig.getTargetAppConsumerId(), globalAppConfig.getTargetAppConsumerSecret(), accessToken); Twitter twitter = new TwitterFactory().getInstance(auth); for (IItemList<IItem> itemList : items) { log.info("Processing items from: {}", itemList.getListTitle()); for (IItem item : itemList.getItems()) { log.info("Posting message '{}' for {}", item, targetConfig.getServiceUserName()); GeoLocation geoLoc = null; if (item instanceof IGeoItem) { if (((IGeoItem) item).getGeoData() != null) { IGeoItem geoItem = (IGeoItem) item; geoLoc = new GeoLocation( geoItem.getGeoData().getLatitude(), geoItem .getGeoData().getLongitude()); } } String message = null; if (item instanceof IPhoto) { IPhoto photo = (IPhoto) item; message = "My new photo: " + photo.getTitle(); String url = photo.getUrl(); if (photo instanceof IShortUrl) { url = ((IShortUrl) photo).getShortUrl(); } else if (photo.getUrl().length() > 15){ url = BitLyUtils.shortenUrl(photo.getUrl()); } message += " " + url; } else if (item instanceof IMedia) { IMedia media = (IMedia) item; message = "My new post: " + media.getTitle(); String url = media.getUrl(); if (media instanceof IShortUrl) { url = ((IShortUrl) media).getShortUrl(); } else if (media.getUrl().length() > 15){ url = BitLyUtils.shortenUrl(media.getUrl()); } message += " " + url; } else if (item instanceof IDescriptiveItem) { IDescriptiveItem ditem = (IDescriptiveItem)item; message = ditem.getTitle(); String url = ditem.getUrl(); if (ditem instanceof IShortUrl) { url = ((IShortUrl) ditem).getShortUrl(); } else if (ditem.getUrl().length() > 15){ url = BitLyUtils.shortenUrl(ditem.getUrl()); } message += " " + url; } else if (item instanceof ILinkableItem) { ILinkableItem litem = (ILinkableItem) item; message = "My new item: " + item.getTitle(); String url = litem.getUrl(); if (litem instanceof IShortUrl) { url = ((IShortUrl) litem).getShortUrl(); } else if (litem.getUrl().length() > 15){ url = BitLyUtils.shortenUrl(litem.getUrl()); } message += " " + url; } else { message = item.getTitle(); } if (message != null) { try { Status status = geoLoc == null ? twitter.updateStatus(message) : twitter.updateStatus(message, geoLoc); log.info("Successfully updated the status [{}] to user @{}", status.getText(), targetConfig.getServiceUserName()); } catch (TwitterException e) { log.warn("Failed posting message ->" + message, e); } } } } } /* * (non-Javadoc) * * @see com.googlecode.flickr2twitter.intf.IServiceProvider# * createDefaultGlobalApplicationConfig() */ @Override public GlobalTargetApplicationService createDefaultGlobalApplicationConfig() { GlobalTargetApplicationService result = new GlobalTargetApplicationService(); result.setAppName(DISPLAY_NAME); result.setProviderId(ID); result.setDescription("The world's leading online micro-blog service"); result.setTargetAppConsumerId(GlobalDefaultConfiguration.getInstance() .getTwitterConsumerId()); result.setTargetAppConsumerSecret(GlobalDefaultConfiguration .getInstance().getTwitterConsumerSecret()); result.setAuthPagePath(CALLBACK_URL + "?" + KEY_SOURCE + "=" + Boolean.FALSE); result.setImagePath("/services/twitter/images/twitter_100.gif"); return result; } /* (non-Javadoc) * @see com.googlecode.flickr2twitter.impl.twitter.AbstractServiceProviderTwitter#createNewUserServiceConfig() */ @Override protected UserTargetServiceConfig createNewUserServiceConfig() { return new UserTargetServiceConfig(); } /* (non-Javadoc) * @see com.googlecode.flickr2twitter.impl.twitter.AbstractServiceProviderTwitter#getGlobalApplicationConfig() */ @Override protected GlobalTargetApplicationService getGlobalApplicationConfig() { return MyPersistenceManagerFactory.getGlobalTargetAppService(ID); } /* (non-Javadoc) * @see com.googlecode.flickr2twitter.impl.twitter.AbstractServiceProviderTwitter#getUserServiceConfigs(java.lang.String) */ @Override protected List<UserTargetServiceConfig> getUserServiceConfigs( String userEmail) { return MyPersistenceManagerFactory.getUserTargetServices(userEmail); } }