mflorea (SVN) wrote:
Author: mflorea
Date: 2009-10-28 11:51:16 +0100 (Wed, 28 Oct 2009)
New Revision: 24746
Added:
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncService.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncServiceAsync.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/filter/XWikiContextInitializationFilter.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/XWikiSyncService.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/internal/
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/internal/DefaultSyncEngine.java
Removed:
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/DefaultSyncEngine.java
Modified:
platform/web/trunk/wysiwyg/pom.xml
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/WysiwygService.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/WysiwygServiceAsync.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/WysiwygServiceAsyncCacheProxy.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncPlugin.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncPluginFactory.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncResult.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncStatus.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncTools.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/DefaultWysiwygService.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/SyncEngine.java
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/SyncException.java
platform/web/trunk/wysiwyg/src/main/resources/META-INF/components.txt
platform/web/trunk/wysiwyg/src/main/webapp/WEB-INF/web.xml
platform/web/trunk/wysiwyg/src/test/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/SyncTest.java
Log:
XWIKI-4534: Create a SyncService component to be used by SyncPlugin
Also:
* Refactored and cleaned the sync plugin classes a bit
* Made SyncEngine a component
* Added a filter to initialize the XWiki context. This filter is generic and could be
moved to xwiki-core.
Modified: platform/web/trunk/wysiwyg/pom.xml
===================================================================
--- platform/web/trunk/wysiwyg/pom.xml 2009-10-28 10:31:41 UTC (rev 24745)
+++ platform/web/trunk/wysiwyg/pom.xml 2009-10-28 10:51:16 UTC (rev 24746)
@@ -107,6 +107,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.xwiki.platform</groupId>
+ <artifactId>xwiki-core-container-api</artifactId>
+ <version>${platform.core.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
I don't understand why I need to declare this dependency while the
web-gwt module doesn't need to. XWikiServiceImpl uses the Container
component and the web-gwt pom has only a dependency on xwiki-core. mvn
compiler:compile succeeds. XWikiContextInitializationFilter uses the
same Container component and mvn compiler:compile throws "package
org.xwiki.container not found".
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>provided</scope>
@@ -198,9 +204,10 @@
com/xpn/xwiki/wysiwyg/client/plugin/link/LinkConfig.java,
com/xpn/xwiki/wysiwyg/client/plugin/link/LinkConfigTest.java,
com/xpn/xwiki/wysiwyg/client/plugin/image/ImageConfig.java,
- com/xpn/xwiki/wysiwyg/client/plugin/sync/**/*,
- com/xpn/xwiki/wysiwyg/server/plugin/sync/**/*,
- com/xpn/xwiki/wysiwyg/server/DefaultWysiwygService.java,
+ com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncPlugin.java,
+ com/xpn/xwiki/wysiwyg/client/plugin/sync/SyncTools.java,
+ com/xpn/xwiki/wysiwyg/server/plugin/sync/internal/DefaultSyncEngine.java,
+ com/xpn/xwiki/wysiwyg/server/plugin/sync/SyncTest.java,
com/xpn/xwiki/wysiwyg/server/DefaultWysiwygServiceTest.java</excludes>
</configuration>
</plugin>
[snip]
Added:
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/filter/XWikiContextInitializationFilter.java
===================================================================
---
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/filter/XWikiContextInitializationFilter.java
(rev 0)
+++
platform/web/trunk/wysiwyg/src/main/java/com/xpn/xwiki/wysiwyg/server/filter/XWikiContextInitializationFilter.java 2009-10-28
10:51:16 UTC (rev 24746)
@@ -0,0 +1,159 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package com.xpn.xwiki.wysiwyg.server.filter;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.xwiki.container.Container;
+import org.xwiki.container.servlet.ServletContainerException;
+import org.xwiki.container.servlet.ServletContainerInitializer;
+import org.xwiki.context.Execution;
+
+import com.xpn.xwiki.XWiki;
+import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.web.Utils;
+import com.xpn.xwiki.web.XWikiEngineContext;
+import com.xpn.xwiki.web.XWikiRequest;
+import com.xpn.xwiki.web.XWikiResponse;
+import com.xpn.xwiki.web.XWikiServletContext;
+import com.xpn.xwiki.web.XWikiServletRequest;
+import com.xpn.xwiki.web.XWikiServletResponse;
+
+/**
+ * This filter can be used to initialize the XWiki context before processing a request.
+ *
+ * @version $Id$
+ */
+public class XWikiContextInitializationFilter implements Filter
+{
+ /**
+ * The filter configuration object.
+ */
+ private FilterConfig filterConfig;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see Filter#destroy()
+ */
+ public void destroy()
+ {
+ filterConfig = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
+ */
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain) throws IOException,
+ ServletException
+ {
+ try {
+ initializeXWikiContext(request, response);
+ chain.doFilter(request, response);
+ } finally {
+ cleanupComponents();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see Filter#init(FilterConfig)
+ */
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ this.filterConfig = filterConfig;
+ }
+
+ /**
+ * Initializes the XWiki context.
+ *
+ * @param request the request being processed
+ * @param response the response
+ * @throws ServletException if the initialization fails
+ */
+ protected void initializeXWikiContext(ServletRequest request, ServletResponse
response) throws ServletException
+ {
+ XWikiEngineContext xwikiEngine = new
XWikiServletContext(filterConfig.getServletContext());
+ XWikiRequest xwikiRequest = new XWikiServletRequest((HttpServletRequest)
request);
+ XWikiResponse xwikiResponse = new XWikiServletResponse((HttpServletResponse)
response);
+
+ XWikiContext context;
+ try {
+ // Create the XWiki context.
+ context = Utils.prepareContext("", xwikiRequest, xwikiResponse,
xwikiEngine);
+ // Initialize the XWiki database. The following method calls
context.setWiki(XWiki).
+ XWiki.getXWiki(context);
+ } catch (XWikiException e) {
+ throw new ServletException("Failed to prepare the XWiki context.",
e);
+ }
+
+ // Initialize the Container component which is the new way of transporting the
Context in the new component
+ // architecture.
+ initializeContainerComponent(context);
+ }
+
+ /**
+ * @param context the XWiki context
+ * @throws ServletException if the container component initialization fails
+ */
+ protected void initializeContainerComponent(XWikiContext context) throws
ServletException
+ {
+ // Initialize the Container fields (request, response, session). Note that this
is a bridge between the old core
+ // and the component architecture. In the new component architecture we use
ThreadLocal to transport the
+ // request, response and session to components which require them.
+ ServletContainerInitializer containerInitializer =
Utils.getComponent(ServletContainerInitializer.class);
+
+ try {
+
containerInitializer.initializeRequest(context.getRequest().getHttpServletRequest(),
context);
+
containerInitializer.initializeResponse(context.getResponse().getHttpServletResponse());
+
containerInitializer.initializeSession(context.getRequest().getHttpServletRequest());
+ } catch (ServletContainerException e) {
+ throw new ServletException("Failed to initialize Request/Response or
Session", e);
+ }
+ }
+
+ /**
+ * We must ensure we clean the ThreadLocal variables located in the Container and
Execution components as otherwise
+ * we will have a potential memory leak.
+ */
+ protected void cleanupComponents()
+ {
+ Container container = Utils.getComponent(Container.class);
+ container.removeRequest();
+ container.removeResponse();
+ container.removeSession();
+
+ Execution execution = Utils.getComponent(Execution.class);
+ execution.removeContext();
+ }
+}
I committed the context initialization filter in the wysiwyg module for
now but I think we should move it to xwiki-core if it's generic enough
to be used by other servlets (besides the XWikiRemoteServiceServlet).
Thanks,
Marius