/*
* Copyright 2015 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.web.model;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.web.db.DataBase;
import com.google.common.base.Preconditions;
public class ServerListModelImpl implements ServerListModel {
private static final Logger logger = LoggerFactory.getLogger(ServerListModelImpl.class);
private final DataBase dataBase;
private final String tableName;
private final String editSecret;
public ServerListModelImpl(DataBase dataBase, String tableName, String editSecret) throws SQLException {
Preconditions.checkArgument(dataBase != null, "dataSource must not be null");
Preconditions.checkArgument(tableName != null, "tableName must not be null");
Preconditions.checkArgument(editSecret != null, "editSecret must not be null");
this.dataBase = dataBase;
this.tableName = tableName;
this.editSecret = editSecret;
dataBase.createTable(tableName);
}
@Override
public List<ServerEntry> getServers() throws IOException {
try {
List<Map<String, Object>> data = dataBase.readAll(tableName);
List<ServerEntry> servers = new ArrayList<>(data.size());
for (Map<String, Object> entry : data) {
String address = entry.get("address").toString();
Number port = (Number) entry.get("port");
ServerEntry server = new ServerEntry(address, port.intValue());
server.setName(orNull(entry.get("name")));
server.setOwner(orNull(entry.get("owner")));
server.setCity(orNull(entry.get("city")));
server.setStateprov(orNull(entry.get("stateprov")));
server.setCountry(orNull(entry.get("country")));
server.setActive((Boolean) entry.get("active"));
servers.add(server);
}
return servers;
} catch (Exception e) {
throw new IOException(e);
}
}
private String orNull(Object obj) {
return (obj != null) ? obj.toString() : null;
}
@Override
public Result addServer(String name, String address, int port, String owner, boolean active, String secret) {
try {
Result response = verify(name, address, port, owner, secret);
if (!response.isSuccess()) {
return response;
} else {
dataBase.insert(tableName, name, address, port, owner, active);
return Result.success("Entry added!");
}
} catch (Exception e) {
logger.error("Could not insert entry into server table: " + e.getMessage());
return Result.fail(e.getMessage());
}
}
@Override
public Result removeServer(String address, int port, String secret) {
if (address == null) {
return Result.fail("No address specified");
}
if (port == 0) {
return Result.fail("No port specified");
}
if (!editSecret.equals(secret)) {
return Result.fail("Invalid secret");
}
try {
if (dataBase.remove(tableName, address, port)) {
return Result.success("Entry removed!");
} else {
return Result.fail("Entry not found");
}
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
@Override
public Result updateServer(String name, String address, int port, String owner, boolean active, String secret) {
Result response = verify(name, address, port, owner, secret);
if (!response.isSuccess()) {
return response;
}
try {
if (dataBase.update(tableName, name, address, port, owner, active)) {
return Result.success("Entry updated!");
} else {
return Result.fail("Entry not found");
}
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
private Result verify(String name, String address, int port, String owner, String secret) {
if (name == null) {
return Result.fail("No name specified");
}
if (name.length() < 3 || name.length() > 20) {
return Result.fail("Name length must be in [3..20]");
}
if (port < 1024 || port > 65535) {
return Result.fail("Port must be in [1024..65535]");
}
if (address == null || address.trim().isEmpty()) {
return Result.fail("No address specified");
}
if (owner == null || owner.isEmpty()) {
return Result.fail("No owner specified");
}
try {
InetAddress.getByName(address);
} catch (UnknownHostException e) {
logger.error("Could not resolve host: " + e.getMessage());
return Result.fail("Unknown host: " + address);
}
if (!editSecret.equals(secret)) {
return Result.fail("Invalid secret");
}
return Result.success("OK");
}
}