001 /**
002 * Copyright (C) Intersect 2012.
003 *
004 * This module contains Proprietary Information of Intersect,
005 * and should be treated as Confidential.
006 */
007 package au.org.intersect.exsite9.service;
008
009 import java.util.List;
010
011 import javax.persistence.EntityManager;
012 import javax.persistence.EntityManagerFactory;
013
014 import au.org.intersect.exsite9.dao.MetadataAttributeDAO;
015 import au.org.intersect.exsite9.dao.MetadataCategoryDAO;
016 import au.org.intersect.exsite9.dao.factory.MetadataAttributeDAOFactory;
017 import au.org.intersect.exsite9.dao.factory.MetadataCategoryDAOFactory;
018 import au.org.intersect.exsite9.domain.MetadataAttribute;
019 import au.org.intersect.exsite9.domain.MetadataCategory;
020 import au.org.intersect.exsite9.domain.MetadataCategoryType;
021 import au.org.intersect.exsite9.domain.MetadataCategoryUse;
022 import au.org.intersect.exsite9.domain.MetadataCategoryViewConfiguration;
023 import au.org.intersect.exsite9.domain.MetadataValue;
024
025 /**
026 * A service for manipulating {@link MetadataCategory}s
027 */
028 public final class MetadataCategoryService implements IMetadataCategoryService
029 {
030 private final EntityManagerFactory emf;
031 private final MetadataCategoryDAOFactory metadataCategoryDAOFactory;
032 private final MetadataAttributeDAOFactory metadataAttributeDAOFactory;
033
034 public MetadataCategoryService(final EntityManagerFactory emf, final MetadataCategoryDAOFactory metadataCategoryDAOFactory, final MetadataAttributeDAOFactory metadataAttributeDAOFactory)
035 {
036 this.emf = emf;
037 this.metadataCategoryDAOFactory = metadataCategoryDAOFactory;
038 this.metadataAttributeDAOFactory = metadataAttributeDAOFactory;
039 }
040
041 /**
042 * @{inheritDoc}
043 */
044 @Override
045 public MetadataCategory createNewMetadataCategory(final String name, final String description, final MetadataCategoryType type, final MetadataCategoryUse use,
046 final boolean inextensible, final boolean imported, final List<MetadataValue> values, final MetadataAttribute metadataAttribute)
047 {
048 final EntityManager em = this.emf.createEntityManager();
049 try
050 {
051 final MetadataCategoryDAO mdcDAO = this.metadataCategoryDAOFactory.createInstance(em);
052 final MetadataAttributeDAO mdaDAO = this.metadataAttributeDAOFactory.createInstance(em);
053
054 final MetadataCategory mdc = new MetadataCategory(name, type, use);
055 mdc.setDescription(description);
056 mdc.setValues(values);
057 mdc.setInextensible(inextensible);
058 mdc.setImported(imported);
059
060 if (metadataAttribute != null)
061 {
062 mdaDAO.createMetadataAttribute(metadataAttribute);
063 mdc.setMetadataAttribute(metadataAttribute);
064 }
065
066 mdcDAO.createMetadataCategory(mdc);
067 return mdc;
068 }
069 finally
070 {
071 em.close();
072 }
073 }
074
075 /**
076 * @{inheritDoc}
077 */
078 @Override
079 public void deleteMetadataCategory(final MetadataCategory metadataCategory)
080 {
081 final EntityManager em = this.emf.createEntityManager();
082 try
083 {
084 final MetadataCategoryDAO mdcDAO = this.metadataCategoryDAOFactory.createInstance(em);
085
086 final MetadataAttribute mda = metadataCategory.getMetadataAttribute();
087 if (mda != null)
088 {
089 final MetadataAttributeDAO mdaDAO = this.metadataAttributeDAOFactory.createInstance(em);
090 metadataCategory.setMetadataAttribute(null);
091 mdcDAO.updateMetadataCategory(metadataCategory);
092 mdaDAO.delete(mda);
093 }
094
095 final MetadataCategoryViewConfiguration mcvc = MetadataCategoryViewConfigService.getMetadataCategoryViewConfiguration(em, metadataCategory);
096 if (mcvc != null)
097 {
098 em.remove(mcvc);
099 }
100
101 mdcDAO.delete(metadataCategory);
102 }
103 finally
104 {
105 em.close();
106 }
107 }
108
109 @Override
110 public MetadataCategory findById(final Long id)
111 {
112 final EntityManager em = this.emf.createEntityManager();
113 try
114 {
115 final MetadataCategoryDAO mdcDAO = this.metadataCategoryDAOFactory.createInstance(em);
116 return mdcDAO.findById(id);
117 }
118 finally
119 {
120 em.close();
121 }
122 }
123
124 @Override
125 public void updateMetadataCategory(final MetadataCategory existingMetadataCategoryToUpdate, final String name, final String description,
126 final MetadataCategoryUse use, final boolean inExtensible, final List<MetadataValue> values, final MetadataAttribute newMetadataAttribute)
127 {
128 final EntityManager em = this.emf.createEntityManager();
129 try
130 {
131 final MetadataCategoryDAO mdcDAO = this.metadataCategoryDAOFactory.createInstance(em);
132 final MetadataAttributeDAO mdaDAO = this.metadataAttributeDAOFactory.createInstance(em);
133
134 existingMetadataCategoryToUpdate.setName(name);
135 existingMetadataCategoryToUpdate.setDescription(description);
136 existingMetadataCategoryToUpdate.setUse(use);
137 existingMetadataCategoryToUpdate.setInextensible(inExtensible);
138 existingMetadataCategoryToUpdate.setValues(values);
139
140 final MetadataAttribute oldMetadataAttribute = existingMetadataCategoryToUpdate.getMetadataAttribute();
141 existingMetadataCategoryToUpdate.setMetadataAttribute(newMetadataAttribute);
142 mdcDAO.updateMetadataCategory(existingMetadataCategoryToUpdate);
143
144 if (oldMetadataAttribute != null)
145 {
146 if (newMetadataAttribute != null)
147 {
148 mdaDAO.updateMetadataAttribute(newMetadataAttribute);
149 }
150 else
151 {
152 mdaDAO.delete(oldMetadataAttribute);
153 }
154 }
155 }
156 finally
157 {
158 em.close();
159 }
160 }
161
162 @Override
163 public MetadataValue addValueToMetadataCategory(final MetadataCategory metadataCategory, final String metadataValue)
164 {
165 if (metadataCategory.getType() == MetadataCategoryType.CONTROLLED_VOCABULARY)
166 {
167 for (final MetadataValue existingValue : metadataCategory.getValues())
168 {
169 if (existingValue.getValue().equals(metadataValue))
170 {
171 return existingValue;
172 }
173 }
174 }
175
176 final EntityManager em = this.emf.createEntityManager();
177
178 try
179 {
180 final MetadataValue newValue = new MetadataValue(metadataValue);
181
182 em.persist(newValue);
183 metadataCategory.getValues().add(newValue);
184 final MetadataCategoryDAO mdcDAO = this.metadataCategoryDAOFactory.createInstance(em);
185 mdcDAO.updateMetadataCategory(metadataCategory);
186
187 return newValue;
188 }
189 finally
190 {
191 em.close();
192 }
193 }
194 }