summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/speedment/examples/socialserver/ServerBase.java
blob: 44855a117cf903aceb8ff583a068005fc6a0d75c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.speedment.examples.socialserver;

import com.speedment.common.logger.Logger;
import com.speedment.common.logger.LoggerManager;
import fi.iki.elonen.NanoHTTPD;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static java.util.Optional.ofNullable;
import java.util.stream.Collectors;

/**
 *
 * @author Emil Forslund
 */
public abstract class ServerBase extends NanoHTTPD implements ServerAPI {

    private static final Logger LOGGER = LoggerManager.getLogger(ServerBase.class);

    private static final int PORT = 8281;

    public ServerBase() {
        super(PORT);
        LOGGER.info(" running on http://127.0.0.1:" + PORT + ".");
    }

    @Override
    public NanoHTTPD.Response serve(NanoHTTPD.IHTTPSession session) {
        final Map<String, String> files = new HashMap<>();
        final NanoHTTPD.Method method = session.getMethod();
        final String uri = session.getUri();
        final String command = uri.substring(uri.indexOf("/") + 1);

        if (Method.PUT.equals(method) || Method.POST.equals(method)) {
            try {
                session.parseBody(files);
            } catch (IOException ex) {
                return new Response(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT,
                        "SERVER INTERNAL ERROR: IOException: " + ex.getMessage()
                );
            } catch (ResponseException ex) {
                return new Response(ex.getStatus(), MIME_PLAINTEXT, ex.getMessage());
            }
        }

        final Map<String, String> params = session.getParms();

        LOGGER.debug(method + " '" + uri + "' "
                + params.entrySet().stream()
                .map(e -> "\"" + e.getKey() + "\" = \"" + limitString(e.getValue()) + "\"")
                .collect(Collectors.joining(", ", "(", ")"))
                + " -> "
        );

        final long userId = parseLong(params, "userid");
        final String mail = parseString(params, "mail");
        final String password = parseString(params, "password");
        final String sessionKey = parseString(params, "sessionkey");
        final String title = parseString(params, "title");
        final String description = parseString(params, "description");
        final String imgData = parseString(params, "imgdata");
        final Optional<String> avatar = parseOptional(params, "avatar");
        final String freeText = parseString(params, "freetext");
        final String firstName = parseString(params, "firstname");
        final String lastName = parseString(params, "lastname");
        final Optional<Timestamp> from = parseTime(params, "from");
        final Optional<Timestamp> to = parseTime(params, "to");

        final String msg;
        switch (command) {
            case "register":
                msg = onRegister(mail, password);
                break;
            case "login":
                msg = onLogin(mail, password);
                break;
            case "self":
                msg = onSelf(sessionKey);
                break;
            case "upload":
                msg = onUpload(title, description, imgData, sessionKey);
                break;
            case "find":
                msg = onFind(freeText, sessionKey);
                break;
            case "follow":
                msg = onFollow(userId, sessionKey);
                break;
            case "browse":
                msg = onBrowse(sessionKey, from, to);
                break;
            case "update":
                msg = onUpdate(mail, firstName, lastName, avatar, sessionKey);
                break;
            default:
                msg = "Unknown command.";
                break;
        }

        LOGGER.debug("\"" + msg + "\"");

        return new NanoHTTPD.Response(msg);
    }

    private long parseLong(Map<String, String> params, String command) {
        return parseOptional(params, command).map(Long::parseLong).orElse(-1L);
    }

    private Optional<Timestamp> parseTime(Map<String, String> params, String command) {
        return parseOptional(params, command).map(s -> Timestamp.valueOf(s.replace("T", " ")));
    }

    private String parseString(Map<String, String> params, String command) {
        return parseOptional(params, command).orElse("");
    }

    private Optional<String> parseOptional(Map<String, String> params, String command) {
        return ofNullable(params.get(command)).map(String::trim).filter(p -> !p.isEmpty());
    }

    private String limitString(String s) {
        return limitString(s, 64);
    }

    private String limitString(String s, int len) {
        if (s.length() <= len) {
            return s;
        }
        return s.substring(0, len) + "...";
    }

}