HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

Tracking Containers in a Train Station

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
trackingcontainerstrainstation

Problem

This is a time line for control over the events of some containers in a train station.

It gets all the data to build the time line by getting a JSON from a database via REST service. The app resets every minute to refresh the results and every dot representing a container has some info in a tooltip activated by hovering the mouse.

The app needs 3 external libraries:

  • commons-io-2.4.jar



  • guava-18.0.jar



  • json-simple-1.1.1.jar



There is also a webstart test version online, please use Firefox if you want to try it out: http://www.abaxomol.com/dist/ContenedoresChart.html

ContenedoresChart.java

```
public class ContenedoresChart extends Application {
DrawDots drawDots = new DrawDots();
static DotsArrays dotsArrays = new DotsArrays();
final static NumberAxis xAxis = new NumberAxis();
final static CategoryAxis yAxis = new CategoryAxis();
final static LineChart sc = new
LineChart<>(xAxis,yAxis);
static String fullJSON = "";
@Override
public void start(Stage primaryStage) {
NumberAxis xAxis = new NumberAxis();
CategoryAxis yAxis = new CategoryAxis();
LineChart sc = new
LineChart<>(xAxis,yAxis);

Get_JSON_String.getJSONString();
primaryStage.setTitle("Ferroservicios");
DateFormatter.dateFormatter(xAxis);
xAxis.setLabel("Fecha");
yAxis.setLabel("Contenedores");
sc.setTitle("Eventos de Contenedores");
SeparateContenedores.loadDots(sc);
//sc.setLegendVisible(false);
SetTooltip.setTooltip();
SetTooltip.setSeriesStyle(sc);

LegendItems.setItems(sc);
LegendItems.setTransparent();
Legend legend = (Legend)sc.lookup(".chart-legend");
legend.getItems().removeIf(item->item.getText().equals("hide"));

Scene scene = new Scene(sc, 1200, 1000);
//primaryStage.setMaximized(true);
primaryS

Solution

public class DateFormatter {
    static String date1 = "";
    static String date2 = "";
    static String date3 = "";
    static String date4 = "";
    static String date5 = "";
    static String date6 = "";
    static String date7 = "";

    public static void dateFormatter(NumberAxis xAxis){
        loadDates();
        xAxis.setLowerBound(0.0);
        xAxis.setUpperBound(7.4);
        xAxis.setAutoRanging(false);
        xAxis.setTickUnit(1);
        xAxis.setTickLabelFormatter(new StringConverter() {

            @Override
            public String toString(Number n) {
                if (n.equals(1.00)) return date1;
                if (n.equals(2.00)) return date2;
                if (n.equals(3.00)) return date3;
                if (n.equals(4.00)) return date4;
                if (n.equals(5.00)) return date5;
                if (n.equals(6.00)) return date6;
                if (n.equals(7.00)) return date7;
                return "";
            }

            @Override
            public Number fromString(String string) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });    
    }

    public static void loadDates(){
        try {
        JSONParser parser = new JSONParser();
        String urlJSON = ContenedoresChart.fullJSON;
        JSONObject JSON_obj = (JSONObject) JSONValue.parseWithException(urlJSON);
        //set the value of the dates
        JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
        date1 = String.valueOf(namesArray.get("date1"));
        date2 = String.valueOf(namesArray.get("date2"));
        date3 = String.valueOf(namesArray.get("date3"));
        date4 = String.valueOf(namesArray.get("date4"));
        date5 = String.valueOf(namesArray.get("date5"));
        date6 = String.valueOf(namesArray.get("date6"));
        date7 = String.valueOf(namesArray.get("date7"));

        } catch (ParseException e) {
        //ErrorHandling.showException();
        }
    }
}


Looks good!

But then people say "Can we have a setting to pick how many labels we want to use?" and you're practically screwed. Especially if they want 1 for each day of the month. You'd have to add date8 through date31. That's a lot of typing.

I'd use lists instead:

This

static String date1 = "";
    static String date2 = "";
    static String date3 = "";
    static String date4 = "";
    static String date5 = "";
    static String date6 = "";
    static String date7 = "";


Becomes this

static List dates = new ArrayList();


This

@Override
            public String toString(Number n) {
                if (n.equals(1.00)) return date1;
                if (n.equals(2.00)) return date2;
                if (n.equals(3.00)) return date3;
                if (n.equals(4.00)) return date4;
                if (n.equals(5.00)) return date5;
                if (n.equals(6.00)) return date6;
                if (n.equals(7.00)) return date7;
                return "";
            }


Becomes this

@Override
            public String toString(Number n) {
                int index = n.intValue()-1;
                if(0 <= index && index < dates.size()){
                    return dates.get(index);
                }
                return "";
            }


And this

JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
        date1 = String.valueOf(namesArray.get("date1"));
        date2 = String.valueOf(namesArray.get("date2"));
        date3 = String.valueOf(namesArray.get("date3"));
        date4 = String.valueOf(namesArray.get("date4"));
        date5 = String.valueOf(namesArray.get("date5"));
        date6 = String.valueOf(namesArray.get("date6"));
        date7 = String.valueOf(namesArray.get("date7"));


Becomes this.

dates.clear();
        JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
        for(int i = 1; namesArray.has("date" + i); i++){
            dates.add(String.valueOf(namesArray.get("date"+i)));
        }


You might need to check if you can use has or whether you need something like hasString or hasKey or containsKey.

The end result looks a lot better:

```
public class DateFormatter {
static List dates = new ArrayList();

public static void dateFormatter(NumberAxis xAxis){
loadDates();
xAxis.setLowerBound(0.0);
xAxis.setUpperBound(7.4);
xAxis.setAutoRanging(false);
xAxis.setTickUnit(1);
xAxis.setTickLabelFormatter(new StringConverter() {

@Override
public String toString(Number n) {
int index = n.intValue()-1;
if(0 <= index && index < dates.size()){
return dates.get(index);
}
return "";
}

@Override
public Number fromString(String string) {
throw new UnsupportedOperationExce

Code Snippets

public class DateFormatter {
    static String date1 = "";
    static String date2 = "";
    static String date3 = "";
    static String date4 = "";
    static String date5 = "";
    static String date6 = "";
    static String date7 = "";


    public static void dateFormatter(NumberAxis xAxis){
        loadDates();
        xAxis.setLowerBound(0.0);
        xAxis.setUpperBound(7.4);
        xAxis.setAutoRanging(false);
        xAxis.setTickUnit(1);
        xAxis.setTickLabelFormatter(new StringConverter<Number>() {

            @Override
            public String toString(Number n) {
                if (n.equals(1.00)) return date1;
                if (n.equals(2.00)) return date2;
                if (n.equals(3.00)) return date3;
                if (n.equals(4.00)) return date4;
                if (n.equals(5.00)) return date5;
                if (n.equals(6.00)) return date6;
                if (n.equals(7.00)) return date7;
                return "";
            }

            @Override
            public Number fromString(String string) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });    
    }

    public static void loadDates(){
        try {
        JSONParser parser = new JSONParser();
        String urlJSON = ContenedoresChart.fullJSON;
        JSONObject JSON_obj = (JSONObject) JSONValue.parseWithException(urlJSON);
        //set the value of the dates
        JSONObject namesArray = (JSONObject) JSON_obj.get("dates");
        date1 = String.valueOf(namesArray.get("date1"));
        date2 = String.valueOf(namesArray.get("date2"));
        date3 = String.valueOf(namesArray.get("date3"));
        date4 = String.valueOf(namesArray.get("date4"));
        date5 = String.valueOf(namesArray.get("date5"));
        date6 = String.valueOf(namesArray.get("date6"));
        date7 = String.valueOf(namesArray.get("date7"));

        } catch (ParseException e) {
        //ErrorHandling.showException();
        }
    }
}
static String date1 = "";
    static String date2 = "";
    static String date3 = "";
    static String date4 = "";
    static String date5 = "";
    static String date6 = "";
    static String date7 = "";
static List<String> dates = new ArrayList<String>();
@Override
            public String toString(Number n) {
                if (n.equals(1.00)) return date1;
                if (n.equals(2.00)) return date2;
                if (n.equals(3.00)) return date3;
                if (n.equals(4.00)) return date4;
                if (n.equals(5.00)) return date5;
                if (n.equals(6.00)) return date6;
                if (n.equals(7.00)) return date7;
                return "";
            }
@Override
            public String toString(Number n) {
                int index = n.intValue()-1;
                if(0 <= index && index < dates.size()){
                    return dates.get(index);
                }
                return "";
            }

Context

StackExchange Code Review Q#121650, answer score: 7

Revisions (0)

No revisions yet.