diff --git a/client/app/build.gradle.kts b/client/app/build.gradle.kts new file mode 100644 index 0000000..6a5a8cf --- /dev/null +++ b/client/app/build.gradle.kts @@ -0,0 +1,41 @@ + +plugins { + id("application") + id("org.openjfx.javafxplugin") version "0.0.10" +} + +javafx { + version = "11" + modules( + "javafx.controls", + "javafx.fxml" + ) +} + +application { + mainClassName = "client.MainApplication" +} + +dependencies { + implementation(project(":data")) +} + +val jar by tasks.getting(Jar::class) { + manifest { + attributes["Main-Class"] = "client.Launcher" + } + from({ + configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) } + }) +} + +tasks.register("rebuild and move", Copy::class) { + group = "custom" + dependsOn("clean") + dependsOn("jar") + + from("$buildDir/libs/app.jar") + + mkdir("$buildDir/out/") + into("$buildDir/out/") +} diff --git a/client/app/src/main/java/main/CreateEventController.java b/client/app/src/main/java/main/CreateEventController.java new file mode 100644 index 0000000..14d52d3 --- /dev/null +++ b/client/app/src/main/java/main/CreateEventController.java @@ -0,0 +1,68 @@ +package main; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.DatePicker; +import javafx.scene.control.TextField; +import javafx.stage.Stage; +import res.DataController; +import res.Event; + +public class CreateEventController { + + @FXML + public DatePicker datePickerDate; + @FXML + public TextField textName; + @FXML + public TextField textStart; + @FXML + public TextField textEnd; + @FXML + public ComboBox ComboBoxTyp; + @FXML + public ComboBox ComboBoxPriotity; + @FXML + public CheckBox checkBoxIsFullDay; + @FXML + public CheckBox checkBoxIsPrivate; + + + public CreateEventController(){} + + @FXML + public void initialize(){} + + + @FXML + protected void createBtnClick(ActionEvent actionEvent){ + + Event event = new Event( + textName.getText(), + ComboBoxPriotity.getSelectionModel().getSelectedIndex(), + checkBoxIsFullDay.isSelected(), + checkBoxIsPrivate.isSelected(), + textStart.getText(), + textEnd.getText(), + datePickerDate.getValue().atStartOfDay(), + 1 + ); + + System.out.println(event.getAsUrlParam()); + + DataController dataController = new DataController(); + dataController.createEvent(event); + + Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow(); + stage.close(); + } + + @FXML + protected void abortBtnClick(ActionEvent event){ + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + stage.close(); + } +} diff --git a/client/app/src/main/java/main/Launcher.java b/client/app/src/main/java/main/Launcher.java new file mode 100644 index 0000000..fd5d4c8 --- /dev/null +++ b/client/app/src/main/java/main/Launcher.java @@ -0,0 +1,8 @@ +package main; + +public class Launcher { + + public static void main(String[] args) { + MainApplication.main(args); + } +} diff --git a/client/app/src/main/java/main/MainApplication.java b/client/app/src/main/java/main/MainApplication.java new file mode 100644 index 0000000..6514b0d --- /dev/null +++ b/client/app/src/main/java/main/MainApplication.java @@ -0,0 +1,27 @@ +package main; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.Objects; + +public class MainApplication extends Application { + @Override + public void start(Stage stage) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml")); + + Scene scene = new Scene(fxmlLoader.load(), 1200, 700); + scene.getStylesheets().add(Objects.requireNonNull(MainApplication.class.getResource("main-view.css")).toExternalForm()); + stage.setTitle("Hello!"); + stage.setScene(scene); + stage.show(); + + } + + public static void main(String[] args) { + launch(); + } +} \ No newline at end of file diff --git a/client/app/src/main/java/main/MainController.java b/client/app/src/main/java/main/MainController.java new file mode 100644 index 0000000..c886eb4 --- /dev/null +++ b/client/app/src/main/java/main/MainController.java @@ -0,0 +1,183 @@ +package main; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.stage.Modality; +import javafx.stage.Stage; +import res.DataController; +import res.Event; + +import java.io.IOException; +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Objects; + +public class MainController { + + @FXML + private GridPane calendarGrid; + + @FXML + private Label LabelMonth; + + private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; + private final Label[] dayLabel = new Label[7]; + private final VBox[] dayVBoxes = new VBox[7]; + + private int weekOffset; + private LocalDateTime weekStartDateTime; + + + public MainController() { + weekOffset = 0; + } + + @FXML + public void initialize(){ + createWeek(); + setDates(); + + updateEvents(); + } + + private void updateEvents() { + for(VBox vBox : dayVBoxes){ + vBox.getChildren().clear(); + } + + DataController dataController = new DataController(); + ArrayList eventList = dataController.getAllVisibleEvents(); + + for(Event event : eventList){ + addEvent(event); + } + } + + @FXML + protected void onAddBtnClick(){ + try{ + FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("create-event.fxml")); + Scene scene = new Scene(fxmlLoader.load(), 650, 500); + scene.getStylesheets().add(Objects.requireNonNull(MainApplication.class.getResource("create-event.css")).toExternalForm()); + Stage stage = new Stage(); + stage.setTitle("Termin erstellen"); + stage.setScene(scene); + stage.initModality(Modality.APPLICATION_MODAL); + stage.setResizable(false); + //stage.initStyle(StageStyle.UNDECORATED); + stage.showAndWait(); + } + catch (IOException e){ + e.printStackTrace(); + } + updateEvents(); + } + + private void createWeek(){ + for (int i = 0; i < 7; i++) { + Label label = new Label(); + label.setText(dayNames[i]); + label.setMaxHeight(Double.MAX_VALUE); + label.setMaxWidth(Double.MAX_VALUE); + label.getStyleClass().add("labelDays"); + dayLabel[i] = label; + calendarGrid.add(label, i, 0); + + ScrollPane scrollPane = new ScrollPane(); + + VBox vBox = new VBox(); + vBox.getStyleClass().add("vBoxDays"); + vBox.setSpacing(10); + dayVBoxes[i] = vBox; + scrollPane.setContent(vBox); + + scrollPane.setFitToWidth(true); + scrollPane.setFitToHeight(true); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); + scrollPane.getStyleClass().add("scrollDays"); + + calendarGrid.add(scrollPane, i, 1); + } + } + + private void addEvent(Event event){ + VBox vBox = new VBox(); + vBox.getStyleClass().add("event"); + vBox.setSpacing(5); + + HBox btnHBox = new HBox(); + btnHBox.setAlignment(Pos.BOTTOM_RIGHT); + Button deleteBtn = new Button(); + deleteBtn.setText(" X "); + deleteBtn.setOnAction(e -> { + DataController dataController = new DataController(); + dataController.deleteEvent(event.getId()); + updateEvents(); + }); + Button editBtn = new Button(); + editBtn.setText("edit"); + btnHBox.getChildren().add(editBtn); + btnHBox.getChildren().add(deleteBtn); + vBox.getChildren().add(btnHBox); + + Label nameLabel = new Label(event.getName()); + vBox.getChildren().add(nameLabel); + + Label timeLabel = new Label(event.getStart() + "-" + event.getEnd()); + vBox.getChildren().add(timeLabel); + + Label typeLabel = new Label("Wer: " + event.getOwnerName()); + vBox.getChildren().add(typeLabel); + + /* + Ä, ä \u00c4, \u00e4 + Ö, ö \u00d6, \u00f6 + Ü, ü \u00dc, \u00fc + ß \u00df + */ + Label prioLabel = new Label("Priorit\u00e4t: " + event.getPriority()); + vBox.getChildren().add(prioLabel); + + if(event.isFullDay()){ + Label fullDayLabel = new Label("Dieser Termin bockiert den ganzen Tag!"); + vBox.getChildren().add(fullDayLabel); + } + + + LocalDateTime eventDate = event.getDate(); + + int day = (int)Duration.between(weekStartDateTime.toLocalDate().atStartOfDay(), eventDate.toLocalDate().atStartOfDay()).toDays(); + + if(day >= 0 && day < 7){ + dayVBoxes[day].getChildren().add(vBox); + } + } + + private void setDates(){ + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("LLLL yyyy"); + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("E dd.MM"); + DateTimeFormatter dayOfWeekFormatter = DateTimeFormatter.ofPattern("e"); + + LocalDateTime now = LocalDateTime.now(); + int dayOfWeek = Integer.parseInt(dayOfWeekFormatter.format(now)); + + weekStartDateTime = now.minusDays(weekOffset * 7L + dayOfWeek - 1); + + for (int i = 0; i < 7; i++) { + dayLabel[i].setText(dayFormatter.format(weekStartDateTime.plusDays(i))); + } + + LabelMonth.setText(dateFormatter.format(weekStartDateTime)); + + } +} \ No newline at end of file diff --git a/client/app/src/main/resources/main/create-event.css b/client/app/src/main/resources/main/create-event.css new file mode 100644 index 0000000..59602e9 --- /dev/null +++ b/client/app/src/main/resources/main/create-event.css @@ -0,0 +1,35 @@ +GridPane{ + -fx-background-color: #3E415F; + -fx-padding: 20px; + -fx-font-size: 20px; + -fx-font-family: Segoe UI; + + -fx-border-insets: 1; + -fx-border-color: #B0B0B0; + -fx-border-style: solid; + -fx-border-width: 2; + -fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0); +} + +Label{ + -fx-text-fill: white; + -fx-max-width: 150px; + -fx-min-width: 150px; +} + +.mainLabel{ + -fx-background-color: #8D99AE; + -fx-padding: 10px; + -fx-max-width: 200px; + -fx-min-width: 200px; + -fx-font-weight: bold; + -fx-alignment: center; +} + +.inputField{ + -fx-padding: 10px; +} + +.mainButton{ + -fx-font-weight: bold; +} \ No newline at end of file diff --git a/client/app/src/main/resources/main/create-event.fxml b/client/app/src/main/resources/main/create-event.fxml new file mode 100644 index 0000000..2ca5917 --- /dev/null +++ b/client/app/src/main/resources/main/create-event.fxml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/app/src/main/resources/main/main-view.css b/client/app/src/main/resources/main/main-view.css new file mode 100644 index 0000000..af0f292 --- /dev/null +++ b/client/app/src/main/resources/main/main-view.css @@ -0,0 +1,74 @@ +* { + -fx-base-background-color: #2B2D42; + -fx-base1-background-color: #525E74; + + -fx-main-border-color: #B0B0B0; + -fx-main-text-color: #ffffff; +} + + +GridPane{ + -fx-background-color: -fx-base-background-color; +} + +.main-panel{ + -fx-background-color: #282C34; +} + +.vbox-main{ + -fx-background-color: #333333; + -fx-alignment: top-center; + +} + +.gridCalendar Line{ + -fx-stroke: -fx-main-border-color; +} + +.gridCalender{ + -fx-background-color: -fx-base-background-color; + -fx-min-height: 80px; + -fx-max-height: 80px; +} + +.labelMonth{ + -fx-padding: 0 0 0 20; + -fx-background-color: #77859E; + -fx-font-size: 35px; + -fx-font-weight: bold; +} + +.scrollDays{ + -fx-background-color: -fx-base-background-color; + -fx-border-color: -fx-main-border-color; +} + +.vBoxDays{ + -fx-background-color: -fx-base-background-color; +} + +.labelDays{ + -fx-alignment: center; + -fx-background-color: -fx-base1-background-color; + -fx-font-size: 25px; + -fx-border-color: -fx-main-border-color; +} + +Label{ + -fx-text-fill: -fx-main-text-color; +} + +.event{ + -fx-background-color: -fx-base1-background-color; +} + +.main-btn{ + -fx-background-color: #ffffff; + -fx-text-fill: -fx-main-text-color; + -fx-background-radius: 5em; + -fx-min-width: 40px; + -fx-min-height: 40px; + -fx-max-width: 40px; + -fx-max-height: 40px; +} + diff --git a/client/app/src/main/resources/main/main-view.fxml b/client/app/src/main/resources/main/main-view.fxml new file mode 100644 index 0000000..b5bf7e2 --- /dev/null +++ b/client/app/src/main/resources/main/main-view.fxml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/build.gradle.kts b/client/build.gradle.kts new file mode 100644 index 0000000..6e4d8e5 --- /dev/null +++ b/client/build.gradle.kts @@ -0,0 +1,5 @@ +allprojects { + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/client/data/build.gradle.kts b/client/data/build.gradle.kts new file mode 100644 index 0000000..5b07f24 --- /dev/null +++ b/client/data/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + java +} + +dependencies { + val jacksonVersion = "2.13.0" + implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") + implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") + implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion") +} diff --git a/client/data/src/main/java/res/DataController.java b/client/data/src/main/java/res/DataController.java new file mode 100644 index 0000000..ddc826d --- /dev/null +++ b/client/data/src/main/java/res/DataController.java @@ -0,0 +1,96 @@ +package res; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; + +public class DataController { + + private static final String ALL_EVENTS_ENDPOINT = "http://localhost:8080/vpr/all-events"; + private static final String ALL_USERS_ENDPOINT = "http://localhost:8080/vpr/all-users"; + private static final String ADD_EVENT_ENDPOINT = "http://localhost:8080/vpr/add-event"; + private static final String DELETE_EVENT_ENDPOINT = "http://localhost:8080/vpr/del-event"; + + private final HttpRequest httpRequest; + + public DataController(){ + httpRequest = new HttpRequest(); + } + + public void createEvent(Event event){ + try { + System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam())); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void deleteEvent(int eventId){ + try { + System.out.println(httpRequest.sendPostRequest(DELETE_EVENT_ENDPOINT, "eventId=" + eventId)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public ArrayList getAllVisibleEvents() { + ArrayList eventList = new ArrayList<>(); + + try { + String jsonResponse = httpRequest.sendPostRequest(ALL_EVENTS_ENDPOINT, "userId=1"); + System.out.println(jsonResponse); + + ObjectMapper objectMapper = new ObjectMapper(); + //String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }"; + + for (Object obj : objectMapper.readValue(jsonResponse, Object[].class)){ + ArrayList list = new ArrayList<>(); + if (obj.getClass().isArray()) { + list = (ArrayList) Arrays.asList((Object[])obj); + } else if (obj instanceof Collection) { + list = new ArrayList<>((Collection) obj); + } + eventList.add(new Event(list)); + + } + } catch (Exception e) { + e.printStackTrace(); + } + + return eventList; + } + + public Event[] getAllEvents() { + Event[] eventList = null; + + try { + String jsonResponse = httpRequest.sendGetRequest("http://localhost:8080/vpr/all-events-test"); + eventList = parseJsonToEventList(jsonResponse); + for (Event e : eventList) { + System.out.println(e); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return eventList; + } + + private Event[] parseJsonToEventList(String jsonString) throws JsonProcessingException { + ArrayList eventList; + + // Parse JSON + ObjectMapper objectMapper = new ObjectMapper(); + //String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }"; + + return objectMapper.readValue(jsonString, Event[].class); + } +} diff --git a/client/data/src/main/java/res/Event.java b/client/data/src/main/java/res/Event.java new file mode 100644 index 0000000..33ee93f --- /dev/null +++ b/client/data/src/main/java/res/Event.java @@ -0,0 +1,174 @@ +package res; + +import com.sun.jdi.event.StepEvent; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +public class Event { + + private int id; + private String name; + private int priority; + private boolean isFullDay; + private boolean isPrivate; + private String start; + private String end; + + private LocalDateTime date; + + private int ownerId; + private String ownerName; + + /* + Constructor for SELECT: + e.id AS eid, + e.name AS ename, + e.start, + e.end, + e.priority, + e.is_full_day, + + ue.date, + + u.id AS uid, + u.forename, + u.name AS uname + */ + + public Event(ArrayList arr) { + id = (int) arr.get(0); + name = (String) arr.get(1); + start = (String) arr.get(2); + end = (String) arr.get(3); + priority = (int) arr.get(4); + isFullDay = (Boolean) arr.get(5); //((String)arr.get(5)).equals("true"); + + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + date = LocalDateTime.parse(arr.get(6) + " 00:00", formatter); + + ownerId = (int) arr.get(7); + ownerName = arr.get(8) + " " + arr.get(9); + } + + public Event(String name, + int priority, + boolean isFullDay, + boolean isPrivate, + String start, + String end, + LocalDateTime date, + int ownerId + ) { + this.name = name; + this.priority = priority; + this.isFullDay = isFullDay; + this.isPrivate = isPrivate; + this.start = start; + this.end = end; + this.date = date; + this.ownerId = ownerId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; + } + + public boolean isFullDay() { + return isFullDay; + } + + public void setFullDay(boolean fullDay) { + isFullDay = fullDay; + } + + public boolean isPrivate() { + return isPrivate; + } + + public void setPrivate(boolean aPrivate) { + isPrivate = aPrivate; + } + + public String getStart() { + return start; + } + + public void setStart(String start) { + this.start = start; + } + + public String getEnd() { + return end; + } + + public void setEnd(String end) { + this.end = end; + } + + public LocalDateTime getDate() { + return date; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + public int getOwnerId() { + return ownerId; + } + + public void setOwnerId(int ownerId) { + this.ownerId = ownerId; + } + + public String getOwnerName() { + return ownerName; + } + + public void setOwnerName(String ownerName) { + this.ownerName = ownerName; + } + + @Override + public String toString() { + return name + + "\nVon: " + start + + "\nBis: " + start + + (isFullDay ? "\nDen ganzen Tag lang" : ""); + + } + + public String getAsUrlParam() { + return "userId=" + getOwnerId() + + "&date=" + getDate().toLocalDate() + + "&name=" + getName() + + "&start=" + getStart() + + "&end=" + getEnd() + + "&prority=" + getPriority() + + "&isFullDay=" + isFullDay() + + "&isPrivate=" + isPrivate(); + } +} diff --git a/client/data/src/main/java/res/HttpRequest.java b/client/data/src/main/java/res/HttpRequest.java new file mode 100644 index 0000000..183efb8 --- /dev/null +++ b/client/data/src/main/java/res/HttpRequest.java @@ -0,0 +1,76 @@ +package res; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +public class HttpRequest { + public String sendPostRequest(String urlString, String urlParameters) throws Exception{ + byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8); + int postDataLength = postData.length; + + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + + con.setDoOutput(true); + con.setInstanceFollowRedirects(false); + con.setRequestMethod("POST"); + con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + con.setRequestProperty("charset", "utf-8"); + con.setRequestProperty("Content-Length", Integer.toString(postDataLength)); + con.setUseCaches(false); + try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) { + wr.write(postData); + } + + int status = con.getResponseCode(); + if (status == 200) { + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + + con.disconnect(); + return content.toString(); + } else { + con.disconnect(); + throw new Exception("Status: " + status); + } + } + + public String sendGetRequest(String urlString) throws Exception{ + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + int status = con.getResponseCode(); + if (status == 200) { + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + + con.disconnect(); + return content.toString(); + + } else { + con.disconnect(); + throw new Exception("Status: " + status); + } + } +} diff --git a/client/gradle/wrapper/gradle-wrapper.properties b/client/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..63e1207 --- /dev/null +++ b/client/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Nov 15 11:51:46 CET 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip diff --git a/client/gradlew b/client/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/client/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/client/gradlew.bat b/client/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/client/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/client/settings.gradle.kts b/client/settings.gradle.kts new file mode 100644 index 0000000..c43cf6e --- /dev/null +++ b/client/settings.gradle.kts @@ -0,0 +1,2 @@ +include("app") +include("data")