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>