/**
* $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.
//