AdminServerResource.java
/**
* AdministratorServerResource.java This file is part of WattDepot.
*
* Copyright (C) 2013 Cam Moore
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.wattdepot.server.http.api;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.restlet.data.LocalReference;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.freemarker.TemplateRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
import org.restlet.resource.Get;
import org.restlet.security.User;
import org.wattdepot.common.domainmodel.CollectorProcessDefinition;
import org.wattdepot.common.domainmodel.Depository;
import org.wattdepot.common.domainmodel.MeasurementPruningDefinition;
import org.wattdepot.common.domainmodel.MeasurementType;
import org.wattdepot.common.domainmodel.Organization;
import org.wattdepot.common.domainmodel.Sensor;
import org.wattdepot.common.domainmodel.SensorGroup;
import org.wattdepot.common.domainmodel.SensorModel;
import org.wattdepot.common.domainmodel.UserInfo;
import org.wattdepot.common.exception.IdNotFoundException;
import org.wattdepot.common.http.api.API;
/**
* AdministratorServerResource - Administrative interface for WattDepot. It
* handles the HTTP API ("/wattdepot/{org-id}/").
*
* @author Cam Moore
*
*/
public class AdminServerResource extends WattDepotServerResource {
/**
* @return The admin user interface as an HTML Representation.
*/
@Get()
public Representation toHtml() {
getLogger().log(Level.INFO, "GET " + API.BASE_URI + "{" + orgId + "}/");
if (!isInRole(orgId) && !isInRole(Organization.ADMIN_GROUP.getId())) {
User user = getClientInfo().getUser();
// The user isn't in the orgId. Search for the user in other
// organizations.
boolean foundUser = false;
for (UserInfo ui : depot.getUsers()) {
if (ui.getUid().equals(user.getIdentifier()) && isInRole(ui.getOrganizationId())) {
redirectPermanent("/wattdepot/" + ui.getOrganizationId() + "/");
foundUser = true;
}
}
if (!foundUser) {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
}
}
else {
Map<String, Object> dataModel = new HashMap<String, Object>();
dataModel.put("orgId", orgId);
String address = getServerInfo().getAddress();
if (address.startsWith("0")) {
address = "localhost";
}
dataModel.put("serverAddress", address);
dataModel.put("serverPort", getServerInfo().getPort());
Representation rep = null;
TemplateRepresentation template = null;
// decide what to show based upon the orgId.
if (orgId.equals(Organization.ADMIN_GROUP.getId())) {
// admin can manipulate users and organizations
List<UserInfo> users = depot.getUsers();
List<Organization> orgs = depot.getOrganizations();
dataModel.put("users", users);
dataModel.put("orgs", orgs);
dataModel.put("rootUid", UserInfo.ROOT.getUid());
dataModel.put("adminId", Organization.ADMIN_GROUP.getId());
rep = new ClientResource(LocalReference.createClapReference(getClass().getPackage())
+ "/UserAdmin.ftl").get();
}
else {
try {
// regular organization, can manipulate sensors, depositories
depot.getOrganization(orgId, true);
List<Depository> depos = depot.getDepositories(orgId, false);
List<Sensor> sensors = depot.getSensors(orgId, false);
List<SensorModel> sensorModels = depot.getSensorModels();
List<SensorGroup> sensorGroups = depot.getSensorGroups(orgId, false);
List<CollectorProcessDefinition> cpds = depot
.getCollectorProcessDefinitions(orgId, false);
List<MeasurementType> measurementTypes = depot.getMeasurementTypes();
List<MeasurementPruningDefinition> gcds = depot.getMeasurementPruningDefinitions(orgId,
false);
dataModel.put("depositories", depos);
dataModel.put("sensors", sensors);
dataModel.put("sensorgroups", sensorGroups);
dataModel.put("sensormodels", sensorModels);
dataModel.put("cpds", cpds);
dataModel.put("measurementtypes", measurementTypes);
dataModel.put("mpds", gcds);
rep = new ClientResource(LocalReference.createClapReference(getClass().getPackage())
+ "/OrganizationAdmin.ftl").get();
}
catch (IdNotFoundException e) {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST, e.getMessage());
}
}
template = new TemplateRepresentation(rep, dataModel, MediaType.TEXT_HTML);
return template;
}
return null;
}
}