Expand task-related models with new task types and flight-related entities

- Added `TaskJDG`, `TaskPDG`, and a re-implemented `TaskHWZ` class, enhancing task abstraction with rule, abbreviation, and serialization methods.
- Introduced `Pilot`, `Track`, `MarkerDrop`, and `Declaration` classes for detailed flight representation.
- Made structural improvements across several classes for better clarity and maintainability.
This commit is contained in:
Jan Meinl
2026-05-14 14:38:14 +02:00
parent c6578e3eef
commit 1928dbe8fb
23 changed files with 212 additions and 62 deletions
@@ -28,6 +28,7 @@ public class Competition {
private String website;
private AltitudeSource altitudeSource;
private Altitude seperationAltitude;
private boolean publishCurrentStandings;
private HashMap<String, Coordinate> commonLaunchPoints;
private HashSet<CompetitionContact> contacts;
@@ -13,7 +13,7 @@ public class CompetitionProvider implements Provider {
@Override
public void createDatabaseTables(Query query) {
}
@Override
@@ -6,6 +6,6 @@ public enum CompetitionType {
CONTINENTAL_CHAMPIONSHIP,
NATIONAL_CHAMPIONSHIP,
STATE_OR_REGIONAL_CHAMPIONSHIP,
OTHER;
OTHER
}
@@ -1,8 +1,8 @@
package dev.coph.flightscore.backend.coordinate;
public enum PositionValid {
FIX_3D,
NO_FIX_OR_2D;
NO_FIX_OR_2D
}
@@ -18,7 +18,7 @@ public class FlightPublicData {
private String pZsInForce;
private String searchPeriod;
private String nextBriefing;
/*
Additional notes for the flight. E.g., for reduced time periods or temporary change of blue pz altitudes, ...
*/
@@ -12,5 +12,5 @@ public class FlightScoringData {
private Instant launchPeriodStart;
private Instant launchPeriodEnd;
private Integer minimumILPToGoalsInMeter;
}
@@ -1,6 +1,6 @@
package dev.coph.flightscore.backend.flight;
public enum FlightStatus {
public enum FlightStatus {
DRAFT,
LIVE,
@@ -0,0 +1,6 @@
package dev.coph.flightscore.backend.pilot;
public class Pilot {
}
@@ -3,13 +3,7 @@ package dev.coph.flightscore.backend.provider;
import dev.coph.flightscore.backend.Backend;
import dev.coph.simplesql.query.Query;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
public class ProviderManager {
private final Backend backend;
@@ -25,20 +19,6 @@ public class ProviderManager {
query.execute();
}
public void enableAllProviders() {
Query query = new Query(backend.databaseAdapter());
resolveOrder().forEach(provider -> provider.onEnable(query));
query.execute();
}
public void registerProvider(Provider provider) {
providers.put(provider.key(), provider);
}
public <T extends Provider> T provider(String key) {
return (T) providers.get(key);
}
private List<Provider> resolveOrder() {
HashMap<String, Integer> inDegree = new HashMap<>();
HashMap<String, Set<String>> dependents = new HashMap<>();
@@ -84,4 +64,18 @@ public class ProviderManager {
return ordered;
}
public void enableAllProviders() {
Query query = new Query(backend.databaseAdapter());
resolveOrder().forEach(provider -> provider.onEnable(query));
query.execute();
}
public void registerProvider(Provider provider) {
providers.put(provider.key(), provider);
}
public <T extends Provider> T provider(String key) {
return (T) providers.get(key);
}
}
@@ -12,6 +12,7 @@ public enum PublicationState {
FINAL(true);
final boolean versionable;
PublicationState(boolean versionable) {
this.versionable = versionable;
}
@@ -7,7 +7,7 @@ public class PublicationTask {
private final Instant timestamp;
//TODO
public PublicationTask(PublicationState state, Instant timestamp) {
this.state = state;
this.timestamp = timestamp;
@@ -1,24 +1,37 @@
package dev.coph.flightscore.backend.task;
import dev.coph.flightscore.backend.flight.Flight;
import dev.coph.flightscore.backend.flight.FlightScoringData;
import dev.coph.simpleutilities.ulid.ULID;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.json.JSONObject;
import java.time.Instant;
@Setter
@Getter
@Accessors(fluent = true)
public abstract class Task {
private Flight flight;
private ULID id;
private final ULID id;
private final Flight flight;
private int taskNumber;
private TaskStatus status;
private Instant scoringPeriodeEnd;
private Integer separationAltitudeOverride;
public abstract JSONObject serialize();
public abstract Task deserialize(JSONObject json);
protected Task(ULID id, Flight flight) {
this.id = id;
this.flight = flight;
}
public abstract String rule();
public abstract String abbreviation();
public abstract JSONObject serialize();
public abstract Task deserialize(JSONObject json);
}
@@ -5,7 +5,7 @@ public enum TaskStatus {
LIVE,
SCORING,
COMPLETED,
CANCELED;
CANCELED
}
@@ -1,16 +0,0 @@
package dev.coph.flightscore.backend.task.impl;
import dev.coph.flightscore.backend.task.Task;
public class TaskHWZ extends Task {
/**
*
* TaskNumber INT (UNSIGNED)
* ScoringPeriod TIMESTAMP
* Status STRING
* Data JSON
*
*/
}
@@ -0,0 +1,33 @@
package dev.coph.flightscore.backend.task.type;
import dev.coph.flightscore.backend.flight.Flight;
import dev.coph.flightscore.backend.task.Task;
import dev.coph.simpleutilities.ulid.ULID;
import org.json.JSONObject;
public class TaskHWZ extends Task {
public TaskHWZ(ULID id, Flight flight) {
super(id, flight);
}
@Override
public String rule() {
return "";
}
@Override
public String abbreviation() {
return "";
}
@Override
public JSONObject serialize() {
return null;
}
@Override
public Task deserialize(JSONObject json) {
return null;
}
}
@@ -0,0 +1,34 @@
package dev.coph.flightscore.backend.task.type;
import dev.coph.flightscore.backend.flight.Flight;
import dev.coph.flightscore.backend.task.Task;
import dev.coph.simpleutilities.ulid.ULID;
import org.json.JSONObject;
public class TaskJDG extends Task {
protected TaskJDG(ULID id, Flight flight) {
super(id, flight);
}
@Override
public String rule() {
return "";
}
@Override
public String abbreviation() {
return "";
}
@Override
public JSONObject serialize() {
return null;
}
@Override
public Task deserialize(JSONObject json) {
return null;
}
}
@@ -0,0 +1,34 @@
package dev.coph.flightscore.backend.task.type;
import dev.coph.flightscore.backend.flight.Flight;
import dev.coph.flightscore.backend.task.Task;
import dev.coph.simpleutilities.ulid.ULID;
import org.json.JSONObject;
public class TaskPDG extends Task {
protected TaskPDG(ULID id, Flight flight) {
super(id, flight);
}
@Override
public String rule() {
return "15.1";
}
@Override
public String abbreviation() {
return "PDG";
}
@Override
public JSONObject serialize() {
return null;
}
@Override
public Task deserialize(JSONObject json) {
return null;
}
}
@@ -0,0 +1,18 @@
package dev.coph.flightscore.backend.track;
import dev.coph.flightscore.backend.coordinate.Coordinate;
import lombok.Getter;
import lombok.experimental.Accessors;
@Getter
@Accessors(fluent = true)
public class Declaration {
private int number;
private Coordinate declaration;
private Coordinate positionAtDeclaration;
private boolean isHeightPilotDeclared;
private String originalDeclarationEasting, originalDeclarationNorthing;
}
@@ -0,0 +1,15 @@
package dev.coph.flightscore.backend.track;
import dev.coph.flightscore.backend.coordinate.Coordinate;
import lombok.Getter;
import lombok.experimental.Accessors;
import java.time.Instant;
@Getter
@Accessors(fluent = true)
public class MarkerDrop {
private int number;
private Coordinate location;
private Instant timestamp;
}
@@ -0,0 +1,23 @@
package dev.coph.flightscore.backend.track;
import dev.coph.flightscore.backend.coordinate.Coordinate;
import dev.coph.flightscore.backend.pilot.Pilot;
import lombok.Getter;
import lombok.experimental.Accessors;
import java.io.File;
import java.util.List;
@Getter
@Accessors(fluent = true)
public class Track {
private Pilot pilot;
private List<Coordinate> trackPoints;
private List<Declaration> declarations;
private List<MarkerDrop> markerDrops;
private File trackFile;
}
@@ -17,8 +17,8 @@ public class User {
private final String email;
private final String phoneNumber;
private final Locale country;
private Role role;
private final boolean blocked;
private Role role;
public User(ULID id, String firstname, String lastname, String email, String phoneNumber, Locale country, boolean blocked) {
this.id = id;
@@ -4,14 +4,7 @@ import dev.coph.simpleutilities.ulid.ULID;
import lombok.Getter;
import lombok.experimental.Accessors;
@Getter
@Accessors(fluent = true)
public class Permission {
private final ULID id;
private final String name;
public Permission(ULID id, String name) {
this.id = id;
this.name = name;
}
public record Permission(ULID id, String name) {
}
@@ -15,6 +15,7 @@ public class Role {
private final String name;
private final boolean defaultRole;
private final HashSet<Permission> permissions = new HashSet<>();
public Role(ULID id, String name, boolean defaultRole) {
this.id = id;
this.name = name;