mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged V3.2 to HEAD
18862: Merged DEV_TEMPORARY to V3.2 18699: ETHREEOH-4171: HTTP 500 when filling in a WCM webform (ACT-15969) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@18863 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -33,6 +33,7 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
import javax.faces.context.ExternalContext;
|
import javax.faces.context.ExternalContext;
|
||||||
@@ -42,10 +43,12 @@ import javax.servlet.ServletContext;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.alfresco.repo.avm.AVMNodeConverter;
|
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||||
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.springframework.extensions.surf.util.Pair;
|
import org.springframework.extensions.surf.util.Pair;
|
||||||
import org.alfresco.web.app.Application;
|
import org.alfresco.web.app.Application;
|
||||||
import org.alfresco.web.app.servlet.FacesHelper;
|
import org.alfresco.web.app.servlet.FacesHelper;
|
||||||
import org.alfresco.web.bean.NavigationBean;
|
import org.alfresco.web.bean.NavigationBean;
|
||||||
|
import org.alfresco.web.bean.repository.Repository;
|
||||||
import org.alfresco.web.bean.wcm.AVMBrowseBean;
|
import org.alfresco.web.bean.wcm.AVMBrowseBean;
|
||||||
import org.alfresco.web.bean.wcm.AVMNode;
|
import org.alfresco.web.bean.wcm.AVMNode;
|
||||||
import org.alfresco.web.bean.wcm.AVMUtil;
|
import org.alfresco.web.bean.wcm.AVMUtil;
|
||||||
@@ -80,9 +83,6 @@ import org.w3c.dom.events.EventListener;
|
|||||||
import org.w3c.dom.events.EventTarget;
|
import org.w3c.dom.events.EventTarget;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
|
||||||
import org.alfresco.web.bean.repository.Repository;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bean for interacting with the chiba processor from the ui using ajax requests.
|
* Bean for interacting with the chiba processor from the ui using ajax requests.
|
||||||
@@ -122,6 +122,7 @@ public class XFormsBean implements Serializable
|
|||||||
*/
|
*/
|
||||||
class XFormsSession implements FormProcessor.Session
|
class XFormsSession implements FormProcessor.Session
|
||||||
{
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
private final Document formInstanceData;
|
private final Document formInstanceData;
|
||||||
private final String formInstanceDataName;
|
private final String formInstanceDataName;
|
||||||
private final Form form;
|
private final Form form;
|
||||||
@@ -179,8 +180,10 @@ public class XFormsBean implements Serializable
|
|||||||
private transient Schema2XFormsProperties schema2XFormsProperties;
|
private transient Schema2XFormsProperties schema2XFormsProperties;
|
||||||
private AVMBrowseBean avmBrowseBean;
|
private AVMBrowseBean avmBrowseBean;
|
||||||
private NavigationBean navigator;
|
private NavigationBean navigator;
|
||||||
|
// lock for XFormSession.eventLog
|
||||||
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
|
||||||
|
private Lock writeLock = rwLock.writeLock();
|
||||||
|
private Lock readLock = rwLock.readLock();
|
||||||
|
|
||||||
public static String BEAN_NAME = "XFormsBean";
|
public static String BEAN_NAME = "XFormsBean";
|
||||||
|
|
||||||
@@ -229,67 +232,67 @@ public class XFormsBean implements Serializable
|
|||||||
final ServletContext servletContext = (ServletContext)
|
final ServletContext servletContext = (ServletContext)
|
||||||
externalContext.getContext();
|
externalContext.getContext();
|
||||||
|
|
||||||
final ChibaBean chibaBean = new ChibaBean();
|
writeLock.lock();
|
||||||
chibaBean.setConfig(servletContext.getRealPath("/WEB-INF/chiba.xml"));
|
try
|
||||||
Pair<Document, XSModel> chibaPair = this.getXFormsDocument();
|
|
||||||
chibaBean.setXMLContainer(chibaPair.getFirst(), chibaPair.getSecond());
|
|
||||||
|
|
||||||
final EventTarget et = (EventTarget)
|
|
||||||
chibaBean.getXMLContainer().getDocumentElement();
|
|
||||||
final EventListener el = new EventListener()
|
|
||||||
{
|
{
|
||||||
public void handleEvent(final Event e)
|
final ChibaBean chibaBean = new ChibaBean();
|
||||||
|
chibaBean.setConfig(servletContext.getRealPath("/WEB-INF/chiba.xml"));
|
||||||
|
Pair<Document, XSModel> chibaPair = this.getXFormsDocument();
|
||||||
|
chibaBean.setXMLContainer(chibaPair.getFirst(), chibaPair.getSecond());
|
||||||
|
|
||||||
|
final EventTarget et = (EventTarget)
|
||||||
|
chibaBean.getXMLContainer().getDocumentElement();
|
||||||
|
final EventListener el = new EventListener()
|
||||||
{
|
{
|
||||||
final XMLEvent xmle = (XMLEvent)e;
|
public void handleEvent(final Event e)
|
||||||
if (XFormsBean.LOGGER.isDebugEnabled())
|
|
||||||
XFormsBean.LOGGER.debug("received event " + xmle.getType() + ": " + xmle);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
lock.writeLock().lock();
|
final XMLEvent xmle = (XMLEvent)e;
|
||||||
XFormsBean.this.xformsSession.eventLog.add(xmle);
|
if (XFormsBean.LOGGER.isDebugEnabled())
|
||||||
|
XFormsBean.LOGGER.debug("received event " + xmle.getType() + ": " + xmle);
|
||||||
|
|
||||||
|
XFormsBean.this.xformsSession.eventLog.add(xmle);
|
||||||
}
|
}
|
||||||
finally
|
};
|
||||||
{
|
|
||||||
lock.writeLock().unlock();
|
// interaction events my occur during init so we have to register before
|
||||||
}
|
et.addEventListener(ChibaEventNames.LOAD_URI, el, true);
|
||||||
}
|
et.addEventListener(ChibaEventNames.RENDER_MESSAGE, el, true);
|
||||||
};
|
et.addEventListener(ChibaEventNames.REPLACE_ALL, el, true);
|
||||||
|
|
||||||
// interaction events my occur during init so we have to register before
|
et.addEventListener(XFormsEventNames.ENABLED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.LOAD_URI, el, true);
|
et.addEventListener(XFormsEventNames.DISABLED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.RENDER_MESSAGE, el, true);
|
et.addEventListener(XFormsEventNames.REQUIRED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.REPLACE_ALL, el, true);
|
et.addEventListener(XFormsEventNames.OPTIONAL, el, true);
|
||||||
|
et.addEventListener(XFormsEventNames.READONLY, el, true);
|
||||||
et.addEventListener(XFormsEventNames.ENABLED, el, true);
|
et.addEventListener(XFormsEventNames.READWRITE, el, true);
|
||||||
et.addEventListener(XFormsEventNames.DISABLED, el, true);
|
et.addEventListener(XFormsEventNames.VALID, el, true);
|
||||||
et.addEventListener(XFormsEventNames.REQUIRED, el, true);
|
et.addEventListener(XFormsEventNames.INVALID, el, true);
|
||||||
et.addEventListener(XFormsEventNames.OPTIONAL, el, true);
|
et.addEventListener(XFormsEventNames.IN_RANGE, el, true);
|
||||||
et.addEventListener(XFormsEventNames.READONLY, el, true);
|
et.addEventListener(XFormsEventNames.OUT_OF_RANGE, el, true);
|
||||||
et.addEventListener(XFormsEventNames.READWRITE, el, true);
|
et.addEventListener(XFormsEventNames.SELECT, el, true);
|
||||||
et.addEventListener(XFormsEventNames.VALID, el, true);
|
et.addEventListener(XFormsEventNames.DESELECT, el, true);
|
||||||
et.addEventListener(XFormsEventNames.INVALID, el, true);
|
et.addEventListener(XFormsEventNames.INSERT, el, true);
|
||||||
et.addEventListener(XFormsEventNames.IN_RANGE, el, true);
|
et.addEventListener(XFormsEventNames.DELETE, el, true);
|
||||||
et.addEventListener(XFormsEventNames.OUT_OF_RANGE, el, true);
|
|
||||||
et.addEventListener(XFormsEventNames.SELECT, el, true);
|
chibaBean.init();
|
||||||
et.addEventListener(XFormsEventNames.DESELECT, el, true);
|
|
||||||
et.addEventListener(XFormsEventNames.INSERT, el, true);
|
// register for notification events
|
||||||
et.addEventListener(XFormsEventNames.DELETE, el, true);
|
et.addEventListener(XFormsEventNames.SUBMIT, el, true);
|
||||||
|
et.addEventListener(XFormsEventNames.SUBMIT_DONE, el, true);
|
||||||
chibaBean.init();
|
et.addEventListener(XFormsEventNames.SUBMIT_ERROR, el, true);
|
||||||
|
et.addEventListener(ChibaEventNames.STATE_CHANGED, el, true);
|
||||||
// register for notification events
|
et.addEventListener(ChibaEventNames.PROTOTYPE_CLONED, el, true);
|
||||||
et.addEventListener(XFormsEventNames.SUBMIT, el, true);
|
et.addEventListener(ChibaEventNames.ID_GENERATED, el, true);
|
||||||
et.addEventListener(XFormsEventNames.SUBMIT_DONE, el, true);
|
et.addEventListener(ChibaEventNames.ITEM_INSERTED, el, true);
|
||||||
et.addEventListener(XFormsEventNames.SUBMIT_ERROR, el, true);
|
et.addEventListener(ChibaEventNames.ITEM_DELETED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.STATE_CHANGED, el, true);
|
et.addEventListener(ChibaEventNames.INDEX_CHANGED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.PROTOTYPE_CLONED, el, true);
|
et.addEventListener(ChibaEventNames.SWITCH_TOGGLED, el, true);
|
||||||
et.addEventListener(ChibaEventNames.ID_GENERATED, el, true);
|
this.xformsSession.chibaBean = chibaBean;
|
||||||
et.addEventListener(ChibaEventNames.ITEM_INSERTED, el, true);
|
}
|
||||||
et.addEventListener(ChibaEventNames.ITEM_DELETED, el, true);
|
finally
|
||||||
et.addEventListener(ChibaEventNames.INDEX_CHANGED, el, true);
|
{
|
||||||
et.addEventListener(ChibaEventNames.SWITCH_TOGGLED, el, true);
|
writeLock.unlock();
|
||||||
this.xformsSession.chibaBean = chibaBean;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -323,24 +326,30 @@ public class XFormsBean implements Serializable
|
|||||||
* Writes the xform out to the http servlet response. This allows
|
* Writes the xform out to the http servlet response. This allows
|
||||||
* us to use the browser to parse the xform using XMLHttpRequest.
|
* us to use the browser to parse the xform using XMLHttpRequest.
|
||||||
*/
|
*/
|
||||||
public synchronized void getXForm()
|
public void getXForm() throws IOException, XFormsException
|
||||||
throws IOException,
|
|
||||||
XFormsException
|
|
||||||
{
|
{
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
LOGGER.debug(this + ".getXForm()");
|
LOGGER.debug(this + ".getXForm()");
|
||||||
final FacesContext context = FacesContext.getCurrentInstance();
|
final FacesContext context = FacesContext.getCurrentInstance();
|
||||||
final ResponseWriter out = context.getResponseWriter();
|
final ResponseWriter out = context.getResponseWriter();
|
||||||
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
|
||||||
final Node xformsDocument = chibaBean.getXMLContainer();
|
readLock.lock();
|
||||||
XMLUtil.print(xformsDocument, out);
|
try
|
||||||
|
{
|
||||||
|
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
||||||
|
final Node xformsDocument = chibaBean.getXMLContainer();
|
||||||
|
XMLUtil.print(xformsDocument, out);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
readLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the value of a control in the processor.
|
* sets the value of a control in the processor.
|
||||||
*/
|
*/
|
||||||
public synchronized void setXFormsValue()
|
public void setXFormsValue() throws XFormsException, IOException
|
||||||
throws XFormsException, IOException
|
|
||||||
{
|
{
|
||||||
final FacesContext context = FacesContext.getCurrentInstance();
|
final FacesContext context = FacesContext.getCurrentInstance();
|
||||||
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
||||||
@@ -349,50 +358,67 @@ public class XFormsBean implements Serializable
|
|||||||
|
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
LOGGER.debug(this + ".setXFormsValue(" + id + ", " + value + ")");
|
LOGGER.debug(this + ".setXFormsValue(" + id + ", " + value + ")");
|
||||||
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
|
||||||
if (chibaBean.getContainer().lookup(id) instanceof Upload)
|
|
||||||
{
|
|
||||||
chibaBean.updateControlValue(id, null, value, value.getBytes("UTF-8"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
chibaBean.updateControlValue(id, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
final ResponseWriter out = context.getResponseWriter();
|
readLock.lock();
|
||||||
XMLUtil.print(this.getEventLog(), out);
|
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
||||||
out.close();
|
readLock.unlock();
|
||||||
|
writeLock.lock();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (chibaBean.getContainer().lookup(id) instanceof Upload)
|
||||||
|
{
|
||||||
|
chibaBean.updateControlValue(id, null, value, value.getBytes("UTF-8"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chibaBean.updateControlValue(id, value);
|
||||||
|
}
|
||||||
|
final ResponseWriter out = context.getResponseWriter();
|
||||||
|
XMLUtil.print(this.getEventLog(), out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
writeLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the value of a control in the processor.
|
* sets the value of a control in the processor.
|
||||||
*/
|
*/
|
||||||
public void setRepeatIndeces()
|
public void setRepeatIndeces() throws XFormsException, IOException
|
||||||
throws XFormsException, IOException
|
|
||||||
{
|
{
|
||||||
final FacesContext context = FacesContext.getCurrentInstance();
|
final FacesContext context = FacesContext.getCurrentInstance();
|
||||||
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
||||||
final String repeatIds = (String)requestParameters.get("repeatIds");
|
final String repeatIds = (String)requestParameters.get("repeatIds");
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
LOGGER.debug(this + ".setRepeatIndeces(" + repeatIds + ")");
|
LOGGER.debug(this + ".setRepeatIndeces(" + repeatIds + ")");
|
||||||
for (String id : repeatIds.split(","))
|
|
||||||
|
writeLock.lock();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
final int index = Integer.parseInt((String)requestParameters.get(id));
|
for (String id : repeatIds.split(","))
|
||||||
if (LOGGER.isDebugEnabled())
|
{
|
||||||
LOGGER.debug(this + ".setRepeatIndex(" + id + ", " + index + ")");
|
final int index = Integer.parseInt((String)requestParameters.get(id));
|
||||||
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
if (LOGGER.isDebugEnabled())
|
||||||
chibaBean.updateRepeatIndex(id, index);
|
LOGGER.debug(this + ".setRepeatIndex(" + id + ", " + index + ")");
|
||||||
|
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
||||||
|
chibaBean.updateRepeatIndex(id, index);
|
||||||
|
}
|
||||||
|
final ResponseWriter out = context.getResponseWriter();
|
||||||
|
XMLUtil.print(this.getEventLog(), out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
writeLock.unlock();
|
||||||
}
|
}
|
||||||
final ResponseWriter out = context.getResponseWriter();
|
|
||||||
XMLUtil.print(this.getEventLog(), out);
|
|
||||||
out.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fires an action associated with a trigger.
|
* fires an action associated with a trigger.
|
||||||
*/
|
*/
|
||||||
public synchronized void fireAction()
|
public void fireAction() throws XFormsException, IOException
|
||||||
throws XFormsException, IOException
|
|
||||||
{
|
{
|
||||||
final FacesContext context = FacesContext.getCurrentInstance();
|
final FacesContext context = FacesContext.getCurrentInstance();
|
||||||
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
||||||
@@ -400,12 +426,21 @@ public class XFormsBean implements Serializable
|
|||||||
|
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
LOGGER.debug(this + ".fireAction(" + id + ")");
|
LOGGER.debug(this + ".fireAction(" + id + ")");
|
||||||
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
|
||||||
chibaBean.dispatch(id, DOMEventNames.ACTIVATE);
|
|
||||||
|
|
||||||
final ResponseWriter out = context.getResponseWriter();
|
writeLock.lock();
|
||||||
XMLUtil.print(this.getEventLog(), out);
|
try
|
||||||
out.close();
|
{
|
||||||
|
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
||||||
|
chibaBean.dispatch(id, DOMEventNames.ACTIVATE);
|
||||||
|
|
||||||
|
final ResponseWriter out = context.getResponseWriter();
|
||||||
|
XMLUtil.print(this.getEventLog(), out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
writeLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -454,8 +489,7 @@ public class XFormsBean implements Serializable
|
|||||||
/**
|
/**
|
||||||
* Swaps model nodes to implement reordering within repeats.
|
* Swaps model nodes to implement reordering within repeats.
|
||||||
*/
|
*/
|
||||||
public synchronized void swapRepeatItems()
|
public void swapRepeatItems() throws Exception
|
||||||
throws Exception
|
|
||||||
{
|
{
|
||||||
final FacesContext context = FacesContext.getCurrentInstance();
|
final FacesContext context = FacesContext.getCurrentInstance();
|
||||||
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
final Map requestParameters = context.getExternalContext().getRequestParameterMap();
|
||||||
@@ -464,22 +498,38 @@ public class XFormsBean implements Serializable
|
|||||||
final String toItemId = (String)requestParameters.get("toItemId");
|
final String toItemId = (String)requestParameters.get("toItemId");
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
LOGGER.debug(this + ".swapRepeatItems(" + fromItemId + ", " + toItemId + ")");
|
LOGGER.debug(this + ".swapRepeatItems(" + fromItemId + ", " + toItemId + ")");
|
||||||
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
|
||||||
final RepeatItem from = (RepeatItem)chibaBean.getContainer().lookup(fromItemId);
|
|
||||||
if (from == null)
|
|
||||||
{
|
|
||||||
throw new NullPointerException("unable to find source repeat item " + fromItemId);
|
|
||||||
}
|
|
||||||
final RepeatItem to = (RepeatItem)chibaBean.getContainer().lookup(toItemId);
|
|
||||||
if (to == null)
|
|
||||||
{
|
|
||||||
throw new NullPointerException("unable to find destination repeat item " + toItemId);
|
|
||||||
}
|
|
||||||
this.swapRepeatItems(from, to);
|
|
||||||
|
|
||||||
final ResponseWriter out = context.getResponseWriter();
|
readLock.lock();
|
||||||
XMLUtil.print(this.getEventLog(), out);
|
try
|
||||||
out.close();
|
{
|
||||||
|
final ChibaBean chibaBean = this.xformsSession.chibaBean;
|
||||||
|
final RepeatItem from = (RepeatItem)chibaBean.getContainer().lookup(fromItemId);
|
||||||
|
if (from == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("unable to find source repeat item " + fromItemId);
|
||||||
|
}
|
||||||
|
final RepeatItem to = (RepeatItem)chibaBean.getContainer().lookup(toItemId);
|
||||||
|
if (to == null)
|
||||||
|
{
|
||||||
|
throw new NullPointerException("unable to find destination repeat item " + toItemId);
|
||||||
|
}
|
||||||
|
readLock.unlock();
|
||||||
|
writeLock.lock();
|
||||||
|
this.swapRepeatItems(from, to);
|
||||||
|
|
||||||
|
final ResponseWriter out = context.getResponseWriter();
|
||||||
|
XMLUtil.print(this.getEventLog(), out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (NullPointerException e)
|
||||||
|
{
|
||||||
|
readLock.unlock();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
writeLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void swapRepeatItems(final RepeatItem from,
|
private void swapRepeatItems(final RepeatItem from,
|
||||||
@@ -644,89 +694,71 @@ public class XFormsBean implements Serializable
|
|||||||
final Element eventsElement = result.createElement("events");
|
final Element eventsElement = result.createElement("events");
|
||||||
result.appendChild(eventsElement);
|
result.appendChild(eventsElement);
|
||||||
|
|
||||||
try
|
for (XMLEvent xfe : this.xformsSession.eventLog)
|
||||||
{
|
{
|
||||||
lock.readLock().lock();
|
final String type = xfe.getType();
|
||||||
|
if (LOGGER.isDebugEnabled())
|
||||||
for (XMLEvent xfe : this.xformsSession.eventLog)
|
{
|
||||||
{
|
LOGGER.debug("adding event " + type + " to the event log");
|
||||||
final String type = xfe.getType();
|
}
|
||||||
if (LOGGER.isDebugEnabled())
|
|
||||||
{
|
|
||||||
LOGGER.debug("adding event " + type + " to the event log");
|
|
||||||
}
|
|
||||||
|
|
||||||
final Element target = (Element)xfe.getTarget();
|
final Element target = (Element)xfe.getTarget();
|
||||||
|
|
||||||
final Element eventElement = result.createElement(type);
|
final Element eventElement = result.createElement(type);
|
||||||
eventsElement.appendChild(eventElement);
|
eventsElement.appendChild(eventElement);
|
||||||
eventElement.setAttribute("targetId", target.getAttributeNS(null, "id"));
|
eventElement.setAttribute("targetId", target.getAttributeNS(null, "id"));
|
||||||
eventElement.setAttribute("targetName", target.getLocalName());
|
eventElement.setAttribute("targetName", target.getLocalName());
|
||||||
|
|
||||||
final Collection properties = xfe.getPropertyNames();
|
final Collection properties = xfe.getPropertyNames();
|
||||||
if (properties != null)
|
if (properties != null)
|
||||||
{
|
{
|
||||||
for (Object name : properties)
|
for (Object name : properties)
|
||||||
{
|
{
|
||||||
final Object value = xfe.getContextInfo((String)name);
|
final Object value = xfe.getContextInfo((String)name);
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
{
|
{
|
||||||
LOGGER.debug("adding property {" + name +
|
LOGGER.debug("adding property {" + name +
|
||||||
":" + value + "} to event " + type);
|
":" + value + "} to event " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Element propertyElement = result.createElement("property");
|
final Element propertyElement = result.createElement("property");
|
||||||
eventElement.appendChild(propertyElement);
|
eventElement.appendChild(propertyElement);
|
||||||
propertyElement.setAttribute("name", name.toString());
|
propertyElement.setAttribute("name", name.toString());
|
||||||
propertyElement.setAttribute("value",
|
propertyElement.setAttribute("value",
|
||||||
value != null ? value.toString() : null);
|
value != null ? value.toString() : null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LOGGER.isDebugEnabled() && XFormsEventNames.SUBMIT_ERROR.equals(type))
|
if (LOGGER.isDebugEnabled() && XFormsEventNames.SUBMIT_ERROR.equals(type))
|
||||||
{
|
{
|
||||||
// debug for figuring out which elements aren't valid for submit
|
// debug for figuring out which elements aren't valid for submit
|
||||||
LOGGER.debug("performing full revalidate");
|
LOGGER.debug("performing full revalidate");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final Model model = this.xformsSession.chibaBean.getContainer().getDefaultModel();
|
final Model model = this.xformsSession.chibaBean.getContainer().getDefaultModel();
|
||||||
final Instance instance = model.getDefaultInstance();
|
final Instance instance = model.getDefaultInstance();
|
||||||
model.getValidator().validate(instance, "/", new DefaultValidatorMode());
|
model.getValidator().validate(instance, "/", new DefaultValidatorMode());
|
||||||
final Iterator<ModelItem> it = instance.iterateModelItems("/");
|
final Iterator<ModelItem> it = instance.iterateModelItems("/");
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{
|
{
|
||||||
final ModelItem modelItem = it.next();
|
final ModelItem modelItem = it.next();
|
||||||
if (!modelItem.isValid())
|
if (!modelItem.isValid())
|
||||||
{
|
{
|
||||||
LOGGER.debug("model node " + modelItem.getNode() + " is invalid");
|
LOGGER.debug("model node " + modelItem.getNode() + " is invalid");
|
||||||
}
|
}
|
||||||
if (modelItem.isRequired() && modelItem.getValue().length() == 0)
|
if (modelItem.isRequired() && modelItem.getValue().length() == 0)
|
||||||
{
|
{
|
||||||
LOGGER.debug("model node " + modelItem.getNode() + " is empty and required");
|
LOGGER.debug("model node " + modelItem.getNode() + " is empty and required");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (final XFormsException xfe2)
|
catch (final XFormsException xfe2)
|
||||||
{
|
{
|
||||||
LOGGER.debug("error performing revaliation", xfe2);
|
LOGGER.debug("error performing revaliation", xfe2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
this.xformsSession.eventLog.clear();
|
||||||
finally
|
|
||||||
{
|
|
||||||
lock.readLock().unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
lock.writeLock().lock();
|
|
||||||
this.xformsSession.eventLog.clear();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
lock.writeLock().unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (LOGGER.isDebugEnabled())
|
if (LOGGER.isDebugEnabled())
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user