r942 - xwiki/trunk/src/main/java/com/xpn/xwiki/web

Phung Hai Nam namphunghai at users.forge.objectweb.org
Mon Feb 27 10:00:27 CET 2006


Author: namphunghai
Date: 2006-02-27 10:00:26 +0100 (Mon, 27 Feb 2006)
New Revision: 942

Modified:
   xwiki/trunk/src/main/java/com/xpn/xwiki/web/EditAction.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/web/InlineAction.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/web/PrepareEditForm.java
   xwiki/trunk/src/main/java/com/xpn/xwiki/web/SaveAction.java
Log:
Fix issue with lock a document #XWIKI-176

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/web/EditAction.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/web/EditAction.java	2006-02-27 04:19:36 UTC (rev 941)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/web/EditAction.java	2006-02-27 09:00:26 UTC (rev 942)
@@ -1,6 +1,8 @@
 package com.xpn.xwiki.web;
 
 import org.apache.velocity.VelocityContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.XWikiException;
@@ -9,77 +11,83 @@
 import com.xpn.xwiki.doc.XWikiLock;
 
 public class EditAction extends XWikiAction {
+    private static final Log log = LogFactory.getLog(EditAction.class);
+
 	public String render(XWikiContext context) throws XWikiException {
         XWikiRequest request = context.getRequest();
         XWikiDocument doc = context.getDoc();
         XWikiForm form = context.getForm();
         VelocityContext vcontext = (VelocityContext) context.get("vcontext");
 
-        XWikiDocument tdoc = (XWikiDocument) context.get("tdoc");
-        PrepareEditForm peform = (PrepareEditForm) form;
-        String parent = peform.getParent();
-        if (parent!=null)
-            doc.setParent(parent);
-        String creator = peform.getCreator();
-        if (creator!=null)
-            doc.setCreator(creator);
-        String defaultTemplate = peform.getDefaultTemplate();
-        if (defaultTemplate!=null)
-            doc.setDefaultTemplate(defaultTemplate);
-        String defaultLanguage = peform.getDefaultLanguage();
-        if ((defaultLanguage!=null)&&!defaultLanguage.equals(""))
-            doc.setDefaultLanguage(defaultLanguage);
-        if (doc.getDefaultLanguage().equals(""))
-            doc.setDefaultLanguage(context.getWiki().getLanguagePreference(context));
+        synchronized (doc) {
+            XWikiDocument tdoc = (XWikiDocument) context.get("tdoc");
+            PrepareEditForm peform = (PrepareEditForm) form;
+            String parent = peform.getParent();
+            if (parent!=null)
+                doc.setParent(parent);
+            String creator = peform.getCreator();
+            if (creator!=null)
+                doc.setCreator(creator);
+            String defaultTemplate = peform.getDefaultTemplate();
+            if (defaultTemplate!=null)
+                doc.setDefaultTemplate(defaultTemplate);
+            String defaultLanguage = peform.getDefaultLanguage();
+            if ((defaultLanguage!=null)&&!defaultLanguage.equals(""))
+                doc.setDefaultLanguage(defaultLanguage);
+            if (doc.getDefaultLanguage().equals(""))
+                doc.setDefaultLanguage(context.getWiki().getLanguagePreference(context));
 
-        String language = context.getWiki().getLanguagePreference(context);
-        String languagefromrequest = context.getRequest().getParameter("language");
-        String languagetoedit = ((languagefromrequest==null)||(languagefromrequest.equals(""))) ?
-                language : languagefromrequest;
+            String language = context.getWiki().getLanguagePreference(context);
+            String languagefromrequest = context.getRequest().getParameter("language");
+            String languagetoedit = ((languagefromrequest==null)||(languagefromrequest.equals(""))) ?
+                    language : languagefromrequest;
 
-        if ((languagetoedit==null)||(languagetoedit.equals("default")))
-            languagetoedit = "";
-        if (doc.isNew()||(doc.getDefaultLanguage().equals(languagetoedit)))
-            languagetoedit = "";
+            if ((languagetoedit==null)||(languagetoedit.equals("default")))
+                languagetoedit = "";
+            if (doc.isNew()||(doc.getDefaultLanguage().equals(languagetoedit)))
+                languagetoedit = "";
 
-        if (languagetoedit.equals("")) {
-            // In this case the created document is going to be the default document
-            tdoc = doc;
-            context.put("tdoc", doc);
-            vcontext.put("tdoc", vcontext.get("doc"));
-            if (doc.isNew()) {
-                doc.setDefaultLanguage(language);
-                doc.setLanguage("");
+            if (languagetoedit.equals("")) {
+                // In this case the created document is going to be the default document
+                tdoc = doc;
+                context.put("tdoc", doc);
+                vcontext.put("tdoc", vcontext.get("doc"));
+                if (doc.isNew()) {
+                    doc.setDefaultLanguage(language);
+                    doc.setLanguage("");
+                }
+            } else {
+                // If the translated doc object is the same as the doc object
+                // this means the translated doc did not exists so we need to create it
+                if ((tdoc==doc)) {
+                    tdoc = new XWikiDocument(doc.getWeb(), doc.getName());
+                    tdoc.setLanguage(languagetoedit);
+                    tdoc.setContent(doc.getContent());
+                    tdoc.setAuthor(context.getUser());
+                    tdoc.setStore(doc.getStore());
+                    context.put("tdoc", tdoc);
+                    vcontext.put("tdoc", new Document(tdoc, context));
+                }
             }
-        } else {
-            // If the translated doc object is the same as the doc object
-            // this means the translated doc did not exists so we need to create it
-            if ((tdoc==doc)) {
-                tdoc = new XWikiDocument(doc.getWeb(), doc.getName());
-                tdoc.setLanguage(languagetoedit);
-                tdoc.setContent(doc.getContent());
-                tdoc.setAuthor(context.getUser());
-                tdoc.setStore(doc.getStore());
-                context.put("tdoc", tdoc);
-                vcontext.put("tdoc", new Document(tdoc, context));
+
+            XWikiDocument tdoc2 = (XWikiDocument) tdoc.clone();
+            context.put("tdoc", tdoc2);
+            vcontext.put("tdoc", new Document(tdoc2, context));
+            tdoc2.readFromTemplate(peform, context);
+
+            /* Setup a lock */
+            try {
+                XWikiLock lock = tdoc.getLock(context);
+                if ((lock == null) || (lock.getUserName().equals(context.getUser())) || (peform.isLockForce()))
+                    tdoc.setLock(context.getUser(),context);
+            } catch (Exception e) {
+                e.printStackTrace();
+                // Lock should never make XWiki fail
+                // But we should log any related information
+                log.error("Exception while setting up lock", e);
             }
         }
 
-        /* Setup a lock */
-        try {
-        XWikiLock lock = tdoc.getLock(context);
-        if (lock == null || lock.getUserName().equals(context.getUser()) || peform.isLockForce())
-            tdoc.setLock(context.getUser(),context);
-        } catch (Exception e) {
-            // Lock should never make XWiki fail
-            // But we should log any related information
-            // log.error("Exception while setting up lock", e);
-        }
-
-        XWikiDocument tdoc2 = (XWikiDocument) tdoc.clone();
-        context.put("tdoc", tdoc2);
-        vcontext.put("tdoc", new Document(tdoc2, context));
-        tdoc2.readFromTemplate(peform, context);
         return "edit";
 	}
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/web/InlineAction.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/web/InlineAction.java	2006-02-27 04:19:36 UTC (rev 941)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/web/InlineAction.java	2006-02-27 09:00:26 UTC (rev 942)
@@ -1,50 +1,69 @@
 package com.xpn.xwiki.web;
 
 import org.apache.velocity.VelocityContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.XWikiException;
 import com.xpn.xwiki.api.Document;
 import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.doc.XWikiLock;
 
 public class InlineAction extends XWikiAction {
-	public String render(XWikiContext context) throws XWikiException {
+    private static final Log log = LogFactory.getLog(InlineAction.class);
+
+    public String render(XWikiContext context) throws XWikiException {
         XWikiDocument doc = context.getDoc();
-        XWikiForm form = context.getForm();
-        VelocityContext vcontext = (VelocityContext) context.get("vcontext");
-        Document vdoc = (Document) vcontext.get("doc");
-        Document vcdoc = (Document) vcontext.get("cdoc");
+        synchronized (doc) {
+            XWikiForm form = context.getForm();
+            VelocityContext vcontext = (VelocityContext) context.get("vcontext");
+            Document vdoc = (Document) vcontext.get("doc");
+            Document vcdoc = (Document) vcontext.get("cdoc");
+            PrepareEditForm peform = (PrepareEditForm) form;
 
-        XWikiDocument doc2 = (XWikiDocument) doc.clone();
-        Document vdoc2 = new Document(doc2, context);
-        context.put("doc", doc2);
-        vcontext.put("doc", vdoc2);
+            XWikiDocument doc2 = (XWikiDocument) doc.clone();
+            Document vdoc2 = new Document(doc2, context);
+            context.put("doc", doc2);
+            vcontext.put("doc", vdoc2);
 
-        PrepareEditForm peform = (PrepareEditForm) form;
-        String parent = peform.getParent();
-        if (parent!=null)
-            doc2.setParent(parent);
-        String creator = peform.getCreator();
-        if (creator!=null)
-            doc2.setCreator(creator);
-        String defaultLanguage = peform.getDefaultLanguage();
-        if ((defaultLanguage!=null)&&!defaultLanguage.equals(""))
-            doc2.setDefaultLanguage(defaultLanguage);
-        if (doc2.getDefaultLanguage().equals(""))
-            doc2.setDefaultLanguage(context.getWiki().getLanguagePreference(context));
+            String parent = peform.getParent();
+            if (parent!=null)
+                doc2.setParent(parent);
+            String creator = peform.getCreator();
+            if (creator!=null)
+                doc2.setCreator(creator);
+            String defaultLanguage = peform.getDefaultLanguage();
+            if ((defaultLanguage!=null)&&!defaultLanguage.equals(""))
+                doc2.setDefaultLanguage(defaultLanguage);
+            if (doc2.getDefaultLanguage().equals(""))
+                doc2.setDefaultLanguage(context.getWiki().getLanguagePreference(context));
 
-        doc2.readFromTemplate(peform, context);
-        if (vdoc==vcdoc) {
-            vcontext.put("cdoc", vdoc2);
-        } else {
-            XWikiDocument cdoc = vcdoc.getDocument();
-            XWikiDocument cdoc2 = (XWikiDocument) cdoc.clone();
-            vcontext.put("cdoc", new Document(cdoc2, context));
-            cdoc2.readFromTemplate(peform, context);
+            doc2.readFromTemplate(peform, context);
+            if (vdoc==vcdoc) {
+                vcontext.put("cdoc", vdoc2);
+            } else {
+                XWikiDocument cdoc = vcdoc.getDocument();
+                XWikiDocument cdoc2 = (XWikiDocument) cdoc.clone();
+                vcontext.put("cdoc", new Document(cdoc2, context));
+                cdoc2.readFromTemplate(peform, context);
+            }
+
+            /* Setup a lock */
+            try {
+                XWikiLock lock = doc.getLock(context);
+                if ((lock == null) || (lock.getUserName().equals(context.getUser())) || (peform.isLockForce()))
+                    doc.setLock(context.getUser(),context);
+            } catch (Exception e) {
+                e.printStackTrace();
+                // Lock should never make XWiki fail
+                // But we should log any related information
+                log.error("Exception while setting up lock", e);
+            }
         }
-                
+
         // Set display context to 'view'
         context.put("display", "edit");
         return "inline";
-	}
+    }
 }

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/web/PrepareEditForm.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/web/PrepareEditForm.java	2006-02-27 04:19:36 UTC (rev 941)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/web/PrepareEditForm.java	2006-02-27 09:00:26 UTC (rev 942)
@@ -17,7 +17,7 @@
 
  * Created by
  * User: Ludovic Dubost
- * Date: 30 déc. 2003
+ * Date: 30 d�c. 2003
  * Time: 09:12:48
  */
 package com.xpn.xwiki.web;
@@ -39,7 +39,7 @@
         setCreator(request.getParameter("creator"));
         setDefaultLanguage(request.getParameter("defaultLanguage"));
         setDefaultTemplate(request.getParameter("defaultTemplate"));
-        setLockForce("1".equals(request.getParameter("lockforce")));
+        setLockForce("1".equals(request.getParameter("force")));
     }
 
     public String getTemplate() {

Modified: xwiki/trunk/src/main/java/com/xpn/xwiki/web/SaveAction.java
===================================================================
--- xwiki/trunk/src/main/java/com/xpn/xwiki/web/SaveAction.java	2006-02-27 04:19:36 UTC (rev 941)
+++ xwiki/trunk/src/main/java/com/xpn/xwiki/web/SaveAction.java	2006-02-27 09:00:26 UTC (rev 942)
@@ -16,37 +16,40 @@
         XWikiDocument doc = context.getDoc();
         XWikiForm form = context.getForm();
 
-        String language = ((EditForm)form).getLanguage();
-        String defaultLanguage = ((EditForm)form).getDefaultLanguage();
-        XWikiDocument tdoc;
+        synchronized (doc) {
+            String language = ((EditForm)form).getLanguage();
+            String defaultLanguage = ((EditForm)form).getDefaultLanguage();
+            XWikiDocument tdoc;
 
-        if ((language==null)||(language.equals(""))||(language.equals("default"))||(language.equals(doc.getDefaultLanguage()))) {
-            // Need to save parent and defaultLanguage if they have changed
-            tdoc = doc;
-        } else {
-            tdoc = doc.getTranslatedDocument(language, context);
-            if (tdoc == doc) {
-                tdoc = new XWikiDocument(doc.getWeb(), doc.getName());
-                tdoc.setLanguage(language);
-                tdoc.setStore(doc.getStore());
+            if ((language==null)||(language.equals(""))||(language.equals("default"))||(language.equals(doc.getDefaultLanguage()))) {
+                // Need to save parent and defaultLanguage if they have changed
+                tdoc = doc;
+            } else {
+                tdoc = doc.getTranslatedDocument(language, context);
+                if (tdoc == doc) {
+                    tdoc = new XWikiDocument(doc.getWeb(), doc.getName());
+                    tdoc.setLanguage(language);
+                    tdoc.setStore(doc.getStore());
+                }
+                tdoc.setTranslation(1);
             }
-            tdoc.setTranslation(1);
-        }
 
-        XWikiDocument olddoc = (XWikiDocument) tdoc.clone();
-        tdoc.readFromTemplate(((EditForm)form).getTemplate(), context);
-        tdoc.readFromForm((EditForm)form, context);
+            XWikiDocument olddoc = (XWikiDocument) tdoc.clone();
+            tdoc.readFromTemplate(((EditForm)form).getTemplate(), context);
+            tdoc.readFromForm((EditForm)form, context);
 
-        // TODO: handle Author
-        String username = context.getUser();
-        tdoc.setAuthor(username);
-        if (tdoc.isNew())
-         tdoc.setCreator(username);
+            // TODO: handle Author
+            String username = context.getUser();
+            tdoc.setAuthor(username);
+            if (tdoc.isNew())
+                tdoc.setCreator(username);
 
-        xwiki.saveDocument(tdoc, olddoc, context);
-        XWikiLock lock = tdoc.getLock(context);
-        if (lock != null && lock.getUserName().equals(username))
-            tdoc.removeLock(context);
+            xwiki.saveDocument(tdoc, olddoc, context);
+            XWikiLock lock = tdoc.getLock(context);
+            if (lock != null )
+                tdoc.removeLock(context);
+        }
+
         // forward to view
         String redirect = Utils.getRedirect("view", context);
         sendRedirect(response, redirect);





More information about the Xwiki-notifications mailing list