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

Reply via email to