Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1967 → Rev 1989

/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java
43,18 → 43,10
private static final Logger logger = Logger.getLogger(CourseReportServices.class);
 
 
 
 
 
 
 
/****************************************************************************/
/* SERVICOS CORE DOS REPORTS
/****************************************************************************/
 
 
 
 
/**
*
* @param courseCode
449,10 → 441,52
}
 
 
/**
* Este servico gera um grafico com a taxa global de aproveitamento e grava-o no repositorio digital
* devolvendo o respectivo RepositoryFile4JsonView em json para poder ser anexado ao objecto imagem do
* widget do grafico
* @param reportDocumentJson
* @param session
* @return
* @throws java.io.IOException
*/
public String generateGlobalLearningResultsChartYearImg(String reportDocumentJson,UserSession session) throws IOException {
 
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
LearningResultsSection learningResultsSection = (LearningResultsSection) reportDocument.findDocumentSection(LearningResultsSection.class);
LearningGlobalAnalysisSection learningGlobalAnalysisSection = (LearningGlobalAnalysisSection) learningResultsSection.findSection(LearningGlobalAnalysisSection.class);
GlobalLearningResultsChartYearImg chartImg = (GlobalLearningResultsChartYearImg) learningGlobalAnalysisSection.findDocComponent(GlobalLearningResultsChartYearImg.class);
 
 
UnitsLearningResultsTable table = (UnitsLearningResultsTable) learningResultsSection.findDocComponent(UnitsLearningResultsTable.class);
 
 
FileUploaded fileUploaded = chartImg.generateChart2tmp(table,reportDocument);
 
RepositoryService repositoryService = new RepositoryService();
 
boolean imageInitialized = chartImg.getImage() != null
&&
chartImg.getImage().getIdentifier() != null;
 
RepositoryFile4JsonView view;
if(imageInitialized)
{
String identifier = chartImg.getImage().getIdentifier();
view = repositoryService.replaceRepositoryFileFromFileUpload(identifier, fileUploaded, ResourceAccessControlEnum.privateDomain, session);
}
else
{
view = repositoryService.storeRepositoryFileFromFileUpload(fileUploaded,ResourceAccessControlEnum.privateDomain,session);
}
chartImg.setImage(view);
//TODO FALTA GUARDAR O JSON NO CURSO
return view.toJson();
}
 
 
 
 
/****************************************************************************/
/*
 
634,18 → 668,80
}
}
 
/** Req2
* Método para guardar um courseReportDocument na base de dados e volta a retornar o mesmo em Json
* @param reportDocumentJson ReportDocument em Json para save
* */
public String saveCourseReportDocument(String reportDocumentJson, UserSession session) throws IOException {
 
//Recebe o Conteudo do reportDocument em Json e deserializa para um objecto do tipo CourseReportDocument
CourseReportDocument courseReportDocument = CourseReportDocument.fromJson(reportDocumentJson);
 
String courseCode = courseReportDocument.getCourseCode();
String courseYear = courseReportDocument.getYear();
 
//Vai à base de dados buscar o curso e as informações relativas a esse curso através do courseCode
//E transforma num object do tipo Course (Class que mapeia a tabela Course)
Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
List<CourseYear> courseYearList = DaoFactory.getCourseYearDaoImpl().findCourseYear(courseCode, courseYear);
 
CourseYear cy;
 
if (courseYearList.isEmpty()){
cy = DomainObjectFactory.createCourseYearImpl();
cy.setCourse(course);
course.getCourseYears().add(cy);
cy.setImportYear(courseYear);
DaoFactory.getCourseYearDaoImpl().save(cy);
}else{
//Vai buscar o primeiro index da lista
cy = courseYearList.get(0);
 
}
 
cy.setCourseReportDocument(reportDocumentJson);
 
return reportDocumentJson;
}
 
/**
* Metodo que dá load ao json da tabela
*/
public String loadCourseReportDocument(String courseCode, String year, UserSession session) throws IOException {
 
List<CourseYear> courseYearList = DaoFactory.getCourseYearDaoImpl().findCourseYear(courseCode, year);
 
CourseYear cy;
//Cria a string para onde se vai fazer load e atribuir
String courseReportJson = null;
 
if (courseYearList.isEmpty()){
cy = null;
}else{
cy = courseYearList.get(0);
}
if (cy != null) {
courseReportJson = cy.getCourseReportDocument();
}
 
if (courseReportJson == null) {
try {
CourseReportDocument courseReport = createNewCourseReportDocument(courseCode, year);
courseReportJson = courseReport.toJson();
saveCourseReportDocument(courseReportJson, session);
} catch (Throwable e) {
System.out.println(e);
e.printStackTrace();
}
}
return courseReportJson;
}
 
 
 
 
 
 
public static void main(String[] args) throws IOException, JSONException {
AbstractDao.getCurrentSession().beginTransaction();
 
661,13 → 757,14
 
 
System.out.println(StreamsUtils.readString(url.openStream()));*/
 
 
}
 
/*
 
public String loadUnitsAndCreateLearningResultsTables4Course(String courseCode, String year) throws IOException, JSONException
{
 
}
*/
//TODO loadUnitsAndCreateLearningResultsTables4Course
/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/GlobalLearningResultsChartYearImg.java
1,10 → 1,121
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components;
 
import pt.estgp.estgweb.utils.documentBuilder.AutoImageWraperComponent;
 
import jomm.utils.BytesUtils;
import jomm.utils.MimeTypeGuesser;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.RingPlot;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.documentBuilder.ImageComponent;
import pt.estgp.estgweb.web.controllers.utils.FileUploaded;
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
 
/**
* Created by jorgemachado on 31/10/17.
*/
public class GlobalLearningResultsChartYearImg extends AutoImageWraperComponent
public class GlobalLearningResultsChartYearImg extends ImageComponent
{
 
/**
*
* @param results
* @return the tmp path for generated chart
* @throws java.io.IOException
*/
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results, CourseReportDocument courseReportDocument) throws IOException
{
//Anos para aparecer no grafico e para serem percorridos no foreach
java.util.List<UnitsLearningResultYear> years = results.getYears();
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultCategoryDataset data = new DefaultCategoryDataset();
 
//Percorre cada ano, o year tem os métodos necessários para obter dados percentuais
for(UnitsLearningResultYear year : years) {
data.addValue(new Double(year.getAprovados1013Percent()), "Aprovados 10-13", year.getAno() + "ºAno");
data.addValue(new Double(year.getAprovados1416Percent()), "Aprovados 14-16", year.getAno() + "ºAno");
data.addValue(new Double(year.getAprovados1720Percent()), "Aprovados 17-20", year.getAno() + "ºAno");
}
//addvalue parametros(valor,fila,coluna)
data.addValue(new Double(results.getAprovados1013Percent()), "Aprovados 10-13","Total");
data.addValue(new Double(results.getAprovados1416Percent()), "Aprovados 14-16","Total");
data.addValue(new Double(results.getAprovados1720Percent()), "Aprovados 17-20","Total");
 
//Cria o grafico com orientação e a data
JFreeChart chart = ChartFactory.createStackedBarChart(null,null, null, data, PlotOrientation.VERTICAL, true, false, false);
 
//Fundo e linhas visiveis
chart.setBackgroundPaint(new Color(255,255,255));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(new Color(255, 255, 255));
plot.setRangeGridlinePaint(Color.GRAY);
plot.setRangeGridlinesVisible(true);
 
 
//Insets do grafico, com o padding
RectangleInsets rectangle = new RectangleInsets(0,0,30F,0);
chart.setPadding(rectangle);
 
//Estilo do texto no grafico
plot.getDomainAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
plot.getRangeAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
 
StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer();
//Cores do grafico
renderer.setSeriesPaint(0, new Color(240, 130, 25));
renderer.setSeriesPaint(1, new Color(255, 218, 0));
renderer.setSeriesPaint(2, new Color(120, 173, 38));
//Grossura das barras
renderer.setMaximumBarWidth(0.1);
 
//O primeiro parametro é {2} por defeito, o 2º formata os valores no chart. Mete-o visivel e formata a letra
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("#.##'%'")));
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(new Font("Helvetica", Font.PLAIN, 25));
 
//Legenda do grafico
LegendTitle legend = chart.getLegend();
legend.setItemFont(new Font("Helvetica", Font.PLAIN, 25));
legend.setFrame(BlockBorder.NONE);
 
 
BufferedImage image = chart.createBufferedImage( 300*4, 200*4);
String pathGraficoTiposAlunos = Globals.TMP_DIR + java.io.File.separator + tempName;
java.io.File output = new java.io.File(pathGraficoTiposAlunos);
ImageIO.write(image, "png", new FileOutputStream(output));
 
FileUploaded fileUploaded = new FileUploaded();
fileUploaded.setTmpName(tempName);
fileUploaded.setTitle("Taxa global de aproveitamento");
fileUploaded.setDescription("Curso: " + courseReportDocument.getCourseName() + " (" + courseReportDocument.getCourseCode()+ ") ano " + courseReportDocument.getYear());
fileUploaded.setContentType(MimeTypeGuesser.getInstance().guessMimeType(output));
fileUploaded.setFileSize(output.length());
fileUploaded.setExtension("png");
return fileUploaded;
}
 
public static void main(String [] args) throws IOException {
 
}
 
 
}
/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/CourseReportDocument.java
27,8 → 27,30
private String courseName;
private String year;
 
private String grau;
 
private String nomeEscola;
 
public String getGrau() {
return grau;
}
 
public void setGrau(String grau) {
this.grau = grau;
}
 
public String getNomeEscola() {
return nomeEscola;
}
 
public void setNomeEscola(String nomeEscola) {
this.nomeEscola = nomeEscola;
}
 
 
 
 
 
public CourseReportDocument()
{
 
63,6 → 85,8
setYear(year);
setCourseCode(c.getCode());
setCourseName(c.getName());
setNomeEscola(c.getDepartment().getCourseSchool().getName());
setGrau(c.getDegree());
 
//1 - Introducao
IntroSection introSection = new IntroSection();
/branches/grupo10/impl/src/java/pt/estgp/estgweb/domain/CourseImpl.java
21,7 → 21,6
*/
public class CourseImpl extends Course
{
 
private static final Logger logger = Logger.getLogger(CourseImpl.class);
 
public Serializable getSerializable()
/branches/grupo10/impl/src/java/pt/estgp/estgweb/filters/filters/IsFromCourseCommissionClass.java
New file
0,0 → 1,61
package pt.estgp.estgweb.filters.filters;
 
import jdk.nashorn.internal.codegen.types.Type;
import pt.estgp.estgweb.domain.CourseImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.LoadControlFilter;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.filters.filters.utils.LoadObjectFromParameters;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.UserImpl;
import pt.estgp.estgweb.utils.Globals;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
import org.apache.log4j.Logger;
 
public class IsFromCourseCommissionClass extends LoadControlFilter
{
private static final Logger logger = Logger.getLogger(IsFromCourseCommissionClass.class);
 
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
 
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
 
//Não tem autenticação então nega o acesso
if(userSession.getUser() == null)
{
logger.info("try access restricted area:" + request.getRequester());
throw new NeedAuthenticationException();
}
 
if(userSession.getUser().isSuperuser())
return;
 
 
 
String courseCode = null;
 
Object req = request.getServiceParameters().getParameter((String) filterParameters.getParameter(0));
 
if (req instanceof String){
courseCode = (String) req;
}else {
logger.info(userSession.getUser().getUsername() + ": Invalid Parameter");
throw new AccessDeniedOperationException("fail.owner");
}
 
 
CourseImpl courseimpl = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
 
if(!courseimpl.isFromCourseCommission(userSession.getUser()))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
}
}
/branches/grupo10/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesServicesController.java
1,8 → 1,15
package pt.estgp.estgweb.web.controllers.courses;
 
 
import jomm.dao.impl.AbstractDao;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.CourseImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.web.controllers.utils.AbstractWidgetAjaxController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
10,6 → 17,7
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
/**
* Created by jorgemachado on 06/01/17.
*/
42,5 → 50,48
return new JSONObject(json);
}
 
public JSONObject generateGlobalLearningResultsChartYearImg(ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseReportDocument = request.getParameter("courseReportDocument");
 
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"CourseReportGenerateGlobalLearningResultsChartYearImg",
new Object[]{courseReportDocument});
return new JSONObject(json);
}
 
 
public JSONObject saveCourseReportDocument(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
String courseReportDocument = request.getParameter("courseReportDocument");
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"SaveCourseReportDocument",
new Object[]{courseReportDocument});
return new JSONObject(json);
}
 
 
 
 
/* Req3 Esta função é chamada no struts e chamada o serviço load através do ServiceManager que é o Berserk
* antes de começar a ser editado */
public ActionForward startEdit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
String courseCode = request.getParameter("courseCode");
String year = request.getParameter("year");
 
IServiceManager sm = ServiceManager.getInstance();
String courseReportJson = (String) sm.execute(
RequestUtils.getRequester(request, response),
"LoadCourseReportDocument",
new Object[]{courseCode, year},
new String[]{"courseCode", "year"});
request.setAttribute("courseReportJson", courseReportJson);
 
 
return mapping.findForward("editCourseReport");
}
 
}