You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2009/06/30 20:46:11 UTC
svn commit: r789871 - in /ofbiz/trunk:
applications/workeffort/script/org/ofbiz/workeffort/permission/
applications/workeffort/script/org/ofbiz/workeffort/workeffort/
applications/workeffort/servicedef/
applications/workeffort/src/org/ofbiz/workeffort/...
Author: adrianc
Date: Tue Jun 30 18:46:10 2009
New Revision: 789871
URL: http://svn.apache.org/viewvc?rev=789871&view=rev
Log:
Code cleanup and bug fixes in WebDAV and iCalendar.
Modified:
ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/permission/WorkEffortPermissionServices.xml
ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml
ofbiz/trunk/applications/workeffort/servicedef/services.xml
ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalConverter.java
ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalWorker.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/PropFindHelper.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/ResponseHelper.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavUtil.java
Modified: ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/permission/WorkEffortPermissionServices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/permission/WorkEffortPermissionServices.xml?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/permission/WorkEffortPermissionServices.xml (original)
+++ ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/permission/WorkEffortPermissionServices.xml Tue Jun 30 18:46:10 2009
@@ -305,7 +305,7 @@
<simple-method method-name="workEffortICalendarPermission" short-description="Check iCalendar Permission">
<!-- Note: the iCalendar servlet will call the permission service under two conditions - to grant
- VIEW access to a calendar that isn't PUBLIC, or to grant UPDATE access to a work effort -->
+ VIEW access to a calendar that isn't PUBLIC, or to grant CREATE or UPDATE access to a work effort -->
<log level="verbose" message="workEffortICalendarPermission invoked for workEffortId ${parameters.workEffortId},
user login partyId = ${userLogin.partyId}"/>
<call-simple-method method-name="workEffortManagerPermission"/>
Modified: ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml (original)
+++ ofbiz/trunk/applications/workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml Tue Jun 30 18:46:10 2009
@@ -1528,7 +1528,7 @@
<order-by field-name="contactMechPurposeTypeId"/>
</entity-condition>
<if-compare field="util:size(contactMechs)" operator="greater" value="0" type="Integer">
- <field-to-result field="iCalUrl" result-name="contactMechs[0].infoString"/>
+ <field-to-result field="contactMechs[0].infoString" result-name="iCalUrl"/>
</if-compare>
</simple-method>
Modified: ofbiz/trunk/applications/workeffort/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/servicedef/services.xml?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/applications/workeffort/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/workeffort/servicedef/services.xml Tue Jun 30 18:46:10 2009
@@ -698,7 +698,7 @@
<description>Get Party iCalendar URL</description>
<!-- No permission checking - the servlet handles that -->
<attribute type="String" mode="IN" name="partyId" optional="false"/>
- <attribute type="String" mode="OUT" name="iCalUri" optional="true"/>
+ <attribute type="String" mode="OUT" name="iCalUrl" optional="true"/>
</service>
<!-- WorkEffort Event Reminder Services -->
Modified: ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalConverter.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalConverter.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalConverter.java (original)
+++ ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalConverter.java Tue Jun 30 18:46:10 2009
@@ -70,7 +70,6 @@
public class ICalConverter {
protected static final String module = ICalConverter.class.getName();
- protected static final String contactMechIdXParamName = "X-ORG-APACHE-OFBIZ-CONTACT-MECH-ID";
protected static final String partyIdXParamName = "X-ORG-APACHE-OFBIZ-PARTY-ID";
protected static final ProdId prodId = new ProdId("-//Apache Open For Business//Work Effort Calendar//EN");
protected static final String workEffortIdParamName = "X-ORG-APACHE-OFBIZ-WORKEFFORT-ID";
@@ -656,9 +655,6 @@
Calendar calendar = null;
try {
calendar = builder.build(is);
- } catch (IOException e) {
- Debug.logError(e, "Error while updating calendar: ", module);
- throw e;
} finally {
if (is != null) {
is.close();
Modified: ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalWorker.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalWorker.java (original)
+++ ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalWorker.java Tue Jun 30 18:46:10 2009
@@ -19,7 +19,6 @@
package org.ofbiz.workeffort.workeffort;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
@@ -41,8 +40,10 @@
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilJ2eeCompat;
+import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.service.GenericServiceException;
@@ -84,10 +85,28 @@
return context;
}
+ /** Create an HTTP Forbidden response. The calendar converter will use this
+ * response when a user is logged in, but they don't have the basic CRUD
+ * permissions to perform an action. Returning a Forbidden status will
+ * prevent the client from trying the operation again.
+ *
+ * @param statusMessage Optional status message - usually <code>null</code>
+ * for security reasons
+ * @return
+ */
public static ResponseProperties createForbiddenResponse(String statusMessage) {
return new ResponseProperties(HttpServletResponse.SC_FORBIDDEN, statusMessage);
}
+ /** Create an HTTP Unauthorized response. The calendar converter will use this
+ * response when a user is not logged in, and basic CRUD permissions are
+ * needed to perform an action. Returning an Unauthorized status will
+ * force the client to authenticate the user, then try the operation again.
+ *
+ * @param statusMessage Optional status message - usually <code>null</code>
+ * for security reasons
+ * @return
+ */
public static ResponseProperties createNotAuthorizedResponse(String statusMessage) {
return new ResponseProperties(HttpServletResponse.SC_UNAUTHORIZED, statusMessage);
}
@@ -100,10 +119,29 @@
return new ResponseProperties(HttpServletResponse.SC_OK, statusMessage);
}
+ /** Create an HTTP Partial Content response. The calendar converter will use this
+ * response when a calendar is only partially updated.
+ *
+ * @param statusMessage A message describing which calendar components were
+ * not updated
+ * @return
+ */
public static ResponseProperties createPartialContentResponse(String statusMessage) {
return new ResponseProperties(HttpServletResponse.SC_PARTIAL_CONTENT, statusMessage);
}
+ protected static Date getLastModifiedDate(HttpServletRequest request) throws GenericEntityException {
+ String workEffortId = (String) request.getAttribute("workEffortId");
+ GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator");
+ GenericValue publishProperties = delegator.findOne("WorkEffort", UtilMisc.toMap("workEffortId", workEffortId), false);
+ GenericValue iCalData = publishProperties.getRelatedOne("WorkEffortIcalData");
+ if (iCalData != null) {
+ return iCalData.getTimestamp("lastUpdatedStamp");
+ } else {
+ return publishProperties.getTimestamp("lastUpdatedStamp");
+ }
+ }
+
protected static Writer getWriter(HttpServletResponse response, ServletContext context) throws IOException {
Writer writer = null;
if (UtilJ2eeCompat.useOutputStreamNotWriter(context)) {
@@ -143,11 +181,8 @@
Debug.logInfo("[handlePropFindRequest] workEffortId = " + workEffortId, module);
try {
Document requestDocument = WebDavUtil.getDocumentFromRequest(request);
- ByteArrayOutputStream os = null;
if (Debug.verboseOn()) {
- os = new ByteArrayOutputStream();
- UtilXml.writeXmlDocument(os, requestDocument, "UTF-8", true, true);
- Debug.logVerbose("[handlePropFindRequest] PROPFIND body:\r\n" + os.toString(), module);
+ Debug.logVerbose("[handlePropFindRequest] PROPFIND body:\r\n" + UtilXml.writeXmlDocument(requestDocument), module);
}
PropFindHelper helper = new PropFindHelper(requestDocument);
if (!helper.isAllProp() && !helper.isPropName()) {
@@ -162,7 +197,8 @@
continue;
}
if ("getlastmodified".equals(propElement.getLocalName())) {
- Element lmElement = helper.createElementSetValue("D:getlastmodified", WebDavUtil.formatDate(WebDavUtil.RFC1123_DATE_FORMAT, new Date()));
+ Date lastModified = getLastModifiedDate(request);
+ Element lmElement = helper.createElementSetValue("D:getlastmodified", WebDavUtil.formatDate(WebDavUtil.RFC1123_DATE_FORMAT, lastModified));
supportedProps.add(lmElement);
continue;
}
@@ -182,14 +218,15 @@
rootElement.appendChild(responseElement);
responseDocument.appendChild(rootElement);
if (Debug.verboseOn()) {
- os = new ByteArrayOutputStream();
- UtilXml.writeXmlDocument(os, responseDocument, "UTF-8", true, true);
- Debug.logVerbose("[handlePropFindRequest] PROPFIND response:\r\n" + os.toString(), module);
+ Debug.logVerbose("[handlePropFindRequest] PROPFIND response:\r\n" + UtilXml.writeXmlDocument(responseDocument), module);
}
ResponseHelper.prepareResponse(response, 207, "Multi-Status");
Writer writer = getWriter(response, context);
- helper.writeResponse(writer);
- writer.close();
+ try {
+ helper.writeResponse(response, writer);
+ } finally {
+ writer.close();
+ }
return;
}
} catch (Exception e) {
@@ -295,11 +332,10 @@
response.setHeader("WWW-Authenticate", "Basic realm=\"OFBiz iCalendar " + request.getAttribute("workEffortId") + "\"");
}
if (responseProps.statusMessage != null) {
+ response.setContentLength(responseProps.statusMessage.length());
Writer writer = getWriter(response, context);
try {
writer.write(responseProps.statusMessage);
- } catch (IOException e) {
- throw e;
} finally {
writer.close();
}
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilXml.java Tue Jun 30 18:46:10 2009
@@ -253,10 +253,6 @@
try {
fos = new FileOutputStream(outFile);
writeXmlDocument(fos, node);
- } catch (FileNotFoundException e) {
- throw e;
- } catch (IOException e) {
- throw e;
} finally {
if (fos != null) {
fos.close();
Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/PropFindHelper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/PropFindHelper.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/PropFindHelper.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/PropFindHelper.java Tue Jun 30 18:46:10 2009
@@ -18,18 +18,14 @@
*******************************************************************************/
package org.ofbiz.webapp.webdav;
-import java.io.IOException;
import java.util.List;
-import javax.xml.parsers.ParserConfigurationException;
-
import javolution.util.FastList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
/** PROPFIND HTTP method helper class. This class provides helper methods for
* working with WebDAV PROPFIND requests and responses.*/
@@ -37,7 +33,7 @@
protected final Document requestDocument;
- public PropFindHelper(Document requestDocument) throws IOException, SAXException, ParserConfigurationException {
+ public PropFindHelper(Document requestDocument) {
this.requestDocument = requestDocument;
}
Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/ResponseHelper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/ResponseHelper.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/ResponseHelper.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/ResponseHelper.java Tue Jun 30 18:46:10 2009
@@ -23,12 +23,10 @@
import java.io.Writer;
import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.ParserConfigurationException;
import org.ofbiz.base.util.UtilXml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import org.xml.sax.SAXException;
/** WebDAV response helper class. This class provides helper methods for
* working with WebDAV requests and responses.*/
@@ -54,7 +52,7 @@
protected final Document responseDocument;
- public ResponseHelper() throws IOException, SAXException, ParserConfigurationException {
+ public ResponseHelper() {
this.responseDocument = UtilXml.makeEmptyXmlDocument();
}
@@ -93,13 +91,14 @@
return this.responseDocument;
}
- public void writeResponse(Writer writer) throws IOException {
+ public void writeResponse(HttpServletResponse response, Writer writer) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
UtilXml.writeXmlDocument(os, this.responseDocument, "UTF-8", true, true);
} catch (Exception e) {
throw new IOException(e.getMessage());
}
- writer.write(os.toString());
+ response.setContentLength(os.size());
+ writer.write(os.toString("UTF-8"));
}
}
Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavUtil.java?rev=789871&r1=789870&r2=789871&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavUtil.java (original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavUtil.java Tue Jun 30 18:46:10 2009
@@ -53,9 +53,16 @@
}
public static Document getDocumentFromRequest(HttpServletRequest request) throws IOException, SAXException, ParserConfigurationException {
- InputStream is = request.getInputStream();
- Document document = UtilXml.readXmlDocument(is, false, "WebDAV request");
- is.close();
+ Document document = null;
+ InputStream is = null;
+ try {
+ is = request.getInputStream();
+ document = UtilXml.readXmlDocument(is, false, "WebDAV request");
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ }
return document;
}
@@ -66,7 +73,7 @@
* those aren't found, then the request is checked for the HTTP Authorization header.
* Currently, only Basic authorization is supported.</p>
*
- * @param request
+ * @param request The WebDAV request
* @return A <code>Map</code> containing <code>login.username</code> and
* <code>login.password</code> elements.
*/