001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krad.dao.impl;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.List;
021
022 import org.apache.log4j.Logger;
023 import org.apache.ojb.broker.query.Criteria;
024 import org.apache.ojb.broker.query.Query;
025 import org.apache.ojb.broker.query.QueryByCriteria;
026 import org.apache.ojb.broker.query.QueryFactory;
027 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
028 import org.kuali.rice.krad.bo.Attachment;
029 import org.kuali.rice.krad.bo.Note;
030 import org.kuali.rice.krad.dao.NoteDao;
031 import org.springframework.dao.DataAccessException;
032
033 /**
034 * This class is the OJB implementation of the NoteDao interface.
035 *
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 */
038 public class NoteDaoOjb extends PlatformAwareDaoBaseOjb implements NoteDao {
039 private static Logger LOG = Logger.getLogger(NoteDaoOjb.class);
040
041 /**
042 * Default constructor.
043 */
044 public NoteDaoOjb() {
045 super();
046 }
047
048 /**
049 * Saves a note to the DB using OJB.
050 *
051 * @param line
052 */
053 public void save(Note note) throws DataAccessException {
054 // Add this check for KRAD to avoid saving the empty Attachments
055 // TODO : look into avoiding the default empty attachments being added to the note
056 if (note.getAttachment() != null && note.getAttachment().getAttachmentFileName() == null) {
057 note.setAttachment(null);
058 }
059 //workaround in case sequence is empty I shouldn't need this but ojb seems to work weird with this case
060 if (note != null && note.getNoteIdentifier() == null && note.getAttachment() != null) {
061 Attachment attachment = note.getAttachment();
062 note.setAttachment(null);
063 //store without attachment
064 getPersistenceBrokerTemplate().store(note);
065 attachment.setNoteIdentifier(note.getNoteIdentifier());
066 //put attachment back
067 note.setAttachment(attachment);
068 }
069 getPersistenceBrokerTemplate().store(note);
070 }
071
072 /**
073 * Deletes a note from the DB using OJB.
074 */
075 public void deleteNote(Note note) throws DataAccessException {
076 getPersistenceBrokerTemplate().delete(note.getAttachment());
077 note.setAttachment(null);
078 getPersistenceBrokerTemplate().delete(note);
079
080 }
081
082 /**
083 * Retrieves document associated with a given object using OJB.
084 *
085 * @param id
086 * @return
087 */
088 public List<Note> findByremoteObjectId(String remoteObjectId) {
089 Criteria criteria = new Criteria();
090 //TODO: Notes - Chris move remoteObjectId string to constants
091 criteria.addEqualTo("RMT_OBJ_ID", remoteObjectId);
092
093 QueryByCriteria query = QueryFactory.newQuery(Note.class, criteria);
094 //while this is currently called every time these methods could be changed to allow
095 //custom sorting by BO see discussion on Notes confluence page
096 defaultOrderBy(query);
097 Collection<Note> notes = findCollection(query);
098
099 return new ArrayList<Note>(notes);
100 }
101
102 public Note getNoteByNoteId(Long noteId) {
103 Criteria crit = new Criteria();
104 crit.addEqualTo("noteIdentifier", noteId);
105 return (Note) this.getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(Note.class, crit));
106 }
107
108 /**
109 * This method defines the default sort for notes
110 * @param query
111 */
112 private void defaultOrderBy(QueryByCriteria query) {
113 //TODO: Notes - Chris move remoteObjectId string to constants
114 query.addOrderBy("notePostedTimestamp", true);
115 }
116
117
118 /**
119 * Retrieve a Collection of note instances found by a query.
120 *
121 * @param query
122 * @return
123 */
124 @SuppressWarnings("unchecked")
125 private Collection<Note> findCollection(Query query) throws DataAccessException {
126 return getPersistenceBrokerTemplate().getCollectionByQuery(query);
127 }
128 }