package nl.ipo.cds.admin.ba.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.annotation.PostConstruct; import javax.inject.Inject; import nl.ipo.cds.dao.ManagerDao; import nl.ipo.cds.domain.CodeListMapping; import nl.ipo.cds.etl.theme.AttributeDescriptor; import nl.ipo.cds.etl.theme.ThemeConfig; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping ("/ba/codelists") public class CodeListController { @Inject private ManagerDao managerDao; @Inject private Set<ThemeConfig<?>> themeConfigurations; private List<String> codeSpaces; @PostConstruct public void discoverCodeSpaces () { SortedSet<String> codeSpaces = new TreeSet<String> (); for (final ThemeConfig<?> themeConfig: themeConfigurations) { for (final AttributeDescriptor<?> ad: themeConfig.getAttributeDescriptors ()) { final String codeSpace = ad.getCodeSpace (); if (codeSpace != null) { codeSpaces.add (codeSpace); } } } this.codeSpaces = new ArrayList<String>(codeSpaces); } @ModelAttribute ("roleFunction") public String getRoleFunction(){ return "beheerder"; } @ModelAttribute ("codeSpaces") public List<String> getCodeSpaces () { return codeSpaces; } @RequestMapping (method = RequestMethod.GET) public String codeListsForm (final Model model) { model.addAttribute ("mappings", getCurrentMappings ()); return "/ba/codelists/form"; } @RequestMapping (method = RequestMethod.POST) @Transactional public String postCodeListForm (final Form form, final Model model) { final Map<String, String> mappings = new HashMap<String, String> (form.getMappings ()); final List<CodeListMapping> currentMappings = managerDao.getCodeListMappings (); // Update or delete existing mappings: for (final CodeListMapping mapping: currentMappings) { if (mappings.containsKey (mapping.getCodeSpace ())) { final String value = mappings.get (mapping.getCodeSpace ()).trim (); if (!value.isEmpty ()) { mapping.setUrl (value); managerDao.update (mapping); } else { managerDao.delete (mapping); } mappings.remove (mapping.getCodeSpace ()); } else { managerDao.delete (mapping); } } // Insert new mappings: for (final Map.Entry<String, String> entry: mappings.entrySet ()) { managerDao.create (new CodeListMapping (entry.getKey (), entry.getValue ())); } model.asMap ().clear (); return "redirect:/ba/codelists"; } private Map<String, String> getCurrentMappings () { final Map<String, String> mappings = new HashMap<String, String> (); for (final CodeListMapping mapping: managerDao.getCodeListMappings ()) { mappings.put (mapping.getCodeSpace (), mapping.getUrl ()); } return mappings; } public static class Form { private Map<String, String> mappings; public Map<String, String> getMappings() { return mappings; } public void setMappings(Map<String, String> mappings) { this.mappings = mappings; } } }