You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wookie.apache.org by sc...@apache.org on 2014/02/27 23:13:51 UTC

svn commit: r1572755 - in /wookie/trunk/wookie-server/src/main: java/org/apache/wookie/ajaxmodel/ java/org/apache/wookie/ajaxmodel/impl/ java/org/apache/wookie/controller/ webapp/WEB-INF/

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>