thanks for helping!
This indeed eliminates the null pointer. But the real problem is there is nothing stored in usersPath and it is thus "". Also, when you do not authorize, your userId will be "".
In LockImpl.computeSubjectUriFromPrincipal
the statement
namespaceConfig.getUsersPath()+userId
creates the uri "". This finally leads to this exception (which is not the real bug as well - just a robustness thing- , as "" is not a valid uri:
org.apache.slide.common.Namespace - java.lang.StringIndexOutOfBoundsException: String index out of range: -1
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1444)
at java.lang.String.substring(String.java:1411)
at org.apache.slide.common.Uri.parseUri(Uri.java:390)
at org.apache.slide.common.Uri.<init>(Uri.java:106)
at org.apache.slide.common.Namespace.getUri(Namespace.java:682)
at org.apache.slide.common.Namespace.getUri(Namespace.java:662)
at org.apache.slide.lock.LockImpl.checkLock(LockImpl.java:401)
at org.apache.slide.content.ContentImpl.retrieve(ContentImpl.java:192)
at org.apache.slide.common.XMLUnmarshaller.loadObjectRevision(XMLUnmarshaller.java:375)
at org.apache.slide.common.XMLUnmarshaller.loadDefaultObjectRevision(XMLUnmarshaller.java:339)
at org.apache.slide.common.XMLUnmarshaller.loadObjectNode(XMLUnmarshaller.java:271)
at org.apache.slide.common.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:126)
at org.apache.slide.common.NamespaceAccessTokenImpl.importData(NamespaceAccessTokenImpl.java:317)
at org.apache.slide.common.Namespace.loadBaseData(Namespace.java:816)
at org.apache.slide.common.Domain.initNamespace(Domain.java:860)
at org.apache.slide.common.Domain.init(Domain.java:479)
at org.apache.slide.common.Domain.selfInit(Domain.java:793)
at org.apache.slide.common.Domain.accessNamespace(Domain.java:278)
at wrappers.catalina.SlideRealm.start(SlideRealm.java:218)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1173)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:347)
at org.apache.catalina.core.StandardService.start(StandardService.java:497)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2190)
at org.apache.catalina.startup.Catalina.start(Catalina.java:512)
at org.apache.catalina.startup.Catalina.execute(Catalina.java:400)
at org.apache.catalina.startup.Catalina.process(Catalina.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:203)
As I said, this is not the real bug, but it rather is in
Namespace.loadBaseData
in line 808
config.initializeAsDummyConfig(this);
resetting usersPath to "" which before was set correctly to "/users".
Now in line 816
token.importData(new SlideTokenImpl(new CredentialsToken(new String("/"))), namespaceBaseDataDefinition);
fails as shown in the stack trace above.
It has been like this even before Peter's changes, so I wonder why it has worked in the past. Has it been set somewhere else afterwards?
Anyway commenting out the concerned lines seemingly fixes the bug. But this is like "debugging by guessing". Maybe, again, Peter's changes revealed a bug that has been there before?!
Peter, can you help?
Thanks,
Oliver
Ingo Brunberg wrote:
Just a guess: Should the relevant part of the diff not looke like this?
public String getUsersPath() { - return usersPath; + // TODO: get rid of user_collection parameter + if (resolvedUsersPath == null) { + if (usersPath == null || "/".equals(usersPath)) { + resolvedUsersPath = ""; + } + else { + resolvedUsersPath = usersPath; + String ucoll = getParameter("user_collection"); + if (ucoll != null && ucoll.length() > 0) { + if (!ucoll.startsWith("/")) { + ucoll = "/"+ucoll; + } + resolvedUsersPath += ucoll; + } + } + } + return resolvedUsersPath; + }
Regards, Ingo
There seems to be a bug in NamespaceConfig.getUsersPath(). It returns null in initialization:
Thread [main] (Suspended (breakpoint at line 860 in SecurityImpl))
SecurityImplAllGrant(SecurityImpl).getPrincipal(SlideToken) line: 860
SecurityImplAllGrant(SecurityImpl).hasPermission(SlideToken, ObjectNode, ActionNode) line: 686
SecurityImplAllGrant(SecurityImpl).checkPermission(SlideToken, ObjectNode, ActionNode) line: 469
SecurityImplAllGrant(SecurityImpl).checkCredentials(SlideToken, ObjectNode, ActionNode) line: 405
SecurityImplAllGrant(SecurityImpl).grantPermission(SlideToken, NodePermission) line: 255
XMLUnmarshaller.loadObjectNode(NamespaceAccessToken, SlideToken, Configuration) line: 250
XMLUnmarshaller.unmarshal(NamespaceAccessToken, SlideToken, Configuration) line: 126
NamespaceAccessTokenImpl.importData(SlideToken, Configuration) line: 317
Namespace.loadBaseData(Configuration) line: 816
Domain.initNamespace(Configuration) line: 860
Domain.init(Configuration) line: 479
Domain.selfInit() line: 793
Domain.accessNamespace(SecurityToken, String) line: 278
SlideRealm.start() line: 218
StandardEngine(ContainerBase).start() line: 1173
StandardEngine.start() line: 347
StandardService.start() line: 497
StandardServer.start() line: 2190
Catalina.start() line: 512
Catalina.execute() line: 400
Catalina.process(String[]) line: 180
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 [local variables unavailable]
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 [local variables unavailable]
Method.invoke(Object, Object[]) line: 324 [local variables unavailable]
Bootstrap.main(String[]) line: 203
This leads to the URI-String null// which will be resolved to null. This is certainly not a valid uri, but is furtheron used to retrieve and store subjectUri.
Unfortunately, I have no idea how to fix this...
Oliver
[EMAIL PROTECTED] wrote:
pnever 2003/10/20 05:38:17
Modified: src/webdav/server/org/apache/slide/webdav/method
AclMethod.java ReportMethod.java LockMethod.java
src/share/org/apache/slide/lock LockImpl.java
src/share/org/apache/slide/common NamespaceConfig.java
src/share/org/apache/slide/security SecurityImpl.java
src/share/org/apache/slide/structure StructureImpl.java
src/webdav/server/org/apache/slide/webdav/util
PropertyHelper.java XMLValue.java
Log:
Refactoring:
users, groups and roles paths are controlled now solely by NamespaceConfig
Revision Changes Path
1.35 +4 -11 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AclMethod.java
Index: AclMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AclMethod.java,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- AclMethod.java 18 Oct 2003 16:30:29 -0000 1.34
+++ AclMethod.java 20 Oct 2003 12:38:17 -0000 1.35
@@ -447,14 +447,7 @@
return "~";
}
else if (hasChild(principal, NamespaceCache.DEFAULT_NAMESPACE, E_UNAUTHENTICATED)) {
- String userCollection = "/";
- String configParam = token.getNamespaceConfig().getParameter(AclConstants.P_USER_COLLECTION);
- if ( configParam != null ) {
- if ( configParam.length() > 0 )
- userCollection = userCollection + configParam +"/";
- }
- return token.getNamespaceConfig().getUsersPath() + userCollection +
- token.getNamespaceConfig().getGuestPath();
+ return token.getNamespaceConfig().getUsersPath()+token.getNamespaceConfig().getGuestPath();
}
throw new JDOMException("<"+principal.getName()+"> element must contain either a "+
"<"+E_HREF+">, "+
1.59 +4 -11 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/ReportMethod.java
Index: ReportMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/ReportMethod.java,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- ReportMethod.java 13 Oct 2003 16:55:42 -0000 1.58
+++ ReportMethod.java 20 Oct 2003 12:38:17 -0000 1.59
@@ -1120,13 +1120,6 @@
char seperator = '/';
boolean self = false;
- String userPrefix = "/";
- String configParam = token.getNamespaceConfig().getParameter(AclConstants.P_USER_COLLECTION);
- if ( configParam != null ) {
- if ( configParam.length() > 0 )
- userpath = userpath + "/" + configParam +"/";
- }
- currentUri = req.getRequestURI();
// check if self or principal-property is searched
if ((principalProperty.getName()).equalsIgnoreCase(E_SELF)) {
1.52 +5 -12 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java
Index: LockMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/LockMethod.java,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- LockMethod.java 18 Sep 2003 11:01:07 -0000 1.51
+++ LockMethod.java 20 Oct 2003 12:38:17 -0000 1.52
@@ -431,18 +431,11 @@
+ (MAX_TIMEOUT * 1000));
}
- String userCollection = "/";
- String configParam = namespaceConfig.getParameter(AclConstants.P_USER_COLLECTION);
- if ( configParam != null ) {
- if ( configParam.length() > 0 )
- userCollection = "/" + configParam +"/";
- }
SubjectNode credentialsSubject =
(SubjectNode) structure.retrieve
- (slideToken, namespaceConfig.getUsersPath() + userCollection
- + slideToken.getCredentialsToken()
- .getPublicCredentials());
+ (slideToken, namespaceConfig.getUsersPath()
+ +"/"+slideToken.getCredentialsToken().getPublicCredentials());
NodeLock lockToken = null;
1.35 +5 -16 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.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- LockImpl.java 18 Oct 2003 16:30:29 -0000 1.34
+++ LockImpl.java 20 Oct 2003 12:38:17 -0000 1.35
@@ -410,22 +410,11 @@
private String computeSubjectUriFromPrincipal(SlideToken token) {
String result;
- String configParam = namespaceConfig.getParameter("user_collection");
- - String userCollection;
- if ( configParam != null && configParam.length() > 0) {
- userCollection = "/" + configParam;
- } else {
- userCollection = "/";
- }
- - String userId = token.getCredentialsToken().getPublicCredentials();
if (userId.equals("/")) userId = "";
else userId = "/" + userId;
- result = namespaceConfig.getUsersPath() + userCollection + userId;
- // System.out.println("##### Subject URI = " + result);
+ result = namespaceConfig.getUsersPath()+userId;
return result;
}
1.30 +79 -6 jakarta-slide/src/share/org/apache/slide/common/NamespaceConfig.java
Index: NamespaceConfig.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/common/NamespaceConfig.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- NamespaceConfig.java 18 Oct 2003 16:30:29 -0000 1.29
+++ NamespaceConfig.java 20 Oct 2003 12:38:17 -0000 1.30
@@ -100,7 +100,15 @@
/** generic action nodes */
- public static final ActionNode DEFAULT_ACTION = new ActionNode();
+ public static final ActionNode DEFAULT_ACTION = new ActionNode("default");
+ public static final ActionNode ALL_ACTION = new ActionNode("all");
+ + + /** generic subject nodes */
+ public static final SubjectNode DEFAULT_SUBJECT = new SubjectNode("default");
+ public static final SubjectNode ALL_SUBJECT = new SubjectNode("all");
+ public static final SubjectNode OWNER_SUBJECT = new SubjectNode("owner");
+ public static final SubjectNode GUEST_SUBJECT = new SubjectNode("guest");
// ----------------------------------------------------- Instance Variables
@@ -226,6 +234,10 @@
*/
protected String usersPath = null;
+ protected String resolvedUsersPath = null;
+ protected String resolvedGroupsPath = null;
+ protected String resolvedRolesPath = null;
+ /**
* Guest user path.
@@ -500,7 +512,68 @@
* @return String Users path
*/
public String getUsersPath() {
- return usersPath;
+ // TODO: get rid of user_collection parameter
+ if (resolvedUsersPath == null) {
+ if (usersPath == null || "/".equals(usersPath)) {
+ resolvedUsersPath = "";
+ }
+ else {
+ String ucoll = getParameter("user_collection");
+ if (ucoll != null && ucoll.length() > 0) {
+ if (!ucoll.startsWith("/")) {
+ ucoll = "/"+ucoll;
+ }
+ resolvedUsersPath = usersPath+ucoll;
+ }
+ }
+ }
+ return resolvedUsersPath;
+ }
+ + /**
+ * Groups path accessor.
+ *
+ * @return String Groups path
+ */
+ public String getGroupsPath() {
+ if (resolvedGroupsPath == null) {
+ if (usersPath == null || "/".equals(usersPath)) {
+ resolvedGroupsPath = "";
+ }
+ else {
+ String gcoll = getParameter("group_collection");
+ if (gcoll != null && gcoll.length() > 0) {
+ if (!gcoll.startsWith("/")) {
+ gcoll = "/"+gcoll;
+ }
+ resolvedGroupsPath = usersPath+gcoll;
+ }
+ }
+ }
+ return resolvedGroupsPath;
+ }
+ + /**
+ * Roles path accessor.
+ *
+ * @return String Roles path
+ */
+ public String getRolesPath() {
+ if (resolvedRolesPath == null) {
+ if (usersPath == null || "/".equals(usersPath)) {
+ resolvedRolesPath = "";
+ }
+ else {
+ String rcoll = getParameter("role_collection");
+ if (rcoll != null && rcoll.length() > 0) {
+ if (!rcoll.startsWith("/")) {
+ rcoll = "/"+rcoll;
+ }
+ resolvedRolesPath = usersPath+rcoll;
+ }
+ }
+ }
+ return resolvedRolesPath;
}
1.39 +5 -12 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.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- SecurityImpl.java 18 Oct 2003 16:30:29 -0000 1.38
+++ SecurityImpl.java 20 Oct 2003 12:38:17 -0000 1.39
@@ -857,15 +857,8 @@
principalPath = namespaceConfig.getGuestPath();
}
- String userPrefix = "/";
- String configParam = namespaceConfig.getParameter("user_collection");
- if ( configParam != null ) {
- if ( configParam.length() > 0 )
- userPrefix = "/" + configParam +"/";
- }
- Uri subjectUri = namespace.getUri
- (token, namespaceConfig.getUsersPath() + userPrefix + principalPath);
+ (token, namespaceConfig.getUsersPath()+"/"+principalPath);
try {
return subjectUri.getStore().retrieveObject(subjectUri);
1.34 +6 -6 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.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- StructureImpl.java 17 Oct 2003 16:47:26 -0000 1.33
+++ StructureImpl.java 20 Oct 2003 12:38:17 -0000 1.34
@@ -374,8 +374,8 @@
// object in the configuration files.
// This would then be the default behavior.
NodePermission grantedPermission = null;
- String userUri = namespaceConfig.getUsersPath() + "/"
- + token.getCredentialsToken().getPublicCredentials();
+ String userUri = namespaceConfig.getUsersPath()
+ +"/"+token.getCredentialsToken().getPublicCredentials();
Domain.debug("Checking basic permissions on new object");
/*
try {
1.56 +29 -53 jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/PropertyHelper.java
Index: PropertyHelper.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/PropertyHelper.java,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- PropertyHelper.java 16 Oct 2003 10:01:07 -0000 1.55
+++ PropertyHelper.java 20 Oct 2003 12:38:17 -0000 1.56
@@ -1076,20 +1076,31 @@
List excludeList = new ArrayList();
String usersPath = truncateLeadingSlash(nsaToken.getNamespaceConfig().getUsersPath());
- Element excludeElement = new Element(DaslConstants.E_EXCLUDE, NamespaceCache.SLIDE_NAMESPACE);
- excludeElement.setText(usersPath);
- excludeList.add(excludeElement);
+ addExcludeElement(usersPath, excludeList);
+ + String groupsPath = truncateLeadingSlash(nsaToken.getNamespaceConfig().getGroupsPath());
+ addExcludeElement(groupsPath, excludeList);
+ + String rolesPath = truncateLeadingSlash(nsaToken.getNamespaceConfig().getRolesPath());
+ addExcludeElement(rolesPath, excludeList);
Iterator historyPathIterator = HistoryPathHandler.getHistoryPathHandler().getResolvedHistoryPaths().iterator();
while (historyPathIterator.hasNext()) {
- excludeElement = new Element(DaslConstants.E_EXCLUDE, NamespaceCache.SLIDE_NAMESPACE);
- excludeElement.setText(truncateLeadingSlash(historyPathIterator.next().toString()));
- excludeList.add(excludeElement);
+ String path = truncateLeadingSlash(historyPathIterator.next().toString());
+ addExcludeElement(path, excludeList);
}
return excludeList;
}
+ private void addExcludeElement(String path, List excludeList) {
+ if (path != null && path.length() > 0) {
+ Element excludeElement = new Element(DaslConstants.E_EXCLUDE, NamespaceCache.SLIDE_NAMESPACE);
+ excludeElement.setText(path);
+ excludeList.add(excludeElement);
+ }
+ }
+ /**
* Returns an XMLValue containing <code><href></code> elements
* with the URI of the VCRs in the workspace identified the given
@@ -2040,44 +2051,15 @@
* @throws JDOMException
*/
public XMLValue computePrincipalCollectionSet(NodeRevisionDescriptors revisionDescriptors, NodeRevisionDescriptor revisionDescriptor, String contextPath, String serverURL) throws ObjectLockedException, RevisionDescriptorNotFoundException, ServiceAccessException, LinkedObjectNotFoundException, AccessDeniedException, ObjectNotFoundException, LockTokenNotFoundException, JDOMException {
- XMLValue xmlValue = new XMLValue();
- - NamespaceConfig config = nsaToken.getNamespaceConfig();
- Element href;
- String userCollStr = config.getParameter(P_USER_COLLECTION);
- String groupCollStr = config.getParameter(P_GROUP_COLLECTION);
- String roleCollStr = config.getParameter(P_ROLE_COLLECTION);
- if (userCollStr != null && userCollStr.length() > 0) {
- if (!userCollStr.startsWith("/")) {
- userCollStr = "/"+userCollStr;
- }
- href = new Element(E_HREF, NamespaceCache.DEFAULT_NAMESPACE);
- href.setText(getAbsoluteURL(null, contextPath, config.getUsersPath()+userCollStr));
- xmlValue.add(href);
- if (groupCollStr != null && groupCollStr.length() > 0) {
- if (!groupCollStr.startsWith("/")) {
- groupCollStr = "/"+groupCollStr;
- }
- href = new Element(E_HREF, NamespaceCache.DEFAULT_NAMESPACE);
- href.setText(getAbsoluteURL(null, contextPath, config.getUsersPath()+groupCollStr));
- xmlValue.add(href);
- }
- if (roleCollStr != null && roleCollStr.length() > 0) {
- if (!roleCollStr.startsWith("/")) {
- roleCollStr = "/"+roleCollStr;
- }
- href = new Element(E_HREF, NamespaceCache.DEFAULT_NAMESPACE);
- href.setText(getAbsoluteURL(null, contextPath, config.getUsersPath()+roleCollStr));
- xmlValue.add(href);
- }
+ NamespaceConfig namespaceConfig = nsaToken.getNamespaceConfig();
+ xmlValue.addHref(getAbsoluteURL(null, contextPath, namespaceConfig.getUsersPath()));
+ if (namespaceConfig.getGroupsPath() != null) {
+ xmlValue.addHref(getAbsoluteURL(null, contextPath, namespaceConfig.getGroupsPath()));
}
- else {
- href = new Element(E_HREF, NamespaceCache.DEFAULT_NAMESPACE);
- href.setText(getAbsoluteURL(null, contextPath, config.getUsersPath()));
- xmlValue.add(href);
+ if (namespaceConfig.getRolesPath() != null) {
+ xmlValue.addHref(getAbsoluteURL(null, contextPath, namespaceConfig.getRolesPath()));
}
- return xmlValue;
}
@@ -2130,23 +2112,17 @@
XMLValue xmlValue = new XMLValue();
String userHref;
NamespaceConfig config = nsaToken.getNamespaceConfig();
- String userCollection = config.getParameter(USER_COLLECTION);
if ((userProperty != null) && (userProperty.getValue()!=null) &&
(!"".equals(userProperty.getValue().toString()))) {
- if (userCollection == null){
- userHref = contextPath + config.getUsersPath() + "/" + userProperty.getValue().toString();
- } else {
- userHref = contextPath + config.getUsersPath() + "/" + userCollection + "/" + userProperty.getValue().toString();
- }
+ userHref = contextPath + config.getUsersPath() + "/" + userProperty.getValue().toString();
+ } else {
userHref = contextPath + config.getUsersPath();
if ( config.getGuestPath() != null && !config.getGuestPath().equals("") )
userHref = userHref + "/" + config.getGuestPath();
}
- Element href = new Element(E_HREF, NamespaceCache.DEFAULT_NAMESPACE);
- href.setText(userHref);
- xmlValue.add(href);
+ xmlValue.addHref(userHref);
return xmlValue;
}
1.13 +20 -10 jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/XMLValue.java
Index: XMLValue.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/XMLValue.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XMLValue.java 14 Aug 2003 14:41:45 -0000 1.12
+++ XMLValue.java 20 Oct 2003 12:38:17 -0000 1.13
@@ -69,6 +69,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import org.apache.slide.content.NodeProperty;
import org.jdom.CDATA;
import org.jdom.Comment;
import org.jdom.Document;
@@ -93,13 +94,13 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ralf Stuckert</a>
**/
-public class XMLValue implements Cloneable, Comparable {
+public class XMLValue implements Cloneable, Comparable, WebdavConstants {
/**
* Constant for the message of the IllegalArgumentException that may be
* thrown in method [EMAIL PROTECTED] #add add()}.
*/
-
+ public static final String ELEMENT_MUST_NOT_BE_NULL = "'null' Element is not allowed";
/**
@@ -299,7 +300,10 @@
Iterator iterator = content.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
- if( o instanceof Element ) {
+ if( o == null ) {
+ throw new IllegalArgumentException(ELEMENT_MUST_NOT_BE_NULL);
+ }
+ else if( o instanceof Element ) {
add((Element)o);
}
else if( o instanceof Text ) {
@@ -377,6 +381,12 @@
}
}
+ public void addHref(String path) {
+ Element href = new Element(E_HREF, NodeProperty.NamespaceCache.DEFAULT_NAMESPACE);
+ href.setText(path);
+ add(href);
+ }
+ /**
* Returns an iterator of JDOM Elements.
*
@@ -558,7 +568,7 @@
String getTextValue() {
Iterator it = elementList.iterator();
StringBuffer sb = new StringBuffer();
-
+ while (it.hasNext()) {
Object o = it.next();
if (o instanceof Element) {
@@ -567,7 +577,7 @@
}
return sb.toString();
}
-
+ /**
* compares the concatenated Text values of all Elements in elementList
*
@@ -577,7 +587,7 @@
*
*/
public int compareTo (Object o) {
-
+ String s1 = getTextValue();
String s2 = ((XMLValue)o).getTextValue();
return s1.compareTo (s2);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
