package fi.otavanopisto.muikku.plugins.material; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Iterator; import java.util.List; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import fi.otavanopisto.muikku.plugins.material.dao.MaterialDAO; import fi.otavanopisto.muikku.plugins.material.dao.MaterialMetaDAO; import fi.otavanopisto.muikku.plugins.material.dao.MaterialMetaKeyDAO; import fi.otavanopisto.muikku.plugins.material.dao.MaterialProducerDAO; import fi.otavanopisto.muikku.plugins.material.model.Material; import fi.otavanopisto.muikku.plugins.material.model.MaterialMeta; import fi.otavanopisto.muikku.plugins.material.model.MaterialMetaKey; import fi.otavanopisto.muikku.plugins.material.model.MaterialViewRestrict; import fi.otavanopisto.muikku.plugins.material.model.MaterialProducer; import fi.otavanopisto.muikku.plugins.material.operations.MaterialCloneOperation; @Dependent public class MaterialController { @Inject @Any private Instance<MaterialCloneOperation<?>> cloneOperations; @Inject private MaterialDAO materialDAO; @Inject private MaterialProducerDAO materialProducerDAO; @Inject private MaterialMetaDAO materialMetaDAO; @Inject private MaterialMetaKeyDAO materialMetaKeyDAO; public Material findMaterialById(Long id) { return materialDAO.findById(id); } public <T> T cloneMaterial(T material) { Iterator<MaterialCloneOperation<?>> operations = cloneOperations.iterator(); while (operations.hasNext()) { @SuppressWarnings("unchecked") MaterialCloneOperation<T> operation = (MaterialCloneOperation<T>) operations.next(); @SuppressWarnings("rawtypes") Class<? extends MaterialCloneOperation> operationClass = operation.getClass(); for (Type genericInterface : operationClass.getGenericInterfaces()) { if (genericInterface instanceof ParameterizedType) { ParameterizedType parameterizedGenericInterface = (ParameterizedType) genericInterface; Type type = parameterizedGenericInterface.getActualTypeArguments()[0]; Class<?> operationMaterialType = (Class<?>) type; if (material.getClass().isAssignableFrom(operationMaterialType)) { return operation.clone(material); } } } } return null; } public Material updateMaterialLicense(Material material, String license) { return materialDAO.updateLicense(material, license); } public Material updateMaterialViewRestrict(Material material, MaterialViewRestrict viewRestrict) { return materialDAO.updateViewRestrict(material, viewRestrict); } public List<MaterialMetaKey> listMaterialMetaKeys() { return materialMetaKeyDAO.listAll(); } public MaterialMeta createMaterialMeta(Material material, MaterialMetaKey key, String value) { return materialMetaDAO.create(material, key, value); } public MaterialMeta findMaterialMeta(Material material, MaterialMetaKey key) { return materialMetaDAO.findByMaterialAndKey(material, key); } public List<MaterialMeta> listMaterialMetas(Material material) { return materialMetaDAO.listByMaterial(material); } public MaterialMeta updateMaterialMeta(MaterialMeta materialMeta, String value) { return materialMetaDAO.updateValue(materialMeta, value); } public MaterialMetaKey findMaterialMetaKey(String name) { return materialMetaKeyDAO.findByName(name); } /* Producers */ public MaterialProducer createMaterialProducer(Material material, String name) { return materialProducerDAO.create(material, name); } public MaterialProducer findMaterialProducer(Long producerId) { return materialProducerDAO.findById(producerId); } public List<MaterialProducer> listMaterialProducers(Material material) { return materialProducerDAO.listByMaterial(material); } public void deleteMaterialProducer(MaterialProducer materialProducer) { materialProducerDAO.delete(materialProducer); } }