Subversion Repositories bacoAlunos

Rev

Rev 1776 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 jmachado 1
package pt.estgp.estgweb.services.courses;
2
 
1496 jmachado 3
import com.owlike.genson.Genson;
1776 jmachado 4
 
1496 jmachado 5
import com.owlike.genson.reflect.VisibilityFilter;
1507 jmachado 6
import jomm.dao.impl.AbstractDao;
1670 jmachado 7
import jomm.utils.BytesUtils;
417 jmachado 8
import jomm.utils.FilesUtils;
1496 jmachado 9
import jomm.utils.StreamsUtils;
417 jmachado 10
import org.apache.log4j.Logger;
11
import org.dom4j.Document;
1496 jmachado 12
import org.json.JSONArray;
13
import org.json.JSONException;
14
import org.json.JSONObject;
417 jmachado 15
import pt.estgp.estgweb.Globals;
1496 jmachado 16
import pt.estgp.estgweb.domain.*;
417 jmachado 17
import pt.estgp.estgweb.domain.dao.DaoFactory;
18
import pt.estgp.estgweb.domain.views.CourseView;
19
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
1699 jmachado 20
import pt.estgp.estgweb.filters.exceptions.AccessDeniedException;
1496 jmachado 21
import pt.estgp.estgweb.services.courses.xsd.Curso;
1518 jmachado 22
import pt.estgp.estgweb.services.courses.xsd.SemestreImpl;
1496 jmachado 23
import pt.estgp.estgweb.services.courses.xsd.UnidadeType;
417 jmachado 24
import pt.estgp.estgweb.services.data.IRepositoryFile;
214 jmachado 25
import pt.estgp.estgweb.services.data.RepositoryService;
444 jmachado 26
import pt.estgp.estgweb.services.expceptions.AlreadyExistsException;
995 jmachado 27
import pt.estgp.estgweb.services.expceptions.ServiceException;
1667 jmachado 28
import pt.estgp.estgweb.services.users.UserRoleConfigService;
1496 jmachado 29
import pt.estgp.estgweb.utils.ConfigProperties;
248 jmachado 30
import pt.estgp.estgweb.utils.Dom4jUtil;
1667 jmachado 31
import pt.estgp.estgweb.utils.StringsUtils;
417 jmachado 32
import pt.utl.ist.berserk.logic.serviceManager.IService;
214 jmachado 33
 
1496 jmachado 34
import javax.xml.bind.JAXBContext;
35
import javax.xml.bind.JAXBException;
36
import javax.xml.bind.Marshaller;
37
import javax.xml.bind.Unmarshaller;
1505 jmachado 38
import java.io.*;
1496 jmachado 39
import java.net.URL;
40
import java.util.*;
214 jmachado 41
 
42
/*
43
 * @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
44
 *
45
 *
46
 * Created at 17/Out/2003 , 23:45:24
47
 *
48
 */
49
/**
50
 * @author Jorge Machado
51
 *
52
 *
53
 * Created at 17/Out/2003 , 23:45:24
54
 *
55
 */
56
public class CoursesService implements IService
57
{
58
    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(CoursesService.class);
59
 
60
    RepositoryService repositoryService = new RepositoryService();
61
 
62
 
1505 jmachado 63
    /**
64
     * Servico e subservico para termos acesso as variaveis de controlo
65
     * @param id
66
     * @param initUnits
67
     * @return
68
     * @throws ServiceException
69
     */
70
    public CourseView loadCourse(long id, boolean initUnits)
71
            throws ServiceException
214 jmachado 72
    {
1505 jmachado 73
        return loadCourse(id,initUnits,false);
74
    }
75
    public CourseView loadCourseAndStudiesPlans(long id, boolean initUnits)
76
            throws ServiceException
77
    {
78
        return loadCourse(id,initUnits,true);
79
    }
80
 
81
 
82
    private CourseView loadCourse(long id, boolean initUnits,boolean loadStudiesPlans) throws ServiceException
83
    {
214 jmachado 84
        Course c = DaoFactory.getCourseDaoImpl().get(id);
85
 
86
        if(c != null)
87
        {
1505 jmachado 88
            return getCourseView(initUnits, c,loadStudiesPlans);
214 jmachado 89
        }
90
        return null;
91
    }
92
 
1505 jmachado 93
    /**
94
     * Servico e subservico para termos acesso as variaveis de controlo
95
     * @param code
96
     * @param initUnits
97
     * @return
98
     * @throws ServiceException
99
     */
100
 
101
    public CourseView loadCourseByCode(1.5.0/docs/api/java/lang/String.html">String code, boolean initUnits) throws ServiceException
345 jmachado 102
    {
1505 jmachado 103
        return loadCourseByCode(code,initUnits,false);
345 jmachado 104
    }
1505 jmachado 105
    public CourseView loadCourseByCodeAndStudiesPlans(1.5.0/docs/api/java/lang/String.html">String code, boolean initUnits) throws ServiceException
106
    {
107
        return loadCourseByCode(code,initUnits,true);
108
    }
345 jmachado 109
 
1505 jmachado 110
 
111
    private CourseView loadCourseByCode(1.5.0/docs/api/java/lang/String.html">String code, boolean initUnits,boolean loadStudiesPlans) throws ServiceException
214 jmachado 112
    {
444 jmachado 113
        try{
114
            Course c = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
115
            if(c != null)
214 jmachado 116
            {
1505 jmachado 117
                return getCourseView(initUnits, c, loadStudiesPlans);
214 jmachado 118
            }
119
        }
444 jmachado 120
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
121
        {
122
            logger.error(e + " loading code:" + code,e);
123
            throw new ServiceException("loading code: " + code  + " - " + e.toString(),e);
124
        }
214 jmachado 125
        return null;
126
    }
127
 
1505 jmachado 128
    /**
129
     * Carrega efetivamente o curso nos servicos load e load by code
130
     * @param initUnits
131
     * @param c
132
     * @return
133
     */
134
 
135
    private CourseView getCourseView(boolean initUnits, Course c,boolean loadStudiesPlans) {
136
        CourseView cV = new CourseView(c,initUnits);
137
            /*
138
            * todo Parte antig antigo XML do plano de estudos para remover futuramente*/
139
        if(c.getStudiesPlan() != null)
140
        {
141
            RepositoryFileImpl repositoryFile = repositoryService.loadView(c.getStudiesPlan());
142
            cV.setStudiesPlan(repositoryFile);
143
        }
144
        if(loadStudiesPlans && c.getStudiesPlans() != null && c.getStudiesPlans().size() > 0)
145
        {
146
            for(CourseStudiesPlan sp : c.getStudiesPlans())
147
            {
148
                sp.getVersion();
149
                cV.getCourseStudiesPlans().add(sp);
150
            }
151
        }
152
 
153
        return cV;
154
    }
155
 
156
    public List<String> loadImportYears(UserSession userSession) throws ServiceException
157
    {
158
        List<String> importYears = DaoFactory.getCourseDaoImpl().loadImportYears();
159
        List<String> imStrings = new ArrayList<String>();
160
        for(1.5.0/docs/api/java/lang/String.html">String importYear: importYears)
161
        {
162
            imStrings.add(importYear);
163
        }
164
        return imStrings;
165
    }
166
 
167
 
168
 
214 jmachado 169
    public CourseView submitCourse(CourseView courseView,
170
                                   5+0%2Fdocs%2Fapi+InputStream">InputStream stream,
171
                                   1.5.0/docs/api/java/lang/String.html">String name,
172
                                   int size,
173
                                   1.5.0/docs/api/java/lang/String.html">String contentType,
1776 jmachado 174
                                   UserSession userSession) throws ServiceException, JAXBException, 1.5.0/docs/api/java/io/IOException.html">IOException {
214 jmachado 175
        Course c;
176
        if(courseView.getId() > 0)
444 jmachado 177
        {
214 jmachado 178
            c = DaoFactory.getCourseDaoImpl().get(courseView.getId());
444 jmachado 179
        }
214 jmachado 180
        else
181
        {
444 jmachado 182
            c = DaoFactory.getCourseDaoImpl().findCourseByCodeAndYear(courseView.getCode(),courseView.getImportYear());
183
            if(c != null)
184
                throw new AlreadyExistsException(AlreadyExistsException.ALREADY_EXISTS_COURSE);      
214 jmachado 185
            c = DomainObjectFactory.createCourseImpl();
186
            DaoFactory.getCourseDaoImpl().save(c);
187
        }
188
 
248 jmachado 189
        1.5.0/docs/api/java/lang/String.html">String htmlTrasformationResult = null;
190
 
1505 jmachado 191
        //Stream que pode vir do upload da UIde Admin de Cursos
1496 jmachado 192
        htmlTrasformationResult = uploadStudiesPlan(stream, name, size, contentType, userSession, c,false,null);
193
        courseView.persistViewInObject(c);
194
        CourseView cv = loadCourse(c.getId(),false);
195
        cv.setHtmlResult(htmlTrasformationResult);
196
 
197
        /**
198
         * New## generating course json
199
         */
200
        generateCourseJson(c);
201
 
202
        return cv;
203
    }
204
 
1776 jmachado 205
    private 1.5.0/docs/api/java/lang/String.html">String uploadStudiesPlan(5+0%2Fdocs%2Fapi+InputStream">InputStream stream, 1.5.0/docs/api/java/lang/String.html">String name, int size, 1.5.0/docs/api/java/lang/String.html">String contentType, UserSession userSession, Course c,boolean forceUrlFichas, 1.5.0/docs/api/java/lang/String.html">String systemUrl) throws JAXBException {
1496 jmachado 206
        1.5.0/docs/api/java/lang/String.html">String htmlTrasformationResult = null;
1505 jmachado 207
        //APENAS NO CASO DO AMDIN FAZER UPLOAD DE UM XML
214 jmachado 208
        if(stream != null && size > 0)
209
        {
268 jmachado 210
            1.5.0/docs/api/java/lang/String.html">String extension = FilesUtils.getExtension(name);
211
            if(c.getStudiesPlan() == null)
212
            {
1703 jmachado 213
                1.5.0/docs/api/java/lang/String.html">String identifier = repositoryService.storeRepositoryFile(stream, contentType, extension, size, name, "course.studies.plan " + c.getName(), ResourceAccessControlEnum.publicDomain, null, userSession);
268 jmachado 214
                c.setStudiesPlan(identifier);
215
            }
216
            else
217
            {
218
                repositoryService.updateRepositoryFile(c.getStudiesPlan(), stream, contentType, extension, size, name, "course.studies.plan " + c.getName(), ResourceAccessControlEnum.publicDomain);
219
            }
1496 jmachado 220
            htmlTrasformationResult = generateHtmlCache(userSession, c);
221
            //####New#### Generating XML with JaxB
1505 jmachado 222
            //ISTO SO É CHAMADO NO CASO DE SE FAZER UPLOAD DE UM NOVO PLANO PELO MECANISMO ANTIGO
223
            generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, c, forceUrlFichas, systemUrl);
1496 jmachado 224
        }
225
        return htmlTrasformationResult;
226
    }
227
 
1505 jmachado 228
 
229
 
1776 jmachado 230
    private void generateCourseJson(Course cAux) throws 1.5.0/docs/api/java/io/IOException.html">IOException {
1496 jmachado 231
        CourseImpl c = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(cAux);
232
 
233
        if(c.getValidationRole() != null && c.getValidationRole().trim().length() > 0)
234
        {
235
            List<Teacher> courseComissionProxys = DaoFactory.getUserDaoImpl().loadRoleTeachers(c.getValidationRole());
236
            List<Teacher> courseComission = new ArrayList<Teacher>();
237
            for(Teacher t: courseComissionProxys)
248 jmachado 238
            {
1496 jmachado 239
                courseComission.add(DaoFactory.getTeacherDaoImpl().narrow(t));
248 jmachado 240
            }
1496 jmachado 241
            c.setCourseComission(courseComission);
242
        }
243
        //Getting Coordinator from proxy
244
        Teacher t = c.getCoordinator();
1500 jmachado 245
        if(t != null)
246
            t.getName();
247
        else
248
        {
249
            logger.warn("Course does not have coordinator");
250
        }
1496 jmachado 251
 
252
        1.5.0/docs/api/java/lang/String.html">String jsonCourse = getGensonCourse().serialize(c);
253
        c.setJson(jsonCourse);
254
    }
255
 
256
    private 1.5.0/docs/api/java/lang/String.html">String generateHtmlCache(UserSession userSession, Course c) {
257
        1.5.0/docs/api/java/lang/String.html">String htmlTrasformationResult = null;
258
        5+0%2Fdocs%2Fapi+InputStream">InputStream stream;IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
259
        stream = repositoryFile.getInput();
260
        try
261
        {
262
            5+0%2Fdocs%2Fapi+Document">Document dom = Dom4jUtil.parse(stream);
263
            Map<String,Object> parameters = new HashMap<String,Object>();
264
            parameters.put("COURSE_SIGES_CODE",c.getCode());
265
            1.5.0/docs/api/java/lang/String.html">String html = Dom4jUtil.styleDocument(dom, Globals.TEMPLATE_COURSE_XSL_PATH,parameters);
266
            c.setCacheWebDocument(html);
267
        }
268
        catch (1.5.0/docs/api/java/lang/Exception.html">Exception e)
269
        {
270
            1.5.0/docs/api/java/io/StringWriter.html">StringWriter writer = new 1.5.0/docs/api/java/io/StringWriter.html">StringWriter();
271
            1.5.0/docs/api/java/io/PrintWriter.html">PrintWriter printWriter = new 1.5.0/docs/api/java/io/PrintWriter.html">PrintWriter(writer);
272
            e.printStackTrace(printWriter);
273
            htmlTrasformationResult = "<div class=\"error\"><pre>" + e.toString() + "\n" + printWriter.toString() + "</pre></div>";
274
            printWriter.close();
275
        }
276
        try
277
        {
278
            stream.close();
279
        }
280
        catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
281
        {
282
            logger.error(e,e);
283
        }
284
        return htmlTrasformationResult;
285
    }
286
 
287
    /**
288
     * ##NEW METHOD###
289
     * Gera o XML normalizado para o JAXB a partir do XML importado do XML do plano XML quese usou no upload
290
     * para garantir que está bem formado
291
     * @param userSession
292
     * @param c
293
     * @return
294
     * @throws JAXBException if XML is not weel formed
295
     */
1776 jmachado 296
    private void generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(UserSession userSession, Course c, boolean forceFichaCurricularUrlSet, 1.5.0/docs/api/java/lang/String.html">String systemUrlForUnitPrograms) throws JAXBException
1496 jmachado 297
    {
298
        CourseStudiesPlan courseStudiesPlan;
1500 jmachado 299
        if(c.getStudiesPlan() == null || c.getStudiesPlan().trim().length() == 0)
300
        {
1505 jmachado 301
            //ESTE É O STREAM DO PLANO DE UPLOAD
1500 jmachado 302
            logger.warn("Course does not have studies plan XML file stream to use in update");
303
            return;
304
        }
1496 jmachado 305
 
306
        if(c.getStudiesPlans() == null || c.getStudiesPlans().size() == 0)
307
        {
308
            logger.info("Generating first study plan");
309
            courseStudiesPlan = DomainObjectFactory.createCourseStudiesPlanImpl();
310
            courseStudiesPlan.setVersion(1);
311
            courseStudiesPlan.setVersionDescription("Auto gerado durante a importação de um XML com o plano de estudos a " + new 5+0%2Fdocs%2Fapi+Date">Date().toString());
312
            courseStudiesPlan.setCourse(c);
313
            if(c.getStudiesPlans() == null)
314
                c.setStudiesPlans(new HashSet<CourseStudiesPlan>());
315
            c.getStudiesPlans().add(courseStudiesPlan);
316
            DaoFactory.getCourseStudiesPlanDaoImpl().save(courseStudiesPlan);
317
        }
318
        else
319
        {
320
            courseStudiesPlan = c.getStudiesPlans().iterator().next();
321
            logger.info("Updating Study Plan version " + courseStudiesPlan.getVersion());
322
        }
323
 
324
        5+0%2Fdocs%2Fapi+InputStream">InputStream stream;
325
        IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
1502 jmachado 326
        long lastVersion = repositoryService.loadView(c.getStudiesPlan()).getLastVersion().getId();
1514 jmachado 327
        //stream = repositoryFile.getInput();
1503 jmachado 328
        //TODO TIRAR
329
        //JUST FOR DEBUG
1514 jmachado 330
       /* try {
1503 jmachado 331
            System.out.println(StreamsUtils.readString(stream));
332
            stream.close();
333
        } catch (IOException e) {
334
            e.printStackTrace();
1514 jmachado 335
        }*/
1503 jmachado 336
        repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
337
        stream = repositoryFile.getInput();
1496 jmachado 338
 
339
        try {
340
            JAXBContext jc = JAXBContext.newInstance(Curso.class);
341
            Unmarshaller unmarshaller = jc.createUnmarshaller();
1503 jmachado 342
            //Just in case lets update SigesCode
1496 jmachado 343
            Curso curso = (Curso) unmarshaller.unmarshal(stream);
1503 jmachado 344
            curso.setSiges(c.getCode());
1505 jmachado 345
            curso.setNome(c.getName());
346
            curso.setDep(c.getArea());
1496 jmachado 347
 
1505 jmachado 348
            //##NOVO PARA GERAR LINK SE NAO EXISTIR
349
            generateAutoUrlFichasCurriculares(curso,systemUrlForUnitPrograms,forceFichaCurricularUrlSet);
350
 
1496 jmachado 351
            Marshaller marshaller = jc.createMarshaller();
352
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
353
            1.5.0/docs/api/java/io/StringWriter.html">StringWriter sw = new 1.5.0/docs/api/java/io/StringWriter.html">StringWriter();
354
            marshaller.marshal(curso, sw);
355
            //SETTING XML in COURSE STUDIES PLAN
356
            courseStudiesPlan.setXml(sw.toString());
1505 jmachado 357
 
358
 
359
            1.5.0/docs/api/java/lang/String.html">String json = getGensonPlanoEstudos().serialize(curso);
1496 jmachado 360
            //SETTING JSON in COURSE STUDIES PLAN
361
            courseStudiesPlan.setJson(json);
362
 
363
        } catch (JAXBException e) {
364
            logger.error(e,e);
1502 jmachado 365
            1.5.0/docs/api/java/lang/System.html">System.out.print("check XML for possible errors for repositoryStream:" + c.getStudiesPlan() + " file version: " + lastVersion);
1496 jmachado 366
            throw e;
367
        }
368
        try
369
        {
370
            stream.close();
371
        }
372
        catch (1.5.0/docs/api/java/io/IOException.html">IOException e)
373
        {
374
            logger.error(e,e);
375
        }
376
    }
377
 
1505 jmachado 378
 
1506 jmachado 379
    /**
380
     * Apenas é chamado quando se tenta injectar um programa a partir de um upload que foi feito
381
     * pelo user ou pela sincronização remota
382
     * @param curso
383
     * @param systemUrl
384
     * @param force
385
     */
1496 jmachado 386
    private void generateAutoUrlFichasCurriculares(Curso curso,1.5.0/docs/api/java/lang/String.html">String systemUrl,boolean force)
387
    {
388
        for(Curso.Semestre s :curso.getSemestre())
389
        {
390
            for(Curso.Semestre.Perfil p :s.getPerfil())
248 jmachado 391
            {
1496 jmachado 392
                for(UnidadeType unidadeType : p.getUnidade())
393
                {
394
                    generateAutoUrlUnidade(unidadeType,systemUrl,curso,s,force);
395
                }
248 jmachado 396
            }
1496 jmachado 397
            for(UnidadeType unidadeType : s.getUnidade())
214 jmachado 398
            {
1496 jmachado 399
                generateAutoUrlUnidade(unidadeType,systemUrl,curso,s,force);
214 jmachado 400
            }
401
        }
402
    }
403
 
1496 jmachado 404
    private void generateAutoUrlUnidade(UnidadeType unidadeType,1.5.0/docs/api/java/lang/String.html">String systemUrl,Curso curso,Curso.Semestre semestre,boolean force)
405
    {
406
        if(force || unidadeType.getUrlFichaCurricular() == null || unidadeType.getUrlFichaCurricular().trim().length()==0)
407
        {
408
            logger.info("GENERATING FICHA CURRICULAR URL For " + unidadeType.getNome());
409
            1.5.0/docs/api/java/lang/String.html">String url = systemUrl != null ? systemUrl : "";
1504 jmachado 410
            if(!url.endsWith("/"))
1496 jmachado 411
                url = url + "/";
1504 jmachado 412
 
1505 jmachado 413
            //Nao fornece o ano pois o servico irá assumir o ultimo
1504 jmachado 414
            unidadeType.setUrlFichaCurricular(url + "startLoadCourseUnitProgramSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
415
            unidadeType.setUrlUnidadeCurricular(url + "startLoadCourseUnitSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
1496 jmachado 416
        }
417
    }
418
 
419
 
1505 jmachado 420
    private static Genson getGensonPlanoEstudos(){
1496 jmachado 421
        Genson genson = new Genson.Builder()
422
                .exclude("class")
1507 jmachado 423
                .exclude("siges", Curso.class)
424
                .exclude("nome",Curso.class)
1534 jmachado 425
                .exclude("codigoPlanoSiges",Curso.class)
426
                .exclude("anoPlanoSiges",Curso.class)
427
                .exclude("descPlanoSiges",Curso.class)
1505 jmachado 428
                .exclude("dep")
1507 jmachado 429
                .exclude("removed",UnidadeType.class)
1517 jmachado 430
                .exclude("perfilId",Curso.Semestre.Perfil.class)
431
                .exclude("semestreId",Curso.Semestre.class)
1496 jmachado 432
                .create();
433
        return genson;
434
    }
435
 
436
 
437
 
438
    private static Genson getGensonCourse(){
439
        Genson genson = new Genson.Builder()
440
                .exclude(5+0%2Fdocs%2Fapi+Object">Object.class)
1776 jmachado 441
                .useFields(false)
442
                .useMethods(true)
1496 jmachado 443
                .setMethodFilter(VisibilityFilter.PACKAGE_PUBLIC)
444
                .exclude("admin")
445
                .exclude("autoBlock")
446
                .exclude("autoBlockMode")
447
                .exclude("manualBlock")
448
                .exclude("newUser")
449
                .exclude("student")
450
                .exclude("superuser")
451
                .exclude("superuserOrAdmin")
452
                .exclude("teacher")
453
                .exclude("unitCheck")
454
                .exclude("id")
455
 
456
/*              .exclude(Course.class)
457
                .exclude(CourseImpl.class)
458
                .exclude(GenericUser.class)
459
                .exclude(User.class)
460
                .exclude(UserImpl.class)
461
                .exclude(Teacher.class)
462
                .exclude(TeacherImpl.class)
463
                .exclude(SigesUser.class)
464
                .exclude(SigesUserImpl.class)
465
                .exclude(GenericUser.class)
466
                .exclude(GenericUserImpl.class)
467
*/
468
                .exclude("id", Course.class)
1505 jmachado 469
                .exclude("status", Course.class)
1521 jmachado 470
                .exclude("showStudiesPlan", Course.class)
1496 jmachado 471
                .include("degreeForJsonApi", CourseImpl.class)
1543 jmachado 472
                .include("degreeForJsonApiEn", CourseImpl.class)
473
                .include("degreeForJsonApiEs", CourseImpl.class)
474
                .include("degreeForJsonApiFr", CourseImpl.class)
1496 jmachado 475
                .include("schoolForJsonApi", CourseImpl.class)
476
                .include("statusForJsonApi", CourseImpl.class)
477
 
478
                .include("name", Course.class)
1505 jmachado 479
                .include("nameEn", Course.class)
480
                .include("nameEs", Course.class)
481
                .include("nameFr", Course.class)
482
                .include("department", Course.class)
483
                .exclude("active", CourseDepartment.class)
484
                .include("sigla", CourseDepartment.class)
485
                .include("name", CourseDepartment.class)
486
                .include("nameEn", CourseDepartment.class)
487
                .include("nameEs", CourseDepartment.class)
488
                .include("nameFr", CourseDepartment.class)
1496 jmachado 489
                .include("code", Course.class)
1500 jmachado 490
                .include("validationRole", Course.class)
491
 
1496 jmachado 492
                .include("courseComission", CourseImpl.class)
493
 
494
                .include("name", GenericUser.class)
495
                .include("email", GenericUser.class)
496
                .include("sigesCode", SigesUser.class)
497
                .include("coordinator", Course.class)
498
                .create();
499
 
500
        return genson;
501
    }
502
 
503
 
504
 
214 jmachado 505
    public List<CourseView> loadCourses() throws ServiceException
506
    {
507
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllOrderByName();
508
        List<CourseView> courseViews = new ArrayList<CourseView>();
509
        for(Course c: courses)
510
        {
511
            CourseView courseView = new CourseView(c);
512
            courseViews.add(courseView);
513
        }
514
        return courseViews;
515
    }
516
 
376 jmachado 517
    public List<CourseView> loadCoursesImportYearArea(1.5.0/docs/api/java/lang/String.html">String importYear, 1.5.0/docs/api/java/lang/String.html">String area) throws ServiceException
518
    {
1312 jmachado 519
        return loadCoursesImportYearAreaInstitution(importYear, area,null);
520
    }
521
 
522
    public List<CourseView> loadCoursesImportYearAreaInstitution(1.5.0/docs/api/java/lang/String.html">String importYear, 1.5.0/docs/api/java/lang/String.html">String area,1.5.0/docs/api/java/lang/String.html">String institutionCode) throws ServiceException
523
    {
524
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllOrderByName(importYear,area,null,institutionCode);
376 jmachado 525
        List<CourseView> courseViews = new ArrayList<CourseView>();
526
        for(Course c: courses)
527
        {
528
            CourseView courseView = new CourseView(c);
529
            courseViews.add(courseView);
530
        }
531
        return courseViews;
532
    }
533
 
249 jmachado 534
    public List<CourseView> loadCoursesImportYear() throws ServiceException
535
    {
995 jmachado 536
        1.5.0/docs/api/java/lang/String.html">String importYearIntranet = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear();
249 jmachado 537
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllOrderByName(importYearIntranet);
538
        List<CourseView> courseViews = new ArrayList<CourseView>();
539
        for(Course c: courses)
540
        {
541
            CourseView courseView = new CourseView(c);
542
            courseViews.add(courseView);
543
        }
544
        return courseViews;
545
    }
417 jmachado 546
    public List<CourseView> loadCoursesImportYearByType(1.5.0/docs/api/java/lang/String.html">String type) throws ServiceException
547
    {
995 jmachado 548
        1.5.0/docs/api/java/lang/String.html">String importYearIntranet = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear();
695 jmachado 549
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllOrderByNameEvenWithoutCourseUnit(importYearIntranet,null,type);
417 jmachado 550
        List<CourseView> courseViews = new ArrayList<CourseView>();
551
        for(Course c: courses)
552
        {
553
            CourseView courseView = new CourseView(c);
554
            courseViews.add(courseView);
555
        }
556
        return courseViews;
557
    }
214 jmachado 558
 
790 jmachado 559
    public List<CourseView> loadActiveCoursesByType(1.5.0/docs/api/java/lang/String.html">String type) throws ServiceException
560
    {
995 jmachado 561
        1.5.0/docs/api/java/lang/String.html">String importYearIntranet = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear();
790 jmachado 562
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllActiveOrderByNameEvenWithoutCourseUnit(importYearIntranet,null,type);
563
        List<CourseView> courseViews = new ArrayList<CourseView>();
564
        for(Course c: courses)
565
        {
566
            CourseView courseView = new CourseView(c);
567
            courseViews.add(courseView);
568
        }
569
        return courseViews;
570
    }
249 jmachado 571
 
1500 jmachado 572
 
573
 
574
    /** JSON API **/
575
    /**
576
     * @SERVICE@
577
     *
578
     * @param school
579
     * @param type
580
     * @return
581
     * @throws JSONException
582
     */
1496 jmachado 583
    public JSONObject getActiveCoursesForJsonApi(1.5.0/docs/api/java/lang/String.html">String school,1.5.0/docs/api/java/lang/String.html">String type) throws JSONException {
584
        1.5.0/docs/api/java/lang/String.html">String institutionalCode = null;
585
        1.5.0/docs/api/java/lang/String.html">String degree = null;
586
        if(school != null && school.length() > 0)
587
            institutionalCode = ConfigProperties.getProperty("institution.code.prefix.inverse." + school);
249 jmachado 588
 
1496 jmachado 589
        if(type != null && type.length() > 0)
590
            degree = ConfigProperties.getProperty("course.inverse." + type);
790 jmachado 591
 
1521 jmachado 592
        List<Course> courses = DaoFactory.getCourseDaoImpl().findAllShowStudiesPlanCoursesOrderByNameEvenWithoutCourseUnit(institutionalCode, degree);
1496 jmachado 593
        JSONObject coursesResponse = new JSONObject();
594
 
595
        JSONArray coursesArray = new JSONArray();
596
        for(Course cAux: courses)
597
        {
598
            CourseImpl c = (CourseImpl) DaoFactory.getCourseDaoImpl().narrow(cAux);
599
            JSONObject courseJson = new JSONObject();
600
            courseJson.put("name",c.getName());
601
            courseJson.put("code",c.getCode());
602
            courseJson.put("schoolForJsonApi",c.getSchoolForJsonApi());
603
            courseJson.put("degreeForJsonApi",c.getDegreeForJsonApi());
1543 jmachado 604
            courseJson.put("degreeForJsonApiEn",c.getDegreeForJsonApiEn());
605
            courseJson.put("degreeForJsonApiEs",c.getDegreeForJsonApiEs());
606
            courseJson.put("degreeForJsonApiFr",c.getDegreeForJsonApiFr());
1496 jmachado 607
            courseJson.put("statusForJsonApi",c.getStatusForJsonApi());
608
            courseJson.put("getDetailedInfoUrl","/wsjson/api?service=getCourse&code=" + c.getCode());
609
            coursesArray.put(courseJson);
610
 
611
        }
612
        coursesResponse.put("status","ok");
613
        coursesResponse.put("courses",coursesArray);
614
 
615
        return coursesResponse;
616
    }
617
 
1500 jmachado 618
    /**
619
     *
1505 jmachado 620
     * * Serviço invocado para obter o JSON de um curso
621
     * O JSON tem dois campos o courseInfo e o plano de estudos colocados separadamente
1500 jmachado 622
     *
1505 jmachado 623
     * Atenção o plano de estudos usado é o ultimo considerando o seu ID
624
     *  Nota: O plano de Estudos é uma classe persistente que tem apenas versão e descrição
625
     *  deverá ter como campo o XML e o JSON já gerados do plano de estudos que comporta
626
     *
1500 jmachado 627
     * @param code
628
     * @return
629
     * @throws JSONException
630
     * @throws IOException
631
     * @throws JAXBException
632
     */
1776 jmachado 633
    public JSONObject getCourseDetailForJsonApi(1.5.0/docs/api/java/lang/String.html">String code) throws JSONException, 1.5.0/docs/api/java/io/IOException.html">IOException, JAXBException {
1496 jmachado 634
 
635
        Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
636
 
637
 
638
        JSONObject coursesResponse = new JSONObject();
639
 
1740 jmachado 640
        generateCourseJson(course);
1498 jmachado 641
 
1779 jmachado 642
        //if(course.toJson() == null)
1740 jmachado 643
        //{
644
        //    logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will generate");
645
        //    new CoursesService().generateCourseJson(course);
646
        //}
647
 
1496 jmachado 648
        if(course.getJson() != null)
649
        {
650
            JSONObject courseObj = new JSONObject(course.getJson());
651
            coursesResponse.put("courseInfo",courseObj);
1505 jmachado 652
            //Este caso apenas se dá se o plano nunca tiver sido editado ou sincronizado
653
            //Nesse caso o sistema irá tentar obtê-lo da stream do repositorio
1500 jmachado 654
            if(course.getStudiesPlans() == null || course.getStudiesPlans().size() == 0)
1498 jmachado 655
            {
1505 jmachado 656
                logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will try generate from studies plan OLD Stream");
1498 jmachado 657
                UserSession userSession = DomainObjectFactory.createUserSessionImpl();
658
                userSession.setUser(DaoFactory.getUserDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(1)));
1505 jmachado 659
                new CoursesService().generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, course, false, null);
1498 jmachado 660
            }
661
 
1505 jmachado 662
            if(course.getStudiesPlans() != null )
1496 jmachado 663
            {
664
                CourseStudiesPlan studiesPlan = course.getStudiesPlans().iterator().next();
1505 jmachado 665
                JSONObject studiesPlanObj;
666
                if(studiesPlan.getJson() != null)
667
                {
668
                    studiesPlanObj = new JSONObject(studiesPlan.getJson());
669
                    studiesPlanObj.put("version",studiesPlan.getVersion());
670
                    coursesResponse.put("courseStudiesPlan",studiesPlanObj);
671
                }
672
                else
673
                {
674
                    studiesPlanObj = new JSONObject();
675
                    studiesPlanObj.put("fault","Zero contents for this version");
676
                    studiesPlanObj.put("version",studiesPlan.getVersion());
677
                    coursesResponse.put("courseStudiesPlan",studiesPlanObj);
678
                }
1496 jmachado 679
                coursesResponse.put("courseStudiesPlan",studiesPlanObj);
1505 jmachado 680
 
1496 jmachado 681
            }
682
            else
683
            {
684
                coursesResponse.put("status","JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE");
685
            }
686
        }
687
        else
688
        {
1505 jmachado 689
            coursesResponse.put("status","JSON NOT EXIST FOR COURSE, PLEASE OPEN AND SAVE COURSE IN ADMINISTRATION");
1496 jmachado 690
        }
691
        return coursesResponse;
692
    }
693
 
1500 jmachado 694
    /**
695
     * @SERVICE@
696
     *
697
     * @param code
698
     * @return
699
     * @throws JSONException
700
     */
1502 jmachado 701
    public 1.5.0/docs/api/java/lang/String.html">String getCourseStudiesPlanXml(1.5.0/docs/api/java/lang/String.html">String code,1.5.0/docs/api/java/lang/String.html">String renew) throws JSONException {
1496 jmachado 702
 
703
        Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
1501 jmachado 704
 
1502 jmachado 705
        if(renew != null || course.getStudiesPlans() == null || course.getStudiesPlans().size() == 0)
1501 jmachado 706
        {
707
            logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will generate");
708
            UserSession userSession = DomainObjectFactory.createUserSessionImpl();
709
            userSession.setUser(DaoFactory.getUserDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(1)));
710
            try {
1505 jmachado 711
                generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, course, false, null);
1501 jmachado 712
            } catch (JAXBException e) {
713
                logger.error(e,e);
714
                return "<error>" + e.toString() + ". see log for details</error>";
715
            }
716
        }
717
 
1496 jmachado 718
        if(course.getStudiesPlans() != null && course.getStudiesPlans().size() > 0)
719
        {
720
            return course.getStudiesPlans().iterator().next().getXml();
721
        }
722
        return "<error>Does not exixt</error>";
723
 
724
    }
725
 
726
 
1500 jmachado 727
    /**
728
     * @SERVICE@
729
     *
730
     * @param systemUrl
731
     * @param setActive
732
     * @return
733
     * @throws IOException
734
     * @throws JSONException
735
     * @throws JAXBException
736
     */
1496 jmachado 737
 
1776 jmachado 738
    public 1.5.0/docs/api/java/lang/String.html">String sincronizeCoursesStudiesPlans(1.5.0/docs/api/java/lang/String.html">String systemUrl,boolean setActive,UserSession sess) throws 1.5.0/docs/api/java/io/IOException.html">IOException, JSONException, JAXBException {
1496 jmachado 739
 
1497 jmachado 740
        1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder log = new 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder();
741
        1.5.0/docs/api/java/net/URL.html">URL url = new 1.5.0/docs/api/java/net/URL.html">URL(systemUrl + "/wsjson/api?service=listCourses");
1496 jmachado 742
        5+0%2Fdocs%2Fapi+InputStream">InputStream is = url.openStream();
743
        1.5.0/docs/api/java/lang/String.html">String str = StreamsUtils.readString(is);
744
        JSONObject obj = new JSONObject(str);
745
        JSONArray courses = obj.getJSONArray("courses");
746
        for(int i = 0; i < courses.length();i++)
747
        {
1502 jmachado 748
            1.5.0/docs/api/java/lang/String.html">String code = "";
749
            try{
750
                JSONObject course = courses.getJSONObject(i);
751
                code = course.getString("code");
752
                Course c = DaoFactory.getCourseDaoImpl().findCourseByCode(code);
753
                if(c == null)
754
                {
755
                    1.5.0/docs/api/java/lang/String.html">String msg = "SKIPING - Course " + code + " " + course.getString("name") + " does not exist in this system";
756
                    log.append("<info>" + msg+"</info>");
757
                    logger.info(msg);
758
                }
759
                else
760
                {
761
                    1.5.0/docs/api/java/lang/String.html">String msg = "UPDATING - Course " + code + " " + course.getString("name") + " exist in this system";
762
                    log.append("<info>" + msg+"</info>");
763
                    logger.info(msg);
1500 jmachado 764
 
1505 jmachado 765
                    //#############UPDATING Course Comission Members
1516 jmachado 766
                    updateCourseComissionMembersAndCourseInfo(systemUrl, code, c);
1505 jmachado 767
 
1502 jmachado 768
                    //#############UPDATING STUDIES PLAN
769
                    updateStudiesPlanFromRemoteSystem(systemUrl, setActive, log, course, code, c);
1500 jmachado 770
 
1505 jmachado 771
 
1502 jmachado 772
                }
1500 jmachado 773
            }
1502 jmachado 774
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
775
            {
776
                logger.error("UPDATE COURSE: " + i + " code: " + code + " FAILED");
777
                logger.error(e,e);
778
            }
1500 jmachado 779
        }
780
        return log.toString();
781
 
782
    }
783
 
1776 jmachado 784
    private void updateStudiesPlanFromRemoteSystem(1.5.0/docs/api/java/lang/String.html">String systemUrl, boolean setActive, 1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder log, JSONObject course, 1.5.0/docs/api/java/lang/String.html">String code, Course c) throws 1.5.0/docs/api/java/io/IOException.html">IOException, JSONException, JAXBException {
1505 jmachado 785
        1.5.0/docs/api/java/lang/String.html">String msg;
786
        5+0%2Fdocs%2Fapi+InputStream">InputStream stream = new 1.5.0/docs/api/java/net/URL.html">URL(systemUrl + "/wsjson/api?service=getStudiesPlanXml&code=" + code + "&renew=true").openStream();
787
        1.5.0/docs/api/java/lang/String.html">String studiesPlan = StreamsUtils.readString(stream);
788
        int len = studiesPlan.length();
789
        if(studiesPlan == null || studiesPlan.trim().length() == 0 || studiesPlan.contains("<error>"))
790
        {
791
            msg = "Course " + code + " " + course.getString("name") + " dont has studies plan";
792
            log.append("<warn>" + msg+"</warn>");
793
            logger.warn(msg);
794
        }
795
        else
796
        {
797
            msg = "Found studies plan for "  + code + " " + course.getString("name") + " will update ";
798
            log.append("<info>" + msg+"</info>");
799
            logger.info(msg);
800
            if(setActive)
801
            {
802
                msg = "Setting course to active";
803
                log.append("<info>" + msg+"</info>");
804
                logger.info(msg);
805
                c.setStatus(true);
806
            }
807
            //System.out.println(studiesPlan);
808
            msg = "GENERATING COURSE JSON ....";
809
            log.append("<info>" + msg+"</info>");
810
            logger.info(msg);
811
            new CoursesService().generateCourseJson(c);
812
 
813
            msg="GENERATING COURSE STUDIES PLAN JSON ....";
814
            log.append("<info>" + msg+"</info>");
815
            logger.info(msg);
816
            stream.close();
817
            stream = new 1.5.0/docs/api/java/net/URL.html">URL(systemUrl + "/wsjson/api?service=getStudiesPlanXml&code=" + code).openStream();
818
            UserSession userSession = DomainObjectFactory.createUserSessionImpl();
819
            userSession.setUser(DaoFactory.getUserDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(1)));
820
            new CoursesService().uploadStudiesPlan(stream, "curso_" + code + ".xml", len,"appication/xml", userSession,c,true,systemUrl);
821
        }
822
    }
823
 
824
 
1500 jmachado 825
    /**
826
     * Update courseComission Members
827
     * @param systemUrl
828
     * @param code
829
     * @param c
830
     * @throws IOException
831
     * @throws JSONException
832
     */
1516 jmachado 833
    private void updateCourseComissionMembersAndCourseInfo(1.5.0/docs/api/java/lang/String.html">String systemUrl, 1.5.0/docs/api/java/lang/String.html">String code, Course c) throws 1.5.0/docs/api/java/io/IOException.html">IOException, JSONException
834
    {
835
 
1500 jmachado 836
        1.5.0/docs/api/java/net/URL.html">URL urlCourseDetails = new 1.5.0/docs/api/java/net/URL.html">URL(systemUrl + "/wsjson/api?service=getCourse&code=" + code);
837
        5+0%2Fdocs%2Fapi+InputStream">InputStream isCourseDetails = urlCourseDetails.openStream();
838
        1.5.0/docs/api/java/lang/String.html">String strCourseDetails = StreamsUtils.readString(isCourseDetails);
839
        JSONObject objCourseDetails = new JSONObject(strCourseDetails);
1516 jmachado 840
 
841
        //DEPARTMENT
842
        JSONObject department = objCourseDetails.getJSONObject("courseInfo").getJSONObject("department");
843
        if(department != null)
844
        {
845
            1.5.0/docs/api/java/lang/String.html">String sigla = department.getString("sigla");
846
            if(sigla != null)
847
            {
848
                CourseDepartment department1 =  DaoFactory.getCourseDepartmentDaoImpl().findBySigla(sigla);
849
                if(department1 != null)
850
                {
851
                    c.setDepartment(department1);
852
                }
853
            }
854
        }
855
 
856
 
1500 jmachado 857
        1.5.0/docs/api/java/lang/String.html">String validationRole = objCourseDetails.getJSONObject("courseInfo").getString("validationRole");
858
 
1516 jmachado 859
 
860
 
861
 
1500 jmachado 862
        if(validationRole == null)
863
        {
864
            logger.info("validationRole is not defined");
865
        }
866
        else
867
        {
868
            logger.info("found validationRole: " + validationRole);
869
            c.setValidationRole(validationRole);
870
 
871
            JSONObject coordinator = objCourseDetails.getJSONObject("courseInfo").getJSONObject("coordinator");
872
            JSONArray courseComission = objCourseDetails.getJSONObject("courseInfo").getJSONArray("courseComission");
873
 
874
            Teacher coordinatorPersistent = findPersonFromCourseDetails(coordinator);
875
            if(coordinatorPersistent == null)
876
            {
877
                logger.warn("Coordinator does not exist in this system ");
878
            }
879
            else
880
            {
881
                c.setCoordinator(coordinatorPersistent);
882
            }
1516 jmachado 883
 
884
            List<User> users = DaoFactory.getUserDaoImpl().loadRoleUsers(validationRole);
885
            logger.info("Encontrados " + users.size() + " docentes com o papel de comissao " + validationRole + " vai remover");
886
            for(User u: users)
887
            {
888
                logger.info("Removendo role a " + u.getName());
889
                u.removeRole(validationRole);
890
            }
891
 
1500 jmachado 892
            for(int j = 0 ; j < courseComission.length(); j++)
893
            {
894
                JSONObject memberComission = courseComission.getJSONObject(j);
895
                Teacher memberPersistent = findPersonFromCourseDetails(memberComission);
896
                if(memberPersistent == null)
1496 jmachado 897
                {
1500 jmachado 898
                    logger.info("Member does not exist in this system ");
1496 jmachado 899
                }
900
                else
901
                {
1500 jmachado 902
                    logger.info("Adding role of course comission member");
903
                    if(!memberPersistent.hasRole(validationRole))
1497 jmachado 904
                    {
1500 jmachado 905
                        memberPersistent.addRole(validationRole);
1497 jmachado 906
                    }
1500 jmachado 907
                }
1496 jmachado 908
            }
909
        }
1500 jmachado 910
    }
1497 jmachado 911
 
1500 jmachado 912
    private Teacher findPersonFromCourseDetails(JSONObject coordinator) {
913
        int code;
914
        try {
915
            if(coordinator.has("sigesCode"))
916
            {
917
                code = coordinator.getInt("sigesCode");
918
            }
919
            else
920
            {
921
                logger.warn("there is no sigesCode for this person " + coordinator.toString());
922
                return null;
923
            }
924
        } catch (JSONException e){
925
            return null;
926
        } catch (1.5.0/docs/api/java/lang/NumberFormatException.html">NumberFormatException e){
927
            return null;
928
        }
929
        return DaoFactory.getTeacherDaoImpl().loadBySigesCode(code);
1496 jmachado 930
    }
931
 
1505 jmachado 932
 
933
 
934
    /*
935
     * Studies Plans Administration Services
936
     *
937
     */
938
    public void addNewStudiesPlan(long courseId,CourseStudiesPlan studiesPlan,UserSession session)
939
    {
940
        Course c = DaoFactory.getCourseDaoImpl().load(courseId);
941
        studiesPlan.setCourse(c);
942
        c.getStudiesPlans().add(studiesPlan);
943
        DaoFactory.getCourseStudiesPlanDaoImpl().save(studiesPlan);
944
    }
945
 
1516 jmachado 946
    public CourseStudiesPlanImpl cloneVersionFrom(long sourcePlanId, long targetPlanId, long courseId, UserSession session)
1505 jmachado 947
    {
948
        Course course = DaoFactory.getCourseDaoImpl().load(courseId);
949
        CourseStudiesPlan source = null;
950
        CourseStudiesPlan target = null;
951
        for(CourseStudiesPlan plan: course.getStudiesPlans())
1500 jmachado 952
        {
1505 jmachado 953
            if(plan.getId() == sourcePlanId)
954
                source = plan;
955
            else if(plan.getId() == targetPlanId)
956
                target = plan;
1500 jmachado 957
        }
1505 jmachado 958
        target.setXml(source.getXml());
959
        target.setJson(source.getJson());
1516 jmachado 960
        return (CourseStudiesPlanImpl) DaoFactory.getCourseStudiesPlanDaoImpl().narrow(target);
1505 jmachado 961
    }
1507 jmachado 962
 
1505 jmachado 963
    public Curso loadCursoPlanoFromXml(1.5.0/docs/api/java/lang/String.html">String xml)
964
    {
965
        try {
966
            if(xml != null)
1500 jmachado 967
            {
1505 jmachado 968
                JAXBContext jc = JAXBContext.newInstance(Curso.class);
969
                Unmarshaller unmarshaller = jc.createUnmarshaller();
970
                Curso curso = (Curso) unmarshaller.unmarshal(new 1.5.0/docs/api/java/io/StringReader.html">StringReader(xml));
971
                return curso;
1500 jmachado 972
            }
1505 jmachado 973
            return null;
974
        } catch (JAXBException e) {
975
            logger.error(e,e);
976
            return null;
977
        }
978
    }
1496 jmachado 979
 
1505 jmachado 980
    /**
981
     * Persist the edited studies plan
982
     * Updates studiesPlanVersion
983
     * Updates studiesPlanVersionDescription
984
     * Updates PlanoEstudos XML and JSON
985
     *
986
     * @param courseId
987
     * @param coursePlanId
988
     * @param planoEditado
989
     * @param courseStudiesPlanEditado
990
     * @return
991
     */
992
    public Course savePlanoEstudosEditado(long courseId, long coursePlanId, Curso planoEditado, CourseStudiesPlan courseStudiesPlanEditado,UserSession session)
993
    {
994
        try {
995
            Course course = DaoFactory.getCourseDaoImpl().load(courseId);
996
 
997
            for(CourseStudiesPlan courseStudiesPlanPersistente: course.getStudiesPlans())
998
            {
999
                if(courseStudiesPlanPersistente.getId() == coursePlanId)
1000
                {
1001
                    courseStudiesPlanPersistente.setVersion(courseStudiesPlanEditado.getVersion());
1002
                    courseStudiesPlanPersistente.setVersionDescription(courseStudiesPlanEditado.getVersionDescription());
1003
 
1507 jmachado 1004
                    //REMOVED UNIDADES TO REMOVE
1005
                    for(Curso.Semestre semestre:planoEditado.getSemestre())
1006
                    {
1007
                        Iterator<UnidadeType> uIter = semestre.getUnidade().iterator();
1008
                        while(uIter.hasNext())
1009
                        {
1010
                            UnidadeType unidade = uIter.next();
1011
                            if(unidade.getRemoved() != null && unidade.getRemoved().equals("true"))
1012
                                uIter.remove();
1013
                        }
1014
                        for(Curso.Semestre.Perfil perfil: semestre.getPerfil())
1015
                        {
1016
                            Iterator<UnidadeType> uIter2 = perfil.getUnidade().iterator();
1017
                            while(uIter2.hasNext())
1018
                            {
1019
                                UnidadeType unidade = uIter2.next();
1020
                                if(unidade.getRemoved() != null && unidade.getRemoved().equals("true"))
1021
                                    uIter2.remove();
1022
                            }
1023
                        }
1024
                    }
1505 jmachado 1025
                    //Garante-se mas depois não vai para o JSON
1026
                    planoEditado.setSiges(course.getCode());//GARANTIR QUE O CODIGO SIGEST ESTA CORRECTO
1027
                    planoEditado.setNome(course.getName());
1028
                    planoEditado.setDep(course.getArea());
1029
                    //planoEditado.setDepDesc("");
1030
                    //planoEditado.setDepDescEn("");
1031
                    //planoEditado.setDepDescEs("");
1032
                    //planoEditado.setDepDescFr("");
1033
                    JAXBContext jc = JAXBContext.newInstance(Curso.class);
1034
                    Marshaller marshaller = jc.createMarshaller();
1035
                    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
1036
                    1.5.0/docs/api/java/io/StringWriter.html">StringWriter xml = new 1.5.0/docs/api/java/io/StringWriter.html">StringWriter();
1037
                    marshaller.marshal(planoEditado,xml);
1038
 
1039
                    courseStudiesPlanPersistente.setXml(xml.toString());
1040
                    1.5.0/docs/api/java/lang/String.html">String json = getGensonPlanoEstudos().serialize(planoEditado);
1041
                    //SETTING JSON in COURSE STUDIES PLAN
1042
                    courseStudiesPlanPersistente.setJson(json);
1043
                    break;
1044
                }
1045
            }
1046
            return course;
1047
        } catch (JAXBException e) {
1048
            logger.error(e,e);
1049
            return null;
1500 jmachado 1050
        }
1051
    }
1496 jmachado 1052
 
1507 jmachado 1053
    public void generateFreshJsonPlanosEstudosFromXml(UserSession session)
1054
    {
1055
        List<CourseStudiesPlan> coursePlans = DaoFactory.getCourseStudiesPlanDaoImpl().findAll();
1056
        for(CourseStudiesPlan courseStudiesPlanPersistente: coursePlans)
1057
        {
1058
            try
1059
            {
1060
                logger.info("Generating JSON for " + courseStudiesPlanPersistente.getCourse().getName() + " version: " + courseStudiesPlanPersistente.getVersion());
1061
                Curso cursoPlano = loadCursoPlanoFromXml(courseStudiesPlanPersistente.getXml());
1518 jmachado 1062
                if(cursoPlano != null)
1063
                {
1064
                    for(Curso.Semestre s : cursoPlano.getSemestre())
1065
                    {
1066
                        SemestreImpl.setDescriptionsDefaults(s);
1067
                    }
1068
                    //send to XML again
1069
                    JAXBContext jc = JAXBContext.newInstance(Curso.class);
1070
                    Marshaller marshaller = jc.createMarshaller();
1071
                    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
1072
                    1.5.0/docs/api/java/io/StringWriter.html">StringWriter xml = new 1.5.0/docs/api/java/io/StringWriter.html">StringWriter();
1073
                    marshaller.marshal(cursoPlano,xml);
1074
                    courseStudiesPlanPersistente.setXml(xml.toString());
1075
                    1.5.0/docs/api/java/lang/String.html">String json = getGensonPlanoEstudos().serialize(cursoPlano);
1076
                    //SETTING JSON in COURSE STUDIES PLAN
1077
                    courseStudiesPlanPersistente.setJson(json);
1078
                }
1079
 
1507 jmachado 1080
            }
1081
            catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
1082
            {
1083
                logger.error(e,e);
1084
            }
1085
        }
1514 jmachado 1086
 
1087
        logger.info("GENERATING JSON FOR CLASS COURSE");
1088
        for(Course course: DaoFactory.getCourseDaoImpl().findAll())
1089
        {
1090
            try {
1091
                logger.info("generating json for course: " + course.getName() + " (" + course.getCode() + ")");
1092
                generateCourseJson(course);
1093
            } catch (1.5.0/docs/api/java/io/IOException.html">IOException e) {
1094
                logger.error(e,e);
1095
            }
1096
        }
1507 jmachado 1097
    }
1500 jmachado 1098
 
1505 jmachado 1099
 
1507 jmachado 1100
 
1505 jmachado 1101
    public List<CourseDepartment> loadDepartments()
1102
    {
1103
        List<CourseDepartment> departments = DaoFactory.getCourseDepartmentDaoImpl().findAll();
1104
        for(CourseDepartment dep: departments)
1105
            dep.getName();
1106
        return departments;
1507 jmachado 1107
 
1505 jmachado 1108
    }
1109
 
1516 jmachado 1110
 
1111
    public Teacher addTeacherCommission(1.5.0/docs/api/java/lang/String.html">String teacherId,1.5.0/docs/api/java/lang/String.html">String courseId, UserSession session)
1112
    {
1113
        Course course = DaoFactory.getCourseDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(courseId));
1114
        Teacher t = DaoFactory.getTeacherDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(teacherId));
1115
        t.addRole(course.getValidationRole());
1116
        return t;
1117
    }
1118
 
1119
    public Teacher removeTeacherCommission(1.5.0/docs/api/java/lang/String.html">String teacherId,1.5.0/docs/api/java/lang/String.html">String courseId, UserSession session)
1120
    {
1121
        Course course = DaoFactory.getCourseDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(courseId));
1122
        Teacher t = DaoFactory.getTeacherDaoImpl().load(new 1.5.0/docs/api/java/lang/Long.html">Long(teacherId));
1123
        t.removeRole(course.getValidationRole());
1124
        return t;
1125
    }
1126
 
1507 jmachado 1127
    public static void main(1.5.0/docs/api/java/lang/String.html">String[] args)
1128
    {
1129
        AbstractDao.getCurrentSession().beginTransaction();
1130
        new CoursesService().generateFreshJsonPlanosEstudosFromXml(null);
1131
        AbstractDao.getCurrentSession().getTransaction().commit();
1132
    }
1505 jmachado 1133
 
1535 jmachado 1134
    public StudiesPlanImporter importStudiesPlanVersionFromFile(5+0%2Fdocs%2Fapi+InputStream">InputStream stream, 1.5.0/docs/api/java/lang/Long.html">Long studiesPlanId, UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1534 jmachado 1135
    {
1136
        StudiesPlanImporter importer = new StudiesPlanImporter();
1137
        importer.parseFile(stream);
1138
        1.5.0/docs/api/java/lang/System.html">System.out.println(importer.getLog());
1535 jmachado 1139
        CourseStudiesPlan plan = DaoFactory.getCourseStudiesPlanDaoImpl().load(studiesPlanId);
1140
        plan.setImportLog(importer.getLog());
1534 jmachado 1141
        return importer;
1142
    }
1541 jmachado 1143
    public StudiesPlanImporter mergeStudiesPlanVersionFromFile(5+0%2Fdocs%2Fapi+InputStream">InputStream stream, 1.5.0/docs/api/java/lang/Long.html">Long studiesPlanId, UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1144
    {
1145
        StudiesPlanImporter importer = new StudiesPlanImporter();
1146
        importer.parseFile(stream);
1147
        1.5.0/docs/api/java/lang/System.html">System.out.println(importer.getLog());
1148
        CourseStudiesPlan plan = DaoFactory.getCourseStudiesPlanDaoImpl().load(studiesPlanId);
1149
        plan.setImportLog(plan.getImportLog() + "\n\n############\n\n##MERGING\n\n" + importer.getLog());
1150
        return importer;
1151
    }
1507 jmachado 1152
 
1700 jmachado 1153
    public UserRoleConfigService.ReplaceRoleResult createRoleCourseComission(long courseId,UserSession userSession) throws AccessDeniedException
1667 jmachado 1154
    {
1155
        Course c = DaoFactory.getCourseDaoImpl().load(courseId);
1699 jmachado 1156
        1.5.0/docs/api/java/lang/String.html">String normalizedName = StringsUtils.getNormalizedNameSafeforCode(c.getName());
1157
        if(normalizedName == null)
1158
            throw new 1.5.0/docs/api/java/lang/RuntimeException.html">RuntimeException("Erro o curso " + c.getId() +" + nao tem nome");
1159
        1.5.0/docs/api/java/lang/String.html">String roleValidation = "courseValidateProgram" + normalizedName;
1160
        UserRoleConfigImpl newUserRoleConfig = DomainObjectFactory.createUserRoleConfigImpl();
1161
        newUserRoleConfig.setRole(roleValidation);
1162
        newUserRoleConfig.setValid(true);
1163
        newUserRoleConfig.setValue("Comissão de Curso de " + c.getName());
1164
        newUserRoleConfig.setValuePt("Comissão de Curso de " + c.getName());
1165
        newUserRoleConfig.setValueEn("");
1166
        newUserRoleConfig.setValueEs("");
1167
        newUserRoleConfig.setValueFr("");
1168
 
1169
        try {
1170
 
1171
            UserRoleConfigService.ReplaceRoleResult result;
1172
            if(c.getValidationRole() == null || c.getValidationRole().trim().length() == 0)
1173
            {
1174
                result = new  UserRoleConfigService().addUpdateRole(newUserRoleConfig,userSession);
1175
            }
1176
            else
1177
            {
1178
                1.5.0/docs/api/java/lang/String.html">String oldValidationRole = c.getValidationRole();
1703 jmachado 1179
                result = new  UserRoleConfigService().updateOldRoleWithView(oldValidationRole, newUserRoleConfig, userSession);
1699 jmachado 1180
            }
1181
 
1182
 
1183
            if(result.roleKeyAlreadyExist)
1184
            {
1185
                logger.error("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
1186
                throw new AccessDeniedException("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
1187
            }
1667 jmachado 1188
            c.setValidationRole(roleValidation);
1700 jmachado 1189
            return result;
1699 jmachado 1190
        } catch (AccessDeniedException e) {
1191
            logger.error("Tentado alterar um Role e não é Administrador nem Super user");
1192
            throw e;
1667 jmachado 1193
        }
1194
    }
1534 jmachado 1195
 
1699 jmachado 1196
 
1197
 
1667 jmachado 1198
    public Teacher changeCoordinator(long teacherId,long courseId,UserSession userSession)
1199
    {
1200
        Course c = DaoFactory.getCourseDaoImpl().load(courseId);
1201
        Teacher t = DaoFactory.getTeacherDaoImpl().load(teacherId);
1202
        c.setCoordinator(t);
1203
        t = DaoFactory.getTeacherDaoImpl().narrow(t);
1204
        return t;
1205
    }
1206
 
1776 jmachado 1207
    public CourseDepartmentImpl updateDepartmentFromJson(1.5.0/docs/api/java/lang/String.html">String json,UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1208
    {
1209
        CourseDepartmentImpl courseDepartment = CourseDepartmentImpl.loadFromJson(json);
1210
        CourseDepartmentImpl courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().load(courseDepartment.getSigla());
1211
        courseDepartmentPersistent.setSigla(courseDepartment.getSigla());
1212
        courseDepartmentPersistent.setActive(courseDepartment.isActive());
1213
        courseDepartmentPersistent.setName(courseDepartment.getName());
1214
        courseDepartmentPersistent.setNameEs(courseDepartment.getNameEs());
1215
        courseDepartmentPersistent.setNameEn(courseDepartment.getNameEs());
1216
        courseDepartmentPersistent.setNameFr(courseDepartment.getNameFr());
1692 jmachado 1217
        //courseDepartmentPersistent.setInstitutionalCode(courseDepartment.getInstitutionalCode());
1670 jmachado 1218
        courseDepartmentPersistent.setBoardRole(courseDepartment.getBoardRole());
1219
        courseDepartmentPersistent.setDirectorRole(courseDepartment.getDirectorRole());
1220
        if(courseDepartment.getCourseSchool() != null && courseDepartment.getCourseSchool().getId() > 0)
1221
        {
1222
            CourseSchoolImpl courseSchool = (CourseSchoolImpl) DaoFactory.getCourseSchoolDaoImpl().load(courseDepartment.getCourseSchool().getId());
1223
            courseDepartmentPersistent.setCourseSchool(courseSchool);
1224
        }
1225
        else
1226
            courseDepartmentPersistent.setCourseSchool(null);
1227
        return courseDepartmentPersistent;
1667 jmachado 1228
 
1670 jmachado 1229
    }
1230
 
1776 jmachado 1231
    public CourseDepartmentImpl removeDepartmentFromJson(1.5.0/docs/api/java/lang/String.html">String json,UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1232
    {
1233
        CourseDepartmentImpl courseDepartment = CourseDepartmentImpl.loadFromJson(json);
1234
        CourseDepartmentImpl courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().load(courseDepartment.getSigla());
1235
        DaoFactory.getCourseDepartmentDaoImpl().delete(courseDepartmentPersistent);
1236
        return courseDepartmentPersistent;
1237
 
1238
    }
1239
 
1776 jmachado 1240
    public CourseDepartmentImpl newDepartmentFromJson(UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1241
    {
1242
        CourseDepartmentImpl courseDepartmentPersistent = DomainObjectFactory.createCourseDepartmentImpl();
1243
 
1244
        courseDepartmentPersistent.setSigla(BytesUtils.generateKey().substring(0,10));
1245
        courseDepartmentPersistent.setActive(false);
1246
        DaoFactory.getCourseDepartmentDaoImpl().save(courseDepartmentPersistent);
1247
        return courseDepartmentPersistent;
1248
 
1249
    }
1250
 
1251
 
1776 jmachado 1252
    public CourseSchoolImpl updateSchoolFromJson(1.5.0/docs/api/java/lang/String.html">String json,UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1253
    {
1254
        CourseSchoolImpl courseSchool = CourseSchoolImpl.loadFromJson(json);
1255
        CourseSchoolImpl courseSchoolPersistent = (CourseSchoolImpl) DaoFactory.getCourseSchoolDaoImpl().load(courseSchool.getId());
1256
 
1257
        courseSchoolPersistent.setActive(courseSchool.isActive());
1258
        courseSchoolPersistent.setName(courseSchool.getName());
1259
        courseSchoolPersistent.setNameEs(courseSchool.getNameEs());
1260
        courseSchoolPersistent.setNameEn(courseSchool.getNameEs());
1261
        courseSchoolPersistent.setNameFr(courseSchool.getNameFr());
1262
        courseSchoolPersistent.setInstitutionalCode(courseSchool.getInstitutionalCode());
1730 jmachado 1263
        courseSchoolPersistent.setInitials(courseSchool.getInitials());
1670 jmachado 1264
 
1265
        courseSchoolPersistent.setSchoolDirectorRole(courseSchool.getSchoolDirectorRole());
1266
        courseSchoolPersistent.setSchoolBoardRole(courseSchool.getSchoolBoardRole());
1267
        courseSchoolPersistent.setSchoolSecretariadoRole(courseSchool.getSchoolSecretariadoRole());
1268
 
1269
        courseSchoolPersistent.setCtcPresidentRole(courseSchool.getCtcPresidentRole());
1270
        courseSchoolPersistent.setCtcMemberRole(courseSchool.getCtcMemberRole());
1271
        courseSchoolPersistent.setCtcSecretariadoRole(courseSchool.getCtcSecretariadoRole());
1272
 
1273
        courseSchoolPersistent.setPedagogicoPresidentRole(courseSchool.getPedagogicoPresidentRole());
1274
        courseSchoolPersistent.setPedagogicoMemberRole(courseSchool.getPedagogicoMemberRole());
1275
        courseSchoolPersistent.setPedagogicoSecretariadoRole(courseSchool.getPedagogicoSecretariadoRole());
1276
 
1728 jmachado 1277
        courseSchoolPersistent.setFuncionarioRole(courseSchool.getFuncionarioRole());
1278
        courseSchoolPersistent.setTeacherRole(courseSchool.getTeacherRole());
1279
        courseSchoolPersistent.setStudentRole(courseSchool.getStudentRole());
1280
 
1670 jmachado 1281
        return courseSchoolPersistent;
1282
 
1283
    }
1284
 
1776 jmachado 1285
    public CourseSchoolImpl newSchoolFromJson(UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1286
    {
1287
        CourseSchoolImpl courseSchoolPersistent = DomainObjectFactory.createCourseSchoolImpl();
1288
 
1289
        courseSchoolPersistent.setActive(false);
1290
        DaoFactory.getCourseSchoolDaoImpl().save(courseSchoolPersistent);
1291
        return courseSchoolPersistent;
1292
 
1293
    }
1294
 
1776 jmachado 1295
    public CourseSchoolImpl removeSchoolFromJson(1.5.0/docs/api/java/lang/String.html">String json,UserSession session) throws 1.5.0/docs/api/java/io/IOException.html">IOException
1670 jmachado 1296
    {
1297
        CourseSchoolImpl courseSchool = CourseSchoolImpl.loadFromJson(json);
1298
        CourseSchoolImpl courseSchoolPersistent = (CourseSchoolImpl) DaoFactory.getCourseSchoolDaoImpl().load(courseSchool.getId());
1299
        DaoFactory.getCourseSchoolDaoImpl().delete(courseSchoolPersistent);
1300
        return courseSchoolPersistent;
1301
 
1302
    }
1303
 
1304
 
214 jmachado 1305
}