Re: [xwiki-devs] [xwiki-notifications] r24746 - in platform/web/trunk/wysiwyg: . src/main/java/com/xpn/xwiki/wysiwyg/client src/main/java/com/xpn/xwiki/wysiwyg/client/plugin/sync src/main/java/com/xpn/xwiki/wysiwyg/server src/main/java/com/xpn/xwiki/wysiwyg/server/filter src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync src/main/java/com/xpn/xwiki/wysiwyg/server/plugin/sync/internal src/main/resources/META-INF src/main/webapp/WEB-INF src/test/java/com/xpn/xwiki/wysiwyg/server/plugin/sync
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
participants (1)
-
Marius Dumitru Florea