Index: main/plugin-odf-sync/plugin.xml =================================================================== --- main/plugin-odf-sync/plugin.xml (revision 36748) +++ main/plugin-odf-sync/plugin.xml (working copy) @@ -162,7 +162,7 @@ class="org.ametys.plugins.odfsync.apogee.DefaultApogeeSynchronizationHelper"/> - + @@ -290,8 +290,8 @@ - + program course orgunit Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/apogee/ApogeeSynchronizationManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/apogee/ApogeeSynchronizationManager.java (revision 36748) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/apogee/ApogeeSynchronizationManager.java (working copy) @@ -56,6 +56,8 @@ import org.ametys.plugins.repository.AmetysObjectIterable; import org.ametys.plugins.repository.AmetysRepositoryException; import org.ametys.plugins.repository.UnknownAmetysObjectException; +import org.ametys.plugins.repository.lock.LockHelper; +import org.ametys.plugins.repository.lock.LockableAmetysObject; import org.ametys.plugins.repository.query.expression.AndExpression; import org.ametys.plugins.repository.query.expression.Expression; import org.ametys.plugins.repository.query.expression.Expression.Operator; @@ -150,7 +152,7 @@ report.info(infoMsg); logger.info(infoMsg); - if (program.isLocked()) + if (_isLockedContent(program)) { String lockedMessage = "La formation " + program.getCode() + " est verrouillée, elle n'a pas pu être synchronisée."; report.error(lockedMessage); @@ -300,7 +302,7 @@ report.info(infoMsg); // If the element is locked, log a warning. - if (course.isLocked()) + if (_isLockedContent(course)) { String lockedMessage = "L'ELP " + course.getElpCode() + " est verrouillée, elle n'a pas pu être synchronisée."; report.warn(lockedMessage); @@ -428,7 +430,7 @@ logger.info(infoMsg); // If the element is locked, log a warning. - if (orgunit.isLocked()) + if (_isLockedContent(orgunit)) { String lockedMessage = "La composante " + orgunit.getCode() + " est verrouillée, elle n'a pas pu être synchronisée."; report.warn(lockedMessage); @@ -506,7 +508,7 @@ report.info(info); // If the element is locked, log a warning. - if (rootOrgUnit.isLocked()) + if (_isLockedContent(rootOrgUnit)) { String lockedMessage = "La composante " + rootOrgUnit.getCode() + " est verrouillée, elle n'a pas pu être synchronisée."; report.warn(lockedMessage); @@ -981,5 +983,23 @@ return hasChanges; } - + + /** + * Return true if the content is locked and if the current user is not the owner (except on global and remote synchronisation). + * @param content The lockable content + * @return true if content locked + */ + private boolean _isLockedContent(LockableAmetysObject content) + { + boolean isLocked = content.isLocked(); + if (isLocked) + { + String user = _currentUserProvider.getUser(); + if (user != null) + { + isLocked = !LockHelper.isLockOwner(content, user); + } + } + return isLocked; + } } Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/AbstractCDMFrManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/AbstractCDMFrManager.java (revision 36844) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/AbstractCDMFrManager.java (working copy) @@ -90,6 +90,8 @@ import org.ametys.plugins.repository.AmetysObjectResolver; import org.ametys.plugins.repository.TraversableAmetysObject; import org.ametys.plugins.repository.UnknownAmetysObjectException; +import org.ametys.plugins.repository.lock.LockHelper; +import org.ametys.plugins.repository.lock.LockableAmetysObject; import org.ametys.plugins.repository.query.QueryHelper; import org.ametys.plugins.repository.query.expression.AndExpression; import org.ametys.plugins.repository.query.expression.Expression; @@ -215,7 +217,7 @@ boolean hasChanges = false; - if (content.isLocked()) + if (isLockedContent(content)) { String warn = "Le contenu \"" + content.getTitle() + "\" est verrouillé : il ne peut être synchronisé. Veuillez le déverrouiller pour pouvoir le synchroniser."; report.warn(warn); @@ -1300,19 +1302,29 @@ report.info(info); logger.info(info); - // Copy the remote values - ContentCopyHelper.copySynchronizedMetadatas(content.getMetadataHolder(), translatedContent.getMetadataHolder(), cType); - if (translatedContent.needsSave()) + if (isLockedContent(translatedContent)) { - if (translatedContent instanceof Program || translatedContent instanceof Course || translatedContent instanceof OrgUnit) - { - applyChanges(translatedContent, report, logger); - } - else + String lockedMessage = "Le contenu traduit \"" + translatedContent.getTitle() + "\" est verrouillée, il n'a pas pu être synchronisé."; + report.warn(lockedMessage); + logger.warn(lockedMessage); + return false; + } + else + { + // Copy the remote values + ContentCopyHelper.copySynchronizedMetadatas(content.getMetadataHolder(), translatedContent.getMetadataHolder(), cType); + if (translatedContent.needsSave()) { - translatedContent.saveChanges(); + if (translatedContent instanceof Program || translatedContent instanceof Course || translatedContent instanceof OrgUnit) + { + applyChanges(translatedContent, report, logger); + } + else + { + translatedContent.saveChanges(); + } + hasChanges = true; } - hasChanges = true; } } } @@ -1575,4 +1587,14 @@ return file; } + + /** + * Return true if the content is locked and if the current user is not the owner (except on global and remote synchronisation). + * @param content The lockable content + * @return true if content locked + */ + protected boolean isLockedContent(LockableAmetysObject content) + { + return content.isLocked() && !LockHelper.isLockOwner(content, _currentUserProvider.getUser()); + } } Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/CDMFrSynchronizationManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/CDMFrSynchronizationManager.java (revision 36748) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/CDMFrSynchronizationManager.java (working copy) @@ -35,7 +35,6 @@ import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; - import org.ametys.cms.repository.ContentLanguageExpression; import org.ametys.cms.repository.ContentQueryHelper; import org.ametys.cms.repository.ContentTypeExpression; @@ -224,7 +223,7 @@ report.info(infoMsg); logger.info(infoMsg); - if (program.isLocked()) + if (isLockedContent(program)) { String lockedMessage = "La formation \"" + program.getTitle() + " (" + program.getCdmCode() + ")\" est verrouillée, elle n'a pas pu être synchronisée."; report.error(lockedMessage); Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrImportManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrImportManager.java (revision 0) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrImportManager.java (revision 0) @@ -0,0 +1,15 @@ +package org.ametys.plugins.odfsync.cdmfr; + +import org.ametys.plugins.repository.lock.LockableAmetysObject; + +public class GlobalCDMFrImportManager extends CDMFrImportManager +{ + /** Avalon Role */ + public static final String ROLE = GlobalCDMFrImportManager.class.getName(); + + @Override + protected boolean isLockedContent(LockableAmetysObject content) + { + return content.isLocked(); + } +} Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrSynchronizationManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrSynchronizationManager.java (revision 36748) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/GlobalCDMFrSynchronizationManager.java (working copy) @@ -35,7 +35,6 @@ import org.apache.commons.io.comparator.LastModifiedFileComparator; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; - import org.ametys.cms.observation.Event; import org.ametys.cms.observation.ObservationConstants; import org.ametys.cms.repository.WorkflowAwareContent; @@ -44,6 +43,7 @@ import org.ametys.odf.program.Program; import org.ametys.plugins.odfsync.SynchronizationReport; import org.ametys.plugins.repository.AmetysRepositoryException; +import org.ametys.plugins.repository.lock.LockableAmetysObject; import org.ametys.plugins.repository.version.VersionableAmetysObject; import org.ametys.runtime.config.Config; @@ -74,7 +74,7 @@ public void service(ServiceManager smanager) throws ServiceException { super.service(smanager); - _importManager = (CDMFrImportManager) smanager.lookup(CDMFrImportManager.ROLE); + _importManager = (CDMFrImportManager) smanager.lookup(GlobalCDMFrImportManager.ROLE); } @Override @@ -284,4 +284,10 @@ report.error(msg, e); } } + + @Override + protected boolean isLockedContent(LockableAmetysObject content) + { + return content.isLocked(); + } } Index: main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/RemoteCDMFRImportManager.java =================================================================== --- main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/RemoteCDMFRImportManager.java (revision 36748) +++ main/plugin-odf-sync/src/org/ametys/plugins/odfsync/cdmfr/RemoteCDMFRImportManager.java (working copy) @@ -40,7 +40,7 @@ * Class to import or synchronize ODF contents from CDMFR stream * */ -public class RemoteCDMFRImportManager extends CDMFrImportManager +public class RemoteCDMFRImportManager extends GlobalCDMFrImportManager { /** Avalon Role */ @SuppressWarnings("hiding")