Rev 1312 | Rev 1315 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
110 | susana | 1 | package pt.estgp.estgweb.services.sigesimports; |
2 | |||
165 | jmachado | 3 | import jomm.dao.impl.AbstractDao; |
4 | import org.apache.log4j.Logger; |
||
5 | import pt.estgp.estgweb.Globals; |
||
1312 | jmachado | 6 | import pt.estgp.estgweb.domain.*; |
995 | jmachado | 7 | import pt.estgp.estgweb.domain.dao.DaoFactory; |
214 | jmachado | 8 | import pt.estgp.estgweb.domain.views.CourseView; |
995 | jmachado | 9 | import pt.estgp.estgweb.services.courses.CoursesService; |
10 | import pt.estgp.estgweb.services.email.SendEmailService; |
||
165 | jmachado | 11 | import pt.estgp.estgweb.services.expceptions.ServiceException; |
995 | jmachado | 12 | import pt.estgp.estgweb.services.jobs.ServiceJob; |
165 | jmachado | 13 | import pt.estgp.estgweb.services.logresults.ILogMessages; |
14 | import pt.estgp.estgweb.services.logresults.LogMessageTypeEnum; |
||
15 | import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessage; |
||
16 | import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages; |
||
1296 | jmachado | 17 | import pt.estgp.estgweb.services.sigesimports.oracle.dao.DisciplinaDao; |
18 | import pt.estgp.estgweb.services.sigesimports.oracle.dao.connection.ConnectionManager; |
||
19 | import pt.estgp.estgweb.services.sigesimports.oracle.domain.Disciplina; |
||
1312 | jmachado | 20 | import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasHorario; |
21 | import pt.estgp.estgweb.services.sigesimports.oracle.domain.TipologiasSumario; |
||
995 | jmachado | 22 | import pt.estgp.estgweb.utils.ConfigProperties; |
863 | jmachado | 23 | import pt.estgp.estgweb.utils.Email; |
110 | susana | 24 | import pt.utl.ist.berserk.logic.serviceManager.IService; |
25 | |||
1296 | jmachado | 26 | import java.sql.Connection; |
27 | import java.sql.SQLException; |
||
863 | jmachado | 28 | import java.util.*; |
110 | susana | 29 | |
30 | /** |
||
31 | * @author Jorge Machado |
||
32 | */ |
||
995 | jmachado | 33 | public class ImportCourseService extends ServiceJob implements IService |
163 | jmachado | 34 | { |
110 | susana | 35 | private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(ImportCourseService.class); |
36 | |||
214 | jmachado | 37 | private CoursesService coursesService = new CoursesService(); |
38 | |||
995 | jmachado | 39 | int newUnits = 0; |
40 | int newCourses = 0; |
||
1277 | jmachado | 41 | int unitsRepeated = 0; |
1296 | jmachado | 42 | int unitsAtualizadas = 0; |
1312 | jmachado | 43 | int turmasSeparadasComInconsistencias = 0; |
44 | int turmasSeparadasTratadasOk = 0; |
||
45 | int erroGraveAObterTipologias = 0; |
||
46 | static Map<String,Boolean> courseYearTurmasPolicy = new HashMap<String, Boolean>(); |
||
47 | |||
48 | public static void resetCourseYearTurmaPolicy() |
||
110 | susana | 49 | { |
1312 | jmachado | 50 | courseYearTurmasPolicy.clear(); |
51 | } |
||
52 | |||
53 | public ILogMessages run(1.5.0/docs/api/java/lang/String.html">String year,int institutionCode) throws ServiceException |
||
54 | { |
||
55 | 1.5.0/docs/api/java/lang/String.html">String msgS = "STARTING COURSES IMPORT SERVICE FOR YEAR: " + year + " " + institutionCode; |
||
995 | jmachado | 56 | serviceLogInfo(msgS); |
57 | logger.info(msgS); |
||
110 | susana | 58 | |
995 | jmachado | 59 | newUnits = 0; |
60 | newCourses = 0; |
||
1277 | jmachado | 61 | unitsRepeated = 0; |
1296 | jmachado | 62 | unitsAtualizadas = 0; |
1312 | jmachado | 63 | turmasSeparadasComInconsistencias = 0; |
64 | turmasSeparadasTratadasOk = 0; |
||
65 | erroGraveAObterTipologias=0; |
||
66 | resetCourseYearTurmaPolicy(); |
||
995 | jmachado | 67 | |
165 | jmachado | 68 | DefaultLogMessages logMessages = new DefaultLogMessages(); |
69 | try |
||
110 | susana | 70 | { |
1312 | jmachado | 71 | logMessages.addMessage(new DefaultLogMessage("import.semestre.separated", LogMessageTypeEnum.INFO, "instituicao " + institutionCode)); |
995 | jmachado | 72 | serviceLogInfo(logMessages.getLastMessage()); |
110 | susana | 73 | |
165 | jmachado | 74 | HashMap<String, Disciplina> disciplinasMap = new HashMap<String, Disciplina>(); |
75 | HashMap<String, Disciplina> disciplinasMapS1 = new HashMap<String, Disciplina>(); |
||
76 | HashMap<String, Disciplina> disciplinasMapS2 = new HashMap<String, Disciplina>(); |
||
727 | jmachado | 77 | HashMap<String, Disciplina> disciplinasMapA = new HashMap<String, Disciplina>(); |
1040 | jmachado | 78 | HashMap<String, Disciplina> disciplinasMapT1 = new HashMap<String, Disciplina>(); |
79 | HashMap<String, Disciplina> disciplinasMapT2 = new HashMap<String, Disciplina>(); |
||
80 | HashMap<String, Disciplina> disciplinasMapT3 = new HashMap<String, Disciplina>(); |
||
81 | HashMap<String, Disciplina> disciplinasMapT4 = new HashMap<String, Disciplina>(); |
||
345 | jmachado | 82 | HashMap<String, Disciplina> cursosMap = new HashMap<String, Disciplina>(); |
163 | jmachado | 83 | |
165 | jmachado | 84 | /** |
85 | * Build Course Units Maps |
||
86 | */ |
||
1296 | jmachado | 87 | /*SiGesWEB service; |
1017 | jmachado | 88 | String WSDL = DaoFactory.getConfigurationDaoImpl().getSigesWebServicesWsdl(); |
165 | jmachado | 89 | try |
90 | { |
||
1017 | jmachado | 91 | serviceLogInfo("STARTING WEB SERVICE AT " + WSDL); |
92 | service = new SiGesWEB(new URL(WSDL), new QName(Globals.SIGES_WEBSERVICE_TARGET_NAMESPACE, "SiGesWEB")); |
||
165 | jmachado | 93 | } |
94 | catch (MalformedURLException e) |
||
95 | { |
||
96 | logger.fatal(e, e); |
||
97 | logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(),"erro na configuracao do WEB Service", LogMessageTypeEnum.INFO)); |
||
995 | jmachado | 98 | serviceLogError(logMessages.getLastMessage(), e); |
165 | jmachado | 99 | return logMessages; |
100 | } |
||
1296 | jmachado | 101 | */ |
102 | DisciplinaDao service = DisciplinaDao.getInstance(); |
||
103 | 1.5.0/docs/api/java/sql/Connection.html">Connection conn = ConnectionManager.openConnection(); |
||
163 | jmachado | 104 | |
1312 | jmachado | 105 | importUnitsSemestre(service,conn, "S1", year,institutionCode, disciplinasMap, disciplinasMapS1, cursosMap, logMessages); |
106 | importUnitsSemestre(service,conn, "S2", year,institutionCode, disciplinasMap, disciplinasMapS2, cursosMap, logMessages); |
||
107 | importUnitsSemestre(service,conn, "A", year,institutionCode, disciplinasMap, disciplinasMapA, cursosMap, logMessages); |
||
108 | importUnitsSemestre(service,conn, "T1", year,institutionCode, disciplinasMap, disciplinasMapT1, cursosMap, logMessages); |
||
109 | importUnitsSemestre(service,conn, "T2", year,institutionCode, disciplinasMap, disciplinasMapT2, cursosMap, logMessages); |
||
110 | importUnitsSemestre(service,conn, "T3", year,institutionCode, disciplinasMap, disciplinasMapT3, cursosMap, logMessages); |
||
111 | importUnitsSemestre(service,conn, "T4", year,institutionCode, disciplinasMap, disciplinasMapT4, cursosMap, logMessages); |
||
1115 | jmachado | 112 | |
165 | jmachado | 113 | /** |
114 | * Import Courses |
||
115 | */ |
||
116 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.courses", LogMessageTypeEnum.INFO)); |
||
995 | jmachado | 117 | serviceLogInfo("updating courses"); |
165 | jmachado | 118 | logger.info("updating courses"); |
345 | jmachado | 119 | Set<Map.Entry<String, Disciplina>> set2 = cursosMap.entrySet(); |
120 | for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set2) |
||
165 | jmachado | 121 | { |
122 | Disciplina d = entry.getValue(); |
||
214 | jmachado | 123 | CourseView c = coursesService.loadCourseByCode("" + d.getCodigoCurso().intValue(),false); |
124 | |||
125 | // Course c = DaoFactory.getCourseDaoImpl().findCourseByCode("" + d.getCodigoCurso()); |
||
219 | jmachado | 126 | if (c == null) |
127 | { |
||
128 | c = new CourseView(); |
||
995 | jmachado | 129 | newCourses++; |
130 | serviceLogInfo("New Course Found: (" + d.getCodigoCurso() + ") " + d.getNomeCurso()); |
||
214 | jmachado | 131 | // DaoFactory.getCourseDaoImpl().save(c); |
219 | jmachado | 132 | } |
165 | jmachado | 133 | c.setName(d.getNomeCurso()); |
1189 | jmachado | 134 | if(d.getGrauCurso() == null || d.getGrauCurso().trim().length() == 0) |
135 | d.setGrauCurso("unknown"); |
||
409 | jmachado | 136 | 1.5.0/docs/api/java/lang/String.html">String grauBaco = ConfigProperties.getProperty("siges.degree."+d.getGrauCurso()); |
1189 | jmachado | 137 | |
138 | c.setDegree(grauBaco); |
||
165 | jmachado | 139 | c.setCode("" + d.getCodigoCurso().intValue()); |
206 | jmachado | 140 | c.setImportYear(year); |
165 | jmachado | 141 | c.setInstitutionalCode("" + d.getCodigoInstituicao().intValue()); |
214 | jmachado | 142 | coursesService.submitCourse(c,null,null,0,null,null); |
165 | jmachado | 143 | } |
163 | jmachado | 144 | |
165 | jmachado | 145 | /** |
146 | * Update Course Units |
||
147 | */ |
||
1312 | jmachado | 148 | updateCourseUnits(disciplinasMapS1, "S1",logMessages,year,institutionCode,service,conn); |
149 | updateCourseUnits(disciplinasMapS2, "S2",logMessages,year,institutionCode,service,conn); |
||
150 | updateCourseUnits(disciplinasMapA, "A",logMessages,year,institutionCode,service,conn); |
||
151 | updateCourseUnits(disciplinasMapT1, "T1",logMessages,year,institutionCode,service,conn); |
||
152 | updateCourseUnits(disciplinasMapT2, "T2",logMessages,year,institutionCode,service,conn); |
||
153 | updateCourseUnits(disciplinasMapT3, "T3",logMessages,year,institutionCode,service,conn); |
||
154 | updateCourseUnits(disciplinasMapT4, "T4",logMessages,year,institutionCode,service,conn); |
||
995 | jmachado | 155 | |
1296 | jmachado | 156 | conn.close(); |
157 | |||
995 | jmachado | 158 | serviceLogInfo("######################################"); |
159 | serviceLogInfo("######################################"); |
||
160 | serviceLogInfo("#Courses Imported:" + cursosMap.size()); |
||
161 | serviceLogInfo("#Units Imported S1:" + disciplinasMapS1.size()); |
||
162 | serviceLogInfo("#Units Imported S2:" + disciplinasMapS2.size()); |
||
163 | serviceLogInfo("#Units Imported A:" + disciplinasMapA.size()); |
||
1040 | jmachado | 164 | serviceLogInfo("#Units Imported T1:" + disciplinasMapT1.size()); |
165 | serviceLogInfo("#Units Imported T2:" + disciplinasMapT2.size()); |
||
166 | serviceLogInfo("#Units Imported T3:" + disciplinasMapT3.size()); |
||
167 | serviceLogInfo("#Units Imported T4:" + disciplinasMapT4.size()); |
||
995 | jmachado | 168 | serviceLogInfo("#New Courses Found:" + newCourses); |
169 | serviceLogInfo("#New Units Found:" + newUnits); |
||
1296 | jmachado | 170 | serviceLogInfo("#Regular Updated Units:" + unitsAtualizadas); |
171 | serviceLogInfo("#Unidades Repetidas (A mesma para o conjunto (Codigo,Curso,Ano,Semestre)):" + unitsRepeated); |
||
1312 | jmachado | 172 | serviceLogInfo("#Turmas Separadas Tratadas com sucesso:" + turmasSeparadasTratadasOk); |
173 | if(turmasSeparadasComInconsistencias > 0) |
||
174 | { |
||
175 | serviceLogInfo("!!!CHECK IN LOG######Units with Courses with Turmas Separadas with problems:" + turmasSeparadasComInconsistencias); |
||
176 | } |
||
177 | if(erroGraveAObterTipologias > 0) |
||
178 | { |
||
179 | serviceLogInfo("!!!Na trasnformacao do JSON em class nas tipologias:" + erroGraveAObterTipologias); |
||
180 | } |
||
995 | jmachado | 181 | |
1025 | jmachado | 182 | logger.info("######################################"); |
183 | logger.info("######################################"); |
||
184 | logger.info("#Courses Imported:" + cursosMap.size()); |
||
185 | logger.info("#Units Imported S1:" + disciplinasMapS1.size()); |
||
186 | logger.info("#Units Imported S2:" + disciplinasMapS2.size()); |
||
187 | logger.info("#Units Imported A:" + disciplinasMapA.size()); |
||
1040 | jmachado | 188 | logger.info("#Units Imported T1:" + disciplinasMapT1.size()); |
189 | logger.info("#Units Imported T2:" + disciplinasMapT2.size()); |
||
190 | logger.info("#Units Imported T3:" + disciplinasMapT3.size()); |
||
191 | logger.info("#Units Imported T4:" + disciplinasMapT4.size()); |
||
1025 | jmachado | 192 | logger.info("#New Courses Found:" + newCourses); |
193 | logger.info("#New Units Found:" + newUnits); |
||
1296 | jmachado | 194 | logger.info("#Regular Updated Units:" + unitsAtualizadas); |
195 | logger.info("#Unidades Repetidas (A mesma para o conjunto (Codigo,Curso,Ano,Semestre)):" + unitsRepeated); |
||
1312 | jmachado | 196 | logger.info("#Turmas Separadas Tratadas com sucesso:" + turmasSeparadasTratadasOk); |
197 | if(turmasSeparadasComInconsistencias > 0) |
||
198 | { |
||
199 | logger.info("!!!CHECK IN LOG######Units with Courses with Turmas Separadas with problems:" + turmasSeparadasComInconsistencias); |
||
200 | } |
||
201 | if(erroGraveAObterTipologias > 0) |
||
202 | { |
||
203 | logger.info("!!!Na trasnformacao do JSON em class nas tipologias:" + erroGraveAObterTipologias); |
||
204 | } |
||
995 | jmachado | 205 | |
1025 | jmachado | 206 | |
110 | susana | 207 | } |
165 | jmachado | 208 | catch (1.5.0/docs/api/java/lang/Throwable.html">Throwable e) |
110 | susana | 209 | { |
358 | jmachado | 210 | logger.error(e,e); |
211 | logMessages.addMessage(new DefaultLogMessage("import.error",e.toString(), "see log for details", LogMessageTypeEnum.ERROR)); |
||
995 | jmachado | 212 | serviceLogError(logMessages.getLastMessage(), e); |
863 | jmachado | 213 | 1.5.0/docs/api/java/lang/String.html">String cause = e.getCause() == null ? "" : e.getCause().toString(); |
1000 | jmachado | 214 | sendNotificationAdmin("Erro na importacao de sumarios",cause); |
110 | susana | 215 | } |
358 | jmachado | 216 | logger.info("terminating course import"); |
995 | jmachado | 217 | serviceLogInfo("terminating course import"); |
165 | jmachado | 218 | logMessages.addMessage(new DefaultLogMessage("import.course.terminating", LogMessageTypeEnum.INFO)); |
995 | jmachado | 219 | setProgress(100); |
165 | jmachado | 220 | return logMessages; |
221 | } |
||
110 | susana | 222 | |
1000 | jmachado | 223 | /** |
224 | * Envio de Notificação aos operadores do CI |
||
225 | * @param subject |
||
226 | * @param cause |
||
227 | */ |
||
228 | private void sendNotificationAdmin(1.5.0/docs/api/java/lang/String.html">String subject, 1.5.0/docs/api/java/lang/String.html">String cause) |
||
229 | { |
||
230 | |||
1024 | jmachado | 231 | |
1000 | jmachado | 232 | List<String> emails = ConfigProperties.getListValues("admin.email"); |
233 | for(1.5.0/docs/api/java/lang/String.html">String email:emails) |
||
234 | { |
||
235 | serviceLogWarn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email); |
||
236 | logger.warn(">>>>>>>>ENVIANDO NOTIFICACAO A ADMINISTRACAO: " + email); |
||
237 | } |
||
238 | List<String> arguments = new ArrayList<String>(); |
||
239 | arguments.add(cause.replace("\n","<br/>")); |
||
240 | Email email = new Email(subject,emails,Globals.SYSTEM_EMAIL_BOX,"messageToAdmin_pt.txt",arguments); |
||
1029 | jmachado | 241 | email.setHtml(true); |
1000 | jmachado | 242 | try { |
243 | new SendEmailService().sendEmail(email); |
||
244 | } catch (ServiceException e) { |
||
245 | e.printStackTrace(); |
||
246 | } |
||
247 | |||
248 | } |
||
249 | |||
1312 | jmachado | 250 | |
251 | |||
252 | /** |
||
253 | * This method loads turmas separated policy from CourseYear |
||
254 | * uses the cache courseYearTurmasPolicy |
||
255 | * @param codigoDoCurso |
||
256 | * @param year |
||
257 | * @param logMessages |
||
258 | * @return |
||
259 | */ |
||
260 | protected static boolean loadCourseYearTurmasPolicy(int codigoDoCurso,1.5.0/docs/api/java/lang/String.html">String year,DefaultLogMessages logMessages,ServiceJob service) { |
||
261 | |||
262 | 1.5.0/docs/api/java/lang/Boolean.html">Boolean turmasSeparated = courseYearTurmasPolicy.get(codigoDoCurso + "-" + year); |
||
263 | if(turmasSeparated != null) |
||
264 | return turmasSeparated; |
||
265 | |||
266 | List<CourseYear> courseYears = DaoFactory.getCourseYearDaoImpl().findCourseYear(""+codigoDoCurso,year); |
||
267 | if(courseYears == null || courseYears.size() == 0) |
||
268 | { |
||
269 | checkOrCreateCourseYear(logMessages, year, "" + codigoDoCurso, service); |
||
270 | courseYears = DaoFactory.getCourseYearDaoImpl().findCourseYear(""+codigoDoCurso,year); |
||
271 | } |
||
272 | if(courseYears != null && courseYears.size() > 0) |
||
273 | { |
||
274 | CourseYear cY = courseYears.get(0); |
||
275 | courseYearTurmasPolicy.put(codigoDoCurso + "-" + year,cY.isSeparatedTurmas()); |
||
276 | return cY.isSeparatedTurmas(); |
||
277 | } |
||
278 | return false; |
||
279 | } |
||
280 | |||
1296 | jmachado | 281 | private void importUnitsSemestre(DisciplinaDao service, |
282 | 1.5.0/docs/api/java/sql/Connection.html">Connection conn, |
||
165 | jmachado | 283 | 1.5.0/docs/api/java/lang/String.html">String semestre, |
284 | 1.5.0/docs/api/java/lang/String.html">String year, |
||
1312 | jmachado | 285 | int institutionCode, |
165 | jmachado | 286 | HashMap<String, Disciplina> disciplinasMap, |
287 | HashMap<String, Disciplina> disciplinasMapSemestre, |
||
345 | jmachado | 288 | HashMap<String, Disciplina> cursosMap, |
1296 | jmachado | 289 | DefaultLogMessages logMessages) throws 1.5.0/docs/api/java/sql/SQLException.html">SQLException { |
1115 | jmachado | 290 | |
291 | |||
165 | jmachado | 292 | logMessages.addMessage(new DefaultLogMessage("import.semestre.course.units." + semestre, LogMessageTypeEnum.INFO)); |
995 | jmachado | 293 | serviceLogInfo("importing " + semestre + " course units"); |
165 | jmachado | 294 | logger.info("importing " + semestre + " course units"); |
1312 | jmachado | 295 | List<Disciplina> disciplinas = service.loadDisciplinas(institutionCode, year, semestre,conn); |
1296 | jmachado | 296 | |
165 | jmachado | 297 | for (Disciplina d : disciplinas) |
110 | susana | 298 | { |
1312 | jmachado | 299 | if(ImportStudentsService.isCursoFicticio(d.getCodigoCurso())) |
300 | continue; |
||
301 | |||
302 | boolean turmasSeparatedPolicy = loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this); |
||
303 | Disciplina inCache = disciplinasMap.get(getDisciplinaUniqueRef(d,year,logMessages)); |
||
304 | |||
305 | if (inCache != null |
||
306 | // && !turmasSeparatedPolicy // Com politica de turmas separadas no curso a repeticao é normal uma por turma |
||
307 | ) |
||
165 | jmachado | 308 | { |
1312 | jmachado | 309 | logMessages.addMessage(new DefaultLogMessage("import.semestre." + semestre, LogMessageTypeEnum.INFO,"Other turma for a unit in " + semestre + ":" + d.getCodigo().intValue() + " -> " + d.getCdTurma())); |
310 | serviceLogInfo("Other turma for a unit in " + semestre + ":" + d.getCodigo().intValue() + " -> " + d.getCdTurma()); |
||
311 | logger.info("Other turma for unit in " + semestre + ":" + d.getCodigo().intValue() + " -> " + d.getCdTurma()); |
||
165 | jmachado | 312 | } |
1312 | jmachado | 313 | |
314 | //se houver mais que uma ocorrencia de turmas na disciplina sobrepoe, nao importa se forem de turmas juntas |
||
315 | //So vai ser criada uma de qualquer maneira e a turma nao é usada neste caso. Apenas depois na imortação de alunos |
||
316 | //para escolher a turma |
||
317 | disciplinasMap.put(getDisciplinaUniqueRef(d,year,logMessages), d); |
||
318 | disciplinasMapSemestre.put(getDisciplinaUniqueRef(d, year, logMessages), d); |
||
319 | //para o caso do serviço ser chamado para varios anos |
||
345 | jmachado | 320 | cursosMap.put(d.getCodigoCurso().intValue()+":"+year, d); |
110 | susana | 321 | } |
165 | jmachado | 322 | } |
163 | jmachado | 323 | |
1312 | jmachado | 324 | private 1.5.0/docs/api/java/lang/String.html">String getDisciplinaUniqueRef(Disciplina d,1.5.0/docs/api/java/lang/String.html">String year,DefaultLogMessages logMessages) |
165 | jmachado | 325 | { |
1312 | jmachado | 326 | boolean turmasSeparatedPolicy = loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this); |
327 | if(turmasSeparatedPolicy) |
||
328 | return d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + d.getCdDuracao() + ":" + d.getCdTurma(); |
||
329 | else |
||
330 | return d.getCodigo().intValue() + ":" + d.getCodigoCurso() + ":" + d.getCdDuracao(); |
||
1115 | jmachado | 331 | } |
332 | |||
1141 | jmachado | 333 | public static final int SIGES_CODIGO_TIPO_DISCIPLINA_EXTRA_CURRICULAR = ConfigProperties.getIntProperty("siges.codigo.tipo.disciplina.extra.curricular"); |
1312 | jmachado | 334 | private void updateCourseUnits(HashMap<String, Disciplina> disciplinasMapS, 1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages, 1.5.0/docs/api/java/lang/String.html">String year,int institutionCode, DisciplinaDao service,1.5.0/docs/api/java/sql/Connection.html">Connection conn) |
1115 | jmachado | 335 | { |
165 | jmachado | 336 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO)); |
1115 | jmachado | 337 | |
1141 | jmachado | 338 | |
165 | jmachado | 339 | logger.info("updating " + semestre + " course units"); |
995 | jmachado | 340 | serviceLogInfo("updating " + semestre + " course units"); |
165 | jmachado | 341 | Set<Map.Entry<String, Disciplina>> set = disciplinasMapS.entrySet(); |
163 | jmachado | 342 | for (1.5.0/docs/api/java/util/Map.html">Map.Entry<String, Disciplina> entry : set) |
343 | { |
||
344 | Disciplina d = entry.getValue(); |
||
1141 | jmachado | 345 | //TIPO 6 é uma EXTRA CURRICULAR |
1296 | jmachado | 346 | if(ImportStudentsService.isCursoFicticio(d.getCodigoCurso())) |
1115 | jmachado | 347 | { |
1296 | jmachado | 348 | logMessages.addMessage(new DefaultLogMessage("import.error","Ignorando disciplina com codigo de curso ficticio - codigo: " + d.getCodigoCurso(), " see log for details", LogMessageTypeEnum.WARNING)); |
1115 | jmachado | 349 | logger.warn(logMessages.getLastMessage()); |
350 | serviceLogWarn(logMessages.getLastMessage()); |
||
351 | |||
352 | continue; |
||
353 | } |
||
1277 | jmachado | 354 | //CourseUnit c = null; |
355 | List<CourseUnit> cus = null; |
||
356 | |||
1312 | jmachado | 357 | cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodeUnique("" + d.getCodigo(), "" + d.getCodigoCurso(), semestre, year); |
358 | |||
359 | //NOVO NOVO NOVO |
||
360 | //Politica de separação de turmas em unidades independentes neste curso |
||
361 | boolean separateTurmas = ImportCourseService.loadCourseYearTurmasPolicy(d.getCodigoCurso(),year,logMessages,this); |
||
362 | //NOVO NOVO NOVO |
||
363 | if(separateTurmas) |
||
364 | { |
||
365 | /***logging*****/ |
||
366 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Unidade de curso com turmas separadas encontrada siges: " + d.getCodigo() + " para curso:" + d.getCodigoCurso() + " turma:" + d.getCdTurma())); |
||
367 | logger.info(logMessages.getLastMessage()); |
||
368 | serviceLogInfo(logMessages.getLastMessage()); |
||
369 | /** |
||
370 | * Este metodo aplicado apenas a cursos de turma separada |
||
371 | * vai retirar da lista de cus todas as que não tenham a turma em questão no campo cdTurma |
||
372 | * Caso haja inconsistencias ete metodo informa no LOG e tenta corrigir a situação |
||
373 | * O objectivo do metodo e econtrar a undade da turma em causa que obtemos |
||
374 | * da disciplina |
||
375 | * Relembrar que as disciplinas sao colocadas no mapa segundo o seu tipo |
||
376 | * se forem de turmasSeparada é colocada uma por turma, portanto |
||
377 | * vao vir para aqui as multiplas todas com as varias turmas |
||
378 | * e assim vamos filtrar todas as que vem na lista que nao sao da turma |
||
379 | * em tratamento neste momento, ou dar a turma a uma no caso de |
||
380 | * haver alguma sem turma, se nao houver nenhuma o metodo limpa todas |
||
381 | * e seguidamente vamos ter de a criar |
||
382 | */ |
||
383 | consistirUnidadesEmCursosTurmasSeparadas(semestre, logMessages, d, cus); |
||
384 | }//NOVO NOVO NOVO |
||
385 | |||
386 | |||
387 | |||
388 | |||
1277 | jmachado | 389 | if(cus != null && cus.size() > 1 ) |
750 | jmachado | 390 | { |
1277 | jmachado | 391 | unitsRepeated++; |
1278 | jmachado | 392 | logMessages.addMessage(new DefaultLogMessage("import.warning","Unidade Repetida: (" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year, "see log for details, vai atualizar as duas", LogMessageTypeEnum.WARNING)); |
1115 | jmachado | 393 | logger.fatal(logMessages.getLastMessage()); |
394 | serviceLogWarn(logMessages.getLastMessage()); |
||
750 | jmachado | 395 | } |
1296 | jmachado | 396 | else if(cus != null && cus.size() == 1) |
397 | { |
||
398 | unitsAtualizadas++; |
||
399 | 1.5.0/docs/api/java/lang/String.html">String msg = "Regular unit update: " + "(" + d.getCodigo() + ") curso: " + d.getCodigoCurso() + " " + semestre + " " + year; |
||
400 | logger.info(msg); |
||
401 | serviceLogInfo(msg); |
||
402 | } |
||
1115 | jmachado | 403 | |
1277 | jmachado | 404 | |
405 | if (cus == null || cus.size() == 0) |
||
225 | jmachado | 406 | { |
1277 | jmachado | 407 | CourseUnitImpl c = DomainObjectFactory.createCourseUnitImpl(); |
1312 | jmachado | 408 | if(separateTurmas) |
409 | c.setCdTurma(d.getCdTurma()); |
||
410 | else |
||
411 | c.setCdTurma(""); |
||
726 | jmachado | 412 | DaoFactory.getCourseUnitDaoImpl().save(c); |
1230 | jmachado | 413 | logMessages.addMessage(new DefaultLogMessage("import.error", "New Unit Found: (" + d.getCodigo() + ") " + d.getNome() + " - curso (" + d.getNomeCurso() + ") " + d.getNomeCurso() + " turma(" + d.getCdTurma() + ")", "see log for details", LogMessageTypeEnum.INFO)); |
1115 | jmachado | 414 | logger.info(logMessages.getLastMessage()); |
415 | serviceLogInfo(logMessages.getLastMessage()); |
||
995 | jmachado | 416 | newUnits++; |
1277 | jmachado | 417 | cus = new ArrayList<CourseUnit>(); |
418 | cus.add(c); |
||
225 | jmachado | 419 | } |
1115 | jmachado | 420 | //NOVO |
421 | |||
1277 | jmachado | 422 | for(CourseUnit c: cus) |
423 | { |
||
1312 | jmachado | 424 | |
425 | if(separateTurmas) |
||
426 | c.setCdTurma(d.getCdTurma()); |
||
427 | else |
||
428 | c.setCdTurma(""); |
||
1277 | jmachado | 429 | c.setName(d.getNome()); |
1312 | jmachado | 430 | c.setInstitutionCode("" + institutionCode); |
1277 | jmachado | 431 | c.setCode("" + d.getCodigo().intValue()); |
432 | c.setCourseCode("" + d.getCodigoCurso()); |
||
433 | c.setCourseName("" + d.getNomeCurso()); |
||
434 | c.setSemestre(semestre); |
||
435 | c.setImportYear(year); |
||
436 | Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(c.getCourseCode()); |
||
437 | c.setCourse(course); |
||
1312 | jmachado | 438 | checkOrCreateCourseYear(logMessages, year, c.getCourseCode(), this); |
1313 | jmachado | 439 | //Obter as tipologias de sumarios e aulas e colocar na unidade |
440 | fillTipologias(d, (CourseUnitImpl) c); |
||
441 | } |
||
442 | } |
||
443 | } |
||
1312 | jmachado | 444 | |
1313 | jmachado | 445 | private void fillTipologias(Disciplina d, CourseUnitImpl c) { |
446 | try { |
||
447 | CourseUnitImpl.Tipologias t = ((CourseUnitImpl)c).getTipologiasClass(); |
||
448 | if(t == null) |
||
449 | t = new CourseUnitImpl.Tipologias(); |
||
450 | for(TipologiasSumario.TipologiaSumario tipologiaSumario : d.getTipologiasSumario().getTipologias()) |
||
451 | { |
||
452 | CourseUnitImpl.Tipologia tipoSum = new CourseUnitImpl.Tipologia(); |
||
453 | tipoSum.setOcorrencias(tipologiaSumario.getNumeroOcorrencias()); |
||
454 | tipoSum.setDsTipologia(ConfigProperties.getProperty("netpa.tipo.aula." + tipologiaSumario.getCdTipoAula())); |
||
455 | tipoSum.setCdTurma(tipologiaSumario.getCdTurma()); |
||
456 | tipoSum.setCdDocente("" + tipologiaSumario.getCdDocente()); |
||
457 | tipoSum.setCdTipologia(""+tipologiaSumario.getCdTipoAula()); |
||
458 | t.getTipologiasSumarios().add(tipoSum); |
||
459 | } |
||
460 | for(TipologiasHorario.TipologiaHorario tipologiaHorario : d.getTipologiasHorario().getTipologias()) |
||
461 | { |
||
462 | CourseUnitImpl.Tipologia tipoSum = new CourseUnitImpl.Tipologia(); |
||
463 | 1.5.0/docs/api/java/lang/String.html">String codigoCorrespondenteTipoAula = |
||
464 | ConfigProperties.getProperty("netpa.code.ocup." + tipologiaHorario.getCdTipoOcupacao() + ".tipo.aula"); |
||
465 | if(codigoCorrespondenteTipoAula != null && codigoCorrespondenteTipoAula.length() > 0) |
||
466 | { |
||
467 | tipoSum.setOcorrencias(null); |
||
468 | tipoSum.setDsTipologia(ConfigProperties.getProperty("netpa.tipo.aula." + codigoCorrespondenteTipoAula)); |
||
469 | tipoSum.setCdTipologia("" + codigoCorrespondenteTipoAula); |
||
470 | tipoSum.setCdTurma(tipologiaHorario.getCdTurma()); |
||
471 | tipoSum.setCdDocente("" + tipologiaHorario.getCdDocente()); |
||
472 | t.getTipologiasHorarioReferencia().add(tipoSum); |
||
1312 | jmachado | 473 | } |
1313 | jmachado | 474 | else |
475 | { |
||
476 | 1.5.0/docs/api/java/lang/System.html">System.out.println("Tipologia: cd tipo ocup ignorado:" + tipologiaHorario.getCdTipoOcupacao()); |
||
477 | } |
||
1312 | jmachado | 478 | |
1277 | jmachado | 479 | } |
1313 | jmachado | 480 | c.setTipologiasClass(t); |
481 | } catch (1.5.0/docs/api/java/lang/Exception.html">Exception e) { |
||
482 | logger.error(e, e); |
||
483 | erroGraveAObterTipologias++; |
||
163 | jmachado | 484 | } |
110 | susana | 485 | } |
486 | |||
1312 | jmachado | 487 | private void consistirUnidadesEmCursosTurmasSeparadas(1.5.0/docs/api/java/lang/String.html">String semestre, DefaultLogMessages logMessages, Disciplina d, List<CourseUnit> cus) { |
488 | Iterator<CourseUnit> iterUnits = cus.iterator(); |
||
489 | //Retira todas as unidades com código de turma preenchido e diferente |
||
490 | //sobram apenas cadeiras com o NOSSO código de TURMA ou cadeiras sem codigo de turma NENHUM |
||
491 | while(iterUnits.hasNext()) |
||
492 | { |
||
493 | CourseUnit cu = iterUnits.next(); |
||
494 | if(cu.getCdTurma() != null && cu.getCdTurma().trim().length() > 0 && !cu.getCdTurma().trim().equals(d.getCdTurma().trim())) |
||
495 | { |
||
496 | iterUnits.remove(); |
||
497 | } |
||
498 | } |
||
499 | if(cus.size() == 0) |
||
500 | { |
||
501 | /***logging*****/ |
||
502 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Sem unidade para a turma separada: " + d.getCdTurma())); |
||
503 | logger.info(logMessages.getLastMessage()); |
||
504 | serviceLogInfo(logMessages.getLastMessage()); |
||
505 | //turma ainda nao existe vai ser criada |
||
506 | turmasSeparadasTratadasOk++; |
||
507 | /***logging*****/ |
||
508 | } |
||
509 | else if(cus.size() == 1 && (cus.get(0).getCdTurma() == null || cus.get(0).getCdTurma().trim().length() == 0)) |
||
510 | { |
||
511 | /***logging*****/ |
||
512 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Ja existe unidade mas sem turma vai ser alocada à a turma separada: " + d.getCdTurma())); |
||
513 | logger.info(logMessages.getLastMessage()); |
||
514 | serviceLogInfo(logMessages.getLastMessage()); |
||
515 | //Ja existia nao tinha codigo de turma vamos colocar no lugar do codigo unico |
||
516 | //que so serve para este controlo |
||
517 | turmasSeparadasTratadasOk++; |
||
518 | /****logging*****/ |
||
995 | jmachado | 519 | |
1312 | jmachado | 520 | cus.get(0).setCdTurma(d.getCdTurma()); |
521 | } |
||
522 | else if(cus.size() == 1 && cus.get(0).getCdTurma() != null && cus.get(0).getCdTurma().trim().equals(d.getCdTurma().trim())) |
||
523 | { |
||
524 | /***logging*****/ |
||
525 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.INFO,"Encontrada a unidade para a turma separada: " + d.getCdTurma())); |
||
526 | logger.info(logMessages.getLastMessage()); |
||
527 | serviceLogInfo(logMessages.getLastMessage()); |
||
528 | turmasSeparadasTratadasOk++; |
||
529 | //ok e' a turma certa nao se faz mais nada |
||
530 | } |
||
531 | else if(cus.size() > 1) |
||
532 | { |
||
533 | turmasSeparadasComInconsistencias++; |
||
534 | /*****logging*******/ |
||
535 | logMessages.addMessage(new DefaultLogMessage("import.semestre.updating.course.units." + semestre, LogMessageTypeEnum.ERROR,"Problema grave nas importações de unidades com turmas separadas para o codigo siges " + d.getCodigo() + ", mais que uma unidade sem turma ou com varias turmas iguais com o mesmo codigo siges, vamos tentar corrigir e reportar de seguida")); |
||
536 | logger.error(logMessages.getLastMessage()); |
||
537 | serviceLogError(logMessages.getLastMessage()); |
||
538 | //Isto e' um problema muito grave, nao devera acontecer haver mais que uma unidade |
||
539 | //repetida e ainda por cima com mais que um código de turma igual ou nosso ou a vazio |
||
540 | //vamos remover todos os vazio, se não sobrar nenhum metemos a nossa turma num deles |
||
541 | //se encontrarmos o nosso usamo-lo, se for mais que um usamos um e colocamos as turmas nos outros a vazio |
||
542 | Iterator<CourseUnit> iter = cus.iterator(); |
||
543 | CourseUnit last = null; |
||
544 | while(iter.hasNext()) |
||
545 | { |
||
546 | last = iter.next(); |
||
547 | if(last.getCdTurma()==null || last.getCdTurma().trim().length() == 0) |
||
548 | { |
||
549 | logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"removendo unidade da lista com turma vazia baco id:" + last.getId())); |
||
550 | logger.info(logMessages.getLastMessage()); |
||
551 | serviceLogInfo(logMessages.getLastMessage()); |
||
552 | iter.remove(); |
||
553 | } |
||
554 | } |
||
555 | |||
556 | if(cus.size() > 0) |
||
557 | { |
||
558 | logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"Sobraram unidades com o nosso código de turma:" + d.getCdTurma() + " vamos remover todas excepto a primeira")); |
||
559 | logger.info(logMessages.getLastMessage()); |
||
560 | serviceLogInfo(logMessages.getLastMessage()); |
||
561 | //vamos deixar apenas uma com a nossa turma |
||
562 | while(cus.size() > 1) |
||
563 | { |
||
564 | logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"removendo baco id:" + cus.get(1).getId() + " e colocando a turma a vazio ")); |
||
565 | logger.info(logMessages.getLastMessage()); |
||
566 | serviceLogInfo(logMessages.getLastMessage()); |
||
567 | cus.get(1).setCdTurma(""); |
||
568 | cus.remove(1); |
||
569 | } |
||
570 | } |
||
571 | else if(cus.size() == 0) |
||
572 | { |
||
573 | logMessages.addMessage(new DefaultLogMessage("import.units" + semestre, LogMessageTypeEnum.INFO,"ficamos sem unidades para usar, nenhuma tinha a nossa turma " + d.getCdTurma() + ", vamos usar a ultima com baco id:" + last.getId() + " e colocando a turma a " + d.getCdTurma())); |
||
574 | logger.info(logMessages.getLastMessage()); |
||
575 | serviceLogInfo(logMessages.getLastMessage()); |
||
576 | cus.add(last); |
||
577 | last.setCdTurma(d.getCdTurma()); |
||
578 | } |
||
579 | } |
||
580 | } |
||
581 | |||
582 | /** |
||
583 | * This method finds or create a courseYear for a courseUnit |
||
584 | * @param logMessages |
||
585 | * @param year |
||
586 | * @param c |
||
587 | * @param course |
||
588 | * @return |
||
589 | */ |
||
590 | private static Map<String,Boolean> courseYearServiceCache = new HashMap<String, Boolean>(); |
||
591 | protected static void checkOrCreateCourseYear(DefaultLogMessages logMessages, 1.5.0/docs/api/java/lang/String.html">String year, 1.5.0/docs/api/java/lang/String.html">String code, ServiceJob service) { |
||
592 | if(courseYearServiceCache.get(code + "-" + year) != null) |
||
593 | { |
||
594 | return; |
||
595 | } |
||
596 | List<CourseYear> cYs = DaoFactory.getCourseYearDaoImpl().findCourseYear(code,year); |
||
597 | CourseYear cY; |
||
598 | if(cYs == null || cYs.size() == 0) |
||
599 | { |
||
600 | |||
601 | Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code); |
||
602 | if(course == null) |
||
603 | return; //does not exist yet |
||
604 | /*****logging******/ |
||
605 | logMessages.addMessage(new DefaultLogMessage("import.ok", "Creating new CourseYear course(" + code + ") year" + year + ")", "see log for details", LogMessageTypeEnum.INFO)); |
||
606 | logger.info(logMessages.getLastMessage()); |
||
607 | service.serviceLogInfo(logMessages.getLastMessage()); |
||
608 | /*****logging******/ |
||
609 | if(course.getCourseYears() == null) |
||
610 | course.setCourseYears(new HashSet<CourseYear>()); |
||
611 | cY = DomainObjectFactory.createCourseYearImpl(); |
||
612 | cY.setImportYear(year); |
||
613 | cY.setSeparatedTurmas(false); |
||
614 | DaoFactory.getCourseYearDaoImpl().save(cY); |
||
615 | course.getCourseYears().add(cY); //adiciona só de um lado |
||
616 | } |
||
617 | else if(cYs.size() > 1) |
||
618 | { |
||
619 | /*****logging******/ |
||
620 | logMessages.addMessage(new DefaultLogMessage("import.error", "CourseYear more than one ocurrence course(" + code + ") year" + year + ")", "see log for details", LogMessageTypeEnum.ERROR)); |
||
621 | logger.error(logMessages.getLastMessage()); |
||
622 | service.serviceLogError(logMessages.getLastMessage()); |
||
623 | /*****logging******/ |
||
624 | //Never happen while year are created only here |
||
625 | } |
||
626 | courseYearServiceCache.put(code + "-" + year,true); |
||
627 | } |
||
628 | |||
629 | |||
995 | jmachado | 630 | @1.5.0/docs/api/java/lang/Override.html">Override |
1070 | jmachado | 631 | protected ILogMessages runJobServiceTask() throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable { |
995 | jmachado | 632 | |
1070 | jmachado | 633 | 1.5.0/docs/api/java/lang/String.html">String importYear = getParametersMap().get(JOB_importYear_KEY).getObject(); |
1312 | jmachado | 634 | 1.5.0/docs/api/java/lang/String.html">String institutionCode = getParametersMap().get(JOB_institution_KEY).getObject(); |
635 | ILogMessages messages = run(importYear,1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(institutionCode)); |
||
1070 | jmachado | 636 | return messages; |
995 | jmachado | 637 | |
638 | } |
||
639 | |||
640 | |||
163 | jmachado | 641 | public static void main(1.5.0/docs/api/java/lang/String.html">String[] args) throws ServiceException |
642 | { |
||
1123 | jmachado | 643 | 1.5.0/docs/api/java/lang/String.html">String year = DaoFactory.getConfigurationDaoImpl().getImportsDefaultImportYearCreateTransaction(); |
1312 | jmachado | 644 | int institutionCode = DaoFactory.getConfigurationDaoImpl().getInstitutionCodeCreateTransaction(); |
491 | jmachado | 645 | if(args != null && args.length > 0) |
646 | year = args[0]; |
||
1312 | jmachado | 647 | if(args != null && args.length > 1) |
648 | institutionCode = 1.5.0/docs/api/java/lang/Integer.html">Integer.parseInt(args[1]); |
||
119 | fvelez | 649 | AbstractDao.getCurrentSession().beginTransaction(); |
1312 | jmachado | 650 | new ImportCourseService().run(year,institutionCode); |
1123 | jmachado | 651 | AbstractDao.getCurrentSession().getTransaction().commit(); |
110 | susana | 652 | } |
653 | |||
654 | |||
655 | } |