Sergiu Dumitriu a écrit :
antoine SEILLES wrote:
I have an AnnotationPluginApi.java class and i
have a method to get all
the annotations associated to a document:
public Vector getAnnotations(Document doc){
return doc.getObjects("AnnotationClass");
}
Now i'd like to have a method to get all the annotations associated to a
document having a specific value specified in parameters for one field :
public Vector getAnnotations(Document doc, String field, String value)
Wich should return all the annotations having the value "value" for the
field "field".
There is no 1-call way to do this. We have a method that returns one
object based on a property=value constraint (see
com.xpn.xwiki.api.Document#getObject(String, String, String)).
So, there are two ways of doing this. One is to write an HQL query for
this, and the other is to manually iterate over the objects.
The query approach is much too low level, and depends on the storage
being based on hibernate, so I'll leave this out of the discussion.
The second method would be like this:
public Vector getAnnotations(Document doc, String field, String value)
{
Vector result = new Vector();
Vector allObjects = doc.getObjects(classname);
if (allObjects == null || allObjects.size() == 0) {
return result;
} else {
for (Iterator it = allObjects.iterator(); it.hasNext();) {
BaseObject obj = (BaseObject) it.next();
if (value.equals(((BaseProperty) obj.get(key)).getValue())) {
result.add(newObjectApi(obj, getXWikiContext()));
}
}
}
return result;
}
You should also add some checks to see if the field, value, and obj.get
are not null, otherwise you might get some exceptions.
Sergiu
Well i have tried this :
public Vector getAnnotations(Document doc, String field, String value)
throws XWikiException
{
Vector result = new Vector();
Vector allObjects = doc.getDocument().getObjects("AnnotationClass");
if (allObjects == null || allObjects.size() == 0) {
return result;
} else {
int limit = allObjects.size();
for (int i=0; i<limit;i++)
{
BaseObject obj = (BaseObject)allObjects.get(i);
if (value.equalsIgnoreCase((String)((BaseProperty)
obj.get(field)).getValue()))
{
result.add(obj);
}
}
}
return result;
}
But when i call getAnnotations(Document doc, String field, String value)
in velocity i have an error: "Error number 4001 in 4: Error while
parsing velocity page Wrapped Exception: Invocation of method
'getRenderedContent' in class com.xpn.xwiki.api.Document threw exception
java.lang.NullPointerException @ [28,44"
And when i try that:
* *public Vector getAnnotations(Document doc, String field, String
value) throws XWikiException
{
Vector result = new Vector();
Vector allObjects = doc.getObjects("AnnotationClass");
if (allObjects == null || allObjects.size() == 0) {
return result;
} else {
int limit = allObjects.size();
for (int i=0; i<limit;i++)
{
BaseObject obj = (BaseObject)allObjects.get(i);
if (value.equalsIgnoreCase((String)((BaseProperty)
obj.get(field)).getValue()))
{
result.add(obj);
}
}
}
return result;
}
I have a cast error : cannot cast Object into BaseObject.
Problem is BaseObject obj = (BaseObject)allObjects.get(i);
Here, allObjects contains API wrappers, and not internal objects, so you
don't have com.xpn.xwiki.object.BaseObject there, but
com.xpn.xwiki.api.Object
In that case you must use this check:
if (value.equalsIgnoreCase((String)((Property)
obj.getProperty(field)).getValue()))
The problem is that now you will get the same NullPointerException as
above. I told you to check if the result of obj.get is null, so you must
do something like:
Property prop = (Property) obj.getProperty(field);
if (prop != null && value.equalsIgnoreCase(prop.getValue())) {