package nl.ipo.cds.admin.ba.controller;
import java.io.IOException;
import java.util.List;
import nl.ipo.cds.dao.ManagerDao;
import nl.ipo.cds.domain.MetadataDocument;
import nl.ipo.cds.domain.MetadataDocumentType;
import nl.ipo.cds.domain.Thema;
import nl.ipo.cds.metadata.MetadataManager;
import nl.ipo.cds.metadata.ValidationResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MetadataController {
private static final Log logger = LogFactory.getLog(MetadataController.class);
@Autowired
private MetadataManager metadataManager;
@Autowired
private ManagerDao managerDao;
@Autowired
private MessageSource messageSource;
@RequestMapping("/ba/metadata/")
public String metadata() {
return "redirect:/ba/metadata";
}
@RequestMapping("/ba/metadata")
public String metadata(final Model model) {
List<MetadataDocument> documents = managerDao.getAllMetadataDocuments();
model.addAttribute("documents", documents);
logger.debug("Fetched " + documents.size() + " metadata document(s)");
return "/ba/metadata/index";
}
private void validateDocument(final String documentContent, MetadataDocumentType documentType, final BindingResult bindingResult) throws Exception {
byte[] documentBytes = documentContent.getBytes("utf-8");
ValidationResult validationResult = metadataManager.validateDocument(documentBytes, documentType);
if(validationResult != ValidationResult.VALID) {
String invalidReason = messageSource.getMessage(validationResult.getCode(), null, validationResult.toString(), LocaleContextHolder.getLocale());
bindingResult.rejectValue("documentContent", "metadata.notValid", new Object[]{invalidReason}, "not valid: {0}");
}
}
@Transactional(rollbackFor=Exception.class)
@RequestMapping(value="/ba/metadata/edit", method=RequestMethod.POST)
public String edit(
@ModelAttribute("metadataForm") @Validated(MetadataForm.Modify.class) final MetadataForm metadataForm,
final BindingResult bindingResult,
final Model model) throws Exception {
logger.debug("Saving editted document " + metadataForm);
validateDocument(metadataForm.getDocumentContent(), metadataForm.getDocumentType(), bindingResult);
MetadataDocument metadataDocument = managerDao.getMetadataDocument(metadataForm.getId());
if(bindingResult.hasErrors()) {
logger.debug("hasErrors");
model.addAttribute("editing", true);
model.addAttribute("themes", managerDao.getAllThemas());
metadataForm.setDocumentName(metadataDocument.getDocumentName());
return "/ba/metadata/edit";
}
Thema thema = managerDao.getThema(metadataForm.getThemeId());
metadataDocument.setThema(thema);
metadataDocument.setDocumentType(metadataForm.getDocumentType());
managerDao.update(metadataDocument);
byte[] documentBytes = null;
String documentContent = metadataForm.getDocumentContent();
if(documentContent != null) {
documentBytes = documentContent.getBytes("utf-8");
}
metadataManager.storeDocument(metadataDocument.getDocumentName(), documentBytes);
return "redirect:/ba/metadata";
}
@RequestMapping("/ba/metadata/edit/{documentId}")
public String edit(@PathVariable("documentId") final long documentId, final Model model) throws IOException {
MetadataDocument metadataDocument = managerDao.getMetadataDocument(documentId);
String documentName = metadataDocument.getDocumentName();
String documentContent = new String(metadataManager.retrieveDocument(documentName), "utf-8");
logger.debug("Retrieved document '" + documentName + "', length: " + documentContent.length());
MetadataForm metadataForm = new MetadataForm();
metadataForm.setId(metadataDocument.getId());
metadataForm.setThemeId(metadataDocument.getThema().getId());
metadataForm.setDocumentType(metadataDocument.getDocumentType());
metadataForm.setDocumentName(metadataDocument.getDocumentName());
metadataForm.setDocumentContent(documentContent);
model.addAttribute("themes", managerDao.getAllThemas());
model.addAttribute("editing", true);
model.addAttribute("metadataForm", metadataForm);
return "/ba/metadata/edit";
}
@Transactional
@RequestMapping("/ba/metadata/delete/{documentId}")
public String delete(@PathVariable("documentId") final long documentId) {
MetadataDocument metadataDocument = managerDao.getMetadataDocument(documentId);
metadataManager.deleteDocument(metadataDocument.getDocumentName());
managerDao.delete(metadataDocument);
return "redirect:/ba/metadata";
}
@RequestMapping(value="/ba/metadata/add", method=RequestMethod.GET)
public String add(final Model model) {
model.addAttribute("themes", managerDao.getAllThemas());
model.addAttribute("metadataForm", new MetadataForm());
return "/ba/metadata/add";
}
@Transactional(rollbackFor=Exception.class)
@RequestMapping(value="/ba/metadata/add", method=RequestMethod.POST)
public String add(
@ModelAttribute("metadataForm") @Validated(MetadataForm.Add.class) final MetadataForm metadataForm,
final BindingResult bindingResult,
final Model model) throws Exception {
logger.debug("Saving new document " + metadataForm);
validateDocument(metadataForm.getDocumentContent(), metadataForm.getDocumentType(), bindingResult);
if(!bindingResult.hasFieldErrors("documentName") && metadataManager.documentExists(metadataForm.getDocumentName())) {
bindingResult.rejectValue("documentName", "metadata.exists", "document exists");
}
if(bindingResult.hasErrors()) {
logger.debug("hasErrors");
model.addAttribute("themes", managerDao.getAllThemas());
return "/ba/metadata/add";
}
Thema thema = managerDao.getThema(metadataForm.getThemeId());
MetadataDocument metadataDocument = new MetadataDocument();
metadataDocument.setDocumentName(metadataForm.getDocumentName());
metadataDocument.setThema(thema);
metadataDocument.setDocumentType(metadataForm.getDocumentType());
managerDao.update(metadataDocument);
byte[] documentBytes = null;
String documentContent = metadataForm.getDocumentContent();
if(documentContent != null) {
documentBytes = documentContent.getBytes("utf-8");
}
metadataManager.storeDocument(metadataDocument.getDocumentName(), documentBytes);
return "redirect:/ba/metadata";
}
}