Commits (2)
/src/server/logs/
/src/server/world/
/src/server/plugins/
/src/server/world_nether/
/src/server/world_the_end/
*.class
/.idea/inspectionProfiles/Project_Default.xml
/.idea/sqldialects.xml
*.mca
.console_history
......@@ -20,6 +20,10 @@
<excludeFolder url="file://$MODULE_DIR$/src/server/logs" />
<excludeFolder url="file://$MODULE_DIR$/.idea/dataSources" />
<excludeFolder url="file://$MODULE_DIR$/target" />
<excludeFolder url="file://$MODULE_DIR$/src/server/plugins" />
<excludeFolder url="file://$MODULE_DIR$/src/server/world" />
<excludeFolder url="file://$MODULE_DIR$/src/server/world_nether" />
<excludeFolder url="file://$MODULE_DIR$/src/server/world_the_end" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
......
package de._82grfl1bif.KPI_Visualizer.commands;
package de._82grfl1bif.kpiVisualizer.commands;
import de._82grfl1bif.KPI_Visualizer.data.DataHolder;
import de._82grfl1bif.KPI_Visualizer.data.JsonParser;
import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.Rectangle;
import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.Row;
import de._82grfl1bif.KPI_Visualizer.layouts.TreeMap.SquarifiedTreemapLayout;
import de._82grfl1bif.KPI_Visualizer.structures.*;
import de._82grfl1bif.kpiVisualizer.data.DataHolder;
import de._82grfl1bif.kpiVisualizer.data.JsonParser;
import de._82grfl1bif.kpiVisualizer.layouts.treeMap.Rectangle;
import de._82grfl1bif.kpiVisualizer.layouts.treeMap.Row;
import de._82grfl1bif.kpiVisualizer.layouts.treeMap.SquarifiedTreemapLayout;
import de._82grfl1bif.kpiVisualizer.structures.Builder;
import de._82grfl1bif.kpiVisualizer.structures.Building;
import de._82grfl1bif.kpiVisualizer.structures.Foundation;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
......@@ -21,7 +24,7 @@ import java.awt.*;
import java.util.Map;
import java.util.logging.Level;
public class generateLayout implements CommandExecutor {
public class GenerateLayout implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
......@@ -29,7 +32,6 @@ public class generateLayout implements CommandExecutor {
sender.sendMessage("please type or select the needed Arguments with tab.");
return false;
}
sender.sendMessage("generating SimpleSquareLayout");
Server server = sender.getServer();
Builder builder = new Builder(server);
Player player = server.getPlayer(sender.getName());
......@@ -41,6 +43,7 @@ public class generateLayout implements CommandExecutor {
if (player != null) { //check if Player exists for getting Start coordinates.
Location location = player.getLocation();
if (args[1].equals("SquarifiedTreemap")) { //check 2. Argument whether to use SquarifiedTreemap or SimpleSquare Layout.
sender.sendMessage("generating SquarifiedTreemapLayout");
BukkitRunnable t = new BukkitRunnable() {
@Override
public void run() {
......@@ -56,18 +59,13 @@ public class generateLayout implements CommandExecutor {
}else{
builder.fillQube(location.clone().add(r.getOrigin().x,s.getDepth()+100,r.getOrigin().y),(int)(r.getWidth()),((Building)s).getHeight(),(int)(r.getHeight()),s.getMaterial());
}
if(r.getHeight() >= 5 && r.getWidth() >= 5){
}else{
Bukkit.getLogger().log(Level.SEVERE,"the rectangle is too small");
}
}
}
}
};
t.run();
return true;
} else {
sender.sendMessage("generating SimpleSquareLayout");
BukkitRunnable t = new BukkitRunnable() {
@Override
public void run() {
......@@ -80,11 +78,11 @@ public class generateLayout implements CommandExecutor {
}
};
t.run();
return true;
}
return true;
} else {
Bukkit.getLogger().log(Level.SEVERE, "Kein Spieler gefunden.");
Bukkit.getLogger().log(Level.SEVERE, "no player found.");
return false;
}
}
......
package de._82grfl1bif.KPI_Visualizer.commands;
package de._82grfl1bif.kpiVisualizer.commands;
import de._82grfl1bif.KPI_Visualizer.data.DataHolder;
import de._82grfl1bif.KPI_Visualizer.structures.Builder;
import de._82grfl1bif.KPI_Visualizer.structures.Building;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.data.DataHolder;
import de._82grfl1bif.kpiVisualizer.structures.Builder;
import de._82grfl1bif.kpiVisualizer.structures.Building;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Server;
......@@ -15,6 +15,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.logging.Level;
@Deprecated
public class SetPreset implements CommandExecutor {
@Override
......@@ -41,7 +42,7 @@ public class SetPreset implements CommandExecutor {
t.run();
}
} else {
Bukkit.getLogger().log(Level.SEVERE, "Kein Spieler gefunden.");
Bukkit.getLogger().log(Level.SEVERE, "no player found.");
return false;
}
return true;
......
package de._82grfl1bif.KPI_Visualizer.data;
package de._82grfl1bif.kpiVisualizer.data;
import de._82grfl1bif.KPI_Visualizer.structures.Building;
import de._82grfl1bif.KPI_Visualizer.structures.Foundation;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.structures.Building;
import de._82grfl1bif.kpiVisualizer.structures.Foundation;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import org.bukkit.Material;
import java.util.ArrayList;
......@@ -70,7 +70,6 @@ public class DataHolder {
public static void generateTreeFromKlassenList(ArrayList<Klasse> klassen) {
foundation = new Foundation(0, Material.YELLOW_CONCRETE);
ArrayList<String> Pakete = new ArrayList<>();
for (Klasse currentKlasse : klassen) {
if (currentKlasse.depth >= 0) {
String[] strings = currentKlasse.path.split("/");
......@@ -98,6 +97,7 @@ public class DataHolder {
}
}
@Deprecated
private static Building generateBuilding() {
Building result = new Building(ThreadLocalRandom.current().nextInt(4, 60 + 1), ThreadLocalRandom.current().nextInt(4, 200 + 1), Material.LIME_CONCRETE);
result.setLocation(foundation.getLocation());
......
package de._82grfl1bif.KPI_Visualizer.data;
package de._82grfl1bif.kpiVisualizer.data;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
......@@ -6,10 +6,16 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
public class JsonParser {
......@@ -36,13 +42,13 @@ public class JsonParser {
JSONArray entities = (JSONArray) jsonObject.get("entities");
ArrayList<Klasse> entitiesList = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd kk:mm:ss Z");
for (int i=0; i < entities.size(); i++) {
JSONObject object = (JSONObject) entities.get(i);
JSONArray commits = (JSONArray) ((JSONObject) entities.get(i)).get("commits");
for (Object entity : entities) {
JSONObject object = (JSONObject) entity;
JSONArray commits = (JSONArray) ((JSONObject) entity).get("commits");
ArrayList<LocalDateTime> dates = new ArrayList<>();
for (Object o: commits){
for (Object o : commits) {
Object date = ((JSONObject) o).get("date");
LocalDateTime time = LocalDateTime.parse(date.toString(),formatter);
LocalDateTime time = LocalDateTime.parse(date.toString(), formatter);
dates.add(time);
}
Klasse currentKlasse = new Klasse(
......@@ -56,7 +62,7 @@ public class JsonParser {
((JSONArray) object.get("variables")).size(),
Math.round(Float.parseFloat(object.get("complexity").toString())),
dates);
if(currentKlasse.depth != -1)entitiesList.add(currentKlasse);
if (currentKlasse.depth != -1) entitiesList.add(currentKlasse);
}
entitiesList.sort(new DepthComparator());
DataHolder.generateTreeFromKlassenList(entitiesList);
......
package de._82grfl1bif.KPI_Visualizer.data;
package de._82grfl1bif.kpiVisualizer.data;
import java.time.Duration;
import java.time.LocalDateTime;
......@@ -32,15 +32,15 @@ public class Klasse {
public static int variablesMin= Integer.MAX_VALUE;
public static int variablesMax;
public Duration bearbeiteteZeit;
public static Duration bearbeiteteZeitMin;
public static Duration bearbeiteteZeitMax;
public Duration zeitSeitLetzterBearbeitung;
public static Duration zeitSeitLetzterBearbeitungMin;
public static Duration zeitSeitLetzterBearbeitungMax;
public Duration zeitSeitErstemCommit;
public static Duration zeitSeitErstemCommitMin;
public static Duration zeitSeitErstemCommitMax;
public Duration existingTime;
public static Duration existingTimeMin;
public static Duration existingTimeMax;
public Duration lastEditingTime;
public static Duration lastEditingTimeMin;
public static Duration lastEditingTimeMax;
public Duration firstCommitTime;
public static Duration firstCommitTimeMin;
public static Duration firstCommitTimeMax;
ArrayList<LocalDateTime> commitTimes;
public Klasse(int id, String name, String path, int qloc, int loc, int commits, int functions, int variables,int complexity, ArrayList<LocalDateTime> commitTimes){
......@@ -68,26 +68,26 @@ public class Klasse {
this.name = name;
this.path = path;
this.commitTimes = commitTimes;
this.bearbeiteteZeit = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(commitTimes.size()-1), commitTimes.get(0));
if (bearbeiteteZeit != null) {
if(bearbeiteteZeitMax == null)bearbeiteteZeitMax = Duration.ofMillis(Long.MIN_VALUE);
if(bearbeiteteZeitMin == null)bearbeiteteZeitMin = Duration.ofMillis((Long.MAX_VALUE));
bearbeiteteZeitMax = (bearbeiteteZeitMax.toMillis() >= bearbeiteteZeit.toMillis()) ? bearbeiteteZeitMax:bearbeiteteZeit;
bearbeiteteZeitMin = (bearbeiteteZeitMin.toMillis() <= bearbeiteteZeit.toMillis()) ? bearbeiteteZeitMin:bearbeiteteZeit;
this.existingTime = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(commitTimes.size()-1), commitTimes.get(0));
if (existingTime != null) {
if(existingTimeMax == null) existingTimeMax = Duration.ofMillis(Long.MIN_VALUE);
if(existingTimeMin == null) existingTimeMin = Duration.ofMillis((Long.MAX_VALUE));
existingTimeMax = (existingTimeMax.toMillis() >= existingTime.toMillis()) ? existingTimeMax : existingTime;
existingTimeMin = (existingTimeMin.toMillis() <= existingTime.toMillis()) ? existingTimeMin : existingTime;
}
this.zeitSeitLetzterBearbeitung = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(0),LocalDateTime.now());
if (zeitSeitLetzterBearbeitung != null) {
if(zeitSeitLetzterBearbeitungMax == null)zeitSeitLetzterBearbeitungMax = Duration.ofMillis(Long.MIN_VALUE);
if(zeitSeitLetzterBearbeitungMin == null)zeitSeitLetzterBearbeitungMin = Duration.ofMillis(Long.MAX_VALUE);
zeitSeitLetzterBearbeitungMax = (zeitSeitLetzterBearbeitungMax.toMillis() >= zeitSeitLetzterBearbeitung.toMillis()) ? zeitSeitLetzterBearbeitungMax:zeitSeitLetzterBearbeitung;
zeitSeitLetzterBearbeitungMin = (zeitSeitLetzterBearbeitungMin.toMillis() <= zeitSeitLetzterBearbeitung.toMillis()) ? zeitSeitLetzterBearbeitungMin:zeitSeitLetzterBearbeitung;
this.lastEditingTime = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(0),LocalDateTime.now());
if (lastEditingTime != null) {
if(lastEditingTimeMax == null) lastEditingTimeMax = Duration.ofMillis(Long.MIN_VALUE);
if(lastEditingTimeMin == null) lastEditingTimeMin = Duration.ofMillis(Long.MAX_VALUE);
lastEditingTimeMax = (lastEditingTimeMax.toMillis() >= lastEditingTime.toMillis()) ? lastEditingTimeMax : lastEditingTime;
lastEditingTimeMin = (lastEditingTimeMin.toMillis() <= lastEditingTime.toMillis()) ? lastEditingTimeMin : lastEditingTime;
}
this.zeitSeitErstemCommit = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(commitTimes.size()-1),LocalDateTime.now());
if (zeitSeitErstemCommit != null) {
if(zeitSeitErstemCommitMax == null)zeitSeitErstemCommitMax = Duration.ofMillis(Long.MIN_VALUE);
if(zeitSeitErstemCommitMin == null)zeitSeitErstemCommitMin = Duration.ofMillis(Long.MAX_VALUE);
zeitSeitErstemCommitMax = (zeitSeitErstemCommitMax.toMillis() >= zeitSeitErstemCommit.toMillis()) ? zeitSeitErstemCommitMax:zeitSeitErstemCommit;
zeitSeitErstemCommitMin = (zeitSeitErstemCommitMin.toMillis() <= zeitSeitErstemCommit.toMillis()) ? zeitSeitErstemCommitMin:zeitSeitErstemCommit;
this.firstCommitTime = (commitTimes.isEmpty()) ? null:Duration.between(commitTimes.get(commitTimes.size()-1),LocalDateTime.now());
if (firstCommitTime != null) {
if(firstCommitTimeMax == null) firstCommitTimeMax = Duration.ofMillis(Long.MIN_VALUE);
if(firstCommitTimeMin == null) firstCommitTimeMin = Duration.ofMillis(Long.MAX_VALUE);
firstCommitTimeMax = (firstCommitTimeMax.toMillis() >= firstCommitTime.toMillis()) ? firstCommitTimeMax : firstCommitTime;
firstCommitTimeMin = (firstCommitTimeMin.toMillis() <= firstCommitTime.toMillis()) ? firstCommitTimeMin : firstCommitTime;
}
}
......
package de._82grfl1bif.KPI_Visualizer.helpers;
package de._82grfl1bif.kpiVisualizer.helpers;
import de._82grfl1bif.KPI_Visualizer.data.JsonParser;
import de._82grfl1bif.kpiVisualizer.data.JsonParser;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
......
package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare;
package de._82grfl1bif.kpiVisualizer.layouts.simpleSquare;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import java.awt.*;
import java.awt.Point;
import java.util.ArrayList;
public class Quadrat extends Shape {
private Boolean belegt;
private Boolean filled;
public Structure getStructure() {
return structure;
......@@ -19,9 +19,9 @@ public class Quadrat extends Shape {
this.bottomLeftCorner = bottomLeftCorner;
this.topRightCorner = topRightCorner;
this.xEdgeLength = topRightCorner.x-bottomLeftCorner.x;
this.belegt=false;
this.filled =false;
if(topRightCorner.y-bottomLeftCorner.y < 3 || topRightCorner.x-bottomLeftCorner.x <3){
throw new IllegalArgumentException("keine Quadrate < 3 erlaubt");
throw new IllegalArgumentException("no Quadrate < 3 permitted");
}
}
......@@ -29,14 +29,14 @@ public class Quadrat extends Shape {
this.xEdgeLength = xEdgeLength;
this.bottomLeftCorner = bottomLeftCorner;
this.topRightCorner = new Point(bottomLeftCorner.x+xEdgeLength,bottomLeftCorner.y+xEdgeLength);
this.belegt = false;
this.filled = false;
if(xEdgeLength < 3 || topRightCorner.x-bottomLeftCorner.x <3){
throw new IllegalArgumentException("keine Quadrate < 3 erlaubt " + xEdgeLength);
throw new IllegalArgumentException("no Quadrate < 3 permitted " + xEdgeLength);
}
}
public ArrayList<Quadrat> setBelegt(Structure structure) {
this.belegt = true;
public ArrayList<Quadrat> setFilled(Structure structure) {
this.filled = true;
this.structure = structure;
ArrayList<Quadrat> result = new ArrayList<>();
if(this.xEdgeLength > structure.getWidth().x+3){//if you can split rest into more quads
......@@ -54,14 +54,15 @@ public class Quadrat extends Shape {
return result;
}
public Boolean getBelegt() {
return belegt;
public Boolean getFilled() {
return filled;
}
public Point getWidth(){
return new Point(topRightCorner.x-bottomLeftCorner.x,topRightCorner.y-bottomLeftCorner.y);
}
@Deprecated
public void applyCoordinates(Point coordinates){
this.bottomLeftCorner = coordinates;
}
......
package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare;
package de._82grfl1bif.kpiVisualizer.layouts.simpleSquare;
import java.awt.*;
import java.awt.Point;
import java.util.ArrayList;
public class Rectangle extends Shape {
......
package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare;
package de._82grfl1bif.kpiVisualizer.layouts.simpleSquare;
import java.awt.Point;
......
package de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare;
package de._82grfl1bif.kpiVisualizer.layouts.simpleSquare;
import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Quadrat;
import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import javax.management.AttributeNotFoundException;
import java.awt.*;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Comparator;
......@@ -51,16 +49,16 @@ public class SimpleSquareLayout {
first = false;
this.size = s.getWidth().x;
layout.add(new Quadrat(new Point(0,0),s.getWidth().x));
layout.addAll(layout.get(0).setBelegt(s));
layout.addAll(layout.get(0).setFilled(s));
}else{
layout.sort(new CoordinateYComparator());
layout.sort(new CoordinateXComparator());
layout.sort(new WidthComparator());
boolean noneFoundFlag = true;
for (int i = 0;i < layout.size();i++) {
if((s.getWidth().x <= layout.get(i).getWidth().x)&&(!layout.get(i).getBelegt())&&(noneFoundFlag)){
if((s.getWidth().x <= layout.get(i).getWidth().x)&&(!layout.get(i).getFilled())&&(noneFoundFlag)){
noneFoundFlag = false;
layout.addAll(layout.get(i).setBelegt(s));
layout.addAll(layout.get(i).setFilled(s));
}
}
if (noneFoundFlag){
......@@ -72,27 +70,27 @@ public class SimpleSquareLayout {
private void appendQuad(Structure structure){
Quadrat q = new Quadrat(new Point(this.size,0),structure.getWidth().x);
q.setBelegt(structure);
q.setFilled(structure);
this.size += structure.getWidth().x;
layout.add(q);
layout.add(new Quadrat(new Point(q.bottomLeftCorner.y,q.bottomLeftCorner.x),new Point(q.topRightCorner.y,q.topRightCorner.x))); // gespiegeltes Quadrat
layout.add(new Quadrat(new Point(q.bottomLeftCorner.x,q.bottomLeftCorner.x),structure.getWidth().x)); // Oberes rechtes Quadrat
if((this.size-(2*structure.getWidth().x)) > 0){ //falls Abstand zwischen den Quadraten ist.
de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle rTop = new de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x));
if((this.size-(2*structure.getWidth().x)) > 0){ //in case there is space between those quads.
de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle rTop = new de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle(structure.getWidth().x,(this.size-2*structure.getWidth().x),new Point(q .topRightCorner.y,q.bottomLeftCorner.x));
layout.addAll(rTop.splitToQuads(rTop));
de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y));
de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.Rectangle rRight = new Rectangle((this.size-2*structure.getWidth().x),structure.getWidth().x,new Point(q.bottomLeftCorner.x,q.topRightCorner.y));
layout.addAll(rRight.splitToQuads(rRight));
}
}
public Point getCoordinateOf(Structure structure) throws AttributeNotFoundException {
for (Quadrat q:this.layout) {
if(q.getBelegt()){
if(q.getFilled()){
if(q.getStructure().equals(structure)){
return q.bottomLeftCorner;
}
}
}
throw new AttributeNotFoundException("Diese Structure ist nicht in der Ebene.");
throw new AttributeNotFoundException("This structure couldn't found in the hierarchy.");
}
}
package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap;
package de._82grfl1bif.kpiVisualizer.layouts.treeMap;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.awt.Point;
public class Rectangle{
......
package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap;
package de._82grfl1bif.kpiVisualizer.layouts.treeMap;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import java.awt.*;
import java.awt.Point;
import java.util.HashMap;
import java.util.Map;
......
package de._82grfl1bif.KPI_Visualizer.layouts.TreeMap;
package de._82grfl1bif.kpiVisualizer.layouts.treeMap;
import de._82grfl1bif.KPI_Visualizer.structures.Foundation;
import de._82grfl1bif.KPI_Visualizer.structures.Structure;
import de._82grfl1bif.kpiVisualizer.structures.Foundation;
import de._82grfl1bif.kpiVisualizer.structures.Structure;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class SquarifiedTreemapLayout {
private ArrayList<Row> rows = new ArrayList<>();
private final ArrayList<Row> rows;
public ArrayList<Row> getRows() {
return rows;
......@@ -28,7 +25,7 @@ public class SquarifiedTreemapLayout {
ArrayList<Row> tempRows = new ArrayList<>();
rows.stream().filter(r -> r.rectangles.containsValue(foundations.get(foundations.size()-1))).forEach(row ->
tempRows.addAll(generateSubLayout(foundations.get(foundations.size()-1), new Rectangle(foundations.get(foundations.size()-1).getArea(), row.getWidth(), row.space.getOrigin()))));
rows.addAll(tempRows);//letztes element bearbeitet und ein subLayout dafür angelegt.
rows.addAll(tempRows);//last element processed and created a sublayout.
ArrayList<Foundation> tempFoundations = new ArrayList<>();
for (Structure s : foundations.get(foundations.size() - 1).getChildren()) {
......@@ -37,7 +34,7 @@ public class SquarifiedTreemapLayout {
}
}
foundations.remove(foundations.size()-1);
foundations.addAll(tempFoundations);//alle Kinder(nur Foundations) des letzten Elements in die Liste geschrieben und das Element entfernt.
foundations.addAll(tempFoundations);//all children(just Foundations) added and removed the Foundation.
} while (!foundations.isEmpty());
}
......@@ -46,11 +43,11 @@ public class SquarifiedTreemapLayout {
ArrayList<Row> result = new ArrayList<>();
result.add(new Row(rectangle));
for (Structure s : foundation.getChildren()) {
if (!result.get(result.size() - 1).checkInsert(s.getArea())) {//wenn einfügen in die bestehende Reihe das Seitenverhältnis verschlechtern würde.
Row tempRow = new Row(result.get(result.size() - 1).getLeftover());//erzeige neue Reihe mit dem Rest des alten spaces als space.
result.add(tempRow);//füge die neue Reihe ans Ende der Sammlung ein.
if (!result.get(result.size() - 1).checkInsert(s.getArea())) {//in case an insertion would make the ratio worse.
Row tempRow = new Row(result.get(result.size() - 1).getLeftover());//create new Row with the remaining space of the old Row.
result.add(tempRow);//put the new Row at the end of the list.
}
result.get(result.size() - 1).addRectangle(s.getArea(), s);//füge das Kind in die letzte Reihe ein, die in der Liste ist.
result.get(result.size() - 1).addRectangle(s.getArea(), s);//put the child in the last Row of the list.
}
return result;
}
......
package de._82grfl1bif.KPI_Visualizer;
package de._82grfl1bif.kpiVisualizer;
import de._82grfl1bif.KPI_Visualizer.commands.SetPreset;
import de._82grfl1bif.KPI_Visualizer.commands.generateLayout;
import de._82grfl1bif.KPI_Visualizer.helpers.FileInputTabCompleter;
import de._82grfl1bif.kpiVisualizer.commands.GenerateLayout;
import de._82grfl1bif.kpiVisualizer.commands.SetPreset;
import de._82grfl1bif.kpiVisualizer.helpers.FileInputTabCompleter;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Objects;
public final class main extends JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
getCommand("setPreset").setExecutor(new SetPreset());
getCommand("generateLayout").setExecutor(new generateLayout());
getCommand("generateLayout").setTabCompleter(new FileInputTabCompleter());
Objects.requireNonNull(getCommand("setPreset")).setExecutor(new SetPreset());
Objects.requireNonNull(getCommand("generateLayout")).setExecutor(new GenerateLayout());
Objects.requireNonNull(getCommand("generateLayout")).setTabCompleter(new FileInputTabCompleter());
}
@Override
......
package de._82grfl1bif.KPI_Visualizer.structures;
package de._82grfl1bif.kpiVisualizer.structures;
import de._82grfl1bif.KPI_Visualizer.data.Klasse;
import de._82grfl1bif.kpiVisualizer.data.Klasse;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
......@@ -10,10 +10,10 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import java.time.Duration;
import java.util.Objects;
import java.util.Random;
import java.util.logging.Level;
import static de._82grfl1bif.KPI_Visualizer.data.Klasse.zeitSeitLetzterBearbeitungMin;
public class Builder {
......@@ -94,7 +94,7 @@ public class Builder {
setWalls(startLocation, x, y, z, innerMaterial, glassMaterial);
setCorners(startLocation, x, y, z, facadeMaterial);
setFoundation(startLocation.clone().add(0, y, 0), x, z, facadeMaterial);//roof
fillQube(startLocation.clone().add(Math.round(x/2),y+1,Math.round(x/2)),1,antennaHeight,1,Material.COBBLESTONE_WALL);
fillQube(startLocation.clone().add(Math.round(x/2f),y+1,Math.round(x/2f)),1,antennaHeight,1,Material.COBBLESTONE_WALL);
Random rm = new Random();
switch (rm.nextInt(3)+1){
case 1: setCrane(startLocation,x,y,z,craneHeight,BlockFace.NORTH);
......@@ -115,48 +115,46 @@ public class Builder {
addDescription(s.getLocation().clone().add(0, s.getDepth(), 0), s);
setAllChildren((Foundation) s);
} else {//TODO must be revisited to draw rectangular Buildings
float ersterCommit = ((Building) s).klasse.zeitSeitErstemCommit.toDays();
float scaleErsterCommit;
if((float)Klasse.zeitSeitErstemCommitMin.toDays() == (float)Klasse.zeitSeitErstemCommitMax.toDays()){
scaleErsterCommit = 0f;
float firstCommit = ((Building) s).klasse.firstCommitTime.toDays();
float scaleFirstCommit;
if((float)Klasse.firstCommitTimeMin.toDays() == (float)Klasse.firstCommitTimeMax.toDays()){
scaleFirstCommit = 0f;
}else {
scaleErsterCommit = ((ersterCommit - (float)Klasse.zeitSeitErstemCommitMin.toDays()) / ((float) Klasse.zeitSeitErstemCommitMax.toDays() - (float)Klasse.zeitSeitErstemCommitMin.toDays()));
scaleFirstCommit = ((firstCommit - (float)Klasse.firstCommitTimeMin.toDays()) / ((float) Klasse.firstCommitTimeMax.toDays() - (float)Klasse.firstCommitTimeMin.toDays()));
}
Duration d = ((Building) s).klasse.zeitSeitLetzterBearbeitung;
float letzterBearbeitung = d.toDays();
float scaleLetzterBearbeitung;
if((float)Klasse.zeitSeitLetzterBearbeitungMin.toDays() == (float)Klasse.zeitSeitLetzterBearbeitungMax.toDays()){
scaleLetzterBearbeitung = 0f;
Duration d = ((Building) s).klasse.lastEditingTime;
float lastCommit = d.toDays();
float scaleLastCommit;
if((float)Klasse.lastEditingTimeMin.toDays() == (float)Klasse.lastEditingTimeMax.toDays()){
scaleLastCommit = 0f;
}else {
scaleLetzterBearbeitung = ((letzterBearbeitung - (float)Klasse.zeitSeitLetzterBearbeitungMin.toDays()) / ((float)Klasse.zeitSeitLetzterBearbeitungMax.toDays() - (float)Klasse.zeitSeitLetzterBearbeitungMin.toDays()));
scaleLastCommit = ((lastCommit - (float)Klasse.lastEditingTimeMin.toDays()) / ((float)Klasse.lastEditingTimeMax.toDays() - (float)Klasse.lastEditingTimeMin.toDays()));
}
Material facadeMaterial;
if(scaleErsterCommit < 0.10){
if(scaleFirstCommit < 0.10){
facadeMaterial = Material.WAXED_COPPER_BLOCK;
}else if(scaleErsterCommit < 0.5){
}else if(scaleFirstCommit < 0.5){
facadeMaterial = Material.WAXED_EXPOSED_COPPER;
}else if(scaleErsterCommit < 0.90){
}else if(scaleFirstCommit < 0.90){
facadeMaterial = Material.WAXED_WEATHERED_COPPER;
}else {
facadeMaterial = Material.WAXED_OXIDIZED_COPPER;
}
Material facadeInnerMaterial;
if(scaleLetzterBearbeitung< 0.10){
if(scaleLastCommit< 0.10){
facadeInnerMaterial = Material.WHITE_STAINED_GLASS;
}else if(scaleLetzterBearbeitung < 0.5){
}else if(scaleLastCommit < 0.5){
facadeInnerMaterial = Material.GLASS;
}else if(scaleLetzterBearbeitung < 0.90){
}else if(scaleLastCommit < 0.90){
facadeInnerMaterial = Material.BLUE_STAINED_GLASS;
}else {
facadeInnerMaterial = Material.IRON_BARS;
}
System.out.println(letzterBearbeitung);
System.out.println(scaleLetzterBearbeitung);
this.buildBuilding(s.getLocation().clone().add(1, s.getDepth() + 1,1),
s.getWidth().x - 2,
((Building) s).getHeight()+1,
((Building)s).klasse.commits,
Math.round(((Building)s).klasse.complexity/100),
Math.round(((Building)s).klasse.complexity/100f),
s.getWidth().x - 2,
facadeMaterial,
facadeInnerMaterial,
......@@ -208,9 +206,7 @@ public class Builder {
private void addDescription(Location startLocation, Structure structure) {
if (structure.getClass() == Foundation.class) {
//if (!((Foundation) structure).getChildren().stream().anyMatch(s -> s.getClass() == Foundation.class)) {//no foundation in Children
setFoundationSing(startLocation,(Foundation) structure);
//}
} else {
setWallSing(startLocation, (Building) structure, BlockFace.NORTH);
setWallSing(startLocation, (Building) structure, BlockFace.EAST);
......@@ -281,13 +277,13 @@ public class Builder {
default:
Bukkit.getLogger().log(Level.SEVERE, "falsche Orientierung übergeben!");
}
sign1.setData(matSign);
sign2.setData(matSign);
Objects.requireNonNull(sign1).setData(matSign);
Objects.requireNonNull(sign2o).setData(matSign);
sign1.setGlowingText(true);
sign2.setGlowingText(true);
if (building.name.length() > 60) {
sign1o.setData(matSign);
sign2o.setData(matSign);
Objects.requireNonNull(sign1o).setData(matSign);
Objects.requireNonNull(sign2o).setData(matSign);
sign1o.setGlowingText(true);
sign2o.setGlowingText(true);
setTextToSign(sign1, sign1o, building.name);
......@@ -351,7 +347,6 @@ public class Builder {
}
public void setLegend(Location startLocation){
org.bukkit.material.Sign matSign = new org.bukkit.material.Sign(Material.OAK_WALL_SIGN);
server.getWorlds().get(0).getBlockAt(startLocation.clone().add(0,0,-6)).setType(Material.WAXED_COPPER_BLOCK);
server.getWorlds().get(0).getBlockAt(startLocation.clone().add(0,1,-6)).setType(Material.WAXED_EXPOSED_COPPER);
server.getWorlds().get(0).getBlockAt(startLocation.clone().add(0,2,-6)).setType(Material.WAXED_WEATHERED_COPPER);
......@@ -378,7 +373,7 @@ public class Builder {
private void setLegendBlock(Location startLocation,String s1,String s2,String s3){
org.bukkit.material.Sign matSign = new org.bukkit.material.Sign(Material.OAK_WALL_SIGN);
org.bukkit.block.Sign sign = null;
org.bukkit.block.Sign sign;
server.getWorlds().get(0).getBlockAt(startLocation).setType(Material.OAK_WALL_SIGN);
sign = (org.bukkit.block.Sign) server.getWorlds().get(0).getBlockAt(startLocation).getState();
sign.setGlowingText(true);
......
package de._82grfl1bif.KPI_Visualizer.structures;
package de._82grfl1bif.kpiVisualizer.structures;
import de._82grfl1bif.KPI_Visualizer.data.Klasse;
import de._82grfl1bif.kpiVisualizer.data.Klasse;
import org.bukkit.Material;
import java.awt.Point;
......@@ -16,28 +16,19 @@ public class Building extends Structure{
this.height = height;
this.material = material;
if(this.width.x < 5){
throw new IllegalArgumentException("keine Gebäude kleiner 5 wegen 2 Gehweg");
}
}
public Building(Point width/*and depth for complex algorithms*/, int height, Material material){
this.width = width;
this.height = height;
this.material = material;
if(this.width.x < 5 || this.width.y < 5){
throw new IllegalArgumentException("keine Gebäude kleiner 5 wegen 2 Gehweg");
throw new IllegalArgumentException("no buildings smaller than 5");
}
}
public Building(Material material, Klasse klasse, String name){ //Buildings are Square -> no depth
this.klasse = klasse;
this.material = material;
this.width = new Point((int)Math.round((klasse.variables+5)),(int)Math.round((klasse.variables+5))); //TODO: make this work with treemap and square
this.width = new Point(Math.round((klasse.variables+5)), Math.round((klasse.variables+5))); //TODO: make this work with treemap and square
this.area = klasse.variables*25;
this.name = name;
this.height = klasse.functions;
if(this.width.x < 5 || this.width.y < 5){
throw new IllegalArgumentException("keine Gebäude kleiner 5 wegen 2 Gehweg");
throw new IllegalArgumentException("no buildings smaller than 5");
}
}
......
package de._82grfl1bif.KPI_Visualizer.structures;
package de._82grfl1bif.kpiVisualizer.structures;
import de._82grfl1bif.KPI_Visualizer.data.Klasse;
import de._82grfl1bif.KPI_Visualizer.layouts.SimpleSquare.SimpleSquareLayout;
import de._82grfl1bif.kpiVisualizer.data.Klasse;
import de._82grfl1bif.kpiVisualizer.layouts.simpleSquare.SimpleSquareLayout;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.util.Vector;
import javax.management.AttributeNotFoundException;
import java.awt.*;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
......@@ -214,13 +214,12 @@ public class Foundation extends Structure {
private boolean baseFoundation = true;
public void organizeFoundation() {
if (this.depth == 0 && baseFoundation) { //rootElement prepwork and recursion call
if (this.depth == 0 && baseFoundation) { //rootElement prep-work and recursion call
ArrayList<Foundation> allFoundations = collectAllFoundations();
baseFoundation = false;
allFoundations.sort(new DepthComparator());
Collections.reverse(allFoundations); //higher Depths first
for (Foundation f : allFoundations) {
//if(!this.equals(f))
f.organizeFoundation();
}
} else { //normal Call and recursion
......@@ -249,6 +248,7 @@ public class Foundation extends Structure {
return fCollection;
}
@Deprecated
public ArrayList<Building> collectAllBuildings() { //called on the base Foundation
ArrayList<Building> buildings = new ArrayList<>();
for (Structure s: children) {
......
package de._82grfl1bif.KPI_Visualizer.structures;
package de._82grfl1bif.kpiVisualizer.structures;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.util.Vector;
import javax.persistence.Column;
import javax.persistence.Entity;
import java.awt.*;
import java.awt.Point;
public abstract class Structure{
......@@ -33,6 +31,7 @@ public abstract class Structure{
this.location = location;
}
@Deprecated
public void addVector(Vector vector){
this.location.add(vector);
}
......