Author: scottbw
Date: Thu Feb 27 22:13:50 2014
New Revision: 1572755

URL: http://svn.apache.org/r1572755
Log:
Replaced the DWR-based WidgetAPI with two REST servlets connected to the 
WidgetAuthorizationFilter in web.xml. This means we don't require DWR for 
simple widgets.

Added:
    
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/MetadataController.java
    
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/PreferencesController.java
Removed:
    
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/ajaxmodel/IWidgetAPI.java
    wookie/trunk/wookie-server/src/main/java/org/apache/wookie/ajaxmodel/impl/
Modified:
    wookie/trunk/wookie-server/src/main/webapp/WEB-INF/dwr.xml
    wookie/trunk/wookie-server/src/main/webapp/WEB-INF/web.xml

Added: 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/MetadataController.java
URL: 
http://svn.apache.org/viewvc/wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/MetadataController.java?rev=1572755&view=auto
==============================================================================
--- 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/MetadataController.java
 (added)
+++ 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/MetadataController.java
 Thu Feb 27 22:13:50 2014
@@ -0,0 +1,108 @@
+/*
+ *  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.apache.wookie.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wookie.auth.AuthToken;
+import org.apache.wookie.beans.IWidget;
+import org.apache.wookie.exceptions.UnauthorizedAccessException;
+import org.apache.wookie.services.WidgetMetadataService;
+import org.apache.wookie.util.WidgetFormattingUtils;
+import org.apache.wookie.w3c.IDescription;
+import org.apache.wookie.w3c.IName;
+import org.apache.wookie.w3c.util.LocalizationUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * AJAX controller for widget metadata. This implements the request for 
metadata on initial Widget load
+ * within the browser.
+ */
+public class MetadataController extends Controller {
+
+       private static final long serialVersionUID = -8594233883227640866L;
+
+       /* (non-Javadoc)
+        * @see 
org.apache.wookie.controller.Controller#index(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse)
+        */
+       @Override
+       protected void index(HttpServletRequest request,
+                       HttpServletResponse response) throws 
UnauthorizedAccessException,
+                       IOException {
+               
+               AuthToken authToken = (AuthToken) 
request.getAttribute("org.apache.wookie.auth.AuthToken");
+               if (authToken == null) throw new UnauthorizedAccessException();
+
+               
+               // Get i18n-enabled metadata for the Widget's locale and encode 
it using unicode control characters.
+               
+               String locales[] = {authToken.getLang()};
+               IWidget widget = 
WidgetMetadataService.Factory.getInstance().getWidget(authToken.getWidgetId());
+                       
+               String author = "";
+        String email = "";
+        String href = "";
+               if (widget.getAuthor() != null){
+            if (widget.getAuthor().getAuthorName() != null) author = 
WidgetFormattingUtils.getEncoded(widget.getAuthor().getDir(), 
widget.getAuthor().getAuthorName());
+               if (widget.getAuthor().getEmail() != null) email = 
widget.getAuthor().getEmail();
+               if (widget.getAuthor().getHref() != null) href = 
widget.getAuthor().getHref();
+               }
+
+               String name = "";
+               IName iname = 
(IName)LocalizationUtils.getLocalizedElement(widget.getNames().toArray(new 
IName[widget.getNames().size()]), locales, widget.getDefaultLocale());
+               if (iname != null && iname.getName() != null) name = 
WidgetFormattingUtils.getEncoded(iname.getDir(), iname.getName());
+               String shortName = "";
+               if (iname != null && iname.getShort() != null) shortName = 
WidgetFormattingUtils.getEncoded(iname.getDir(), iname.getShort());
+               
+               String description = "";
+               IDescription idescription = 
(IDescription)LocalizationUtils.getLocalizedElement(widget.getDescriptions().toArray(new
 IDescription[widget.getDescriptions().size()]), locales, 
widget.getDefaultLocale());
+               if (idescription != null && idescription.getDescription() != 
null) description = WidgetFormattingUtils.getEncoded(idescription.getDir(), 
idescription.getDescription());
+               
+               String version = "";
+               if (widget.getVersion() != null) version = 
WidgetFormattingUtils.getEncoded(widget.getDir(), widget.getVersion());
+               
+               String width = "0";
+               if (widget.getWidth() != null) width = 
String.valueOf(widget.getWidth());
+               
+               String height = "0";
+               if (widget.getHeight() != null) height = 
String.valueOf(widget.getHeight());
+               
+               // Add in metadata
+
+               try {
+                       JSONObject map = new JSONObject();
+                       map.put("id", String.valueOf(widget.getIdentifier()));  
//$NON-NLS-1$
+                       map.put("author", author);      //$NON-NLS-1$
+                       map.put("authorEmail", email);//$NON-NLS-1$
+                       map.put("authorHref", href);//$NON-NLS-1$
+                       map.put("name", name);//$NON-NLS-1$
+                       map.put("description", description);//$NON-NLS-1$       
+                       map.put("shortName", shortName); //$NON-NLS-1$
+                       map.put("version",version);//$NON-NLS-1$
+                       map.put("width", width);//$NON-NLS-1$
+                       map.put("height", height);//$NON-NLS-1$
+                       response.getWriter().write(map.toString());
+               } catch (JSONException e) {
+                       throw new IOException(e);
+               }
+       }
+
+       
+       
+
+}

Added: 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/PreferencesController.java
URL: 
http://svn.apache.org/viewvc/wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/PreferencesController.java?rev=1572755&view=auto
==============================================================================
--- 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/PreferencesController.java
 (added)
+++ 
wookie/trunk/wookie-server/src/main/java/org/apache/wookie/controller/PreferencesController.java
 Thu Feb 27 22:13:50 2014
@@ -0,0 +1,130 @@
+/*
+ *  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.apache.wookie.controller;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wookie.auth.AuthToken;
+import org.apache.wookie.beans.IPreference;
+import org.apache.wookie.exceptions.InvalidParametersException;
+import org.apache.wookie.exceptions.ResourceDuplicationException;
+import org.apache.wookie.exceptions.ServiceUnavailableException;
+import org.apache.wookie.exceptions.UnauthorizedAccessException;
+import org.apache.wookie.services.PreferencesService;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Simple preferences controller used for AJAX requests from
+ * widgets. Unlike PropertiesController, this does not require
+ * requests to be signed using HMAC. It can only operate on
+ * the preferences belonging to the associated auth token
+ * provided.
+ */
+public class PreferencesController extends Controller{
+
+       private static final long serialVersionUID = 5611606748176563026L;
+
+       /* (non-Javadoc)
+        * @see 
org.apache.wookie.controller.Controller#index(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse)
+        */
+       @Override
+       protected void index(HttpServletRequest request,
+                       HttpServletResponse response) throws 
UnauthorizedAccessException,
+                       IOException {
+               
+               AuthToken token = (AuthToken) 
request.getAttribute("org.apache.wookie.auth.AuthToken");
+               if (token == null) throw new UnauthorizedAccessException();
+               
+               //
+               // Get preferences
+               //
+               PreferencesService service = 
PreferencesService.Factory.getInstance();
+               Collection<IPreference> preferences = 
service.getPreferences(token.getApiKey(), token.getWidgetId(), 
token.getContextId(), token.getViewerId());
+               
+               //
+               // Write output as JSON
+               //
+               try {
+                       JSONObject json = new JSONObject();
+                       JSONArray array = new JSONArray();
+                       for (IPreference preference:preferences){
+                               JSONObject preferenceJson = new JSONObject();
+                               preferenceJson.put("dkey", 
preference.getName());
+                               preferenceJson.put("dvalue", 
preference.getValue());
+                               preferenceJson.put("readonly", 
preference.isReadOnly());
+                               array.put(preferenceJson);
+                       }
+                       json.put("Preferences", array);
+                       response.getWriter().write(json.toString());
+               } catch (JSONException e) {
+                       throw new IOException(e);
+               }
+       }
+
+       /* (non-Javadoc)
+        * @see 
org.apache.wookie.controller.Controller#create(java.lang.String, 
javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+        */
+       @Override
+       protected boolean create(String resourceId, HttpServletRequest request,
+                       HttpServletResponse response) throws 
ResourceDuplicationException,
+                       InvalidParametersException, UnauthorizedAccessException,
+                       ServiceUnavailableException {
+
+               AuthToken token = (AuthToken) 
request.getAttribute("org.apache.wookie.auth.AuthToken");
+               if (token == null) throw new UnauthorizedAccessException();
+
+               
+               //
+               // Get parameters
+               //
+               String name = request.getParameter("name");
+               String value = request.getParameter("value");
+               if (name == null || value == null) throw new 
InvalidParametersException();
+               
+               //
+               // Get preferences service
+               //
+               PreferencesService service = 
PreferencesService.Factory.getInstance();
+               
+               //
+               // Check whether the preference exists (update) or not (create)
+               //
+               String existing = service.getPreference(token.getApiKey(), 
token.getWidgetId(), token.getContextId(), token.getViewerId(), name);
+
+               //
+               // Set the preference
+               //
+               service.setPreference(token.getApiKey(), token.getWidgetId(), 
token.getContextId(), token.getViewerId(), name, value);
+               
+               if (existing == null){
+                       //
+                       // Created 201
+                       //
+                       return true;
+               } else {
+                       //
+                       // Updated 200
+                       //
+                       return false;
+               }
+       }
+
+       
+}

Modified: wookie/trunk/wookie-server/src/main/webapp/WEB-INF/dwr.xml
URL: 
http://svn.apache.org/viewvc/wookie/trunk/wookie-server/src/main/webapp/WEB-INF/dwr.xml?rev=1572755&r1=1572754&r2=1572755&view=diff
==============================================================================
--- wookie/trunk/wookie-server/src/main/webapp/WEB-INF/dwr.xml (original)
+++ wookie/trunk/wookie-server/src/main/webapp/WEB-INF/dwr.xml Thu Feb 27 
22:13:50 2014
@@ -36,17 +36,6 @@
       <include method="invalidateToken"/>
       <include method="queryOAuthParams"/>
     </create>
-        
-    <convert converter="object" 
match="org.apache.wookie.ajaxmodel.impl.PreferenceDelegate" 
javascript="Preference">
-        <param name="force" value="true"/>
-        <param name="include" value="dkey, dvalue, readOnly"/>
-    </convert>
-    <create creator="new" javascript="WidgetImpl" scope="application">
-      <param name="class" 
value="org.apache.wookie.ajaxmodel.impl.WidgetAPIImpl"/>
-      <include method="preferences"/> 
-      <include method="metadata"/> 
-      <include method="setPreferenceForKey"/>
-    </create>
     
     <create creator="new" javascript="WookieImpl" scope="application">
       <param name="class" value="org.apache.wookie.feature.ext.WookieAPIImpl"/>

Modified: wookie/trunk/wookie-server/src/main/webapp/WEB-INF/web.xml
URL: 
http://svn.apache.org/viewvc/wookie/trunk/wookie-server/src/main/webapp/WEB-INF/web.xml?rev=1572755&r1=1572754&r2=1572755&view=diff
==============================================================================
--- wookie/trunk/wookie-server/src/main/webapp/WEB-INF/web.xml (original)
+++ wookie/trunk/wookie-server/src/main/webapp/WEB-INF/web.xml Thu Feb 27 
22:13:50 2014
@@ -221,19 +221,47 @@
                <url-pattern>/policies/*</url-pattern>
        </servlet-mapping>
 
+
+       
+       <!-- AJAX -->
        <servlet>
-               <description>
-               </description>
-               <display-name>TokenHandler</display-name>
-               <servlet-name>TokenHandler</servlet-name>
-               
<servlet-class>org.apache.wookie.feature.oauth.TokenHandler</servlet-class>
+               <description>Preferences AJAX controller</description>
+               <display-name>PreferencesController</display-name>
+               <servlet-name>PreferencesController</servlet-name>
+               
<servlet-class>org.apache.wookie.controller.PreferencesController</servlet-class>
        </servlet>
+       <servlet-mapping>
+               <servlet-name>PreferencesController</servlet-name>
+               <url-pattern>/preferences</url-pattern>
+       </servlet-mapping>
+       
+               <servlet>
+               <description>Metadata AJAX controller</description>
+               <display-name>MetadataController</display-name>
+               <servlet-name>MetadataController</servlet-name>
+               
<servlet-class>org.apache.wookie.controller.MetadataController</servlet-class>
+       </servlet>
+       <servlet-mapping>
+               <servlet-name>MetadataController</servlet-name>
+               <url-pattern>/metadata</url-pattern>
+       </servlet-mapping>
+       
        
        <servlet-mapping>
                <servlet-name>dwr-invoker</servlet-name>
                <url-pattern>/dwr/*</url-pattern>
        </servlet-mapping>
+       
+       <!-- End AJAX -->
 
+       <!-- oAuth -->
+       <servlet>
+               <description>
+               </description>
+               <display-name>TokenHandler</display-name>
+               <servlet-name>TokenHandler</servlet-name>
+               
<servlet-class>org.apache.wookie.feature.oauth.TokenHandler</servlet-class>
+       </servlet>
        <servlet-mapping>
                <servlet-name>TokenHandler</servlet-name>
                <url-pattern>/features/oauth/implicit</url-pattern>
@@ -242,6 +270,7 @@
                <servlet-name>TokenHandler</servlet-name>
                <url-pattern>/features/oauth/authz-code</url-pattern>
        </servlet-mapping>
+       <!-- End oAuth -->
 
        <welcome-file-list>
                <welcome-file>index.html</welcome-file>
@@ -253,7 +282,21 @@
        </welcome-file-list>
 
        <!--****************** SECURITY SECTION ************************-->
-       
+
+       <!-- Use Authorization Filter for Widget AJAX API  -->
+       <filter>
+           <filter-name>WidgetAuthorizationFilter</filter-name>
+           
<filter-class>org.apache.wookie.server.security.WidgetAuthorizationFilter</filter-class>
+       </filter>
+       <filter-mapping>
+       <filter-name>WidgetAuthorizationFilter</filter-name>
+               <servlet-name>PreferencesController</servlet-name>
+       </filter-mapping>
+       <filter-mapping>
+       <filter-name>WidgetAuthorizationFilter</filter-name>
+               <servlet-name>MetadataController</servlet-name>
+       </filter-mapping>
+                       
        <!-- Use Authorization Filter for REST API  -->
        <filter>
            <filter-name>AuthorizationFilter</filter-name>


Reply via email to