Twitter functional apps

* Streaming source
* Add twitter search and messasge sources
* Add more twitter source, sink and processors
* Add IT tests for twitter update sink
* Add IT tests for twitter message sink
* Add IT tests for twitter trend processor
* twitter suppliers readme
* twitter consumers readme
* twitter functions readme
* Disable TwitterStreamSourceTests
This commit is contained in:
Christian Tzolov
2020-06-18 16:09:56 +02:00
committed by Soby Chacko
parent 9bf8dcc4e7
commit 873f17414e
79 changed files with 7018 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
/*
* Copyright 2020-2020 the original author or authors.
*
* 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
*
* https://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 org.springframework.cloud.fn.twitter.trend;
import java.util.List;
import java.util.function.Function;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import twitter4j.GeoLocation;
import twitter4j.Location;
import twitter4j.Trends;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.fn.common.twitter.TwitterConnectionConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.messaging.Message;
/**
* @author Christian Tzolov
*/
@Configuration
@EnableConfigurationProperties(TwitterTrendFunctionProperties.class)
@Import(TwitterConnectionConfiguration.class)
public class TwitterTrendFunctionConfiguration {
private static final Log logger = LogFactory.getLog(TwitterTrendFunctionConfiguration.class);
@Bean
public Function<Message<?>, Trends> trend(TwitterTrendFunctionProperties properties, Twitter twitter) {
return message -> {
try {
int woeid = properties.getLocationId().getValue(message, int.class);
return twitter.getPlaceTrends(woeid);
}
catch (TwitterException e) {
logger.error("Twitter API error!", e);
}
return null;
};
}
@Bean
public Function<Message<?>, List<Location>> closestOrAvailableTrends(
TwitterTrendFunctionProperties properties, Twitter twitter) {
return message -> {
try {
if (properties.getClosest().getLat() != null && properties.getClosest().getLon() != null) {
double lat = properties.getClosest().getLat().getValue(message, double.class);
double lon = properties.getClosest().getLon().getValue(message, double.class);
return twitter.getClosestTrends(new GeoLocation(lat, lon));
}
else {
return twitter.getAvailableTrends();
}
}
catch (TwitterException e) {
logger.error("Twitter API error!", e);
}
return null;
};
}
@Bean
public Function<Message<?>, Message<byte[]>> trendOrTrendLocationsFunction(
Function<Object, Message<byte[]>> managedJson, Function<Message<?>, Trends> trend,
TwitterTrendFunctionProperties properties, Function<Message<?>,
List<Location>> closestOrAvailableTrends) {
return (properties.getTrendQueryType() == TwitterTrendFunctionProperties.TrendQueryType.trend) ?
trend.andThen(managedJson) : closestOrAvailableTrends.andThen(managedJson);
}
}

View File

@@ -0,0 +1,107 @@
/*
* Copyright 2020-2020 the original author or authors.
*
* 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
*
* https://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 org.springframework.cloud.fn.twitter.trend;
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.validation.annotation.Validated;
/**
* @author Christian Tzolov
*/
@ConfigurationProperties("twitter.trend")
@Validated
public class TwitterTrendFunctionProperties {
private static final Expression DEFAULT_EXPRESSION = new SpelExpressionParser().parseExpression("payload");
enum TrendQueryType {
/** Retrieve trending places. */
trend,
/** Retrieve the Locations of trending places. */
trendLocation
}
private TrendQueryType trendQueryType = TrendQueryType.trend;
public TrendQueryType getTrendQueryType() {
return trendQueryType;
}
public void setTrendQueryType(TrendQueryType trendQueryType) {
this.trendQueryType = trendQueryType;
}
/**
* The Yahoo! Where On Earth ID of the location to return trending information for.
* Global information is available by using 1 as the WOEID.
*/
@NotNull
private Expression locationId = DEFAULT_EXPRESSION;
public Expression getLocationId() {
return locationId;
}
public void setLocationId(Expression locationId) {
this.locationId = locationId;
}
/**
*
*/
private Closest closest = new Closest();
public Closest getClosest() {
return closest;
}
public static class Closest {
/**
* If provided with a long parameter the available trend locations will be sorted by distance, nearest
* to furthest, to the co-ordinate pair.
* The valid ranges for longitude is -180.0 to +180.0 (West is negative, East is positive) inclusive.
*/
private Expression lat;
/**
* If provided with a lat parameter the available trend locations will be sorted by distance, nearest to
* furthest, to the co-ordinate pair. The valid ranges for longitude is -180.0 to +180.0 (West is negative,
* East is positive) inclusive.
*/
private Expression lon;
public Expression getLat() {
return lat;
}
public void setLat(Expression lat) {
this.lat = lat;
}
public Expression getLon() {
return lon;
}
public void setLon(Expression lon) {
this.lon = lon;
}
}
}