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

215 lines
5.9 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.Date;
import com.arsdigita.auditing.AuditingObserver;
import com.arsdigita.auditing.BasicAuditTrail;
import com.arsdigita.cms.ContentItem;
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.SessionManager;
import com.arsdigita.util.Assert;
import org.apache.log4j.Logger;
/**
*
*
*/
public class Note extends ACSObject {
public static final String BASE_DATA_OBJECT_TYPE =
"com.arsdigita.cms.contentassets.Note";
private static final Logger s_log = Logger.getLogger( Note.class );
static {
s_log.debug("Static initalizer is starting...");
DomainObjectFactory.registerInstantiator(
BASE_DATA_OBJECT_TYPE,
new DomainObjectInstantiator() {
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()
*/
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;
}
protected void beforeDelete() {
// Put this note at the end so other notes will be correctly reordered
setRank( Long.MAX_VALUE );
}
protected void beforeSave() {
super.beforeSave();
if( isNew() ) m_isNew = true;
}
protected void afterSave() {
super.afterSave();
if( m_isNew ) {
PermissionService.setContext( this, getOwner() );
m_isNew = false;
}
}
}