From 9f4b82bd164a8d38a960a83bf8db216636e350cb Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 14 Dec 2011 15:21:39 +0000 Subject: [PATCH] =?UTF-8?q?Fehlende=20Dateien=20f=C3=BCr=20Rev.=201352?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/trunk@1354 8810af33-2d31-482b-a856-94f89814c4df --- .../arsdigita/content-section/PublishLock.pdl | 14 ++++ .../6.6.2-6.6.3/create_publish_lock_table.sql | 9 +++ .../cms/ui/lifecycle/PublishLock.java | 78 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 ccm-cms/pdl/com/arsdigita/content-section/PublishLock.pdl create mode 100644 ccm-cms/sql/ccm-cms/default/upgrade/6.6.2-6.6.3/create_publish_lock_table.sql create mode 100644 ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java diff --git a/ccm-cms/pdl/com/arsdigita/content-section/PublishLock.pdl b/ccm-cms/pdl/com/arsdigita/content-section/PublishLock.pdl new file mode 100644 index 000000000..0869d519e --- /dev/null +++ b/ccm-cms/pdl/com/arsdigita/content-section/PublishLock.pdl @@ -0,0 +1,14 @@ +model com.arsdigita.cms; + +import com.arsdigita.kernel.*; + +object type PublishLock { + + BigDecimal[1..1] id = cms_publish_lock.lock_id INTEGER; + String[0..1] lockedOid = cms_publish_lock.locked_oid VARCHAR(2048); + Date[0..1] timestamp = cms_publish_lock.lock_timestamp TIMESTAMP; + String[0..1] action = cms_publish_lock.action VARCHAR(256); + + object key(id); + +} \ No newline at end of file diff --git a/ccm-cms/sql/ccm-cms/default/upgrade/6.6.2-6.6.3/create_publish_lock_table.sql b/ccm-cms/sql/ccm-cms/default/upgrade/6.6.2-6.6.3/create_publish_lock_table.sql new file mode 100644 index 000000000..5b6454531 --- /dev/null +++ b/ccm-cms/sql/ccm-cms/default/upgrade/6.6.2-6.6.3/create_publish_lock_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE cms_publish_lock ( + lock_id integer NOT NULL, + locked_oid character varying(2048), + lock_timestamp timestamp with time zone, + action character varying(256) +); + + +-- ALTER TABLE public.cms_publish_lock OWNER TO ccm; \ No newline at end of file diff --git a/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java b/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java new file mode 100644 index 000000000..5944512ba --- /dev/null +++ b/ccm-cms/src/com/arsdigita/cms/ui/lifecycle/PublishLock.java @@ -0,0 +1,78 @@ +package com.arsdigita.cms.ui.lifecycle; + +import com.arsdigita.cms.ContentItem; +import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataObject; +import com.arsdigita.persistence.SessionManager; +import java.util.Calendar; + +/** + * Used by {@link ItemLifecycleSelectForm} and {@link ItemLifecycleItemPane} + * to lock an item if threaded publishing is active. + * + * @author Jens Pelzetter + * @version $Id$ + */ +public class PublishLock { + + public final static String LOCK_OBJECT_TYPE = + "com.arsdigita.cms.PublishLock"; + public final static String ID = "id"; + public final static String LOCKED_OID = "lockedOid"; + public final static String TIMESTAMP = "timestamp"; + public final static String ACTION = "action"; + private static PublishLock instance = new PublishLock(); + + private PublishLock() { + } + + protected static synchronized PublishLock getInstance() { + return instance; + } + + protected synchronized void lock(final ContentItem item) { + lock(item, "publish"); + } + + protected synchronized void lock(final ContentItem item, + final String action) { + SessionManager.getSession().getTransactionContext().beginTxn(); + final DataObject lock = SessionManager.getSession().create( + LOCK_OBJECT_TYPE); + lock.set(ID, item.getID()); + lock.set(LOCKED_OID, item.getOID().toString()); + lock.set(TIMESTAMP, Calendar.getInstance().getTime()); + lock.set(ACTION, action); + lock.save(); + SessionManager.getSession().getTransactionContext().commitTxn(); + } + + protected synchronized void unlock(final ContentItem item) { + SessionManager.getSession().getTransactionContext().beginTxn(); + final DataCollection collection = SessionManager.getSession().retrieve( + LOCK_OBJECT_TYPE); + collection.addFilter(String.format("%s = '%s'", LOCKED_OID, + item.getOID().toString())); + if (!collection.isEmpty()) { + collection.next(); + final DataObject lock = collection.getDataObject(); + lock.delete(); + } + collection.close(); + SessionManager.getSession().getTransactionContext().commitTxn(); + } + + protected synchronized boolean isLocked(final ContentItem item) { + final DataCollection collection = SessionManager.getSession().retrieve( + LOCK_OBJECT_TYPE); + collection.addFilter(String.format("%s = '%s'", LOCKED_OID, + item.getOID().toString())); + if (collection.isEmpty()) { + collection.close(); + return false; + } else { + collection.close(); + return true; + } + } +}