dflorey 2004/02/24 08:47:09
Modified: src/share/org/apache/slide/content Content.java
ContentImpl.java
src/share/org/apache/slide/event ContentEvent.java
EventCollection.java EventDispatcher.java
LockEvent.java MacroEvent.java SearchEvent.java
SecurityEvent.java StructureEvent.java package.html
src/share/org/apache/slide/lock Lock.java LockImpl.java
src/share/org/apache/slide/macro Macro.java MacroImpl.java
src/share/org/apache/slide/search SearchImpl.java
src/share/org/apache/slide/security Security.java
SecurityImpl.java
src/share/org/apache/slide/structure Structure.java
StructureImpl.java
Added: src/share/org/apache/slide/event RemoteInformation.java
ResourceEvent.java
Log:
Added some information to events (e.g. namespace) that might be needed by event
listeners.
Added remote event information.
Revision Changes Path
1.15 +4 -4 jakarta-slide/src/share/org/apache/slide/content/Content.java
Index: Content.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/content/Content.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
1.54 +33 -32
jakarta-slide/src/share/org/apache/slide/content/ContentImpl.java
Index: ContentImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/content/ContentImpl.java,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -r1.53 -r1.54
--- ContentImpl.java 11 Feb 2004 12:58:31 -0000 1.53
+++ ContentImpl.java 24 Feb 2004 16:47:07 -0000 1.54
@@ -191,7 +191,7 @@
* from a branch.
*
* @param revisionDescriptors Node revision descriptors
- * @param branch Branch name
+ * @param branch String branch
*/
public NodeRevisionDescriptor retrieve
(SlideToken token, NodeRevisionDescriptors revisionDescriptors,
@@ -232,7 +232,7 @@
result = retrieve( token, revisionDescriptors,
latestNrn );
}
-
+
return result;
}
@@ -271,8 +271,8 @@
null, POST_RETRIEVE);
// Fire event
- if ( ContentEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.RETRIEVE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor));
-
+ if ( ContentEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.RETRIEVE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor));
+
return revisionDescriptor;
}
@@ -305,7 +305,7 @@
result = retrieve( token, revisionDescriptors,
latestNrn );
}
-
+
return result;
}
@@ -362,7 +362,7 @@
revisionContent, POST_RETRIEVE);
// Fire event
- if ( ContentEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.RETRIEVE, new
ContentEvent(this, token, revisionDescriptor, revisionContent));
+ if ( ContentEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.RETRIEVE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptor,
revisionContent));
return revisionContent;
}
@@ -411,7 +411,7 @@
revisionDescriptors.setUri(strUri);
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, strUri, revisionDescriptors));
objectUri.getStore()
.createRevisionDescriptors(objectUri, revisionDescriptors);
@@ -507,9 +507,9 @@
// We update the descriptor
revisionDescriptor.setRevisionNumber(newRevisionNumber);
-
+
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor, revisionContent));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, revisionDescriptor,
@@ -580,9 +580,9 @@
// now use the merged revision descriptor
revisionDescriptor = oldRevisionDescriptor;
} // end of merge
-
+
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor, revisionContent));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors,
@@ -616,9 +616,9 @@
// Basically, it would mean that there is no initial
// revision, which is incorrect since the object
// HAS revisions.
-
+
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor, revisionContent));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors,
@@ -730,7 +730,7 @@
*
* @param strUri Uri
* @param branchName Name of the new branch
- * @param basedOnRevisionNumber Node revision number of
+ * @param basedOnRevisionNumber NodeRevisionNumber revision descriptor of
* the revision on which the new branch
* is based on.
*
@@ -803,7 +803,7 @@
(basedOnRevisionNumber, branchedRevisionNumber);
// Fire event
- if ( ContentEvent.FORK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.FORK, new
ContentEvent(this, token, revisionDescriptors));
+ if ( ContentEvent.FORK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.FORK, new
ContentEvent(this, token, namespace, strUri, revisionDescriptors));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors,
@@ -826,7 +826,7 @@
invokeInterceptors(token, revisionDescriptors,
basedOnRevisionDescriptor,
basedOnRevisionContent, POST_STORE);
-
+
return branchedRevisionNumber;
}
@@ -933,7 +933,7 @@
revisionDescriptors.setLatestRevision(mainBranch, newRevisionNumber);
// Fire event
- if ( ContentEvent.MERGE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.MERGE, new
ContentEvent(this, token, revisionDescriptors, newRevisionDescriptor,
revisionContent));
+ if ( ContentEvent.MERGE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.MERGE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
newRevisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, newRevisionDescriptor,
@@ -1000,9 +1000,9 @@
NodeRevisionDescriptor oldRevisionDescriptor =
objectUri.getStore().retrieveRevisionDescriptor
(objectUri, revisionDescriptor.getRevisionNumber());
-
+
// Fire event
- if ( ContentEvent.STORE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.STORE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor, revisionContent));
+ if ( ContentEvent.STORE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.STORE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, revisionDescriptor,
@@ -1057,9 +1057,6 @@
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, null, null, PRE_REMOVE);
-
- // Fire event
- if ( ContentEvent.REMOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.REMOVE, new
ContentEvent(this, token, revisionDescriptors));
// Retrieve the associated object
ObjectNode associatedObject = structureHelper.retrieve
@@ -1079,6 +1076,10 @@
namespaceConfig.getRemoveRevisionContentAction());
Uri objectUri = namespace.getUri(token, revisionDescriptors.getUri());
+
+ // Fire event
+ if ( ContentEvent.REMOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.REMOVE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors));
+
objectUri.getStore().removeRevisionDescriptors(objectUri);
// Invoke interceptors
@@ -1138,9 +1139,9 @@
NodeRevisionDescriptor revisionDescriptor =
objectUri.getStore().retrieveRevisionDescriptor
(objectUri, revisionNumber);
-
+
// Fire event
- if ( ContentEvent.REMOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.REMOVE, new
ContentEvent(this, token, revisionDescriptor));
+ if ( ContentEvent.REMOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.REMOVE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptor));
// Invoke interceptors
invokeInterceptors(token, null, revisionDescriptor, null, PRE_REMOVE);
@@ -1239,9 +1240,9 @@
// Initialize the branch name in the new descriptor
newRevisionDescriptor.setBranchName
(realOldRevisionDescriptor.getBranchName());
-
+
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors, newRevisionDescriptor,
revisionContent));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
newRevisionDescriptor, revisionContent));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, newRevisionDescriptor,
@@ -1336,9 +1337,9 @@
branchName = "version-history";
}
revisionDescriptor.setBranchName(branchName);
-
+
// Fire event
- if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, revisionDescriptors, revisionDescriptor));
+ if ( ContentEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(ContentEvent.CREATE, new
ContentEvent(this, token, namespace, objectUri.toString(), revisionDescriptors,
revisionDescriptor));
// Invoke interceptors
invokeInterceptors(token, revisionDescriptors, revisionDescriptor,
1.2 +16 -15 jakarta-slide/src/share/org/apache/slide/event/ContentEvent.java
Index: ContentEvent.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/ContentEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ContentEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ ContentEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -78,7 +78,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
* @version $Revision$
*/
-public class ContentEvent extends EventObject {
+public class ContentEvent extends ResourceEvent {
public final static Create CREATE = new Create();
public final static Remove REMOVE = new Remove();
public final static Retrieve RETRIEVE = new Retrieve();
@@ -95,25 +95,26 @@
private NodeRevisionDescriptor revisionDescriptor;
private NodeRevisionContent revisionContent;
- public ContentEvent(Object source, SlideToken token, NodeRevisionDescriptors
revisionDescriptors) {
- this(source, token, revisionDescriptors, null, null);
+ public ContentEvent(Object source, SlideToken token, Namespace namespace,
String uri, NodeRevisionDescriptors revisionDescriptors) {
+ this(source, token, namespace, uri, revisionDescriptors, null, null);
}
- public ContentEvent(Object source, SlideToken token, NodeRevisionDescriptors
revisionDescriptors, NodeRevisionDescriptor revisionDescriptor) {
- this(source, token, revisionDescriptors, revisionDescriptor, null);
+ public ContentEvent(Object source, SlideToken token, Namespace namespace,
String uri, NodeRevisionDescriptors revisionDescriptors, NodeRevisionDescriptor
revisionDescriptor) {
+ this(source, token, namespace, uri, revisionDescriptors,
revisionDescriptor, null);
}
- public ContentEvent(Object source, SlideToken token, NodeRevisionDescriptor
revisionDescriptor, NodeRevisionContent revisionContent) {
- this(source, token, null, revisionDescriptor, revisionContent);
+ public ContentEvent(Object source, SlideToken token, Namespace namespace,
String uri, NodeRevisionDescriptor revisionDescriptor, NodeRevisionContent
revisionContent) {
+ this(source, token, namespace, uri, null, revisionDescriptor,
revisionContent);
}
- public ContentEvent(Object source, SlideToken token, NodeRevisionDescriptor
revisionDescriptor) {
- this(source, token, null, revisionDescriptor, null);
+ public ContentEvent(Object source, SlideToken token, Namespace namespace,
String uri, NodeRevisionDescriptor revisionDescriptor) {
+ this(source, token, namespace, uri, null, revisionDescriptor, null);
}
- public ContentEvent(Object source, SlideToken token, NodeRevisionDescriptors
revisionDescriptors, NodeRevisionDescriptor revisionDescriptor, NodeRevisionContent
revisionContent) {
- super(source);
+ public ContentEvent(Object source, SlideToken token, Namespace namespace,
String uri, NodeRevisionDescriptors revisionDescriptors, NodeRevisionDescriptor
revisionDescriptor, NodeRevisionContent revisionContent) {
+ super(source, uri);
this.token = token;
+ this.namespace = namespace;
this.revisionDescriptors = revisionDescriptors;
this.revisionDescriptor = revisionDescriptor;
this.revisionContent = revisionContent;
1.2 +5 -5
jakarta-slide/src/share/org/apache/slide/event/EventCollection.java
Index: EventCollection.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/EventCollection.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- EventCollection.java 11 Feb 2004 12:58:28 -0000 1.1
+++ EventCollection.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -129,7 +129,7 @@
}
}
- class Event {
+ public class Event {
private AbstractEventMethod method;
private EventObject event;
1.2 +4 -10
jakarta-slide/src/share/org/apache/slide/event/EventDispatcher.java
Index: EventDispatcher.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/EventDispatcher.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- EventDispatcher.java 11 Feb 2004 12:58:28 -0000 1.1
+++ EventDispatcher.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -70,8 +70,6 @@
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.Logger;
/**
* Event dispatcher class
@@ -80,8 +78,6 @@
* @version $Revision$
*/
public class EventDispatcher implements Configurable {
- private final static Logger logger =
Logger.getLogger(EventDispatcher.class.getName());
-
private static EventDispatcher eventDispatcher = new EventDispatcher();
private List eventListeners = new ArrayList();
@@ -94,7 +90,6 @@
}
public void addEventListener(EventListener listener) {
- logger.log(Level.INFO, "Registering event listener: "+listener);
eventListeners.add(listener);
}
@@ -156,7 +151,6 @@
AbstractEventMethod[] methods = (AbstractEventMethod
[])methodsField.get(null);
for ( int i = 0; i < methods.length; i++ ) {
if ( method == null || methods[i].getName().equals(method) ) {
- logger.log(Level.INFO, "Enabling method
'"+methods[i].getId()+"': "+enable);
methods[i].setEnabled(enable);
}
}
1.2 +16 -5 jakarta-slide/src/share/org/apache/slide/event/LockEvent.java
Index: LockEvent.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/event/LockEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LockEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ LockEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -65,6 +65,7 @@
import org.apache.slide.common.SlideToken;
import org.apache.slide.common.Uri;
+import org.apache.slide.common.Namespace;
import java.util.EventListener;
import java.util.EventObject;
@@ -85,12 +86,14 @@
public final static AbstractEventMethod[] methods = new AbstractEventMethod[] {
LOCK, UNLOCK, RENEW, KILL };
private Uri objectUri;
+ private Namespace namespace;
private SlideToken token;
- public LockEvent(Object source, SlideToken token, Uri objectUri) {
+ public LockEvent(Object source, SlideToken token, Namespace namespace, Uri
objectUri) {
super(source);
this.objectUri = objectUri;
this.token = token;
+ this.namespace = namespace;
}
public String toString() {
@@ -98,6 +101,14 @@
buffer.append(getClass().getName()).append("[lock uri=").append(objectUri);
buffer.append("]");
return buffer.toString();
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
+ }
+
+ public SlideToken getToken() {
+ return token;
}
public final static class Lock extends VetoableEventMethod {
1.2 +38 -8 jakarta-slide/src/share/org/apache/slide/event/MacroEvent.java
Index: MacroEvent.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/event/MacroEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MacroEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ MacroEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -23,6 +23,9 @@
package org.apache.slide.event;
+import org.apache.slide.common.Namespace;
+import org.apache.slide.common.SlideToken;
+
import java.util.EventListener;
import java.util.EventObject;
@@ -32,7 +35,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
* @version $Revision$
*/
-public class MacroEvent extends EventObject {
+public class MacroEvent extends EventObject implements RemoteInformation {
public final static Move MOVE = new Move();
public final static Copy COPY = new Copy();
public final static Delete DELETE = new Delete();
@@ -40,16 +43,38 @@
public final static String GROUP = "macro";
public final static AbstractEventMethod[] methods = new AbstractEventMethod[] {
MOVE, COPY, DELETE };
+ protected final static String SOURCE_URI_KEY = "source-uri";
+ protected final static String TARGET_URI_KEY = "target-uri";
private String sourceURI, targetURI;
+ private SlideToken token;
+ private Namespace namespace;
- public MacroEvent(Object source, String tagetURI) {
- this(source, null, tagetURI);
+ public MacroEvent(Object source, SlideToken token, Namespace namespace, String
tagetURI) {
+ this(source, token, namespace, null, tagetURI);
}
- public MacroEvent(Object source, String sourceURI, String targetURI) {
+ public MacroEvent(Object source, SlideToken token, Namespace namespace, String
sourceURI, String targetURI) {
super(source);
this.sourceURI = sourceURI;
this.targetURI = targetURI;
+ this.token = token;
+ this.namespace = namespace;
+ }
+
+ public SlideToken getToken() {
+ return token;
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
+ }
+
+ public String getSourceURI() {
+ return sourceURI;
+ }
+
+ public String getTargetURI() {
+ return targetURI;
}
public String toString() {
@@ -58,6 +83,11 @@
buffer.append(", target-uri=").append(targetURI);
buffer.append("]");
return buffer.toString();
+ }
+
+ public String[][] getInformation() {
+ return new String [][] { { SOURCE_URI_KEY, sourceURI },
+ { TARGET_URI_KEY, targetURI }};
}
public final static class Copy extends VetoableEventMethod {
1.2 +12 -5 jakarta-slide/src/share/org/apache/slide/event/SearchEvent.java
Index: SearchEvent.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/event/SearchEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SearchEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ SearchEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -24,6 +24,7 @@
package org.apache.slide.event;
import org.apache.slide.common.SlideToken;
+import org.apache.slide.common.Namespace;
import org.apache.slide.search.SearchQuery;
import java.util.EventListener;
@@ -40,13 +41,15 @@
private SlideToken token;
private SearchQuery query;
+ private Namespace namespace;
public final static String GROUP = "search";
public final static AbstractEventMethod[] methods = new AbstractEventMethod[] {
SEARCH };
- public SearchEvent(Object source, SlideToken token, SearchQuery query) {
+ public SearchEvent(Object source, SlideToken token, Namespace namespace,
SearchQuery query) {
super(source);
this.token = token;
+ this.namespace = namespace;
this.query = query;
}
@@ -55,6 +58,10 @@
buffer.append(getClass().getName()).append("[query=").append(query);
buffer.append("]");
return buffer.toString();
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
}
public SlideToken getToken() {
1.2 +12 -5
jakarta-slide/src/share/org/apache/slide/event/SecurityEvent.java
Index: SecurityEvent.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/SecurityEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SecurityEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ SecurityEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -25,6 +25,7 @@
import org.apache.slide.common.SlideToken;
import org.apache.slide.common.Uri;
+import org.apache.slide.common.Namespace;
import org.apache.slide.security.NodePermission;
import java.util.EventListener;
@@ -47,12 +48,18 @@
private Uri objectUri;
private SlideToken token;
private NodePermission permission;
+ private Namespace namespace;
- public SecurityEvent(Object source, SlideToken token, Uri objectUri,
NodePermission permission) {
+ public SecurityEvent(Object source, SlideToken token, Namespace namespace, Uri
objectUri, NodePermission permission) {
super(source);
this.objectUri = objectUri;
this.token = token;
this.permission = permission;
+ this.namespace = namespace;
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
}
public String toString() {
1.2 +10 -6
jakarta-slide/src/share/org/apache/slide/event/StructureEvent.java
Index: StructureEvent.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/StructureEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- StructureEvent.java 11 Feb 2004 12:58:28 -0000 1.1
+++ StructureEvent.java 24 Feb 2004 16:47:07 -0000 1.2
@@ -24,6 +24,7 @@
package org.apache.slide.event;
import org.apache.slide.common.SlideToken;
+import org.apache.slide.common.Namespace;
import org.apache.slide.structure.ObjectNode;
import java.util.EventListener;
@@ -50,17 +51,20 @@
private SlideToken token;
private ObjectNode objectNode = null;
private String uri = null;
+ private Namespace namespace;
- public StructureEvent(Object source, SlideToken token, String uri) {
+ public StructureEvent(Object source, SlideToken token, Namespace namespace,
String uri) {
super(source);
this.uri = uri;
this.token = token;
+ this.namespace = namespace;
}
- public StructureEvent(Object source, SlideToken token, ObjectNode objectNode) {
+ public StructureEvent(Object source, SlideToken token, Namespace namespace,
ObjectNode objectNode) {
super(source);
this.token = token;
this.objectNode = objectNode;
+ this.namespace = namespace;
}
public StructureEvent(Object source, SlideToken token, ObjectNode objectNode,
String uri) {
1.2 +60 -20 jakarta-slide/src/share/org/apache/slide/event/package.html
Index: package.html
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/event/package.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- package.html 11 Feb 2004 12:58:28 -0000 1.1
+++ package.html 24 Feb 2004 16:47:07 -0000 1.2
@@ -7,32 +7,72 @@
$Header$
$Revision$
$Date$
-
+
+ ====================================================================
+
+ The Apache Software License, Version 1.1
+
+ Copyright (c) 1999 The Apache Software Foundation. All rights
+ reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ 3. The end-user documentation included with the redistribution, if
+ any, must include the following acknowlegement:
+ "This product includes software developed by the
+ Apache Software Foundation (http://www.apache.org/)."
+ Alternately, this acknowlegement may appear in the software itself,
+ if and wherever such third-party acknowlegements normally appear.
+
+ 4. The names "The Jakarta Project", "Slide", and "Apache Software
+ Foundation" must not be used to endorse or promote products derived
+ from this software without prior written permission. For written
+ permission, please contact [EMAIL PROTECTED]
+
+ 5. Products derived from this software may not be called "Apache"
+ nor may "Apache" appear in their names without prior written
+ permission of the Apache Group.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
====================================================================
- Copyright 1999-2002 The Apache Software Foundation
+ This software consists of voluntary contributions made by many
+ individuals on behalf of the Apache Software Foundation. For more
+ information on the Apache Software Foundation, please see
+ <http://www.apache.org/>.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ [Additional notices, if required by prior licensing conditions]
-->
</head>
<body>
<p>
- Provides event support for slide.
+ Provides event support for Slide.
</p>
<h3>Introduction</h3>
- <p>Event handling in slide is similar to the way it is done in awt or swing.
+ <p>Event handling in Slide is similar to the way it is done in awt or swing.
So if you are not familiar with the concept of event listeners in general,
you should have a look at the
[EMAIL PROTECTED] <a
href="http://java.sun.com/docs/books/tutorial/uiswing/events/">appropriate
sections</a>}
@@ -45,7 +85,7 @@
</p>
<h3>Adding event listeners</h3>
<p>
- Event listeners can be added by configuring them in the <i>Domain.xml</i>
file. Every event listeners must implement the
+ Event listeners can be added by configuring them in the <i>Domain.xml</i>
file. Every event listener must implement the
[EMAIL PROTECTED] java.util.EventListener} interface or one of its
subinterfaces. So if you want to add a listener that
wants to receive content events, you have to register a class that
implements the
[EMAIL PROTECTED] org.apache.slide.event.ContentListener} interface or
extends
@@ -191,7 +231,7 @@
<p>The configuration of listeners can be very sophisticated, because they
use the [EMAIL PROTECTED] org.apache.slide.util.conf configuration mechanism} that
is used by slide.</p>
<h3>Vetoable events</h3>
- <p>Mostly all event listener methods that are called within a transaction
are vetaoable. Event listeners can throw a
+ <p>Almost every event listener method that is called within a transaction
is vetaoable. Event listeners can throw a
[EMAIL PROTECTED] org.apache.slide.event.VetoException}, if they want to
enforce the transaction to be rolled back.</p>
<p>This feature allows to implement sophisticated listeners. We want to
extend our ExampleListener,
so that it denies the storage of all documents that are of the content-type
image/gif:</p>
1.1
jakarta-slide/src/share/org/apache/slide/event/RemoteInformation.java
Index: RemoteInformation.java
===================================================================
/*
* $Header:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/RemoteInformation.java,v 1.1
2004/02/24 16:47:07 dflorey Exp $
* $Revision: 1.1 $
* $Date: 2004/02/24 16:47:07 $
*
* ====================================================================
*
* Copyright 1999-2002 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.slide.event;
/**
* The RemoteInformation interface
*
* @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
*/
public interface RemoteInformation {
public String[][] getInformation();
}
1.1
jakarta-slide/src/share/org/apache/slide/event/ResourceEvent.java
Index: ResourceEvent.java
===================================================================
/*
* $Header:
/home/cvs/jakarta-slide/src/share/org/apache/slide/event/ResourceEvent.java,v 1.1
2004/02/24 16:47:07 dflorey Exp $
* $Revision: 1.1 $
* $Date: 2004/02/24 16:47:07 $
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Slide", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.slide.event;
import java.util.EventObject;
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Daniel Florey</a>
* @version $Revision: 1.1 $
*/
public class ResourceEvent extends EventObject implements RemoteInformation {
protected final static String URI_KEY = "uri";
private String uri;
public ResourceEvent(Object source, String uri) {
super(source);
this.uri = uri;
}
public String getUri() {
return uri;
}
public String[][] getInformation() {
return new String [][] { { URI_KEY, uri } };
}
}
1.19 +4 -5 jakarta-slide/src/share/org/apache/slide/lock/Lock.java
Index: Lock.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/lock/Lock.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- Lock.java 11 Feb 2004 12:58:31 -0000 1.18
+++ Lock.java 24 Feb 2004 16:47:08 -0000 1.19
@@ -81,7 +81,6 @@
boolean unlock(SlideToken slideToken, NodeLock lockToken)
throws ServiceAccessException, LockTokenNotFoundException, VetoException;
-
/**
* Removes a set of linked locks.
*
1.42 +8 -8 jakarta-slide/src/share/org/apache/slide/lock/LockImpl.java
Index: LockImpl.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/lock/LockImpl.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- LockImpl.java 11 Feb 2004 12:58:30 -0000 1.41
+++ LockImpl.java 24 Feb 2004 16:47:08 -0000 1.42
@@ -135,7 +135,7 @@
}
// Fire event
- if ( LockEvent.LOCK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.LOCK, new LockEvent(this,
slideToken, objectUri));
+ if ( LockEvent.LOCK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.LOCK, new LockEvent(this,
slideToken, namespace, objectUri));
}
@@ -173,7 +173,7 @@
lockedUri.getStore().removeLock(lockedUri, lockToken);
// Fire event
- if ( LockEvent.UNLOCK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.UNLOCK, new LockEvent(this,
slideToken, lockedUri));
+ if ( LockEvent.UNLOCK.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.UNLOCK, new LockEvent(this,
slideToken, namespace, lockedUri));
return true;
}
@@ -227,7 +227,7 @@
lockedUri.getStore().renewLock(lockedUri, lockToken);
// Fire event
- if ( LockEvent.RENEW.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.RENEW, new LockEvent(this,
slideToken, lockedUri));
+ if ( LockEvent.RENEW.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.RENEW, new LockEvent(this,
slideToken, namespace, lockedUri));
}
@@ -292,7 +292,7 @@
}
// Fire event
- if ( LockEvent.KILL.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.KILL, new LockEvent(this,
slideToken, subjectUri));
+ if ( LockEvent.KILL.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(LockEvent.KILL, new LockEvent(this,
slideToken, namespace, subjectUri));
}
public Enumeration enumerateLocks(SlideToken slideToken, String objectUri)
1.17 +4 -4 jakarta-slide/src/share/org/apache/slide/macro/Macro.java
Index: Macro.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/macro/Macro.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
1.39 +9 -9 jakarta-slide/src/share/org/apache/slide/macro/MacroImpl.java
Index: MacroImpl.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/macro/MacroImpl.java,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- MacroImpl.java 11 Feb 2004 12:58:30 -0000 1.38
+++ MacroImpl.java 24 Feb 2004 16:47:08 -0000 1.39
@@ -221,9 +221,9 @@
if (!e.isEmpty()) {
throw e;
}
-
+
try {
- if ( MacroEvent.COPY.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.COPY, new MacroEvent(this,
sourceUri, destinationUri));
+ if ( MacroEvent.COPY.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.COPY, new MacroEvent(this,
token, namespace, sourceUri, destinationUri));
} catch ( VetoException ve ) {
throw new CopyMacroException(ve.getMessage());
}
@@ -444,7 +444,7 @@
}
try {
- if ( MacroEvent.MOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.MOVE, new MacroEvent(this,
sourceUri, destinationUri));
+ if ( MacroEvent.MOVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.MOVE, new MacroEvent(this,
token, namespace, sourceUri, destinationUri));
} catch ( VetoException ve ) {
throw new CopyMacroException(ve.getMessage()); // FIXME: Where is the
MoveMacroException?
}
@@ -526,9 +526,9 @@
if (!e.isEmpty()) {
throw e;
}
-
+
try {
- if ( MacroEvent.DELETE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.DELETE, new
MacroEvent(this, targetUri));
+ if ( MacroEvent.DELETE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(MacroEvent.DELETE, new
MacroEvent(this, token, namespace, targetUri));
} catch ( VetoException ve ) {
throw new DeleteMacroException(ve.getMessage());
}
1.17 +5 -5 jakarta-slide/src/share/org/apache/slide/search/SearchImpl.java
Index: SearchImpl.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/search/SearchImpl.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- SearchImpl.java 11 Feb 2004 12:58:31 -0000 1.16
+++ SearchImpl.java 24 Feb 2004 16:47:08 -0000 1.17
@@ -124,7 +124,7 @@
throws ServiceAccessException, VetoException {
// Fire event
- if ( SearchEvent.SEARCH.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SearchEvent.SEARCH, new
SearchEvent(this, token, query));
+ if ( SearchEvent.SEARCH.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SearchEvent.SEARCH, new
SearchEvent(this, token, namespace, query));
return query.execute ();
}
1.27 +4 -4 jakarta-slide/src/share/org/apache/slide/security/Security.java
Index: Security.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/security/Security.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
1.47 +8 -8
jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java
Index: SecurityImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- SecurityImpl.java 11 Feb 2004 12:58:30 -0000 1.46
+++ SecurityImpl.java 24 Feb 2004 16:47:08 -0000 1.47
@@ -245,9 +245,9 @@
// Fire event
if ( permission.isNegative() ) {
- if ( SecurityEvent.DENY_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.DENY_PERMISSION, new
SecurityEvent(this, token, objectUri, permission));
+ if ( SecurityEvent.DENY_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.DENY_PERMISSION, new
SecurityEvent(this, token, namespace, objectUri, permission));
} else {
- if ( SecurityEvent.GRANT_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.GRANT_PERMISSION, new
SecurityEvent(this, token, objectUri, permission));
+ if ( SecurityEvent.GRANT_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.GRANT_PERMISSION, new
SecurityEvent(this, token, namespace, objectUri, permission));
}
}
@@ -344,7 +344,7 @@
.revokePermission(objectUri, permission);
// Fire event
- if ( SecurityEvent.REVOKE_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.REVOKE_PERMISSION, new
SecurityEvent(this, token, objectUri, permission));
+ if ( SecurityEvent.REVOKE_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.REVOKE_PERMISSION, new
SecurityEvent(this, token, namespace, objectUri, permission));
}
@@ -371,7 +371,7 @@
objectUri.getStore().revokePermission(objectUri, permission);
// Fire event
- if ( SecurityEvent.REVOKE_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.REVOKE_PERMISSION, new
SecurityEvent(this, token, objectUri, permission));
+ if ( SecurityEvent.REVOKE_PERMISSION.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(SecurityEvent.REVOKE_PERMISSION, new
SecurityEvent(this, token, namespace, objectUri, permission));
}
1.16 +4 -4
jakarta-slide/src/share/org/apache/slide/structure/Structure.java
Index: Structure.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/structure/Structure.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
1.42 +7 -7
jakarta-slide/src/share/org/apache/slide/structure/StructureImpl.java
Index: StructureImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-slide/src/share/org/apache/slide/structure/StructureImpl.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- StructureImpl.java 11 Feb 2004 12:58:29 -0000 1.41
+++ StructureImpl.java 24 Feb 2004 16:47:09 -0000 1.42
@@ -158,7 +158,7 @@
ObjectNode result = null;
// Fire event
- if ( StructureEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.RETRIEVE, new
StructureEvent(this, token, strUri));
+ if ( StructureEvent.RETRIEVE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.RETRIEVE, new
StructureEvent(this, token, namespace, strUri));
// First of all, we try to load the object directly from the given Uri.
try {
@@ -263,7 +263,7 @@
AccessDeniedException, ObjectLockedException, VetoException {
// Fire event
- if ( StructureEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.CREATE, new
StructureEvent(this, token, strUri));
+ if ( StructureEvent.CREATE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.CREATE, new
StructureEvent(this, token, namespace, strUri));
// Checking roles
Enumeration roles = securityHelper.getRoles(object);
@@ -442,7 +442,7 @@
AccessDeniedException, LinkedObjectNotFoundException, VetoException {
// Fire event
- if ( StructureEvent.STORE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.STORE, new
StructureEvent(this, token, object));
+ if ( StructureEvent.STORE.isEnabled() )
EventDispatcher.getInstance().fireVetoableEvent(StructureEvent.STORE, new
StructureEvent(this, token, namespace, object));
// Checking roles
Enumeration roles = securityHelper.getRoles(object);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]