/**
* TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
* Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
* <p>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
* <p>
* This program 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 General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.autentia.tnt.manager.tags;
import com.autentia.tnt.businessobject.Contact;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.autentia.tnt.businessobject.Position;
import com.autentia.tnt.businessobject.Tag;
import com.autentia.tnt.dao.SortCriteria;
import com.autentia.tnt.dao.hibernate.ContactDAO;
import com.autentia.tnt.dao.hibernate.TagDAO;
import com.autentia.tnt.dao.search.TagSearch;
import com.autentia.tnt.manager.contacts.ContactManager;
import com.autentia.tnt.manager.contacts.PositionManager;
import com.autentia.tnt.tracking.EntityChange;
import com.autentia.tnt.tracking.hibernate.dao.EntityChangeDAO;
import com.autentia.tnt.util.SpringUtils;
public class TagManager {
/* Tag - generated by stajanov (do not edit/delete) */
/** Logger */
private static final Log log = LogFactory.getLog(TagManager.class);
/** Tag DAO **/
private TagDAO tagDAO;
private EntityChangeDAO entityChangeDAO;
public void setEntityChangeDAO(EntityChangeDAO entityChangeDAO) {
this.entityChangeDAO = entityChangeDAO;
}
private ContactDAO contactDAO;
public void setContactDAO(ContactDAO contactDAO) {
this.contactDAO = contactDAO;
}
/**
* Get default TagManager as defined in Spring's configuration file.
* @return the default singleton TagManager
*/
public static TagManager getDefault() {
return (TagManager) SpringUtils.getSpringBean("managerTag");
}
/**
* Empty constructor needed by CGLIB (Spring AOP)
*/
protected TagManager() {
}
/**
* Default constructor
* @deprecated do not construct managers alone: use Spring's declared beans
*/
public TagManager(TagDAO tagDAO) {
this.tagDAO = tagDAO;
}
/**
* List tags.
* @param search search filter to apply
* @param sort sorting criteria
* @return the list of all tags sorted by requested criterion
*/
public List<Tag> getAllEntities(TagSearch search, SortCriteria sort) {
return tagDAO.search(search, sort);
}
/**
* Get tag by primary key.
* @return tag selected by id.
*/
public Tag getEntityById(int id) {
final Tag tag = tagDAO.getById(id);
//tag.initChanges();
return tag;
}
/**
* Insert tag.
*/
public void insertEntity(Tag tag) {
// tracking positions
trackPositionChanges(tag);
tagDAO.insert(tag);
this.trackContactChanges(tag);
}
/**
* Update tag.
*/
public void updateEntity(Tag tag) {
// tracking positions
trackPositionChanges(tag);
this.trackContactChanges(tag);
tagDAO.update(tag);
}
private void trackContactChanges(Tag tag) {
// tracking associated Contacts
for (Contact contact : tag.getContactTags()) {
final Contact contactBD = ContactManager.getDefault().getEntityById(contact.getId());
if (!contactBD.getTags().contains(tag)) {
//FIXME aqui debería bastar con añadir el cambio o el tag al contacto y salvar el contacto
//para que se actualizase con los listener de hibernate. Por algún motivo, sólo cuando se da de alta
//una nueva clave y se asocia a un contacto antes de guardar no funciona correctamente.
EntityChange entityChange = contactBD.getEntityChange(Contact.FIELD_TAGS, "", tag.getName(), tag.getId().toString());
contactBD.addEntityChange(Contact.FIELD_TAGS, "", tag.getName(), tag.getId().toString());
// contactDAO.update(contactBD);
if (entityChange != null) {
entityChangeDAO.insert(entityChange);
}
}
}
// tracking deassociated Contacts
if (tag.getId() != null) {
Tag tagDB = getEntityById(tag.getId());
for (Contact contactDB : tagDB.getContactTags()) {
if (!tag.getContactTags().contains(contactDB)) {
contactDB.addEntityChange(Contact.FIELD_TAGS, tag.getName(), "", tag.getId().toString());
contactDAO.update(contactDB);
}
}
}
}
private void trackPositionChanges(Tag tag) {
// tracking associated Positions
for (Position position : tag.getPositionTags()) {
Position positionDB = PositionManager.getDefault().getEntityById(position.getId());
if (!positionDB.getTags().contains(tag)) {
positionDB.getHistory().add(
PositionManager.getDefault().getChange(positionDB, PositionManager.FIELD_TAGS, "",
tag.getName()));
}
}
// tracking deassociated Positions
if (tag.getId() != null) {
Tag tagDB = getEntityById(tag.getId());
for (Position positionDB : tagDB.getPositionTags()) {
if (!tag.getPositionTags().contains(positionDB)) {
positionDB.getHistory().add(
PositionManager.getDefault().getChange(positionDB, PositionManager.FIELD_TAGS,
tag.getName(), ""));
}
}
}
}
/**
* Delete tag.
*/
public void deleteEntity(Tag tag) {
// for Position tracking
tag.getPositionTags().clear();
tag.getContactTags().clear();
trackPositionChanges(tag);
trackContactChanges(tag);
tagDAO.delete(tag);
}
/* Tag - generated by stajanov (do not edit/delete) */
}