You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by pn...@apache.org on 2004/07/07 17:48:34 UTC
cvs commit: jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/jdomobjects XNodeRevisionDescriptor.java
pnever 2004/07/07 08:48:34
Modified: proposals/tamino/src/store/org/apache/slide/store/tamino/store
Tag: TWS421_BRANCH ISlideAccessor.java
proposals/tamino/src/store/org/apache/slide/store/tamino/datastore
Tag: TWS421_BRANCH TaminoParameters.java
proposals/tamino/src/store/org/apache/slide/store/tamino/security/report
Tag: TWS421_BRANCH XAbstractReport.java
XPrincipalHasPrivilegeReport.java
XPrincipalPrivilegeSetReport.java
proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search
Tag: TWS421_BRANCH XBasicExpression.java
proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/schema
Tag: TWS421_BRANCH XKnownPropertyHelper.java
proposals/tamino/src/store/org/apache/slide/store/tamino/jdomobjects
Tag: TWS421_BRANCH XNodeRevisionDescriptor.java
Added: proposals/tamino/src/store/org/apache/slide/store/tamino/security/report
Tag: TWS421_BRANCH XLocateByHistoryReport.java
Log:
Making locate-by-history report faster for Tamino by using a query
Revision Changes Path
No revision
No revision
1.1.4.1 +14 -4 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/store/ISlideAccessor.java
Index: ISlideAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/store/ISlideAccessor.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- ISlideAccessor.java 25 Mar 2004 16:18:03 -0000 1.1
+++ ISlideAccessor.java 7 Jul 2004 15:48:33 -0000 1.1.4.1
@@ -21,6 +21,8 @@
*/
package org.apache.slide.store.tamino.store;
+import org.apache.slide.common.Namespace;
+
/**
* Provides access to information coming from slide. These are mainly
* configuration data as Tamino connection info and collection for
@@ -30,6 +32,7 @@
*
* @version $Revision$
*/
+
public interface ISlideAccessor {
/**
@@ -45,5 +48,12 @@
* @return the namespace access token
*/
public String getNamespaceName();
+
+ /**
+ * Method getNamespace
+ *
+ * @return a Namespace
+ */
+ public Namespace getNamespace();
}
No revision
No revision
1.1.4.1 +9 -4 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/TaminoParameters.java
Index: TaminoParameters.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/TaminoParameters.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- TaminoParameters.java 25 Mar 2004 16:18:00 -0000 1.1
+++ TaminoParameters.java 7 Jul 2004 15:48:34 -0000 1.1.4.1
@@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
+import org.apache.slide.common.Namespace;
import org.apache.slide.store.tamino.common.XGlobals;
import org.apache.slide.store.tamino.store.ISlideAccessor;
import org.apache.slide.store.tamino.store.monitoring.IMonitor;
@@ -70,6 +71,10 @@
public String getNamespaceName() {
return namespaceName;
+ }
+
+ public Namespace getNamespace() {
+ return null;
}
/**
No revision
No revision
1.1.4.1 +5 -5 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XAbstractReport.java
Index: XAbstractReport.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XAbstractReport.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- XAbstractReport.java 25 Mar 2004 16:18:03 -0000 1.1
+++ XAbstractReport.java 7 Jul 2004 15:48:34 -0000 1.1.4.1
@@ -19,7 +19,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.slide.store.tamino.security.report;
+package org.apache.slide.store.tamino.report;
import java.io.IOException;
import java.util.Enumeration;
1.1.4.2 +5 -5 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalHasPrivilegeReport.java
Index: XPrincipalHasPrivilegeReport.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalHasPrivilegeReport.java,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -r1.1.4.1 -r1.1.4.2
--- XPrincipalHasPrivilegeReport.java 20 Apr 2004 08:27:51 -0000 1.1.4.1
+++ XPrincipalHasPrivilegeReport.java 7 Jul 2004 15:48:34 -0000 1.1.4.2
@@ -19,7 +19,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.slide.store.tamino.security.report;
+package org.apache.slide.store.tamino.report;
import org.apache.slide.urm.URMException;
import org.apache.slide.urm.accesscontroler.URMAclAdministrator;
1.1.4.2 +5 -5 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalPrivilegeSetReport.java
Index: XPrincipalPrivilegeSetReport.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalPrivilegeSetReport.java,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -r1.1.4.1 -r1.1.4.2
--- XPrincipalPrivilegeSetReport.java 20 Apr 2004 08:27:51 -0000 1.1.4.1
+++ XPrincipalPrivilegeSetReport.java 7 Jul 2004 15:48:34 -0000 1.1.4.2
@@ -19,7 +19,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.slide.store.tamino.security.report;
+package org.apache.slide.store.tamino.report;
import org.apache.slide.urm.URMException;
import org.apache.slide.urm.accesscontroler.URMAclAdministrator;
No revision
Index: XPrincipalPrivilegeSetReport.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalPrivilegeSetReport.java,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -r1.1.4.1 -r1.1.4.2
--- XPrincipalPrivilegeSetReport.java 20 Apr 2004 08:27:51 -0000 1.1.4.1
+++ XPrincipalPrivilegeSetReport.java 7 Jul 2004 15:48:34 -0000 1.1.4.2
@@ -19,7 +19,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.slide.store.tamino.security.report;
+package org.apache.slide.store.tamino.report;
import org.apache.slide.urm.URMException;
import org.apache.slide.urm.accesscontroler.URMAclAdministrator;
No revision
Index: XPrincipalPrivilegeSetReport.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/XPrincipalPrivilegeSetReport.java,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -r1.1.4.1 -r1.1.4.2
--- XPrincipalPrivilegeSetReport.java 20 Apr 2004 08:27:51 -0000 1.1.4.1
+++ XPrincipalPrivilegeSetReport.java 7 Jul 2004 15:48:34 -0000 1.1.4.2
@@ -19,7 +19,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.slide.store.tamino.security.report;
+package org.apache.slide.store.tamino.report;
import org.apache.slide.urm.URMException;
import org.apache.slide.urm.accesscontroler.URMAclAdministrator;
1.1.2.1 +175 -0 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/security/report/Attic/XLocateByHistoryReport.java
No revision
No revision
1.1.4.1 +23 -14 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XBasicExpression.java
Index: XBasicExpression.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XBasicExpression.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- XBasicExpression.java 25 Mar 2004 16:18:01 -0000 1.1
+++ XBasicExpression.java 7 Jul 2004 15:48:34 -0000 1.1.4.1
@@ -27,6 +27,7 @@
import java.util.Iterator;
import java.util.List;
import org.apache.slide.common.SlideException;
+import org.apache.slide.common.Uri;
import org.apache.slide.search.BadQueryException;
import org.apache.slide.search.InvalidQueryException;
import org.apache.slide.search.QueryScope;
@@ -35,6 +36,7 @@
import org.apache.slide.search.basic.IBasicExpression;
import org.apache.slide.search.basic.IBasicExpressionFactory;
import org.apache.slide.search.basic.IBasicResultSet;
+import org.apache.slide.store.ResourceId;
import org.apache.slide.store.tamino.common.XDatastoreException;
import org.apache.slide.store.tamino.common.XGlobals;
import org.apache.slide.store.tamino.datastore.XConnection;
@@ -77,7 +79,7 @@
/** backptr to the factory */
IBasicExpressionFactory factory;
-
+
/**
* prevent from being instantiated from outside, use factory method
*/
@@ -231,15 +233,23 @@
if (Configuration.useBinding(query.getStore())) {
return getBindingScopeFilter(slidePath);
} else {
- return getNoneBindingScopeFilter(slidePath);
+ return getNoneBindingScopeFilter(slidePath, "");
}
}
private String getBindingScopeFilter (String slidePath) {
- return query.getDescriptorsMappingList().getScopeQuery();
+ Uri uri = slideAccessor.getNamespace().getUri(slidePath);
+ if (uri != null && uri.isStoreRoot()) {
+ String result = getNoneBindingScopeFilter(slidePath, ResourceId.RESOURCE_ID_SCHEMA);
+// System.out.println(result);
+ return result;
+ }
+ else {
+ return query.getDescriptorsMappingList().getScopeQuery();
+ }
}
- private String getNoneBindingScopeFilter (String slidePath) {
+ private String getNoneBindingScopeFilter (String slidePath, String uriScheme) {
StringBuffer sb = new StringBuffer ();
QueryScope scope = query.getScope();
@@ -251,7 +261,7 @@
slidePath.substring (0, slidePath.length()-1) :
slidePath;
- sb.append ("(@uri=\"");
+ sb.append ("(@uri=\"").append(uriScheme);
sb.append (withoutTrailingSlash).append ("\"");
int depth = query.getProtectedDepth();
if (depth > 0) {
@@ -264,7 +274,7 @@
cutOffSlidePath = slidePath.substring (0, XGlobals.MAX_TEXT_SEARCH_SIZE);
}
- sb.append (" or @uri~=\"");
+ sb.append (" or @uri~=\"").append(uriScheme);
sb.append (cutOffSlidePath).append ("*\")");
if (depth != QueryScope.DEPTH_INFINITY) {
@@ -279,7 +289,7 @@
}
else {
- sb.append ("@uri=\"");
+ sb.append ("@uri=\"").append(uriScheme);
sb.append (slidePath).append ("\"");
}
@@ -291,7 +301,7 @@
String scopeFilter = sb.toString();
- System.out.println (scopeFilter);
+// System.out.println (scopeFilter);
return scopeFilter;
}
@@ -305,8 +315,7 @@
* @return a StringBuffer
*
*/
- private void setInclExclFilter (Iterator it, StringBuffer sb, boolean isEx)
- {
+ private void setInclExclFilter (Iterator it, StringBuffer sb, boolean isEx) {
if (it.hasNext()) {
if (isEx) {
sb.append (" and not (");
No revision
No revision
1.1.4.1 +7 -4 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/schema/XKnownPropertyHelper.java
Index: XKnownPropertyHelper.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/schema/XKnownPropertyHelper.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- XKnownPropertyHelper.java 25 Mar 2004 16:18:01 -0000 1.1
+++ XKnownPropertyHelper.java 7 Jul 2004 15:48:34 -0000 1.1.4.1
@@ -82,6 +82,9 @@
new XKnownProperty ("resource-id", DEFAULT_NAMESPACE, "xs:string"),
new XKnownProperty ("parent-set", DEFAULT_NAMESPACE, "xs:string"),
+ // DeltaV properties
+ new XKnownProperty ("version-history", DEFAULT_NAMESPACE, "xs:string"),
+
// xdav properties
new XKnownProperty ("xdavContentId", TAMINO_NAMESPACE, "xs:string"),
new XKnownProperty ("isXml", TAMINO_NAMESPACE, "xs:boolean")
No revision
No revision
1.1.4.1 +72 -61 jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/jdomobjects/XNodeRevisionDescriptor.java
Index: XNodeRevisionDescriptor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/jdomobjects/XNodeRevisionDescriptor.java,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -r1.1 -r1.1.4.1
--- XNodeRevisionDescriptor.java 25 Mar 2004 16:18:02 -0000 1.1
+++ XNodeRevisionDescriptor.java 7 Jul 2004 15:48:34 -0000 1.1.4.1
@@ -22,12 +22,9 @@
package org.apache.slide.store.tamino.jdomobjects;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
+import java.util.*;
+
+import org.apache.slide.common.UriPath;
import org.apache.slide.content.NodeProperty;
import org.apache.slide.content.NodeProperty.NamespaceCache;
import org.apache.slide.content.NodeRevisionDescriptor;
@@ -60,11 +57,11 @@
}
return slide;
}
-
+
public static Element toXmlList (List revisionDescriptorList, String tsdLanguage) {
Element root;
Iterator iter;
-
+
root = new Element(E_DESCRIPTOR_LIST);
iter = revisionDescriptorList.iterator();
while (iter.hasNext()) {
@@ -75,7 +72,7 @@
public static void toStreamList(XmlStream xs, List revisionDescriptorList, String tsdLanguage) {
Iterator iter;
-
+
xs.addStartElement(E_DESCRIPTOR_LIST);
xs.addEndElement();
iter = revisionDescriptorList.iterator();
@@ -84,7 +81,7 @@
}
xs.addCloseElement(E_DESCRIPTOR_LIST);
}
-
+
/**
* returns the jdom aspect of this descriptor.
*
@@ -97,30 +94,30 @@
if (revisionDescriptor == null) {
throw new XAssertionFailed();
}
-
+
Element e = new Element (E_REVISION_DESCRIPTOR);
-
+
// NodeRevisionNumber
String nodeRevsisionNumber = revisionDescriptor.getRevisionNumber().toString();
e.setAttribute (A_REVISION_NUMBER, nodeRevsisionNumber);
-
+
// branch name
e.setAttribute (A_BRANCH_NAME, revisionDescriptor.getBranchName());
-
+
Element nodePropertiesElement = new Element (E_PROPERTY_LIST);
e.addContent (nodePropertiesElement);
Enumeration properties = revisionDescriptor.enumerateProperties();
-
+
while (properties.hasMoreElements()) {
NodeProperty nodeProp = (NodeProperty)properties.nextElement();
Element prop = XNodeProperty.getElement (nodeProp, tsdLanguage);
nodePropertiesElement.addContent (prop);
}
-
+
// labels
Element labelsElement = new Element (E_LABELS);
e.addContent (labelsElement);
-
+
Enumeration labels = revisionDescriptor.enumerateLabels();
while (labels.hasMoreElements()) {
String label = (String)labels.nextElement();
@@ -128,7 +125,7 @@
labelElement.setText (label);
labelsElement.addContent (labelElement);
}
-
+
return e;
}
@@ -136,31 +133,45 @@
if (revisionDescriptor == null) {
throw new XAssertionFailed();
}
-
+
xs.addStartElement(E_REVISION_DESCRIPTOR);
-
+
// NodeRevisionNumber
String nodeRevsisionNumber = revisionDescriptor.getRevisionNumber().toString();
xs.addAttribute(A_REVISION_NUMBER, nodeRevsisionNumber);
-
+
// branch name
xs.addAttribute(A_BRANCH_NAME, revisionDescriptor.getBranchName());
xs.addEndElement();
-
+
xs.addStartElement(E_PROPERTY_LIST);
xs.addEndElement();
Enumeration properties = revisionDescriptor.enumerateProperties();
-
+
while (properties.hasMoreElements()) {
NodeProperty nodeProp = (NodeProperty)properties.nextElement();
XNodeProperty.toStream (xs, nodeProp, tsdLanguage);
+
+ // @@@@@@@@@@@ Hack for version-history @@@@@@@@@@@@@@@@@@@@
+ // This is to make the DAV:locate-by-history report faster
+ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+ if (("checked-in".equals(nodeProp.getName()) || "checked-out".equals(nodeProp.getName())) &&
+ "DAV:".equals(nodeProp.getNamespace())) {
+
+ String v = (String)nodeProp.getValue();
+ String p = v.substring(v.indexOf("/"), v.lastIndexOf('<'));
+ UriPath up = new UriPath(p);
+ NodeProperty np = new NodeProperty("version-history", up.parent().toString(), "DAV:");
+ XNodeProperty.toStream(xs, np, tsdLanguage);
+ //System.out.println("@@@ Added "+np.getNamespace()+":"+np.getName()+"="+np.getValue());
+ }
}
xs.addCloseElement(E_PROPERTY_LIST);
-
+
// labels
xs.addStartElement(E_LABELS);
xs.addEndElement();
-
+
Enumeration labels = revisionDescriptor.enumerateLabels();
while (labels.hasMoreElements()) {
String label = (String)labels.nextElement();
@@ -172,7 +183,7 @@
xs.addCloseElement(E_LABELS);
xs.addCloseElement(E_REVISION_DESCRIPTOR);
}
-
+
/**
* creates the slide aspect of this NodeRevisionDescriptor
*/
@@ -181,14 +192,14 @@
throw new XAssertionFailed();
}
NodeRevisionDescriptor revisionDescriptor;
-
+
// revision number
NodeRevisionNumber revisionNumber =
new NodeRevisionNumber (jdomAspect.getAttributeValue(A_REVISION_NUMBER));
-
+
// branch name
String branchName = jdomAspect.getAttributeValue(A_BRANCH_NAME);
-
+
// labels
List labelList = jdomAspect.getChild (E_LABELS).getChildren();
Vector labels = new Vector (labelList.size());
@@ -197,12 +208,12 @@
String label = ((Element) it.next()).getText();
labels.add (label);
}
-
+
// properties
List propertyList = jdomAspect.getChild (E_PROPERTY_LIST).getChildren();
-
+
Hashtable properties = new Hashtable (propertyList.size());
-
+
// create NodeRevisionDescriptor
revisionDescriptor = new NodeRevisionDescriptor (revisionNumber,
branchName,
@@ -215,10 +226,10 @@
nodeProp = getNamespaceMigratedProperty(nodeProp);
revisionDescriptor.setProperty (nodeProp);
}
-
+
return revisionDescriptor;
}
-
+
/**
* If the given NodeProperty is one of the proprietary Tamino properties
* (e.g. <code>xdavContentId</code>) and their namespace
@@ -232,24 +243,24 @@
* @return the migrated or the given property (see description).
*/
private static NodeProperty getNamespaceMigratedProperty(NodeProperty property) {
-
+
NodeProperty migratedProperty = property;
-
+
if (XGlobals.CONTENT_ID.equals(property.getName()) &&
NamespaceCache.DEFAULT_URI.equals(property.getNamespace()) ) {
-
+
migratedProperty = new NodeProperty(property.getName(),
property.getValue(),
XGlobals.TAMINO_NAMESPACE_URI);
migratedProperty.setKind( NodeProperty.Kind.PROTECTED );
}
-
+
return migratedProperty;
}
-
-
+
+
//-- misc
-
+
/**
* locate a nodeRevisionDescriptor within descriptorListElement,
* identified by nodeRevisionNumber.
@@ -278,7 +289,7 @@
}
return null;
}
-
+
/**
* Return true if the given node revision descriptor is a collection.
* @param nrd node revision descriptor
@@ -287,7 +298,7 @@
public static boolean isCollection( NodeRevisionDescriptor nrd ) {
return nrd.propertyValueContains(NodeRevisionDescriptor.RESOURCE_TYPE ,"collection");
}
-
+
/**
* Method getPropertyValue
*
@@ -302,29 +313,29 @@
Object result = null;
if( nrd == null )
return result;
-
+
NodeProperty p = null;
-
+
if (namespace == null)
p = nrd.getProperty( pname );
else
p = nrd.getProperty( pname, namespace );
-
+
if( p == null )
return result;
-
+
return p.getValue();
}
-
+
//-- TODO: move somewhere else?
-
+
public static void addSpecialProperties(
IDescriptorsHandler handler, ObjectNode objectNode, NodeRevisionDescriptor nrd)
throws XException {
nrd.setProperty(P_RESOURCE_ID, getXmlResourceId(objectNode));
nrd.setProperty(P_PARENT_SET, getXmlParentSet(handler, objectNode));
}
-
+
public static String getXmlResourceId(ObjectNode objectNode) throws XException {
XMLValue r = new XMLValue();
Element hrefElm = new Element( E_HREF, NamespaceCache.DEFAULT_NAMESPACE );
@@ -332,14 +343,14 @@
r.add( hrefElm );
return r.toString();
}
-
+
public static String getXmlParentSet(IDescriptorsHandler handler, ObjectNode objectNode) throws XException {
XMLValue result;
Element parent;
Element child;
Enumeration parentBindings;
ObjectNode.Binding binding;
-
+
result = new XMLValue();
parentBindings = objectNode.enumerateParentBindings();
while (parentBindings.hasMoreElements()) {
@@ -353,10 +364,10 @@
parent.addContent(child);
result.add(parent);
}
-
+
return result.toString();
}
-
+
/**
** @param uuri to obtain uuri for
**/
@@ -371,7 +382,7 @@
return new XUri(childObjectNode.getUri()).getParent().toString();
}
}
-
+
public static String getOneUri(IDescriptorsHandler handler, String uuri) throws XException {
IDescriptors desc;
String result;
@@ -379,7 +390,7 @@
Enumeration en;
ObjectNode.Binding binding;
String segment;
-
+
result = "";
while (!XUuri.isStoreUuri(uuri)) {
desc = handler.lookup(null, uuri, XTLock.NO_LOCK);
@@ -395,7 +406,7 @@
}
return XUuri.getStoreUri(uuri) + result;
}
-
+
/**
* @post result == nrd
*
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org