package binky.reportrunner.ui.actions.job.edit; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.util.LinkedList; import net.sf.jasperreports.engine.JRException; import org.apache.log4j.Logger; import org.quartz.CronTrigger; import binky.reportrunner.data.RunnerDataSource; import binky.reportrunner.data.RunnerJob; import binky.reportrunner.data.RunnerJobParameter; import binky.reportrunner.exceptions.SecurityException; import binky.reportrunner.scheduler.SchedulerException; public class EditJob extends BaseEditJob { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(EditJob.class); private int parameterId; private String deleteParameters; private String addParameter; private String saveJob; private int tab=0; @Override public String execute() throws Exception { if (!super.doesUserHaveGroup(groupName)) throw new SecurityException("User does not have permissions for group: " + groupName); if (super.getSessionUser().getIsReadOnly()) throw new SecurityException("User is readonly"); super.setDataSources(dataSourceService.getDataSourcesForGroup(groupName)); logger.debug("execute called"); if (isStringPopulated(deleteParameters)) { logger.debug("delete parameter"); tab=3; return deleteParameter(); } else if (isStringPopulated(addParameter)) { logger.debug("add parameter"); tab=3; return addParameter(); } else { logger.debug("save job"); try{ return saveJob(); }catch (Exception e) { super.addActionError(e.getMessage()); return INPUT; } } } private String addParameter() { logger.debug("adding parameter to job " + jobName + " of group " + groupName); if (parameters == null) { logger.debug("parameters are null so creating new list"); parameters = new LinkedList<RunnerJobParameter>(); } RunnerJobParameter parameter = new RunnerJobParameter(); // pk.setParameterIdx(maxIdx); parameter.setParameterIdx(parameters.size() + 1); parameter.setRunnerJob(job); logger.debug("created new parameter with index of: " + (parameters.size() + 1)); parameters.add(parameter); job.setParameters(parameters); return INPUT; } private String deleteParameter() { logger.debug("removing parameter:" + parameterId + " for job " + jobName + " of group " + groupName); parameters.remove(parameterId); job.setParameters(parameters); return INPUT; } private String saveJob() throws JRException, SchedulerException, SecurityException { logger.debug("entered save job"); this.groupName = job.getPk().getGroup().getGroupName(); String jobName = job.getPk().getJobName(); RunnerDataSource ds = dataSourceService.getDataSource(dsName); job.setDatasource(ds); if (groupName != null && !groupName.isEmpty() && (jobName != null && !jobName.isEmpty())) { // security check if (doesUserHaveGroup(groupName) && !isUserReadOnly()) { logger.debug("dispatching to save job"); boolean ok = validateJob(job); if (!ok) { logger.debug("failed validation"); return INPUT; } else { doSaveJob(jobName, groupName); return SUCCESS; } } else { SecurityException se = new SecurityException("Group " + groupName + " not valid for user " + super.getSessionUser().getUserName()); logger.fatal(se.getMessage(), se); throw se; } } else { logger.error("groupName or jobName missing"); super.addActionError("Job Name missing"); return INPUT; } } private boolean validateJob(RunnerJob job) { boolean valid = true; if (job.getPk() == null) { logger.debug("Error with job definition - name and group were not set!"); super.addActionError("Error with job definition - name and group were not set!"); valid = false; } if ((job.getPk().getJobName() == null) || (job.getPk().getJobName().trim().isEmpty())) { logger.debug("Job name not set"); super.addActionError("Job name not set"); valid = false; } if ((job.getPk().getGroup() == null) || (job.getPk().getGroup().getGroupName() == null) || (job.getPk().getGroup().getGroupName().trim().isEmpty())) { logger.debug("Group name not set"); super.addActionError("Group name not set"); valid = false; } if ((job.getQuery() == null) || (job.getQuery().trim().isEmpty())) { logger.debug("Query not set"); super.addActionError("Query not set"); valid = false; } if (job.isScheduled()) { try { new CronTrigger("test", "test", simpleCron.toString()); } catch (ParseException e) { logger.debug("cron fail:" + e.getMessage()); super.addActionError("Schedule invalid: " + e.getMessage()); valid = false; } } return valid; } private boolean doSaveJob(String jobName, String groupName) throws JRException, SchedulerException { job.setOutputUrl(outputPrefix+outputUrl); // Get the uploaded File if (logger.isDebugEnabled()) { logger.debug("file uploaded is: " + templateFileName); logger.debug("upload object is null: " + (template == null)); if (template != null) { logger.debug("upload object is file: " + template.isFile()); logger.debug("upload object exists: " + template.exists()); } } logger.debug("cron schedule="+simpleCron.toString()); job.setCronString(simpleCron.toString()); if ((template != null) && template.isFile() && template.exists()) { try { byte[] file = getBytesFromFile(template); job.setTemplateFile(file); job.setTemplateFileName(templateFileName); } catch (IOException e) { logger.warn(e.getMessage(), e); super.addActionError("Error processing template:" + e.getMessage()); return false; } } else { // hack to preserve template file RunnerJob job2 = jobService.getJob(jobName, groupName); if ((job2 != null) && (job2.getTemplateFile() != null)) { job.setTemplateFile(job2.getTemplateFile().clone()); } } // hack to do the tabular stuff with parameters if (parameters != null) { logger.debug("parameter count:" + parameters.size()); //fix for defect that gave error: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance job.getParameters().clear(); for (RunnerJobParameter p : this.parameters) { if (p != null) { p.setRunnerJob(job); //fix for defect that gave error: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance job.getParameters().add(p); } else { logger.warn("null parameter"); } } } //fix for defect that gave error: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance //job.setParameters(parameters); jobService.addUpdateJob(job); return true; } // Returns the contents of the file in a byte array. private byte[] getBytesFromFile(File file) throws IOException { // if the file is null then return a null byte array to show this if (file == null) { logger.warn("getBytesFromFile called with null file object"); return null; } logger.debug("getBytesFromFile called for: " + file.getName()); InputStream is = new FileInputStream(file); // Get the size of the file long length = file.length(); logger.debug("file len: " + length); if (length > Integer.MAX_VALUE) { throw new IOException("file too large"); } // Create the byte array to hold the data byte[] bytes = new byte[(int) length]; // Read in the bytes int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } // Ensure all the bytes have been read in if (offset < bytes.length) { IOException e = new IOException("Could not completely read file " + file.getName()); logger.error("error reading file", e); throw e; } // Close the input stream and return bytes is.close(); return bytes; } /* * public QuartzCronSchedule getSimpleCron() { return simpleCron; } * * public void setSimpleCron(QuartzCronSchedule simpleCron) { * this.simpleCron = simpleCron; } */ public int getParameterId() { return parameterId; } public void setParameterId(int parameterId) { this.parameterId = parameterId; } public String getDeleteParameters() { return deleteParameters; } public void setDeleteParameters(String deleteParameters) { this.deleteParameters = deleteParameters; } public String getAddParameter() { return addParameter; } public void setAddParameter(String addParameter) { this.addParameter = addParameter; } public String getSaveJob() { return saveJob; } public void setSaveJob(String saveJob) { this.saveJob = saveJob; } public int getTab() { return tab; } }