Author: [email protected]
Date: Tue Dec 20 15:00:13 2011
New Revision: 1867
Log:
Added:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/ExampleGadgetDefinitionProviderImpl.java
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/osgi/Activator.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAO.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAOImpl.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantGadgetImpl.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantListenerImpl.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantRESTServiceImpl.java
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/jsp/TenantGadget.jsp
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/js/tenant.js
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/labels/tenantmgmt_ALL_ALL.xml
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/osgi/Activator.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/osgi/Activator.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/osgi/Activator.java
Tue Dec 20 15:00:13 2011
@@ -24,6 +24,7 @@
import org.amdatu.libraries.utilities.osgi.ServiceDependentActivator;
import org.amdatu.opensocial.gadgetmanagement.GadgetDefinitionProvider;
import org.amdatu.opensocial.tenant.gadget.TenantListener;
+import
org.amdatu.opensocial.tenant.gadget.service.ExampleGadgetDefinitionProviderImpl;
import org.amdatu.opensocial.tenant.gadget.service.TenantConfigDAO;
import org.amdatu.opensocial.tenant.gadget.service.TenantConfigDAOImpl;
import org.amdatu.opensocial.tenant.gadget.service.TenantGadgetDefinition;
@@ -85,17 +86,25 @@
.add(createServiceDependency().setService(LogService.class).setRequired(true))
.add(createServiceDependency().setService(UserAdmin.class).setRequired(true)));
- // Register a login gadget definition for each tenant
- manager.add(createAdapterService(Tenant.class, null)
+ // Register the tenant gadget definition, but ONLY for the admin tenant
+ String adminTenantFilter = "(" + Tenant.TENANT_ID_SERVICEPROPERTY +
"=" + TenantConfigDAO.ADMIN_TENANT_ID + ")";
+ manager.add(createAdapterService(Tenant.class, adminTenantFilter)
.setInterface(GadgetDefinitionProvider.class.getName(), null)
.setImplementation(TenantGadgetDefinition.class));
// Create and register the TenantConfigDAO service
manager.add(
+ createAdapterService(Tenant.class, null)
+ .setInterface(new String[] {
GadgetDefinitionProvider.class.getName() }, null)
+ .setImplementation(ExampleGadgetDefinitionProviderImpl.class));
+
+ // Create and register the TenantConfigDAO service
+ manager.add(
createComponent()
.setInterface(new String[] { TenantConfigDAO.class.getName()
}, null)
.setImplementation(TenantConfigDAOImpl.class)
-
.add(createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true)));
+
.add(createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
+
.add(createServiceDependency().setService(LogService.class).setRequired(true)));
// Create and register the tenant listener service
manager.add(
@@ -109,9 +118,9 @@
createServiceDependency().setService(UserAdmin.class).setCallbacks("userAdminAdded",
"userAdminRemoved")));
- // Create and register the REST tenant service
+ // Create and register the REST tenant service, but ONLY for the admin
tenant!!!
manager.add(
- createAdapterService(Tenant.class, null)
+ createAdapterService(Tenant.class, adminTenantFilter)
.setInterface(new String[] { RESTService.class.getName() },
null)
.setImplementation(TenantRESTServiceImpl.class)
.add(createServiceDependency().setService(LogService.class).setRequired(true))
Added:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/ExampleGadgetDefinitionProviderImpl.java
==============================================================================
--- (empty file)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/ExampleGadgetDefinitionProviderImpl.java
Tue Dec 20 15:00:13 2011
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ *
+ * 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.amdatu.opensocial.tenant.gadget.service;
+
+import org.amdatu.opensocial.gadgetmanagement.GadgetCategory;
+import org.amdatu.opensocial.gadgetmanagement.GadgetDefinition;
+import org.amdatu.opensocial.gadgetmanagement.GadgetDefinitionProvider;
+
+public class ExampleGadgetDefinitionProviderImpl implements
GadgetDefinitionProvider {
+ // Categories
+ private GadgetCategory cal = new GadgetCategory("calendar", "Calendar");
+ private GadgetCategory news = new GadgetCategory("news", "News");
+ private GadgetCategory weather = new GadgetCategory("weather", "Weather");
+ private GadgetCategory tools = new GadgetCategory("tools", "Tools");
+ private GadgetCategory directions = new GadgetCategory("directions",
"Directions");
+ private GadgetCategory fun = new GadgetCategory("fun", "Fun");
+
+ private GadgetDefinition[] defs = new GadgetDefinition[] {
+ // Calendar
+ new
GadgetDefinition("http://hosting.gmodules.com/ig/gadgets/file/109810496796399416248/timedate2.xml",
cal,
+ false), // Date time
+ new
GadgetDefinition("http://gadgets.bashennekam.nl/calendar/google_gadget_calendar.xml",
cal, false), // Google calendar
+
+ // News
+ new GadgetDefinition("http://gadgets.nu.nl/nuzakelijk_igoogle.xml",
news, false), // NUzakelijk
+ new
GadgetDefinition("http://www.google.com/ig/modules/tabnews/tabnews.xml", news,
false), // Google news
+ new
GadgetDefinition("http://hosting.gmodules.com/ig/gadgets/file/108298727131181188059/google-news.xml",
news,
+ false), // Google news updates
+
+ // Weather
+ new
GadgetDefinition("http://igooglegadget.buienradar.nl/buienradar.xml", weather,
false), // Buienradar
+ new
GadgetDefinition("http://www.labpixies.com/campaigns/weather/weather.xml",
weather, false), // Weather
+
+ // Tools
+ new
GadgetDefinition("http://www.labpixies.com/campaigns/todo/todo.xml", tools,
false), // TO do
+ new GadgetDefinition("http://www.replyat.com/ourhitcounterS1.xml",
tools, false), // Visitor count
+ new
GadgetDefinition("http://www.canbuffi.de/gadgets/currency_converter/gadget.xml",
tools, false), // Currency converter
+ new
GadgetDefinition("http://www.gstatic.com/ig/modules/dictionary/kennedy/dictionary.xml",
tools, false), // Google translate
+ new
GadgetDefinition("http://www.google.com/ig/modules/ajaxsearch.xml", tools,
false), // Google mini search
+
+ // Directions
+ new GadgetDefinition(
+
"http://beem.beemway.com/gallery/common.axd?parentwi=204f9840-e4ed-483a-8b77-b0e6c4aa139c&p=google",
+ directions, false),// OV9292
+ new GadgetDefinition(
+
"http://igwidgets.com/lig/gw/f/islk/89/slkm/ik/s/6745687/87/charles447/google-maps-driving-directions.xml",
+ directions, false), // Google driving directions
+
+ // Fun
+ new
GadgetDefinition("http://brainden.com/gadgets/illusions-gadget.xml", fun,
false),// Famous optical illusions
+ new GadgetDefinition("http://quotes4all.net/quotes.xml", fun, false)
// Quotes
+ };
+
+ public GadgetDefinition[] getDefinitions() {
+ return defs;
+ }
+}
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAO.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAO.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAO.java
Tue Dec 20 15:00:13 2011
@@ -25,6 +25,11 @@
* @author ivol
*/
public interface TenantConfigDAO {
+ // The properties of the hard coded default tenant which cannot be removed
or changed
+ static final String ADMIN_TENANT_ID = "admin";
+ static final String ADMIN_TENANT_HOSTNAME = "admin.amdatucloud.org";
+ static final String ADMIN_TENANT_NAME = "Admin tenant";
+
/**
* Returns a list of tenants currently available in ConfigurationAdmin.
* @return list of tenants currently available in ConfigurationAdmin.
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAOImpl.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAOImpl.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantConfigDAOImpl.java
Tue Dec 20 15:00:13 2011
@@ -28,11 +28,23 @@
import org.amdatu.core.tenant.TenantManagementService;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.log.LogService;
-@SuppressWarnings({ "rawtypes", "deprecation", "unchecked" })
+@SuppressWarnings({ "rawtypes", "unchecked" })
public class TenantConfigDAOImpl implements TenantConfigDAO {
// Service dependencies
private volatile ConfigurationAdmin m_configAdmin;
+ private volatile LogService m_logService;
+
+ public void start() throws Exception {
+ // Create the admin tenant if it does not yet exist
+ if (getTenant(ADMIN_TENANT_ID) == null) {
+ m_logService.log(LogService.LOG_INFO, "Creating default admin
tenant");
+ setTenant(ADMIN_TENANT_ID, ADMIN_TENANT_NAME,
ADMIN_TENANT_HOSTNAME);
+ } else {
+ m_logService.log(LogService.LOG_INFO, "Default admin tenant
already exists");
+ }
+ }
public List<TenantBean> getTenants() throws IOException {
Configuration config =
m_configAdmin.getConfiguration(TenantManagementService.PID, null);
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantGadgetImpl.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantGadgetImpl.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantGadgetImpl.java
Tue Dec 20 15:00:13 2011
@@ -30,7 +30,7 @@
* @author ivol
*/
public class TenantGadgetImpl implements ResourceProvider {
- private static final boolean DEBUG_MODE = false;
+ private static final boolean DEBUG_MODE = true;
private static final String LOCAL_DEV_DIR =
"D:/Amdatu-svn/sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources";
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantListenerImpl.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantListenerImpl.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantListenerImpl.java
Tue Dec 20 15:00:13 2011
@@ -25,8 +25,12 @@
import org.amdatu.core.tenant.Tenant;
import org.amdatu.gadgetcontainer.email.EMailService;
+import org.amdatu.opensocial.gadgetmanagement.GadgetCategory;
+import org.amdatu.opensocial.gadgetmanagement.GadgetDefinition;
+import org.amdatu.opensocial.gadgetmanagement.GadgetManagement;
import org.amdatu.opensocial.tenant.gadget.TenantListener;
import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
@@ -53,7 +57,7 @@
private volatile EMailService m_mailService;
private volatile ConfigurationAdmin m_configAdmin;
private volatile LogService m_logService;
-
+
// Tenants in the queue to handle
private List<TenantQueueItem> m_tenantQueue = new
ArrayList<TenantQueueItem>();
@@ -109,6 +113,8 @@
}
adminGroup.addMember(adminUser);
+ // Add a default set of gadgets
+
// Now send an email to the specified email address
with the username and generated password
sendMail(tenant, password);
m_logService.log(LogService.LOG_INFO, "Email send to
'" + tenant.getEmail() + "'");
@@ -119,7 +125,6 @@
}
public void userAdminRemoved(UserAdmin userAdmin) {
-
}
private String generatePassword() {
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantRESTServiceImpl.java
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantRESTServiceImpl.java
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/java/org/amdatu/opensocial/tenant/gadget/service/TenantRESTServiceImpl.java
Tue Dec 20 15:00:13 2011
@@ -15,6 +15,9 @@
*/
package org.amdatu.opensocial.tenant.gadget.service;
+import static
org.amdatu.opensocial.tenant.gadget.service.TenantConfigDAO.ADMIN_TENANT_HOSTNAME;
+import static
org.amdatu.opensocial.tenant.gadget.service.TenantConfigDAO.ADMIN_TENANT_ID;
+
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
@@ -29,6 +32,7 @@
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -71,6 +75,8 @@
private int DEFAULT_ITEMSPERPAGE = 10;
+ private static String VALID_ID_REGEX = "[a-zA-Z0-9]*";
+
private static String VALID_HOSTNAME_REGEX =
"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$";
@@ -124,7 +130,7 @@
+ "=" + clazz.getName() + "))";
}
- public void start() {
+ public void start() throws Exception {
m_logService.log(LogService.LOG_INFO, "Tenant management REST service
started");
}
@@ -132,7 +138,6 @@
* This method can be used to check the availability of the Login Service.
* If the REST service is online, it returns a 200.
*
- * @customding blabla
* @return <ul>
* <li>200 (OK) : Body contains the text "Tenant service
online".</li>
* </ul>
@@ -171,7 +176,7 @@
return get500(e, "An error occured while retrieving online help");
}
}
-
+
private String getBaseURL(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" +
request.getServerPort();
}
@@ -273,9 +278,10 @@
}
/**
- * Creates a new tenant, or updates an existing tenant with the given
properties. It doesn't matter if
- * a tenant with that id already exists; if it exists it is overwritten,
otherwise it is created.
- * Example: PUT /rest/tenants/default_tenant with body parameters
name='default_tenant_2' and hostame='amdatu.org'
+ * Creates a new tenant with the given properties. If a tenant with the
specified id or specified hostname
+ * already exists, this method returns a 400 (bas request).
+ * Example: PUT /rest/tenants/default_tenant with body parameters
name='default_tenant_2', hostname='amdatu.org'
+ * and email address '[email protected]'
*
* @param id The id of the tenant to create or update
* @param name The name of the tenant to set
@@ -285,28 +291,36 @@
* @param request The HTTP servlet request
* @return <ul>
* <li>200 (OK) : Body contains the message that the tenant was
created or updated successfully.</li>
- * <li>401 (BAD REQUEST) : returned in case the hostname is
invalid, the email address is invalid
- * or another tenant is already using this hostname. Body contains
more information about the exact
+ * <li>400 (BAD REQUEST) : returned in case the hostname is
invalid, the email address is invalid
+ * or another tenant is already using this id or hostname. Body
contains more information about the exact
* error.</li>
* <li>401 (UNAUTHORIZED) : returned in case the user is not
logged in or unauthorized to manage tenants.</li>
* </ul>
*/
- @PUT
+ @POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ @Produces(MediaType.TEXT_PLAIN)
@Path("/{id}")
- public Response setTenant(@PathParam("id") final String id,
@FormParam("name") final String name,
+ public Response createTenant(@PathParam("id") final String id,
@FormParam("name") final String name,
@FormParam("hostname") final String hostname, @FormParam("email")
final String email,
@Context final HttpServletRequest request) {
- if (isAuthorized(request)) {
+ if (isAuthorized(request) && !ADMIN_TENANT_ID.equals(id) &&
!ADMIN_TENANT_HOSTNAME.equals(hostname)) {
try {
- Response valid = validate(id, hostname, email);
+ String fullhostname = hostname + ".amdatucloud.org";
+ Response valid = validateSyntax(id, fullhostname, email);
if (valid != null) {
return valid;
}
- if (m_tenantDAO.setTenant(id, name, hostname)) {
+ else {
+ valid = validateInUse(id, fullhostname);
+ if (valid != null) {
+ return valid;
+ }
+ }
+ if (m_tenantDAO.setTenant(id, name, fullhostname)) {
// Add the created tenant to the listener service, such
that an account
// is created and send to the email address as soon as the
tenant is created
- m_tenantListener.addToQueue(id, name, hostname, email);
+ m_tenantListener.addToQueue(id, name, fullhostname, email);
}
return get200("Tenant with id '" + id + "' created or updated
successfully.");
}
@@ -320,6 +334,48 @@
}
/**
+ * Updates an existing tenant with the given properties. The tenant with
the specified id is overwritten.
+ * If no tenant exists with this id, a 404 is returned
+ * Example: PUT /rest/tenants/default_tenant with body parameters
name='default_tenant_2' and hostname='amdatu.org'
+ *
+ * @param id The id of the tenant to create or update
+ * @param name The name of the tenant to set
+ * @param hostname The hostname to associate with the tenant
+ * @param request The HTTP servlet request
+ * @return <ul>
+ * <li>200 (OK) : Body contains the message that the tenant was
created or updated successfully.</li>
+ * <li>400 (BAD REQUEST) : returned in case the hostname is
invalid or the email address is invalid.
+ * Body contains more information about the exact error.</li>
+ * <li>401 (UNAUTHORIZED) : returned in case the user is not
logged in or unauthorized to manage tenants.</li>
+ * <li>404 (NOT FOUND) : returned in case the no tenant with
specified id exists.</li>
+ * </ul>
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ @Produces(MediaType.TEXT_PLAIN)
+ @Path("/{id}")
+ public Response updateTenant(@PathParam("id") final String id,
@FormParam("name") final String name,
+ @FormParam("hostname") final String hostname, @Context final
HttpServletRequest request) {
+ if (isAuthorized(request) && !ADMIN_TENANT_ID.equals(id) &&
!ADMIN_TENANT_HOSTNAME.equals(hostname)) {
+ try {
+ String fullhostname = hostname + ".amdatucloud.org";
+ Response valid = validateSyntax(id, fullhostname, null);
+ if (valid != null) {
+ return valid;
+ }
+ m_tenantDAO.setTenant(id, name, fullhostname);
+ return get200("Tenant with id '" + id + "' created or updated
successfully.");
+ }
+ catch (Exception e) {
+ return get500(e, "An error occurred while creating or updating
tenant with id '" + id + "'.");
+ }
+ }
+ else {
+ return get401();
+ }
+ }
+
+ /**
* Deletes the tenant with the specified id.
* Example: DELETE /rest/tenants/default_tenant
*
@@ -334,7 +390,7 @@
@DELETE
@Path("/{id}")
public Response deleteTenant(@PathParam("id") final String id, @Context
final HttpServletRequest request) {
- if (isAuthorized(request)) {
+ if (isAuthorized(request) && !ADMIN_TENANT_ID.equals(id)) {
try {
if (m_tenantDAO.deleteTenant(id)) {
return get200("Tenant with id '" + id + "' deleted
successfully.");
@@ -364,12 +420,12 @@
// 200 - OK
private Response get200(String msg) {
- return
Response.status(Status.OK).cacheControl(NO_CACHE_CONTROL).build();
+ return
Response.status(Status.OK).entity(msg).cacheControl(NO_CACHE_CONTROL).build();
}
// 400 - BAD REQUEST
private Response get400(String msg) {
- return
Response.status(Status.BAD_REQUEST).cacheControl(NO_CACHE_CONTROL).build();
+ return
Response.status(Status.BAD_REQUEST).entity(msg).cacheControl(NO_CACHE_CONTROL).build();
}
// Returns a 401 - UNAUTHORIZED
@@ -396,41 +452,53 @@
return Response.ok(entity).cacheControl(NO_CACHE_CONTROL).build();
}
- private Response validate(String id, String hostname, String email) throws
IOException {
- if (!validateHostname(hostname)) {
- return get400("Hostname does not match regular expression " +
VALID_HOSTNAME_REGEX);
+ private Response validateSyntax(String id, final String hostname, String
email) throws IOException {
+ if (!validateId(id)) {
+ return get400("Id is invalid. Ensure that it contains only
characters in therange [a-z], [A-Z] and [0-9]");
}
- TenantBean tenant = validateHostnameInUse(id, hostname);
- if (tenant != null) {
- String tenantId = "'" + tenant.getName() + "' (id='" +
tenant.getId() + "')";
- return get400("Hostname '" + hostname + "' is already in use by
tenant " + tenantId);
+ if (!validateHostname(hostname)) {
+ return get400("Hostname is invalid.");
}
- if (m_mailService.validateEmailAddress(email)) {
+ if (email != null && !m_mailService.validateEmailAddress(email)) {
return get400("'" + email + "' is not a valid email address");
}
return null;
}
- private boolean validateHostname(String hostname) {
- // Validate if another tenant exists that did already claim this
hostname
- Pattern p = Pattern.compile(VALID_HOSTNAME_REGEX);
- Matcher m = p.matcher(hostname);
+ private Response validateInUse(String id, final String hostname) throws
IOException {
+ // Validate if another tenant exists with the same id or hostname
+ for (TenantBean t : m_tenantDAO.getTenants()) {
+ String tenantId = "'" + t.getName() + "' (id='" + t.getId() + "')";
+ if (t.getId().equals(id)) {
+ return get400("Id '" + id + "' is already in use by tenant " +
tenantId);
+ }
+ else if (hostname.equalsIgnoreCase(t.getHostname())) {
+ return get400("Hostname '" + hostname + "' is already in use
by tenant " + tenantId);
+ }
+ }
+ return null;
+ }
+
+ private boolean validateId(String id) {
+ if (id == null || id.isEmpty()) {
+ return false;
+ }
+ Pattern p = Pattern.compile(VALID_ID_REGEX);
+ Matcher m = p.matcher(id);
if (!m.matches()) {
return false;
}
return true;
}
- private TenantBean validateHostnameInUse(String id, String hostname)
throws IOException {
+ private boolean validateHostname(String hostname) {
// Validate if another tenant exists that did already claim this
hostname
- for (TenantBean tenant : m_tenantDAO.getTenants()) {
- if (!tenant.getId().equals(id)) {
- if (tenant.getHostname().equalsIgnoreCase(hostname)) {
- return tenant;
- }
- }
+ Pattern p = Pattern.compile(VALID_HOSTNAME_REGEX);
+ Matcher m = p.matcher(hostname);
+ if (!m.matches()) {
+ return false;
}
- return null;
+ return true;
}
private boolean isAuthorized(final HttpServletRequest request) {
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/jsp/TenantGadget.jsp
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/jsp/TenantGadget.jsp
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/jsp/TenantGadget.jsp
Tue Dec 20 15:00:13 2011
@@ -61,10 +61,22 @@
<fieldset id="tenant_details" style="display:none;visibility:hidden">
<legend id="tenant_details_legend">__MSG_details__</legend>
<table width="95%">
- <tr><td>__MSG_id__</td><td><input type="edit" id="tenant_id"
disabled="disabled"/></td></tr>
- <tr><td>__MSG_name__</td><td><input type="edit" id="tenant_name"
value=""/></td></tr>
- <tr><td>__MSG_hostname__</td><td><input type="edit"
id="tenant_hostname" value=""/></td></tr>
- <tr id="tenant_email_row"><td>__MSG_email__*</td><td><input
type="edit" id="tenant_email" value=""/></td></tr>
+ <tr>
+ <td>__MSG_id__</td>
+ <td><input type="edit" id="tenant_id"
disabled="disabled"/></td>
+ </tr>
+ <tr>
+ <td>__MSG_name__</td>
+ <td><input type="edit" id="tenant_name" value=""/></td>
+ </tr>
+ <tr>
+ <td>__MSG_hostname__</td>
+ <td><input style="width:100px;text-align:right" type="edit"
id="tenant_hostname" value=""/>.amdatucloud.org</td>
+ </tr>
+ <tr id="tenant_email_row">
+ <td>__MSG_email__*</td>
+ <td><input type="edit" id="tenant_email" value=""/></td>
+ </tr>
</table>
<div id="comment" class="comment"
style="display:none;visibility:hidden">* __MSG_email_comment__</div>
<input type="submit" id="tenant_save"
style="display:none;visibility:hidden" value="__MSG_save__"
onclick="javascript:saveTenant();"/>
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/js/tenant.js
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/js/tenant.js
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/js/tenant.js
Tue Dec 20 15:00:13 2011
@@ -1,4 +1,5 @@
var prefs = new gadgets.Prefs();
+var editmode = "";
function loadTenants() {
var url = "/rest/tenants";
@@ -14,11 +15,21 @@
}
function doSaveTenant(url, callback) {
- var params = getDefaultParams(gadgets.io.ContentType.JSON,
gadgets.io.MethodType.PUT);
+
var name = document.getElementById('tenant_name').value;
var hostname = document.getElementById('tenant_hostname').value;
var email = document.getElementById('tenant_email').value;
- var postdata = {name : name, hostname : hostname, email : email};
+ var params;
+ var postdata;
+ if (editmode == 'edit') {
+ // Edit mode
+ postdata = {name : name, hostname : hostname};
+ params = getDefaultParams(gadgets.io.ContentType.TEXT,
gadgets.io.MethodType.PUT);
+ } else {
+ // New mode
+ postdata = {name : name, hostname : hostname, email : email};
+ params = getDefaultParams(gadgets.io.ContentType.TEXT,
gadgets.io.MethodType.POST);
+ }
params[gadgets.io.RequestParameters.POST_DATA] =
gadgets.io.encodeValues(postdata);
url = getBaseUrl() + addNoCache(unescape(url));
@@ -48,6 +59,10 @@
var id = tenants[i]["id"];
var name = tenants[i]["name"];
var hostname = tenants[i]["hostname"];
+ if (hostname.indexOf(".amdatucloud.org") != -1) {
+ // Chop off .amdatucloud.org in the UI
+ hostname = hostname.substring(0, hostname.indexOf(".amdatucloud.org"));
+ }
// Create the edit link
var editLink = getLink(ensureArray(tenants[i]["links"]), "edit");
@@ -93,7 +108,12 @@
var tenant = response.data["tenant"];
document.getElementById('tenant_id').value = tenant.id;
document.getElementById('tenant_name').value = tenant.name;
- document.getElementById('tenant_hostname').value = tenant.hostname;
+ var hostname = tenant.hostname;
+ if (hostname.indexOf(".amdatucloud.org") != -1) {
+ // Chop off .amdatucloud.org in the UI
+ hostname = hostname.substring(0, hostname.indexOf(".amdatucloud.org"));
+ }
+ document.getElementById('tenant_hostname').value = hostname;
gadgets.window.adjustHeight();
} else if (response.rc == 404) {
showError(prefs.getMsg('role_not_found'));
@@ -115,22 +135,41 @@
}
function saveTenant() {
- var link = "/rest/tenants/" + document.getElementById('tenant_id').value;
- doSaveTenant(escape(link), onTenantSaved);
+ var tenantId = document.getElementById('tenant_id').value;
+ if (tenantId != "") {
+ var link = "/rest/tenants/" + document.getElementById('tenant_id').value;
+ doSaveTenant(escape(link), onTenantSaved);
+ } else {
+ alert("Id cannot be empty, provide a valid (and unique) identifier.");
+ }
}
-function onTenantSaved() {
- hide('tenant_details');
- hide('tenant_save');
- hide('cancel');
- hide('comment');
- loadTenants();
- show('new_tenant_button');
- showInfo("Tenant saved successfully.");
+function onTenantSaved(response) {
+ if (response.rc == 200) {
+ hide('tenant_details');
+ hide('tenant_save');
+ hide('cancel');
+ hide('comment');
+ loadTenants();
+ show('new_tenant_button');
+ showInfo("Tenant saved successfully.");
+ } else if (response.rc == 400) {
+ showError("Error: " + response.text);
+ } else if (response.rc == 401) {
+ showError(prefs.getMsg('accessdenied'));
+ } else if (response.rc == 504) {
+ showError(prefs.getMsg('servertimeout'));
+ } else {
+ showError(prefs.getMsg('unexpected_error') + response.errors);
+ }
}
function onTenantDeleted() {
hide('tenant_details');
+ show('new_tenant_button');
+ hide('tenant_details');
+ hide('tenant_save');
+ hide('cancel');
loadTenants();
showInfo("Tenant deleted successfully.");
}
@@ -148,6 +187,7 @@
}
function showEditTenant(link) {
+ editmode = "edit";
loadTenant(escape(unescape(link)), onTenantLoaded);
hide('new_tenant_button');
hide('infobox');
@@ -170,6 +210,7 @@
}
function showAddTenant() {
+ editmode = "new";
hide('new_tenant_button');
document.getElementById('tenant_details_legend').innerHTML = newTenantLabel;
document.getElementById('tenant_id').disabled = "";
Modified:
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/labels/tenantmgmt_ALL_ALL.xml
==============================================================================
---
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/labels/tenantmgmt_ALL_ALL.xml
(original)
+++
sandbox/ivol/amdatu-gadget-container/tenant-management-gadget/src/main/resources/static/labels/tenantmgmt_ALL_ALL.xml
Tue Dec 20 15:00:13 2011
@@ -35,6 +35,7 @@
<msg name="unauthorized">You do not have authorization to manage users and
groups.</msg>
<msg name="accessdenied">You do not have proper authorization to perform
this action.</msg>
<msg name="unexpected_error">An unexpected error has occurred: </msg>
+ <msg name="servertimeout">No response from server, it took too long to
respond</msg>
<msg name="confirm_delete">Are you sure you want to delete '%s'?</msg>
</messagebundle>
\ No newline at end of file
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits