/* * 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.servlet; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.ws.rs.DefaultValue; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import org.glassfish.jersey.server.mvc.Viewable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.web.version.VersionInfo; import org.terasology.web.model.Result; import org.terasology.web.model.ServerEntry; import org.terasology.web.model.ServerListModel; import com.google.common.collect.ImmutableMap; /** */ @Path("/servers/") public class ServerServlet { private static final Logger logger = LoggerFactory.getLogger(ServerServlet.class); private ServerListModel model; public ServerServlet(ServerListModel model) { this.model = model; } @GET @Path("show") @Produces(MediaType.TEXT_HTML) public Viewable show() { logger.info("Requested server list as HTML"); ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("items", list()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/server-list.ftl", dataModel); } @GET @Path("add") @Produces(MediaType.TEXT_HTML) public Viewable add() { logger.info("Requested add as HTML"); ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("name", "") .put("address", "") .put("port", 25777) .put("owner", "") .put("active", false) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/add.ftl", dataModel); } @GET @Path("edit") @Produces(MediaType.TEXT_HTML) public Viewable edit(@QueryParam("index") @DefaultValue("-1") int index) throws IOException { List<ServerEntry> servers = model.getServers(); if (index < 0 || index >= servers.size()) { return null; } ServerEntry server = servers.get(index); ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("name", server.getName()) .put("address", server.getAddress()) .put("port", server.getPort()) .put("owner", server.getOwner()) .put("active", server.isActive()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/edit.ftl", dataModel); } @GET @Path("list") @Produces(MediaType.APPLICATION_JSON) public Object list() { logger.info("Requested server list"); try { return model.getServers(); } catch (IOException e) { logger.error("Could not connect to database", e); return Collections.emptyList(); } } @POST @Path("add") @Produces(MediaType.TEXT_HTML) public Viewable add(@FormParam("name") String name, @FormParam("address") String address, @FormParam("port") int port, @FormParam("owner") String owner, @FormParam("active") String activeOn, @FormParam("secret") String secret) { boolean active = "on".equals(activeOn); logger.info("Requested addition: name: {}, address: {}, port:{}, owner:{}, active:{}", name, address, port, owner, active); Result response = model.addServer(name, address, port, owner, active, secret); if (response.isSuccess()) { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("items", list()) .put("message", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/server-list.ftl", dataModel); } else { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("name", name) .put("address", address) .put("port", port) .put("owner", owner) .put("active", active) .put("error", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/add.ftl", dataModel); } } @POST @Path("remove") @Produces(MediaType.TEXT_HTML) public Viewable remove(@FormParam("name") String name, @FormParam("address") String address, @FormParam("port") int port, @FormParam("owner") String owner, @FormParam("active") String activeOn, @FormParam("secret") String secret) { boolean active = "on".equals(activeOn); Result response = model.removeServer(address, port, secret); if (response.isSuccess()) { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("items", list()) .put("message", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/server-list.ftl", dataModel); } else { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("name", name) .put("address", address) .put("port", port) .put("owner", owner) .put("active", active) .put("error", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/edit.ftl", dataModel); } } @POST @Path("update") @Produces(MediaType.TEXT_HTML) public Viewable update(@FormParam("name") String name, @FormParam("address") String address, @FormParam("port") int port, @FormParam("owner") String owner, @FormParam("active") String activeOn, @FormParam("secret") String secret) { boolean active = "on".equals(activeOn); Result response = model.updateServer(name, address, port, owner, active, secret); if (response.isSuccess()) { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("items", list()) .put("message", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/server-list.ftl", dataModel); } else { ImmutableMap<Object, Object> dataModel = ImmutableMap.builder() .put("name", name) .put("address", address) .put("port", port) .put("owner", owner) .put("active", active) .put("error", response.getMessage()) .put("version", VersionInfo.getVersion()) .build(); return new Viewable("/edit.ftl", dataModel); } } }