package org.xdams.controller;
import java.text.Normalizer;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Map.Entry;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
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;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.util.WebUtils;
import org.xdams.admin.command.AdminCommand;
import org.xdams.conf.master.ConfBean;
import org.xdams.page.view.bean.ManagingBean;
import org.xdams.security.AuthenticationType;
import org.xdams.security.UserDetails;
import org.xdams.security.load.LoadUserManager;
import org.xdams.user.access.ServiceUser;
import org.xdams.user.bean.UserBean;
import org.xdams.workflow.bean.WorkFlowBean;
import com.fasterxml.jackson.databind.ObjectMapper;
@Controller
@SessionAttributes({ "userBean" })
@SuppressWarnings("unchecked")
public class xDamsAdminController {
private static final Logger logger = LoggerFactory.getLogger(xDamsAdminController.class);
@Autowired
ServiceUser serviceUser;
@Autowired
ServletContext servletContext;
@Autowired
AuthenticationType authenticationType;
@Autowired
Boolean multiAccount;
@Value("#{mapExtraParam}")
HashMap mapExtraParam;
@Autowired
ApplicationContext applicationContext;
@ModelAttribute
public void workFlowBean(Model model) {
model.addAttribute("workFlowBean", new WorkFlowBean());
}
//@ModelAttribute
public void userLoad(ModelMap model) {
// System.out.println("xDamsController.userLoad() model.containsAttribute(\"userBean\"): " + model.containsAttribute("userBean"));
if (!model.containsAttribute("userBean")) {
UserDetails userDetails = null;
try {
userDetails = (UserDetails) ((SecurityContext) SecurityContextHolder.getContext()).getAuthentication().getPrincipal();
UserBean userBean = LoadUserManager.executeLoad(userDetails, authenticationType);
model.addAttribute("userBean", userBean);
} catch (Exception e) {
}
}
}
@ModelAttribute
public void frontUrl(ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception {
// model.addAttribute("frontUrl", request.getContextPath() + "/resources");
userLoad(model);
model.addAttribute("frontUrl", request.getContextPath() + "/resources");
// System.out.println("xDamsController.frontUrl() multiAccount: " + multiAccount);
// System.out.println("xDamsController.frontUrl() model.get(\"userBean\"): " + model.get("userBean"));
if (multiAccount && model.get("userBean") != null) {
model.addAttribute("frontUrl", request.getContextPath() + "/resources/" + ((UserBean) model.get("userBean")).getAccountRef());
}
// System.out.println("xDamsController.frontUrl() model.get(\"frontUrl\"): " + model.get("frontUrl"));
model.addAttribute("contextPath", request.getContextPath());
String userAgent = ((HttpServletRequest) request).getHeader("User-Agent");
if (userAgent.toLowerCase().contains("msie")) {
response.addHeader("X-UA-Compatible", "IE=edge");
}
try {
Locale locale = RequestContextUtils.getLocale(request);
((UserBean) model.get("userBean")).setLanguage(locale.getLanguage());
} catch (Exception e) {
// TODO: handle exception
}
model.put("realPath", WebUtils.getRealPath(servletContext, ""));
}
public void common(ConfBean confBean, UserBean userBean, String archive, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
WorkFlowBean workFlowBean = (WorkFlowBean) modelMap.get("workFlowBean");
// SETTO IL WORKFLOW PER LA NAVIGAZIONE DI xDams
workFlowBean.setArchive(serviceUser.getArchive(userBean, archive));
workFlowBean.setRequest(request);
workFlowBean.setResponse(response);
workFlowBean.setApplicationContext(applicationContext);
modelMap.put("workFlowBean", workFlowBean);
}
public void common(ConfBean confBean, UserBean userBean, String archive, String archiveLookup, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
WorkFlowBean workFlowBean = (WorkFlowBean) modelMap.get("workFlowBean");
workFlowBean.setArchiveLookup(serviceUser.getArchive(userBean, archiveLookup));
common(confBean, userBean, archive, modelMap, request, response);
}
@RequestMapping(value = { "/resources/langForJS" }, method = RequestMethod.GET)
public ResponseEntity<String> langForJS(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
Locale locale = RequestContextUtils.getLocale(request);
ResourceBundle bundle = ResourceBundle.getBundle("xdams_messages", locale);
Map<String, String> bundleMap = new LinkedHashMap<String, String>();
for (String key : bundle.keySet()) {
String value = bundle.getString(key);
bundleMap.put(key, value);
}
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(bundleMap);
String globalLangOption = "var globalOption = " + json;
System.out.println(json);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", MediaType.APPLICATION_JSON.toString());
return new ResponseEntity<String>(globalLangOption, responseHeaders, HttpStatus.CREATED);
}
@RequestMapping(value = "/admin/createMessage", method = RequestMethod.GET, produces = "text/html")
public @ResponseBody
String createMessage(HttpServletRequest request) {
return stripPunctuation(request.getParameter("messageVal"), '_');
}
@RequestMapping(value = "/message_rest", method = RequestMethod.GET, produces = { "application/json" })
@ResponseStatus(HttpStatus.OK)
public String messageLang(HttpServletRequest request) {
Locale locale = RequestContextUtils.getLocale(request);
ResourceBundle bundle = ResourceBundle.getBundle("xdams_messages", locale);
System.out.println(bundle);
return null;
}
public String stripPunctuation(String str, char separator) {
str = str.replaceAll("/text\\(\\)", "");
str = str.replaceAll("/", "_");
str = str.replaceAll("\\[", "_");
str = str.replaceAll("\\]", "_");
str = str.replaceAll("=", "_");
str = str.replaceAll("'", "");
str = str.replaceAll("@", "");
str = str.replaceAll("__*", "_");
if (str.startsWith("_")) {
str = str.substring(1);
}
StringBuilder sb = new StringBuilder();
char[] cs = str.toCharArray();
for (int i = 0; i < cs.length; i++) {
if (Character.isLetterOrDigit(cs[i]) || cs[i] == '.' || cs[i] == '_' || cs[i] == separator) {
sb.append(cs[i]);
} else {
if (sb.length() > 1 && sb.charAt(sb.length() - 1) != separator) {
if (Character.isSpaceChar(cs[i])) {
sb.append(separator);
}
}
}
}
return removeAccents(sb.toString().replaceAll("\\.", ""));
}
public static String removeAccents(String text) {
return Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
@RequestMapping(value = "/admin/{archive}/exportMenu", method = RequestMethod.GET, produces = "text/html")
public String consoleMenu(@ModelAttribute("userBean") UserBean userBean, @ModelAttribute("confBean") ConfBean confBean, @PathVariable String archive, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
common(confBean, userBean, archive, modelMap, request, response);
AdminCommand adminCommand = new AdminCommand(request.getParameterMap(), modelMap);
ManagingBean managingBean = adminCommand.execute();
return "admin/"+managingBean.getDispatchView();
}
}