/** * $Id: $ * $Date: $ * */ package org.xmlsh.twitter.util; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map.Entry; import java.util.Random; import java.util.Set; import java.util.TimeZone; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.xmlsh.util.Util; import twitter4j.GeoLocation; import twitter4j.HashtagEntity; import twitter4j.MediaEntity; import twitter4j.MediaEntity.Size; import twitter4j.Place; import twitter4j.Status; import twitter4j.URLEntity; import twitter4j.User; import twitter4j.UserMentionEntity; public class TwitterWriter { public static final String kTWITTER_NS = "http://www.xmlsh.org/schemas/twitter"; XMLStreamWriter mWriter; boolean bSanitize; long randomSeed; public TwitterWriter(XMLStreamWriter writer, boolean sanitize) { this.bSanitize = sanitize; mWriter = writer; if( bSanitize ){ Random r = new Random(12345); randomSeed = r.nextLong(); } } public final static String sCOMMON_OPTS = "c=connect:,u=user:,p=password:"; public void closeWriter() throws XMLStreamException { mWriter.flush(); mWriter.close(); } public void endDocument() throws XMLStreamException { mWriter.writeEndDocument(); } public void endElement() throws XMLStreamException { mWriter.writeEndElement(); } public void startElement(String localname) throws XMLStreamException { mWriter.writeStartElement(localname); } public void startDocument() throws XMLStreamException { mWriter.writeStartDocument(); } public void attribute( String localName , String value ) throws XMLStreamException { mWriter.writeAttribute(localName, Util.notNull(value)); } public void characters( String value ) throws XMLStreamException { mWriter.writeCharacters(value); } String formatXSDateTime(Date date) { if( date == null ) date = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'"); df.setTimeZone( TimeZone.getTimeZone("UTC") ); return df.format(date); } public String httpGetString( String sURL ) throws IOException { URL url = new URL( sURL ); InputStream is = url.openStream(); String s = Util.readString(is, "UTF8"); is.close(); return s; } public void write(Status t) throws XMLStreamException { startElement("tweet"); attribute("id",t.getId()); // write("annotations",t.getAnnotations()); write("created-at",t.getCreatedAt()); write("from-user",sanitizeID(t.getUser().getId()),sanitizeUser(t.getUser().getName())); write("geo-location",t.getGeoLocation()); write("hash-tags",t.getHashtagEntities()); write("iso-language-code",t.getUser().getLang()); write("location", t.getUser().getLocation()); write("media",t.getMediaEntities()); write("place",t.getPlace()); write("profile-image-url",sanitizeUser(t.getUser().getProfileImageURL())); write("source",t.getSource()); write("text",t.getText()); write("to-user",sanitizeID(t.getInReplyToUserId()),sanitizeUser(t.getInReplyToScreenName())); write("url-entities",t.getURLEntities()); write("user-mention-entities",t.getUserMentionEntities()); endElement(); } // sanitize an ID value. Keep it unique but not identifying. private long sanitizeID(long id) { // TODO Auto-generated method stub return id ^ randomSeed ; } static String az = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private String sanitizeUser(String user) { StringBuffer sb = new StringBuffer(user.length()); int i = 0; int azl = az.length(); for( char c : user.toCharArray() ){ int pos = (int) ((c ^ (randomSeed >> i%16)) % azl ); sb.append( (char) az.charAt(pos)); } return sb.toString(); } private void write(String localName, UserMentionEntity[] userMentionEntities) throws XMLStreamException { startElement(localName); for( UserMentionEntity e : userMentionEntities ) write("entity" , e ); endElement(); } private void write(String localName, UserMentionEntity e) throws XMLStreamException { startElement(localName); attribute("id",sanitizeID(e.getId())); attribute( "screen-name" , sanitizeUser(e.getScreenName())); attribute("start", e.getStart()); attribute("end", e.getEnd()); endElement(); } private void write(String localName, User user) throws XMLStreamException { startElement("user"); attribute("created-at" , user.getCreatedAt()); attribute("description" ,user.getDescription()); attribute("favorites-count" ,user.getFavouritesCount()); user.getFollowersCount(); user.getFriendsCount(); attribute("id" , sanitizeID(user.getId())); attribute("lang" , user.getLang()); user.getListedCount(); attribute("name",sanitizeUser(user.getName())); user.getProfileBackgroundColor(); user.getProfileBackgroundImageUrl(); user.getProfileBackgroundImageUrlHttps(); user.getProfileImageURL(); user.getProfileImageUrlHttps(); user.getProfileLinkColor(); user.getProfileSidebarBorderColor(); user.getProfileTextColor(); user.getRateLimitStatus(); attribute("screen-name",sanitizeUser(user.getScreenName())); user.getStatusesCount(); user.getTimeZone(); user.getURL(); user.getUtcOffset(); write("location",user.getLocation()); write("user-status",user.getStatus()); endElement(); } private void attribute(String localName, Date dt) throws XMLStreamException { attribute(localName , Util.formatXSDateTime(dt)); } private void write(String localName, URLEntity[] urlEntities) throws XMLStreamException { startElement(localName); for( URLEntity u : urlEntities ) write(u); endElement(); } private void write(URLEntity u) throws XMLStreamException { attribute("display-url",u.getDisplayURL()); attribute("end",u.getEnd()); attribute("expanded-url",u.getExpandedURL().toString()); attribute("start",u.getStart()); attribute("url",u.getURL().toString()); } private void write(String localName, Place place) throws XMLStreamException { if( place != null ){ startElement(localName); // TODO: Lots of place stuff characters(place.getName()); endElement(); } } private void write(String localName, MediaEntity[] mediaEntities) throws XMLStreamException { if( mediaEntities != null ){ startElement(localName); for( MediaEntity m : mediaEntities) write("media",m); endElement(); } } private void write(String localName, MediaEntity m) throws XMLStreamException { startElement(localName ); attribute("display-url",m.getDisplayURL()); attribute("end",m.getEnd()); attribute("expanded-url",m.getExpandedURL().toString()); attribute("id",m.getId()); attribute("media-url",m.getMediaURL().toString()); attribute("media-url-https",m.getMediaURLHttps().toString()); attribute("start",m.getStart()); attribute("url",m.getURL().toString()); Set<Entry<Integer, Size>> sizes = m.getSizes().entrySet(); for( Entry<Integer,Size> s : sizes ){ startElement("size"); attribute( "height" , s.getValue().getHeight()); attribute( "width" , s.getValue().getWidth()); attribute( "resize" , s.getValue().getResize()); endElement(); } } private void write(String localName, GeoLocation geoLocation) throws XMLStreamException { if( geoLocation != null ){ startElement(localName); attribute("latitude",geoLocation.getLatitude()); attribute("longitude",geoLocation.getLongitude()); endElement(); } } private void attribute(String localName, double d) throws XMLStreamException { attribute(localName , String.valueOf(d)); } private void write(String localName, HashtagEntity[] hashtagEntities) throws XMLStreamException { startElement(localName); for( HashtagEntity e : hashtagEntities) write( "hash-tag" , e ); endElement(); } private void write(String localName, HashtagEntity e) throws XMLStreamException { startElement(localName); attribute("start" , e.getStart()); attribute("end" , e.getEnd()); characters(e.getText()); endElement(); } private void write(String localName, long id, String string) throws XMLStreamException { startElement(localName); attribute("id" , id ); characters(string); endElement(); } private void write(String localName, String value) throws XMLStreamException { startElement(localName); characters(value); endElement(); } private void write(String localName, Date date) throws XMLStreamException { startElement(localName); characters( Util.formatXSDateTime(date)); endElement(); } private void attribute(String localName, long l) throws XMLStreamException { attribute(localName, String.valueOf(l)); } public void write(String localName , Status status) throws XMLStreamException { if( status != null ){ startElement(localName); attribute("id",status.getId()); // write("annotations",t.getAnnotations()); write("created-at",status.getCreatedAt()); write("user",status.getUser()); write("geo-location",status.getGeoLocation()); write("hash-tags",status.getHashtagEntities()); write("media",status.getMediaEntities()); write("place",status.getPlace()); write("source",status.getSource()); write("text",status.getText()); write("url-entities",status.getURLEntities()); write("user-mention-entities",status.getUserMentionEntities()); endElement(); } } public void writeDefaultNamespace() throws XMLStreamException { mWriter.writeDefaultNamespace(kTWITTER_NS); } public void startElement(String ns, String localName) throws XMLStreamException { mWriter.writeStartElement("",localName,ns); } } // // // Copyright (C) 2008-2014 David A. Lee. // // The contents of this file are subject to the "Simplified BSD License" (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.opensource.org/licenses/bsd-license.php // // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. // See the License for the specific language governing rights and limitations // under the License. // // The Original Code is: all this file. // // The Initial Developer of the Original Code is David A. Lee // // Portions created by (your name) are Copyright (C) (your legal entity). All // Rights Reserved. // // Contributor(s): none. //