/* * OpenClinica is distributed under the * GNU Lesser General Public License (GNU LGPL). * For details see: http://www.openclinica.org/license * * Copyright 2003-2008 Akaza Research */ package org.akaza.openclinica.control.submit; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.rule.FileProperties; import org.akaza.openclinica.bean.rule.FileUploadHelper; import org.akaza.openclinica.bean.rule.XmlSchemaValidationHelper; import org.akaza.openclinica.control.SpringServletAccess; import org.akaza.openclinica.control.core.SecureController; import org.akaza.openclinica.core.form.StringUtil; import org.akaza.openclinica.dao.core.CoreResources; import org.akaza.openclinica.domain.rule.RulesPostImportContainer; import org.akaza.openclinica.exception.OpenClinicaSystemException; import org.akaza.openclinica.i18n.core.LocaleResolver; import org.akaza.openclinica.service.rule.RulesPostImportContainerService; import org.akaza.openclinica.view.Page; import org.akaza.openclinica.web.InsufficientPermissionException; import org.akaza.openclinica.web.SQLInitServlet; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.mapping.MappingException; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.ValidationException; import org.exolab.castor.xml.XMLContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; import java.util.Locale; /** * Verify the Rule import , show records that have Errors as well as records that will be saved. * * @author Krikor krumlian */ public class ImportRuleServlet extends SecureController { private static final long serialVersionUID = 9116068126651934226L; protected final Logger log = LoggerFactory.getLogger(ImportRuleServlet.class); Locale locale; FileUploadHelper uploadHelper = new FileUploadHelper(new FileProperties("xml")); XmlSchemaValidationHelper schemaValidator = new XmlSchemaValidationHelper(); RulesPostImportContainerService rulesPostImportContainerService; @Override public void processRequest() throws Exception { String action = request.getParameter("action"); request.setAttribute("contextPath", getContextPath()); request.setAttribute("hostPath", getHostPath()); copyFiles(); //@pgawade 13-April-2011 - #8877 // request.setAttribute("designerURL", // getCoreResources().getField("designer.url")); if (StringUtil.isBlank(action)) { forwardPage(Page.IMPORT_RULES); } if ("downloadrulesxsd".equalsIgnoreCase(action)) { // File xsdFile = new File(SpringServletAccess.getPropertiesDir(context) + "rules.xsd"); File xsdFile = getCoreResources().getFile("rules.xsd", "rules"+File.separator); dowloadFile(xsdFile, "text/xml"); } if ("downloadtemplate".equalsIgnoreCase(action)) { // File file = new File(SpringServletAccess.getPropertiesDir(context) + "rules_template.xml"); File file = getCoreResources().getFile("rules_template.xml", "rules"+File.separator); dowloadFile(file, "text/xml"); } if ("downloadtemplateWithNotes".equalsIgnoreCase(action)) { // File file = new File(SpringServletAccess.getPropertiesDir(context) + "rules_template_with_notes.xml"); File file = getCoreResources().getFile("rules_template_with_notes.xml", "rules"+File.separator); dowloadFile(file, "text/xml"); } if ("confirm".equalsIgnoreCase(action)) { try { File f = uploadHelper.returnFiles(request, context, getDirToSaveUploadedFileIn()).get(0); // File xsdFile = new File(getServletContext().getInitParameter("propertiesDir") + "rules.xsd"); // File xsdFile = new File(SpringServletAccess.getPropertiesDir(context) + "rules.xsd"); InputStream xsdFile = getCoreResources().getInputStream("rules.xsd"); schemaValidator.validateAgainstSchema(f, xsdFile); RulesPostImportContainer importedRules = handleLoadCastor(f); logger.info(ub.getFirstName()); importedRules = getRulesPostImportContainerService().validateRuleDefs(importedRules); importedRules = getRulesPostImportContainerService().validateRuleSetDefs(importedRules); session.setAttribute("importedData", importedRules); provideMessage(importedRules); forwardPage(Page.VERIFY_RULES_IMPORT_SERVLET); } catch (OpenClinicaSystemException re) { // re.printStackTrace(); MessageFormat mf = new MessageFormat(""); mf.applyPattern(re.getErrorCode() == null ? respage.getString("OCRERR_0016") : respage.getString(re.getErrorCode())); Object[] arguments = { re.getMessage() }; if (re.getErrorCode() != null) { arguments = re.getErrorParams(); } addPageMessage(mf.format(arguments)); forwardPage(Page.IMPORT_RULES); } } } private void copyFiles() { } private void provideMessage(RulesPostImportContainer rulesContainer) { int validRuleSetDefs = rulesContainer.getValidRuleSetDefs().size(); int duplicateRuleSetDefs = rulesContainer.getDuplicateRuleSetDefs().size(); int invalidRuleSetDefs = rulesContainer.getInValidRuleSetDefs().size(); int validRuleDefs = rulesContainer.getValidRuleDefs().size(); int duplicateRuleDefs = rulesContainer.getDuplicateRuleDefs().size(); int invalidRuleDefs = rulesContainer.getInValidRuleDefs().size(); if (validRuleSetDefs > 0 && duplicateRuleSetDefs == 0 && invalidRuleSetDefs == 0 && duplicateRuleDefs == 0 && invalidRuleDefs == 0) { addPageMessage(respage.getString("rules_Import_message1")); } if (duplicateRuleSetDefs > 0 && invalidRuleSetDefs == 0 && duplicateRuleDefs >= 0 && invalidRuleDefs == 0) { addPageMessage(respage.getString("rules_Import_message2")); } if (invalidRuleSetDefs > 0 && invalidRuleDefs >= 0) { addPageMessage(respage.getString("rules_Import_message3")); } } private String getDirToSaveUploadedFileIn() throws OpenClinicaSystemException { String dir = SQLInitServlet.getField("filePath"); if (!new File(dir).exists()) { throw new OpenClinicaSystemException(respage.getString("filepath_you_defined_not_seem_valid")); } String theDir = dir + "rules" + File.separator + "original" + File.separator; return theDir; } private RulesPostImportContainer handleLoadCastor(File xmlFile) { RulesPostImportContainer ruleImport = null; try { // create an XMLContext instance XMLContext xmlContext = new XMLContext(); // create and set a Mapping instance Mapping mapping = xmlContext.createMapping(); // mapping.loadMapping(SpringServletAccess.getPropertiesDir(context) + "mapping.xml"); mapping.loadMapping(getCoreResources().getURL("mapping.xml")); xmlContext.addMapping(mapping); // create a new Unmarshaller Unmarshaller unmarshaller = xmlContext.createUnmarshaller(); unmarshaller.setWhitespacePreserve(false); unmarshaller.setClass(RulesPostImportContainer.class); // Create a Reader to the file to unmarshal from FileReader reader = new FileReader(xmlFile); ruleImport = (RulesPostImportContainer) unmarshaller.unmarshal(reader); ruleImport.initializeRuleDef(); logRuleImport(ruleImport); return ruleImport; } catch (FileNotFoundException ex) { throw new OpenClinicaSystemException(ex.getMessage(), ex.getCause()); } catch (IOException ex) { throw new OpenClinicaSystemException(ex.getMessage(), ex.getCause()); } catch (MarshalException e) { throw new OpenClinicaSystemException(e.getMessage(), e.getCause()); } catch (ValidationException e) { throw new OpenClinicaSystemException(e.getMessage(), e.getCause()); } catch (MappingException e) { throw new OpenClinicaSystemException(e.getMessage(), e.getCause()); } } private void logRuleImport(RulesPostImportContainer ruleImport) { logger.info("Total Number of RuleDefs Being imported : {} ", ruleImport.getRuleDefs().size()); logger.info("Total Number of RuleAssignments Being imported : {} ", ruleImport.getRuleSets().size()); } private RulesPostImportContainerService getRulesPostImportContainerService() { rulesPostImportContainerService = this.rulesPostImportContainerService != null ? rulesPostImportContainerService : (RulesPostImportContainerService) SpringServletAccess .getApplicationContext(context).getBean("rulesPostImportContainerService"); rulesPostImportContainerService.setCurrentStudy(currentStudy); rulesPostImportContainerService.setRespage(respage); rulesPostImportContainerService.setUserAccount(ub); return rulesPostImportContainerService; } private CoreResources getCoreResources() { return (CoreResources) SpringServletAccess.getApplicationContext(context).getBean("coreResources"); } @Override protected String getAdminServlet() { if (ub.isSysAdmin()) { return SecureController.ADMIN_SERVLET_CODE; } else { return ""; } } @Override public void mayProceed() throws InsufficientPermissionException { locale = LocaleResolver.getLocale(request); if (ub.isSysAdmin()) { return; } Role r = currentRole.getRole(); if (r.equals(Role.STUDYDIRECTOR) || r.equals(Role.COORDINATOR)) { return; } addPageMessage(respage.getString("no_have_correct_privilege_current_study") + respage.getString("change_study_contact_sysadmin")); throw new InsufficientPermissionException(Page.MENU_SERVLET, resexception.getString("may_not_submit_data"), "1"); } }