Index: src/main/java/com/xpn/xwiki/objects/classes/GroupsClass.java =================================================================== --- src/main/java/com/xpn/xwiki/objects/classes/GroupsClass.java (revision 3868) +++ src/main/java/com/xpn/xwiki/objects/classes/GroupsClass.java (working copy) @@ -1,11 +1,5 @@ package com.xpn.xwiki.objects.classes; -import com.xpn.xwiki.XWikiContext; -import com.xpn.xwiki.XWikiException; -import com.xpn.xwiki.objects.BaseCollection; -import com.xpn.xwiki.objects.BaseProperty; -import com.xpn.xwiki.objects.StringProperty; -import com.xpn.xwiki.objects.meta.PropertyMetaClass; import org.apache.commons.lang.StringUtils; import org.apache.ecs.xhtml.button; import org.apache.ecs.xhtml.input; @@ -14,6 +8,12 @@ import org.dom4j.Element; import java.util.*; +import com.xpn.xwiki.XWikiContext; +import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.objects.BaseCollection; +import com.xpn.xwiki.objects.BaseProperty; +import com.xpn.xwiki.objects.LargeStringProperty; +import com.xpn.xwiki.objects.meta.PropertyMetaClass; public class GroupsClass extends ListClass { @@ -61,7 +61,7 @@ public BaseProperty newProperty() { - return new StringProperty(); + return new LargeStringProperty(); } public BaseProperty fromString(String value) Index: src/main/java/com/xpn/xwiki/objects/classes/UsersClass.java =================================================================== --- src/main/java/com/xpn/xwiki/objects/classes/UsersClass.java (revision 3868) +++ src/main/java/com/xpn/xwiki/objects/classes/UsersClass.java (working copy) @@ -17,7 +17,7 @@ import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.objects.BaseCollection; import com.xpn.xwiki.objects.BaseProperty; -import com.xpn.xwiki.objects.StringProperty; +import com.xpn.xwiki.objects.LargeStringProperty; import com.xpn.xwiki.objects.meta.PropertyMetaClass; public class UsersClass extends ListClass { @@ -56,7 +56,7 @@ } public BaseProperty newProperty() { - return new StringProperty(); + return new LargeStringProperty(); } public BaseProperty fromString(String value) { Index: src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java =================================================================== --- src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (revision 3868) +++ src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (working copy) @@ -1,40 +1,49 @@ package com.xpn.xwiki.store; -import com.xpn.xwiki.XWiki; -import com.xpn.xwiki.XWikiContext; -import com.xpn.xwiki.XWikiException; -import com.xpn.xwiki.monitor.api.MonitorPlugin; -import com.xpn.xwiki.objects.classes.BaseClass; -import com.xpn.xwiki.util.Util; -import com.xpn.xwiki.web.XWikiRequest; +import java.io.File; +import java.lang.reflect.Proxy; +import java.net.URL; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; -import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.*; -import org.hibernate.mapping.Table; -import org.hibernate.jdbc.ConnectionManager; -import org.hibernate.jdbc.BorrowedConnectionProxy; +import org.hibernate.FlushMode; +import org.hibernate.HibernateException; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.dialect.Dialect; import org.hibernate.impl.SessionFactoryImpl; import org.hibernate.impl.SessionImpl; +import org.hibernate.jdbc.BorrowedConnectionProxy; +import org.hibernate.jdbc.ConnectionManager; +import org.hibernate.mapping.Table; import org.hibernate.tool.hbm2ddl.DatabaseMetadata; -import java.io.File; -import java.net.URL; -import java.sql.Connection; -import java.sql.Statement; -import java.util.Collection; -import java.util.Date; -import java.util.Map; -import java.util.Iterator; -import java.lang.reflect.Proxy; -import java.lang.reflect.InvocationHandler; +import com.xpn.xwiki.XWiki; +import com.xpn.xwiki.XWikiContext; +import com.xpn.xwiki.XWikiException; +import com.xpn.xwiki.monitor.api.MonitorPlugin; +import com.xpn.xwiki.objects.LargeStringProperty; +import com.xpn.xwiki.objects.StringProperty; +import com.xpn.xwiki.objects.classes.BaseClass; +import com.xpn.xwiki.util.Util; +import com.xpn.xwiki.web.XWikiRequest; +import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap; + /** * Created by IntelliJ IDEA. * User: ludovic @@ -418,10 +427,11 @@ /* Check Schema */ if (getSessionFactory()!=null) { updateSchema(context); + migrateData(context, false); } } } - + /** * Checks if this xwiki setup is virtual * meaning if multiple wikis can be accessed using the same database pool @@ -795,4 +805,68 @@ ""; return custommapping; } + + /** Perform data migrations */ + private void migrateData(XWikiContext context, boolean force) + { + if ((!force) && (context.getWiki() != null) && ("0".equals(context.getWiki().Param("xwiki.store.hibernate.migration")))) { + if (log.isDebugEnabled()) + log.debug("Migration deactivated for wiki " + context.getDatabase()); + return; + } + if (log.isInfoEnabled()) { + log.info("Migrating data for wiki " + context.getDatabase() + " ..."); + } + Session session; + boolean bTransaction = true; + MonitorPlugin monitor = Util.getMonitorPlugin(context); + try { + bTransaction = beginTransaction(context); + session = getSession(context); + setDatabase(session, context); + if (monitor!=null) + monitor.startTimer("migration"); + mirgateXWIKI883(session); + } + catch (Exception e) { + if ( log.isErrorEnabled() ) + log.error("Failed data migration", e); + } + finally { + try { + if (bTransaction) + endTransaction(context, true); + } catch (Exception e) {} + // End monitoring timer + if (monitor!=null) + monitor.endTimer("migration"); + } + } + + /** Migration for XWIKI-883 issue. + * Move from StringProperty to LargeStringProperty in XWikiRights classes + * @throws SQLException */ + private void mirgateXWIKI883(Session session) throws SQLException + { + session.flush(); + Query q = session.createQuery("select s from BaseObject o, StringProperty s where o.className like 'XWiki.XWiki%Rights' and o.id=s.id and (s.name='users' or s.name='groups')"); + List lst = q.list(); + if (lst.size()==0) return; + List lst2 = new ArrayList(lst.size()); + for (Iterator it=lst.iterator(); it.hasNext(); ) { + StringProperty sp = (StringProperty) it.next(); + LargeStringProperty lsp = new LargeStringProperty(); + lsp.setId(sp.getId()); + lsp.setName(sp.getName()); + lsp.setValue(sp.getValue()); + lst2.add(lsp); + } + for (Iterator it=lst.iterator(); it.hasNext(); ) + session.delete(it.next()); + session.flush(); + Connection connection = session.connection(); + for (Iterator it=lst2.iterator(); it.hasNext(); ) + session.save(it.next()); + connection.commit(); + } }