Java tutorial
/** * Copyright 2013 Spanish Minister of Education, Culture and Sport * * written by MasMedios * * Licensed under the EUPL, Version 1.1 or as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); * * You may not use this work except in compliance with the License. You may obtain a copy of the License at: * * http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" basis, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and limitations under the License. */ package org.dspace.EDMExport.controller; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.DataBinder; import org.springframework.validation.FieldError; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.TypeReference; import org.dspace.EDMExport.bo.EDMExportBOFormEDMData; import org.dspace.EDMExport.bo.EDMExportBOListCollections; import org.dspace.EDMExport.bo.EDMExportBOListItems; import org.dspace.EDMExport.bo.EDMExportBOSearch; import org.dspace.EDMExport.bo.EDMExportBOUser; import org.dspace.EDMExport.service.EDMExportServiceListCollections; import org.dspace.EDMExport.service.EDMExportServiceListItems; import org.dspace.EDMExport.service.EDMExportServiceSearch; import org.dspace.EDMExport.service.EDMExportServiceXML; import org.dspace.EDMExport.service.EDMExportXML; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; /** * Clase que gestiona todas las peticiones web cuando ya estamos validados. * Es un controller que mapea las url con ruta / * */ @Controller @RequestMapping("/") public class homeController { protected static Logger logger = Logger.getLogger("edmexport"); /** * Variables capturadas del fichero de configuracin WebContent/WEB-INF/classes/edmexport.properties */ @Value("${list_coll.pagecount}") private String PageCount; @Value("${list_coll.itemspage}") private String ItemsPage; @Value("${list_items.itemspage}") private String listItemsPage; @Value("${selectedItems.Edmtype}") private String edmTypes; @Value("${xmlFormats}") private String xmlFormats; /** * Listado de colecciones {@link EDMExportServiceListCollections} */ private EDMExportServiceListCollections edmExportServiceListCollections; /** * Bsqueda e tems {@link EDMExportServiceSearch} */ private EDMExportServiceSearch edmExportServiceSearch; /** * Listados de tems {@link EDMExportServiceListItems} */ private EDMExportServiceListItems edmExportServiceListItems; /** * Service Export xml {@link EDMExportServiceXML} */ private EDMExportServiceXML edmExportServiceXML; /** * pginas totales a listar */ private int pageTotal = 0; /** * nmero total de elementos a recogidos */ private int hitCount = 0; /** * nmero de tems por pgina */ private int listItemsPageInt; @Autowired ServletContext servletContext; /** * Objeto de datos de usuario inyectado {@link EDMExportBOUser} */ @Autowired private EDMExportBOUser edmExportBOUser; /** * Objeto de lgica de la lista de colecciones inyectado * * @param edmExportServiceListCollections lgica listado de colecciones {@link EDMExportServiceListCollections} */ @Autowired public void setEdmExportServiceListCollections( EDMExportServiceListCollections edmExportServiceListCollections) { this.edmExportServiceListCollections = edmExportServiceListCollections; } /** * Objeto de lgica de bsqueda inyectado * * @param edmExportServiceSearch lgica de la bsqueda {@link EDMExportServiceSearch} */ @Autowired public void setEdmExportServiceSearch(EDMExportServiceSearch edmExportServiceSearch) { this.edmExportServiceSearch = edmExportServiceSearch; } /** * Objeto de lgica de listado de tems inyectado * * @param edmExportServiceListItems lgica de listado de tems {@link EDMExportServiceListItems} */ @Autowired public void setEdmExportServiceListItems(EDMExportServiceListItems edmExportServiceListItems) { this.edmExportServiceListItems = edmExportServiceListItems; } /** * Objeto de lgica de exportar a xml inyectado * * @param EDMExportServiceXML lgica de EDM en xml {@link EDMExportServiceXML} */ @Autowired public void setEDMExportServiceXML(EDMExportServiceXML edmExportServiceXML) { this.edmExportServiceXML = edmExportServiceXML; } /** * Mtodo para el listado de los tems que nos aumenta el nmero que podemos unir al enviarlos por POST * * @param dataBinder objeto WebDataBinder con el objeto a unir a nuestra variable */ @InitBinder("listItems") public void initBinder(WebDataBinder dataBinder) { logger.debug("homeController.initBinder size: " + dataBinder.getAutoGrowCollectionLimit()); int newSize = edmExportServiceListItems.getMapItemsSubmit().size() + 1; logger.debug("homeController.initBinder ItemsSubmitsize: " + newSize); if (dataBinder.getAutoGrowCollectionLimit() < newSize) { dataBinder.setAutoGrowCollectionLimit(newSize); logger.debug("homeController.resizeAutoGrowCollectionLimit new size: " + newSize); } } // CONTROLLERS PARA MTODO GET /** * Controller para la url /home.htm con mtodo GET y con parmetro "error" obligatorio igual a "search". * Pasamos a la vista un error y el objeto de la bsqueda para regenerar el formulario de la bsqueda con datos. * * @param error cadena con el valor del parmetro error * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.GET, params = "error=search") public String getError(@RequestParam(value = "error", required = true) String error, Model model) { logger.debug("homeController.getError"); EDMExportBOSearch searchBO = new EDMExportBOSearch(); model.addAttribute("search", searchBO); model.addAttribute("error", 1); return returnView("search", model); } /** * Controller para la url /home.htm con mtodo GET y con parmetro "referer","checked","nochecked" obligatorios. * Devuelve un entero y no una vista porque este mtodo se llama desde una peticin Ajax * * @param referer cadena con el valor del parmetro referer. Puede venir de la bsqueda o del listado de colecciones * @param checkedStr cadena en Json con el valor del parmetro checked * @param nocheckedStr cadena en Json con el valor del parmetro nochecked * @param model objeto de Spring Model con la peticin {@link Model} * @return devuelve un entero con el nmero de tems seleccionados */ @RequestMapping(value = "/home.htm", method = RequestMethod.GET, params = { "referer", "checked", "nochecked" }) public @ResponseBody Integer getItemsCheck(@RequestParam(value = "referer", required = true) String referer, @RequestParam(value = "checked", required = true) String checkedStr, @RequestParam(value = "nochecked", required = true) String nocheckedStr, Model model) { logger.debug("homeController.getItemsCheck"); ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapperNo = new ObjectMapper(); try { // decodificamos el json String[] checked = mapper.readValue(checkedStr, new TypeReference<String[]>() { }); String[] nochecked = mapperNo.readValue(nocheckedStr, new TypeReference<String[]>() { }); logger.debug( "referer: " + referer + " ; checked: " + checked.length + " ; nochecked: " + nochecked.length); for (int i = 0; i < checked.length; i++) logger.debug("referer: " + referer + " ; checked: " + checked[i]); // recogemos los tems con origen el listado de colecciones o desde la bsqueda EDMExportBOListItems boListItems = (referer.equals("listCollections")) ? edmExportServiceListCollections.getBoListItems() : edmExportServiceSearch.getBoListItems(); // guardamos los tems BO seleccionados y quitamos el resto edmExportServiceListItems.processEDMExportBOItemsChecked(boListItems, checked); edmExportServiceListItems.processEDMExportBOItemsNoChecked(boListItems, nochecked); logger.debug("Items checked: " + edmExportServiceListItems.getMapItemsSubmit().size()); } catch (JsonParseException e) { logger.debug("JsonParseException", e); } catch (IOException e) { logger.debug("IOException", e); } return Integer.valueOf(edmExportServiceListItems.getMapItemsSubmit().size()); } /** * Controller para la url /home.htm con mtodo GET y con parmetros "referer" y "page" obligatorios. * Se muestran los tems de la pgina pasada como parmetro. * Si hay algn error se redirecciona a home.htm, si todo est bien devuelve la cadena de la vista a renderizar y mostrar * * @param referer cadena con el valor del parmetro referer. Nos dice si viene del listado de colecciones o de la bsqueda. * @param page cadena con el valor del parmetro page * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.GET, params = { "referer", "page" }) public String getItemsPage(@RequestParam(value = "referer", required = true) String referer, @RequestParam(value = "page", required = true) String page, Model model) { logger.debug("homeController.getItemsPage"); int pageInt = Integer.parseInt(page); if (pageInt < 0 || pageInt > pageTotal) return "redirect:home.htm"; // se viene de la lista de colecciones if (referer.equals("listCollections")) { // recogemos los tems de la pgina EDMExportBOListItems boListItems = edmExportServiceListCollections .getListItems((pageInt - 1) * listItemsPageInt); if (boListItems.isEmpty()) { if (pageInt > 1) { model.addAttribute("referer", "listCollections"); model.addAttribute("page", 1); } else model.addAttribute("error", 1); return "redirect:home.htm"; } else { edmExportServiceListItems.processEDMExportBOListItems(boListItems); logger.debug("Showing items " + boListItems.getListItems().size()); model.addAttribute("referer", "listCollections"); model.addAttribute("numItemsChecked", edmExportServiceListItems.getMapItemsSubmit().size()); model.addAttribute("listItemsBO", boListItems); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", (hitCount < listItemsPageInt) ? hitCount : listItemsPage); model.addAttribute("page", page); model.addAttribute("pageTotal", pageTotal); if (pageInt < pageTotal) model.addAttribute("next_page", pageInt + 1); if (pageInt > 1) model.addAttribute("prev_page", pageInt - 1); return returnView("listItems", model); } } else { // se viene de la bsqueda EDMExportBOListItems boListItems = edmExportServiceSearch .getListItems((pageInt - 1) * listItemsPageInt); if (boListItems.isEmpty()) { if (pageInt > 1) { model.addAttribute("referer", "search"); model.addAttribute("page", 1); } else model.addAttribute("error", 1); return "redirect:home.htm"; } else { edmExportServiceListItems.processEDMExportBOListItems(boListItems); logger.debug("Showing items " + boListItems.getListItems().size()); model.addAttribute("referer", "search"); model.addAttribute("numItemsChecked", edmExportServiceListItems.getMapItemsSubmit().size()); model.addAttribute("listItemsBO", boListItems); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", (hitCount < listItemsPageInt) ? hitCount : listItemsPage); model.addAttribute("page", page); model.addAttribute("pageTotal", pageTotal); if (pageInt < pageTotal) model.addAttribute("next_page", pageInt + 1); if (pageInt > 1) model.addAttribute("prev_page", pageInt - 1); return returnView("listItems", model); } } } /** * Controller para la url /home.htm con mtodo GET y con parmetro "referer" obligatorio. * Se muestran todos los tems de las colecciones seleccionadas o del criterio de bsqueda aplicado, sin paginado. * Si hay algn error se redirecciona a home.htm, si todo est bien devuelve la cadena de la vista a renderizar y mostrar * * @param referer cadena con el valor del parmetro referer. Nos dice si viene del listado de colecciones o de la bsqueda. * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.GET, params = "referer") public String getShowAll(@RequestParam(value = "referer", required = true) String referer, Model model) { logger.debug("homeController.getShowAll"); if (referer.equals("listCollections")) { EDMExportBOListItems boListItems = edmExportServiceListCollections.getListItems(0, hitCount); if (boListItems.isEmpty()) { return "redirect:home.htm"; } else { edmExportServiceListItems.processEDMExportBOListItems(boListItems); model.addAttribute("referer", "listCollections"); model.addAttribute("numItemsChecked", edmExportServiceListItems.getMapItemsSubmit().size()); model.addAttribute("listItemsBO", boListItems); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", hitCount); return returnView("listItems", model); } } else { EDMExportBOListItems boListItems = edmExportServiceSearch.getListItems(0, hitCount); if (boListItems.isEmpty()) { model.addAttribute("error", 1); return "redirect:home.htm"; } else { edmExportServiceListItems.processEDMExportBOListItems(boListItems); model.addAttribute("referer", "search"); model.addAttribute("numItemsChecked", edmExportServiceListItems.getMapItemsSubmit().size()); model.addAttribute("listItemsBO", boListItems); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", hitCount); return returnView("listItems", model); } } } /** * Controller para la url /selectedItems.htm con mtodo GET y sin parmetros. * Nos muestra el formulario con la configuracin de elementos EDM para mostrar el xml de los tems seleccionados * * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/selectedItems.htm", method = RequestMethod.GET) public String getXML(Model model) { logger.debug("homeController.getXML"); String[] edmTypesArr = edmTypes.split(","); String realPath = servletContext.getRealPath(""); logger.debug("realPath: " + realPath); String[] xmlFormatsArr = edmExportServiceXML.getFormatsXml(xmlFormats, realPath); EDMExportBOFormEDMData edmExportBOFormEDMData = new EDMExportBOFormEDMData(xmlFormatsArr, edmTypesArr, edmExportServiceListItems.getEDMExportServiceBase().getDspaceName(), "", edmExportServiceListItems.getEDMExportServiceBase().getDspaceBaseUrl(), "xml"); List<String> listCollections = edmExportServiceListItems.getListCollections(); model.addAttribute("FormEDMData", edmExportBOFormEDMData); model.addAttribute("listCollections", listCollections); model.addAttribute("listCollectionsCount", listCollections.size()); model.addAttribute("selectedItemsCount", edmExportServiceListItems.getMapItemsSubmit().size()); return returnView("selectedItems", model); } /** * Controller para la url /viewXml.htm con mtodo GET y sin parmetros. * Se recogen los datos del formulario con la configuracin de elementos EDM para mostrar el xml de los tems seleccionados. * Si hay errores se redirige a la lista de tems seleccionados, si no se muestra el xml con los datos en EDM. * Si el xml a mostrar excede los 2MB y no se comprime con el servlet se comprime el contenido y se enva tambin. * * @param edmExportBOFormEDMData objeto que recoge los datos pasados del formulario {@link EDMExportBOFormEDMData} * @param result objeto con el que se une la peticin y se valida {@link BindingResult} * @param model objeto de Spring Model con la peticin {@link Model} * @param request objeto de la peticin http para recoger los datos del objeto flash (como la sesin pero dura una peticin) * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/viewXml.htm", method = RequestMethod.GET) public String getViewXML(@ModelAttribute(value = "FormEDMData") EDMExportBOFormEDMData edmExportBOFormEDMData, BindingResult result, Model model, HttpServletRequest request) { logger.debug("homeController.getViewXML"); Map<String, ?> map = RequestContextUtils.getInputFlashMap(request); if (map == null) { logger.debug("No FlashMap"); return "redirect:selectedItems.htm"; } if (result.hasErrors()) { logErrorValid(result); return "redirect:selectedItems.htm"; } else { edmExportServiceXML.setEdmExportServiceListItems(edmExportServiceListItems); String edmXML = edmExportServiceXML.showEDMXML(edmExportBOFormEDMData, servletContext.getRealPath("")); logger.debug(edmXML); String edmXMLEncoded = ""; String encoding = request.getHeader("Content-Encoding"); //while (edmXML.length() <= 1500000) edmXML += edmXML; if (edmXML.length() > 1500000 && (encoding == null || (encoding != null && encoding.isEmpty()))) { ByteArrayOutputStream output = null; GZIPOutputStream gzOut = null; try { output = new ByteArrayOutputStream(); gzOut = new GZIPOutputStream(output); gzOut.write(edmXML.getBytes("UTF-8")); gzOut.finish(); byte[] encoded = Base64.encodeBase64(output.toByteArray()); edmXMLEncoded = new String(encoded, "UTF-8"); } catch (IOException e) { logger.debug("IOException", e); } finally { try { if (output != null) output.close(); if (gzOut != null) gzOut.close(); } catch (IOException e) { logger.debug("IOException", e); } } } logger.debug(edmXMLEncoded); model.addAttribute("formatXML", edmExportBOFormEDMData.getXmlFormat()); model.addAttribute("edmXML", edmXML); model.addAttribute("edmXMLEncoded", edmXMLEncoded); model.addAttribute("listElementsFilled", edmExportServiceXML.getListElementsFilled()); return returnView("viewXml", model); } } /** * Controller para la url /home.htm con mtodo GET y con parmetro "tab" opcional. * Dependiendo de la pestaa seleccionada se mostrar el listado de colecciones o la bsqueda. * * @param tab cadena con la pestaa de la pgina a mostrar * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.GET) public String get(@RequestParam(value = "tab", required = false) String tab, Model model) { logger.debug("homeController.get"); getBOUserFromAuth(); if (tab == null || tab.isEmpty() || tab.equals("list")) { EDMExportBOListCollections listCollectionsBO = edmExportServiceListCollections.getListCollection(); model.addAttribute("listCollections", listCollectionsBO); model.addAttribute("PageCount", PageCount); model.addAttribute("ItemsPage", ItemsPage); model.addAttribute("tab", "list"); return returnView("home", model); } else { EDMExportBOSearch searchBO = new EDMExportBOSearch(); model.addAttribute("search", searchBO); model.addAttribute("tab", tab); return returnView("search", model); } } // CONTROLLERS PARA MTODO POST /** * Controller para la url /home.htm con mtodo POST y con parmetro "referer","checked","nochecked" obligatorios. * Devuelve un entero y no una vista porque este mtodo se llama desde una peticin Ajax * * @param referer cadena con el valor del parmetro referer. Puede venir de la bsqueda o del listado de colecciones * @param checkedStr cadena en Json con el valor del parmetro checked * @param nocheckedStr cadena en Json con el valor del parmetro nochecked * @param model objeto de Spring Model con la peticin {@link Model} * @return devuelve un entero con el nmero de tems seleccionados */ @RequestMapping(value = "/home.htm", method = RequestMethod.POST, params = { "referer", "checked", "nochecked" }) public @ResponseBody Integer getItemsCheckPost(@RequestParam(value = "referer", required = true) String referer, @RequestParam(value = "checked", required = true) String checkedStr, @RequestParam(value = "nochecked", required = true) String nocheckedStr, Model model) { logger.debug("homeController.getItemsCheckPost"); ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapperNo = new ObjectMapper(); try { // decodificamos el json String[] checked = mapper.readValue(checkedStr, new TypeReference<String[]>() { }); String[] nochecked = mapperNo.readValue(nocheckedStr, new TypeReference<String[]>() { }); logger.debug( "referer: " + referer + " ; checked: " + checked.length + " ; nochecked: " + nochecked.length); for (int i = 0; i < checked.length; i++) logger.debug("referer: " + referer + " ; checked: " + checked[i]); // recogemos los tems con origen el listado de colecciones o desde la bsqueda EDMExportBOListItems boListItems = (referer.equals("listCollections")) ? edmExportServiceListCollections.getBoListItems() : edmExportServiceSearch.getBoListItems(); // guardamos los tems BO seleccionados y quitamos el resto edmExportServiceListItems.processEDMExportBOItemsChecked(boListItems, checked); edmExportServiceListItems.processEDMExportBOItemsNoChecked(boListItems, nochecked); logger.debug("Items checked: " + edmExportServiceListItems.getMapItemsSubmit().size()); } catch (JsonParseException e) { logger.debug("JsonParseException", e); } catch (IOException e) { logger.debug("IOException", e); } return Integer.valueOf(edmExportServiceListItems.getMapItemsSubmit().size()); } /** * Controller para la url /getFile.htm con mtodo POST. * Devuelve el fichero del EDM en xml. Viene de la pgina del formulario EDM. * * @param edmExportBOFormEDMData objeto con los datos del formulario de configuracin de elementos de EDM {@link EDMExportBOFormEDMData} * @param result objeto con el que se une la peticin * @return objeto HttpEntity {@link HttpEntity} con el array de bytes del document xml de EDM */ @RequestMapping(value = "/getFile.htm", method = RequestMethod.POST, params = "pageAction=xml") public HttpEntity<byte[]> postExport( @ModelAttribute(value = "FormEDMData") @Valid EDMExportBOFormEDMData edmExportBOFormEDMData, BindingResult result) { logger.debug("homeController.postExport"); try { if (result.hasErrors()) { logErrorValid(result); } else { edmExportServiceXML.setEdmExportServiceListItems(edmExportServiceListItems); String EDMXml = edmExportServiceXML.showEDMXML(edmExportBOFormEDMData, servletContext.getRealPath("")); if (EDMXml != null && !EDMXml.isEmpty()) { return getHttpEntityFromXml(EDMXml, edmExportBOFormEDMData.getXmlFormat()); } } } catch (Exception e) { logger.debug("homeController.postExport", e); } return null; } /** * Controller para la url /getFile.htm con mtodo POST. * Devuelve el fichero del EDM en xml. Viene de la pgina del formulario que muestra el xml. * Si el parmetro del xml comprimido tiene datos se descomprime para usarlos como contenido xml. * * @param EDMXml cadena con el contenido xml * @param edmXMLEncoded cadena con el contenido xml codificado bas64 y comprimido gzip * @return objeto HttpEntity {@link HttpEntity} con el array de bytes del document xml de EDM */ @RequestMapping(value = "/getFile.htm", method = RequestMethod.POST, params = "pageAction=exportView") public HttpEntity<byte[]> postExportView(@RequestParam("EDMXml") String EDMXml, @RequestParam("edmXMLEncoded") String edmXMLEncoded, @RequestParam("formatXML") String formatXML) { logger.debug("homeController.postExportView"); try { if (edmXMLEncoded != null && !edmXMLEncoded.isEmpty()) { BufferedInputStream reader = null; try { logger.debug("edmXMLEncoded: " + edmXMLEncoded); byte[] compressedData = Base64.decodeBase64(edmXMLEncoded.getBytes()); reader = new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(compressedData))); EDMXml = IOUtils.toString(reader, "UTF-8"); } catch (Exception e) { logger.debug("homeController.postExportView", e); } finally { if (reader != null) reader.close(); } } if (EDMXml != null && !EDMXml.isEmpty()) { return getHttpEntityFromXml(EDMXml, formatXML); } } catch (Exception e) { logger.debug("homeController.postExportView", e); } return null; } /** * Controller para la url /selectedItems.htm con mtodo POST y parmetro "pageAction" obligatorio con valor "xml" * Si hay un error se vuelve a la lista de tem seleccionados, si no se muestra el contenido xml en un formulario. * Los contenidos del formulario de elementos EDM se pasan en un objeto flash. * * @param boFormData objeto con los datos del formulario de elementos EDM {@link EDMExportBOFormEDMData} * @param result objeto con el que se une la peticin y se valida {@link BindingResult} * @param model objeto de Spring Model con la peticin {@link Model} * @param redirectAttributes objeto para devolver un objeto flash con los datos del formulario {@link RedirectAttributes} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/selectedItems.htm", method = RequestMethod.POST, params = "pageAction=xml") public String postXml(@ModelAttribute(value = "FormEDMData") @Valid EDMExportBOFormEDMData boFormData, BindingResult result, Model model, final RedirectAttributes redirectAttributes) { logger.debug("homeController.postXml "); if (result.hasErrors()) { logErrorValid(result); List<String> listCollections = edmExportServiceListItems.getListCollections(); model.addAttribute("FormEDMData", boFormData); model.addAttribute("listCollections", listCollections); model.addAttribute("listCollectionsCount", listCollections.size()); model.addAttribute("selectedItemsCount", edmExportServiceListItems.getMapItemsSubmit().size()); return returnView("selectedItems", model); } else { boFormData.paddingTypes(edmTypes.split(",")); redirectAttributes.addFlashAttribute("FormEDMData", boFormData); if (result.hasErrors()) { logErrorValid(result); List<String> listCollections = edmExportServiceListItems.getListCollections(); model.addAttribute("FormEDMData", boFormData); model.addAttribute("listCollections", listCollections); model.addAttribute("listCollectionsCount", listCollections.size()); model.addAttribute("selectedItemsCount", edmExportServiceListItems.getMapItemsSubmit().size()); return returnView("selectedItems", model); } edmExportServiceXML.clear(); return "redirect:viewXml.htm"; } } /** * Controller para la url /selectedItems.htm con mtodo POST y parmetro "referer" obligatorio. * Recoge los tems seleccionados para procesarlos. * Si hay un error redirige al listado de colecciones, si no al formulario de elementos EDM * * @param boListItems objeto con los datos de los tems pasados en la peticin {@link EDMExportBOListItems} * @param result objeto con el que se une la peticin {@link BindingResult} * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/selectedItems.htm", method = RequestMethod.POST, params = "referer") public String postListItems(@ModelAttribute(value = "listItems") EDMExportBOListItems boListItems, BindingResult result, Model model) { logger.debug("homeController.postListItems"); if (result.hasErrors()) { logErrorValid(result); return "redirect:home.htm"; } else { String[] edmTypesArr = edmTypes.split(","); String realPath = servletContext.getRealPath(""); logger.debug("realPath: " + realPath); String[] xmlFormatsArr = edmExportServiceXML.getFormatsXml(xmlFormats, realPath); EDMExportBOFormEDMData edmExportBOFormEDMData = new EDMExportBOFormEDMData(xmlFormatsArr, edmTypesArr, edmExportServiceListItems.getEDMExportServiceBase().getDspaceName(), "", edmExportServiceListItems.getEDMExportServiceBase().getDspaceBaseUrl(), "xml"); edmExportServiceListItems.processEDMExportBOListItems(boListItems); List<String> listCollections = edmExportServiceListItems.getListCollections(); model.addAttribute("FormEDMData", edmExportBOFormEDMData); model.addAttribute("listCollections", listCollections); model.addAttribute("listCollectionsCount", listCollections.size()); model.addAttribute("selectedItemsCount", edmExportServiceListItems.getMapItemsSubmit().size()); return returnView("selectedItems", model); } } /** * Mtodo para generar un objeto HttpEntity con un array de bytes a partir del contenido xml * * @param xml cadena con el contenido xml * @return objeto HttpEntity {@link HttpEntity} * @throws UnsupportedEncodingException */ private HttpEntity<byte[]> getHttpEntityFromXml(String xml, String format) throws UnsupportedEncodingException { byte[] EDMXmlBytes; EDMXmlBytes = xml.getBytes("UTF-8"); HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("text", "xml", Charset.forName("UTF-8"))); header.set("Content-Disposition", "attachment; filename=" + format + "Xml.xml"); header.setContentLength(EDMXmlBytes.length); return new HttpEntity<byte[]>(EDMXmlBytes, header); } /** * Controller para la url /home.htm con mtodo POST y parmetro "pageAction" obligatorio y valor "listColls". * Recoge las colecciones seleccionadas y los primeros tems a mostrar en su listado. * Si hay un error redirige al listado de colecciones, si no muestra el listado de tems con paginado. * * @param listCollectionsBO objeto con las colecciones seleccionadas {@link EDMExportBOListCollections} * @param result objeto con el que se une la peticin {@link BindingResult} * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.POST, params = "pageAction=listColls") public String postListCollections( @ModelAttribute(value = "listCollections") @Valid EDMExportBOListCollections listCollectionsBO, BindingResult result, Model model) { logger.debug("homeController.postListCollections"); if (result.hasErrors()) { logErrorValid(result); return "redirect:home.htm"; } else { listItemsPageInt = Integer.parseInt(listItemsPage); edmExportServiceListCollections.setBoListCollections(listCollectionsBO); edmExportServiceListCollections.clearBoListItems(); edmExportServiceListItems.clearMapItemsSubmit(); EDMExportBOListItems boListIems = edmExportServiceListCollections.getListItems(0, listItemsPageInt); if (boListIems.isEmpty()) { return "redirect:home.htm"; } else { model.addAttribute("referer", "listCollections"); model.addAttribute("listItemsBO", boListIems); hitCount = edmExportServiceListCollections.getHitCount(); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", (hitCount < listItemsPageInt) ? hitCount : listItemsPage); model.addAttribute("page", 1); pageTotal = getPageTotal(hitCount, listItemsPageInt); model.addAttribute("pageTotal", pageTotal); if (pageTotal > 1) model.addAttribute("next_page", 2); return returnView("listItems", model); } } } /** * Controller para la url /home.htm con mtodo POST y parmetro "pageAction" obligatorio y valor "searchItems". * Busca y recoge los primeros tems a mostrar en su listado. * Si hay un error redirige al formulario de bsqueda, si no muestra el listado de tems con paginado. * * @param searchBO objeto con los datos del formulario {@link EDMExportBOSearch} * @param result objeto con el que se une la peticin {@link BindingResult} * @param model objeto de Spring Model con la peticin {@link Model} * @return cadena con la vista a renderizar y mostrar */ @RequestMapping(value = "/home.htm", method = RequestMethod.POST, params = "pageAction=searchItems") public String postSearch(@ModelAttribute(value = "search") @Valid EDMExportBOSearch searchBO, BindingResult result, Model model) { logger.debug("homeController.postSearch"); if (result.hasErrors()) { logErrorValid(result); return returnView("search", model); } else { listItemsPageInt = Integer.parseInt(listItemsPage); edmExportServiceSearch.setSearchBO(searchBO); edmExportServiceSearch.clearBoListItems(); edmExportServiceListItems.clearMapItemsSubmit(); EDMExportBOListItems boListIems = edmExportServiceSearch.getListItems(0, listItemsPageInt); if (boListIems.isEmpty()) { model.addAttribute("error", "search"); return "redirect:home.htm"; } else { model.addAttribute("referer", "search"); model.addAttribute("listItemsBO", boListIems); hitCount = edmExportServiceSearch.getHitCount(); model.addAttribute("hitCount", hitCount); model.addAttribute("listItemsPage", (hitCount < listItemsPageInt) ? hitCount : listItemsPage); model.addAttribute("page", 1); pageTotal = getPageTotal(hitCount, listItemsPageInt); model.addAttribute("pageTotal", pageTotal); if (pageTotal > 1) model.addAttribute("next_page", 2); return returnView("listItems", model); } } } /** * Mtodo para recoger los datos del usuario del contexto de seguridad y almacenarlos en el objeto {@link EDMExportBOUser} * As se podr mostrar el nombre del usuario en toda la web */ private void getBOUserFromAuth() { if (edmExportBOUser.getUsername() != null && !edmExportBOUser.getUsername().isEmpty()) return; SecurityContext securityContext = SecurityContextHolder.getContext(); if (securityContext != null) { Authentication authentication = securityContext.getAuthentication(); if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) { Object principal = authentication.getPrincipal(); if (principal instanceof UserDetails) { edmExportBOUser.setUsername(((UserDetails) principal).getUsername()); edmExportBOUser.setPassword(((UserDetails) principal).getPassword()); edmExportBOUser.setAccess(1); } else if (principal instanceof java.lang.String) { edmExportBOUser.setUsername(principal.toString()); } } } } /** * Mtodo para aadir atributos comunes a las vistas * * @param view cadena con el nombre de la vista * @param model objeto Spring con el modelo para la vista {@link Model} * @return cadena con la vista */ private String returnView(String view, Model model) { addCommonObjects2Model(model); return view; } /** * Mtodo para aadir atributos comunes al modelo * * @param model objeto Spring con el modelo para la vista {@link Model} */ private void addCommonObjects2Model(Model model) { model.addAttribute("edmExportBOUser", edmExportBOUser); } /** * Mtodo para logar los errores del objeto que une los datos de la peticin * * @param result objeto que une la peticin {@link BindingResult} */ private void logErrorValid(BindingResult result) { for (Object object : result.getAllErrors()) { if (object instanceof FieldError) { FieldError fieldError = (FieldError) object; logger.debug(fieldError.toString()); } } } /** * Mtodo para devolver el nmero total de pginas en el paginado * * @param hitCount nmero de resultados * @param listItemsPageInt resultados por pgina * @return nmero de pginas totales */ private int getPageTotal(int hitCount, int listItemsPageInt) { if (hitCount < listItemsPageInt) return 1; else { int pageTotal = hitCount / listItemsPageInt; if (hitCount % listItemsPageInt > 0) pageTotal++; return pageTotal; } } }