initial commit
This commit is contained in:
commit
e3e8259523
14 changed files with 333 additions and 0 deletions
40
.classpath
Normal file
40
.classpath
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="optional" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="test" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="test" value="true"/>
|
||||
<attribute name="optional" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/target/
|
23
.project
Normal file
23
.project
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>wtapi</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
8
.settings/org.eclipse.jdt.core.prefs
Normal file
8
.settings/org.eclipse.jdt.core.prefs
Normal file
|
@ -0,0 +1,8 @@
|
|||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
|
||||
org.eclipse.jdt.core.compiler.compliance=17
|
||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
|
||||
org.eclipse.jdt.core.compiler.release=disabled
|
||||
org.eclipse.jdt.core.compiler.source=17
|
30
pom.xml
Normal file
30
pom.xml
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>eu.m724</groupId>
|
||||
<artifactId>wtapi</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
14
src/main/java/eu/m724/wtapi/object/Coordinates.java
Normal file
14
src/main/java/eu/m724/wtapi/object/Coordinates.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package eu.m724.wtapi.object;
|
||||
|
||||
/**
|
||||
* represents geographic coordinates
|
||||
* contains fields latitude and longitude
|
||||
*/
|
||||
public class Coordinates {
|
||||
public double latitude, longitude;
|
||||
|
||||
public Coordinates(double latitude, double longitude) {
|
||||
this.latitude = latitude;
|
||||
this.longitude = longitude;
|
||||
}
|
||||
}
|
14
src/main/java/eu/m724/wtapi/object/Weather.java
Normal file
14
src/main/java/eu/m724/wtapi/object/Weather.java
Normal file
|
@ -0,0 +1,14 @@
|
|||
package eu.m724.wtapi.object;
|
||||
|
||||
/**
|
||||
* contains weather conditions
|
||||
*/
|
||||
public class Weather {
|
||||
public WeatherState weatherState;
|
||||
public float level = 1;
|
||||
|
||||
public Weather(WeatherState weatherState, float level) {
|
||||
this.weatherState = weatherState;
|
||||
this.level = level;
|
||||
}
|
||||
}
|
5
src/main/java/eu/m724/wtapi/object/WeatherState.java
Normal file
5
src/main/java/eu/m724/wtapi/object/WeatherState.java
Normal file
|
@ -0,0 +1,5 @@
|
|||
package eu.m724.wtapi.object;
|
||||
|
||||
public enum WeatherState {
|
||||
CLEAR, RAIN, THUNDER
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
package eu.m724.wtapi.provider.api;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.temporal.TemporalUnit;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
import eu.m724.wtapi.object.Weather;
|
||||
import eu.m724.wtapi.object.WeatherState;
|
||||
import eu.m724.wtapi.provider.exception.ProviderException;
|
||||
|
||||
public class MockWeatherAPIWrapper extends WeatherAPIWrapper {
|
||||
|
||||
@Override
|
||||
public void init() throws ProviderException {
|
||||
System.out.println("hello from mock provider");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Weather> getWeather(Coordinates coordinates) {
|
||||
if (coordinates == null)
|
||||
throw new NullPointerException("no coordinates passed");
|
||||
|
||||
System.out.printf("mock getting weather for %f, %f\n",
|
||||
coordinates.latitude, coordinates.longitude);
|
||||
|
||||
CompletableFuture<Weather> completableFuture =
|
||||
new CompletableFuture<>();
|
||||
|
||||
completableFuture.complete(new Weather(WeatherState.CLEAR, 0));
|
||||
|
||||
return completableFuture;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Weather[]> getWeatherBulk(Coordinates[] coordinateses) {
|
||||
if (coordinateses.length == 0)
|
||||
throw new IllegalArgumentException("no coordinates passed");
|
||||
|
||||
System.out.printf("mock getting weather for multiple coords");
|
||||
|
||||
CompletableFuture<Weather[]> completableFuture =
|
||||
new CompletableFuture<>();
|
||||
|
||||
int pairs = coordinateses.length / 2;
|
||||
|
||||
Weather[] weathers = new Weather[pairs];
|
||||
|
||||
for (int i=0; i<pairs; i++) {
|
||||
weathers[i] = new Weather(WeatherState.CLEAR, 1);
|
||||
}
|
||||
|
||||
completableFuture.complete(weathers);
|
||||
|
||||
return completableFuture;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getQuotaHourly() {
|
||||
return 69;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLastRequestQuota() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
package eu.m724.wtapi.provider.api;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
import eu.m724.wtapi.object.Weather;
|
||||
import eu.m724.wtapi.provider.exception.ProviderException;
|
||||
|
||||
public abstract class WeatherAPIWrapper {
|
||||
|
||||
/**
|
||||
* initialize the api
|
||||
* @throws ProviderException if initialization failed
|
||||
*/
|
||||
public abstract void init() throws ProviderException;
|
||||
|
||||
/**
|
||||
* get weather for a single point
|
||||
* @param coordinates
|
||||
* @throws NullPointerException if coordinates is null
|
||||
* @return a future that CAN throw {@link ProviderException}
|
||||
*/
|
||||
public abstract CompletableFuture<Weather> getWeather(Coordinates coordinates);
|
||||
|
||||
/**
|
||||
* get weather for multiple points at bulk
|
||||
* it can be called one at a time if the api doesn't support this or if there's too many
|
||||
* @param coordinateses array of coordinates
|
||||
* @throws IllegalArgumentException if array is empty
|
||||
* @return a future that CAN throw {@link ProviderException}
|
||||
*/
|
||||
public abstract CompletableFuture<Weather[]> getWeatherBulk(Coordinates[] coordinateses);
|
||||
|
||||
/**
|
||||
* get hourly quota that is max requests per hour
|
||||
* @return hourly quota
|
||||
*/
|
||||
public abstract int getQuotaHourly();
|
||||
|
||||
/**
|
||||
* how many requests actually took place last time you called a method
|
||||
* @return amount of requests, 0 if no calls happened
|
||||
*/
|
||||
public abstract int getLastRequestQuota();
|
||||
|
||||
/**
|
||||
* estimates minimum delay between calls given last request
|
||||
* @return milliseconds
|
||||
*/
|
||||
public long estimateDelay() {
|
||||
return (long) Math.ceil(this.getQuotaHourly() / 2.0 / 60 / 60 / 1000);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package eu.m724.wtapi.provider.exception;
|
||||
|
||||
/**
|
||||
* when you specified an incorrect api key
|
||||
*/
|
||||
public class AuthorizationException extends ProviderException {
|
||||
|
||||
private static final long serialVersionUID = -2258293509429607176L;
|
||||
|
||||
public AuthorizationException(String message) {
|
||||
super(message);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package eu.m724.wtapi.provider.exception;
|
||||
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class ProviderException extends ExecutionException {
|
||||
|
||||
private static final long serialVersionUID = -841882181122537157L;
|
||||
|
||||
public ProviderException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package eu.m724.wtapi.provider.exception;
|
||||
|
||||
/**
|
||||
* too many api requests, or ratelimited
|
||||
*/
|
||||
public class QuotaExceededException extends ProviderException {
|
||||
|
||||
private static final long serialVersionUID = 7550042052176034614L;
|
||||
|
||||
private Long retryMs;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param message
|
||||
* @param retryMs SUGGESTION after how many ms to retry. it can be null
|
||||
*/
|
||||
public QuotaExceededException(String message, Long retryMs) {
|
||||
super(message);
|
||||
this.retryMs = retryMs;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return SUGGESTION after how many ms to retry. it can be null
|
||||
*/
|
||||
public Long getRetryIn() {
|
||||
return this.retryMs;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package eu.m724.wtapi.provider.exception;
|
||||
|
||||
/**
|
||||
* when the provider is at fault
|
||||
*/
|
||||
public class ServerProviderException extends ProviderException {
|
||||
|
||||
private static final long serialVersionUID = 4461164912391786673L;
|
||||
|
||||
public ServerProviderException(String message) {
|
||||
super(message);
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in a new issue