libreccm-legacy/ccm-cms-assets-notes/src/com/arsdigita/cms/contentassets/Note.java

255 lines
7.1 KiB
Java
Executable File

/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.arsdigita.cms.contentassets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.arsdigita.auditing.AuditingObserver;
import com.arsdigita.auditing.BasicAuditTrail;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.domain.DomainCollection;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainObjectInstantiator;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.kernel.User;
import com.arsdigita.kernel.permissions.PermissionService;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.util.Assert;
import org.apache.log4j.Logger;
/**
*
*
*/
public class Note extends ACSObject {
private static final Logger s_log = Logger.getLogger(Note.class);
/** PDL stuff */
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contentassets.Note";
static {
s_log.debug("Static initalizer is starting...");
DomainObjectFactory.registerInstantiator(
BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() {
@Override
public DomainObjectInstantiator resolveInstantiator(DataObject dataObject) {
return this;
}
protected DomainObject doNewInstance(DataObject dataObject) {
return new Note(dataObject);
}
});
s_log.debug("Static initalizer finished.");
}
public static final String CONTENT = "content";
public static final String RANK = "rank";
public static final String OWNER = "owner";
public static final String NOTES = "ca_notes";
public static final String AUDIT = "auditing";
public static final String CREATION_DATE = AUDIT + "."
+ BasicAuditTrail.CREATION_DATE;
private BasicAuditTrail auditTrail;
private boolean m_isNew = false;
private Note() {
super(BASE_DATA_OBJECT_TYPE);
}
public Note(String type) {
super(type);
}
public Note(DataObject obj) {
super(obj);
}
public static Note create(ContentItem item) {
DataCollection notes = getNotes(item);
long nextRank = notes.size();
Note note = new Note();
note.set(OWNER, item);
note.set(RANK, new Long((int) nextRank));
return note;
}
/**
* Register auditing observer
* (non-Javadoc)
* @see com.arsdigita.domain.DomainObject#initialize()
*/
@Override
protected void initialize() {
super.initialize();
DataObject dataObj = (DataObject) get(AUDIT);
if (dataObj != null) {
auditTrail = new BasicAuditTrail(dataObj);
} else {
// creates a new one when one doesn't already exist
auditTrail = BasicAuditTrail.retrieveForACSObject(this);
}
addObserver(new AuditingObserver(auditTrail));
}
public String getContent() {
return (String) get(CONTENT);
}
public void setContent(String content) {
set(CONTENT, content);
}
public long getRank() {
Long rank = (Long) get(RANK);
Assert.exists(rank, Long.class);
return rank.longValue();
}
public void setRank(long newRank) {
DataCollection notes = getNotes(getOwner());
if (newRank < 0) {
newRank = 0;
}
Note last = null;
long currentRank = 0;
while (notes.next()) {
if (newRank == currentRank) {
currentRank++;
}
Note current = (Note) DomainObjectFactory.newInstance(notes.getDataObject());
if (equals(current)) {
continue;
}
if (current.getRank() != currentRank) {
current.set(RANK, new Long(currentRank));
}
currentRank++;
}
notes.close();
if (newRank > currentRank) {
set(RANK, new Long(currentRank));
} else {
set(RANK, new Long(newRank));
}
}
public ContentItem getOwner() {
DataObject obj = (DataObject) get(OWNER);
Assert.exists(obj, DataObject.class);
return (ContentItem) DomainObjectFactory.newInstance(obj);
}
public User getNoteAuthor() {
return auditTrail.getCreationUser();
}
public Date getCreationDate() {
return auditTrail.getCreationDate();
}
public static DataCollection getNotes(ContentItem item) {
Assert.exists(item, ContentItem.class);
if (s_log.isDebugEnabled()) {
s_log.debug("Retrieving notes for " + item.getOID());
}
DataCollection notes = SessionManager.getSession().retrieve(BASE_DATA_OBJECT_TYPE);
notes.addEqualsFilter(OWNER, item.getID());
notes.addOrder(RANK);
return notes;
}
@Override
protected void beforeDelete() {
// Put this note at the end so other notes will be correctly reordered
setRank(Long.MAX_VALUE);
}
@Override
protected void beforeSave() {
super.beforeSave();
if (isNew()) {
m_isNew = true;
}
}
@Override
protected void afterSave() {
super.afterSave();
if (m_isNew) {
PermissionService.setContext(this, getOwner());
m_isNew = false;
}
}
/**
* Retrieves all objects of this type stored in the database. Very
* necessary for exporting all entities of the current work environment.
*
* @return List of all objects
*/
public static List<Note> getAllObjects() {
List<Note> objectList = new ArrayList<>();
final Session session = SessionManager.getSession();
DomainCollection collection = new DomainCollection(session.retrieve(
Note.BASE_DATA_OBJECT_TYPE));
while (collection.next()) {
Note object = (Note) collection
.getDomainObject();
if (object != null) {
objectList.add(object);
}
}
collection.close();
return objectList;
}
}