/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"); |
} |
} |