package mil.nga.giat.geowave.format.twitter; import java.io.File; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import org.geotools.feature.AttributeTypeBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.opengis.feature.simple.SimpleFeatureType; import com.vividsolutions.jts.geom.Point; /** * This is a convenience class for performing common Twitter static utility * methods such as schema validation, file parsing, and SimpleFeatureType * definition. */ public class TwitterUtils { private static final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat( "EEE MMM dd HH:mm:ss Z yyyy"); } }; public static Date parseDate( final String source ) throws ParseException { return dateFormat.get().parse( source); } public static final String TWITTER_SFT_NAME = "twitter"; public static final String TWITTER_GEOMETRY_ATTRIBUTE = "geom"; public static final String TWITTER_DTG_ATTRIBUTE = "dtg"; public static final String TWITTER_USERID_ATTRIBUTE = "user_id"; public static final String TWITTER_USERNAME_ATTRIBUTE = "user_name"; public static final String TWITTER_TEXT_ATTRIBUTE = "text"; public static final String TWITTER_INREPLYTOUSER_ATTRIBUTE = "in_reply_to_user_id"; public static final String TWITTER_INREPLYTOSTATUS_ATTRIBUTE = "in_reply_to_status_id"; public static final String TWITTER_RETWEETCOUNT_ATTRIBUTE = "retweet_count"; public static final String TWITTER_LANG_ATTRIBUTE = "lang"; public static SimpleFeatureType createTwitterEventDataType() { final SimpleFeatureTypeBuilder simpleFeatureTypeBuilder = new SimpleFeatureTypeBuilder(); simpleFeatureTypeBuilder.setName(TWITTER_SFT_NAME); final AttributeTypeBuilder attributeTypeBuilder = new AttributeTypeBuilder(); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_USERID_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_USERNAME_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_TEXT_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_INREPLYTOUSER_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_INREPLYTOSTATUS_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( Integer.class).nillable( true).buildDescriptor( TWITTER_RETWEETCOUNT_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( String.class).nillable( true).buildDescriptor( TWITTER_LANG_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( Date.class).nillable( false).buildDescriptor( TWITTER_DTG_ATTRIBUTE)); simpleFeatureTypeBuilder.add(attributeTypeBuilder.binding( Point.class).nillable( false).buildDescriptor( TWITTER_GEOMETRY_ATTRIBUTE)); return simpleFeatureTypeBuilder.buildFeatureType(); } public static boolean validate( final File file ) { return file.getName().toLowerCase( Locale.ENGLISH).matches( "\\d{8}-\\d{6}\\.txt\\.gz"); } }