255 lines
7.1 KiB
Java
Executable File
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;
|
|
}
|
|
|
|
}
|