I have never understood why we do this for Tags and not for Rights,
and all other objects. For me the objects should be created only when
required and not by default.
Thanks
-Vincent
On Jul 4, 2009, at 5:22 PM, sdumitriu (SVN) wrote:
Author: sdumitriu
Date: 2009-07-04 17:22:41 +0200 (Sat, 04 Jul 2009)
New Revision: 21818
Modified:
platform/xwiki-plugins/trunk/tag/src/main/java/com/xpn/xwiki/
plugin/tag/TagPlugin.java
Log:
XATAG-20: Adding tags fails when there is no Tag object attached to
the document
Fixed.
Modified: platform/xwiki-plugins/trunk/tag/src/main/java/com/xpn/
xwiki/plugin/tag/TagPlugin.java
===================================================================
--- platform/xwiki-plugins/trunk/tag/src/main/java/com/xpn/xwiki/
plugin/tag/TagPlugin.java 2009-07-04 15:22:34 UTC (rev 21817)
+++ platform/xwiki-plugins/trunk/tag/src/main/java/com/xpn/xwiki/
plugin/tag/TagPlugin.java 2009-07-04 15:22:41 UTC (rev 21818)
@@ -29,12 +29,18 @@
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.api.Api;
import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.objects.BaseProperty;
+import com.xpn.xwiki.objects.DBStringListProperty;
+import com.xpn.xwiki.objects.classes.BaseClass;
+import com.xpn.xwiki.objects.classes.PropertyClass;
import com.xpn.xwiki.plugin.XWikiDefaultPlugin;
import com.xpn.xwiki.plugin.XWikiPluginInterface;
@@ -45,6 +51,9 @@
*/
public class TagPlugin extends XWikiDefaultPlugin implements
XWikiPluginInterface
{
+ /** Logging helper object. */
+ public static final Log LOG = LogFactory.getLog(TagPlugin.class);
+
/**
* The identifier for this plugin; used for accessing the plugin
from velocity, and as the action returning the
* extension content.
@@ -116,10 +125,40 @@
private void setDocumentTags(XWikiDocument document,
List<String> tags, XWikiContext context)
{
BaseProperty prop = (BaseProperty)
document.getObject(TAG_CLASS, true, context).safeget(TAG_PROPERTY);
+ // Properties aren't added to an object unless a value is
specified either from the Web or from an XML.
+ if (prop == null) {
+ prop = createTagProperty(document.getObject(TAG_CLASS,
true, context), context);
+ }
prop.setValue(tags);
}
/**
+ * Create and add the main tag property to the provided tag
object. The new property corresponds to the definition
+ * in the tag class, but in case of an error, the default type
is a relational-stored list.
+ *
+ * @param tagObject the target tag object
+ * @param context the current request context
+ * @return the created property
+ * @see #TAG_PROPERTY
+ */
+ private BaseProperty createTagProperty(BaseObject tagObject,
XWikiContext context)
+ {
+ BaseProperty tagProperty;
+ try {
+ BaseClass tagClass =
context.getWiki().getClass(TAG_CLASS, context);
+ PropertyClass tagPropertyDefinition = (PropertyClass)
tagClass.getField(TAG_PROPERTY);
+ tagProperty = tagPropertyDefinition.newProperty();
+ } catch (XWikiException ex) {
+ LOG.warn("Failed to properly create tag property for
the tag object, creating a default one");
+ tagProperty = new DBStringListProperty();
+ }
+ tagProperty.setName(TAG_PROPERTY);
+ tagProperty.setObject(tagObject);
+ tagObject.safeput(TAG_PROPERTY, tagProperty);
+ return tagProperty;
+ }
+
+ /**
* Get all tags within the wiki.
*
* @param context XWiki context.
_______________________________________________
notifications mailing list
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications
_______________________________________________
devs mailing list
devs(a)xwiki.org