001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.module.cg.batch;
017
018 import java.io.IOException;
019 import java.util.Date;
020 import java.util.List;
021
022 import org.apache.log4j.Logger;
023 import org.kuali.kfs.module.cg.CGConstants;
024 import org.kuali.kfs.module.cg.businessobject.CfdaUpdateResults;
025 import org.kuali.kfs.module.cg.service.CfdaService;
026 import org.kuali.kfs.sys.KFSKeyConstants;
027 import org.kuali.kfs.sys.batch.AbstractStep;
028 import org.kuali.rice.kns.mail.InvalidAddressException;
029 import org.kuali.rice.kns.mail.MailMessage;
030 import org.kuali.rice.kns.service.KualiConfigurationService;
031 import org.kuali.rice.kns.service.MailService;
032 import org.kuali.rice.kns.service.ParameterService;
033
034 /**
035 * Parses data from a government web page listing the valid CFDA codes. The codes are then compared with what's in the CFDA table in
036 * Kuali. Codes set to be managed automatically are reconciled with what's on the web page. Codes managed manually are left alone.
037 * Finally an email containing a summary of what was done by the step execution is sent to the member of the CG_CFDA_BATCH_NOTIFY workgroup.
038 */
039 public class CfdaBatchStep extends AbstractStep {
040
041 private static Logger LOG = org.apache.log4j.Logger.getLogger(CfdaBatchStep.class);
042
043 private CfdaService cfdaService;
044 private MailService mailService;
045 private ParameterService parameterService;
046 private KualiConfigurationService configurationService;
047 /**
048 * See the class description.
049 *
050 * @see org.kuali.kfs.sys.batch.Step#execute(String, Date)
051 */
052 public boolean execute(String jobName, Date jobRunDate) throws InterruptedException {
053 MailMessage message = new MailMessage();
054
055 try {
056 CfdaUpdateResults results = cfdaService.update();
057
058 List<String> listservAddresses = parameterService.getParameterValues(CfdaBatchStep.class, CGConstants.RESULT_SUMMARY_TO_EMAIL_ADDRESSES);
059 if (listservAddresses == null || listservAddresses.size() == 0) {
060 LOG.fatal("Couldn't find address to send notification to.");
061 return true;
062 }
063
064 for (String listserv : listservAddresses) {
065 if (LOG.isDebugEnabled()) {
066 LOG.debug("Mailing to: "+listserv);
067 }
068 message.addToAddress(listserv);
069 }
070
071 message.setFromAddress(listservAddresses.get(0));
072
073 // TODO this message should come from some config file.
074 StringBuilder builder = new StringBuilder();
075 builder.append("The CFDA batch script is complete.\n");
076 builder.append(" - ");
077 builder.append(results.getNumberOfRecordsDeactivatedBecauseNoLongerOnWebSite());
078 builder.append(" records were deactivated because they are no longer on the web site.\n");
079 builder.append(" - ");
080 builder.append(results.getNumberOfRecordsInKfsDatabase());
081 builder.append(" records were in the KFS database.\n");
082 builder.append(" - ");
083 builder.append(results.getNumberOfRecordsNewlyAddedFromWebSite());
084 builder.append(" records were newly added from the web site.\n");
085 builder.append(" - ");
086 builder.append(results.getNumberOfRecordsNotUpdatedBecauseManual());
087 builder.append(" records were not updated because they are manual.\n");
088 builder.append(" - ");
089 builder.append(results.getNumberOfRecordsReActivated());
090 builder.append(" records were re-activated.\n");
091 builder.append(" - ");
092 builder.append(results.getNumberOfRecordsRetrievedFromWebSite());
093 builder.append(" records were retrieved from the web site.\n");
094 builder.append(" - ");
095 builder.append(results.getNumberOfRecordsUpdatedBecauseAutomatic());
096 builder.append(" records were updated because they are automatic.\n");
097 builder.append(" - ");
098 builder.append(results.getNumberOfRecrodsNotUpdatedForHistoricalPurposes());
099 builder.append(" records were not updated for historical reasons.\n");
100 builder.append(" - Message\n");
101 builder.append(null != results.getMessage() ? results.getMessage() : "");
102
103 message.setSubject(getConfigurationService().getPropertyString(KFSKeyConstants.CFDA_UPDATE_EMAIL_SUBJECT_LINE));
104 message.setMessage(builder.toString());
105 mailService.sendMessage(message);
106
107 }
108 catch (IOException ioe) {
109 LOG.warn("Exception while updating CFDA codes.", ioe);
110 return false;
111 }
112 catch (InvalidAddressException iae) {
113
114 LOG.warn("The email address for "+CfdaBatchStep.class+":"+CGConstants.RESULT_SUMMARY_TO_EMAIL_ADDRESSES+" is invalid.", iae);
115 return true;
116 }
117 return true;
118 }
119
120 /**
121 * Sets the {@link CfdaService}. For use by Spring.
122 *
123 * @param cfdaService The service to be assigned.
124 */
125 public void setCfdaService(CfdaService cfdaService) {
126 this.cfdaService = cfdaService;
127 }
128
129 /**
130 * Set the {@link MailService}. For use by Spring.
131 *
132 * @param mailService The service to be assigned.
133 */
134 public void setMailService(MailService mailService) {
135 this.mailService = mailService;
136 }
137
138 /**
139 * Sets the {@link ParameterService}. For use by Spring.
140 *
141 * @param parameterService The service to be assigned.
142 */
143 public void setParameterService(ParameterService parameterService) {
144 this.parameterService = parameterService;
145 }
146
147 /**
148 * Gets the configurationService attribute.
149 * @return Returns the configurationService.
150 */
151 public KualiConfigurationService getConfigurationService() {
152 return configurationService;
153 }
154
155 /**
156 * Sets the configurationService attribute value.
157 * @param configurationService The configurationService to set.
158 */
159 public void setConfigurationService(KualiConfigurationService configurationService) {
160 this.configurationService = configurationService;
161 }
162
163 }
164