package fi.otavanopisto.pyramus.json.studentfiles;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOUtils;
import fi.internetix.smvc.controllers.JSONRequestContext;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.base.MagicKeyDAO;
import fi.otavanopisto.pyramus.dao.file.FileTypeDAO;
import fi.otavanopisto.pyramus.dao.file.StudentFileDAO;
import fi.otavanopisto.pyramus.dao.reports.ReportDAO;
import fi.otavanopisto.pyramus.dao.students.StudentDAO;
import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO;
import fi.otavanopisto.pyramus.domainmodel.base.MagicKey;
import fi.otavanopisto.pyramus.domainmodel.file.FileType;
import fi.otavanopisto.pyramus.domainmodel.reports.Report;
import fi.otavanopisto.pyramus.domainmodel.students.Student;
import fi.otavanopisto.pyramus.domainmodel.users.User;
import fi.otavanopisto.pyramus.framework.JSONRequestController;
import fi.otavanopisto.pyramus.framework.UserRole;
/**
* The controller responsible of modifying an existing student group.
*
* @see fi.otavanopisto.pyramus.views.students.EditStudentGroupViewController
*/
public class UploadStudentReportJSONRequestController extends JSONRequestController {
/**
* Processes the request to edit a student group.
*
* @param requestContext
* The JSON request context
*/
public void process(JSONRequestContext requestContext) {
StudentFileDAO studentFileDAO = DAOFactory.getInstance().getStudentFileDAO();
FileTypeDAO fileTypeDAO = DAOFactory.getInstance().getFileTypeDAO();
StudentDAO studentDAO = DAOFactory.getInstance().getStudentDAO();
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
ReportDAO reportDAO = DAOFactory.getInstance().getReportDAO();
Long studentId = requestContext.getLong("studentId");
Long reportId = requestContext.getLong("reportId");
String reportParameters = requestContext.getString("reportParameters");
Long userId = requestContext.getLoggedUserId();
User loggedUser = userDAO.findById(userId);
String name = requestContext.getString("fileName");
Long fileTypeId = requestContext.getLong("fileType");
String contentType;
String format = requestContext.getString("reportFormat");
if ("doc".equals(format)) {
contentType = "application/msword";
} else {
format = "pdf";
contentType = "application/pdf";
}
Student student = studentDAO.findById(studentId);
FileType fileType = fileTypeId != null ? fileTypeDAO.findById(fileTypeId) : null;
Report report = reportDAO.findById(reportId);
MagicKeyDAO magicKeyDAO = DAOFactory.getInstance().getMagicKeyDAO();
String reportsContextPath = System.getProperty("reports.contextPath");
String reportsHost = System.getProperty("reports.host");
String reportsProtocol = System.getProperty("reports.protocol");
String reportsPort = System.getProperty("reports.port");
String outputMethod = "preview"; // output or preview
MagicKey magicKey = magicKeyDAO.findByApplicationScope();
StringBuilder urlBuilder = new StringBuilder()
.append(reportsProtocol)
.append("://")
.append(reportsHost)
.append(":")
.append(reportsPort)
.append(reportsContextPath)
.append("/")
.append(outputMethod)
.append("?magicKey=")
.append(magicKey.getName())
.append("&__report=reports/")
.append(reportId)
.append(".rptdesign");
urlBuilder.append("&__format=").append(format);
urlBuilder.append(reportParameters);
try {
URL url = new URL(urlBuilder.toString());
URLConnection urlConn = url.openConnection();
InputStream inputStream = urlConn.getInputStream();
byte[] data = IOUtils.toByteArray(inputStream);
String reportName = report.getName().toLowerCase().replaceAll("[^a-z0-9\\.]", "_");
studentFileDAO.create(student, name, reportName + "." + format, fileType, contentType, data, loggedUser);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public UserRole[] getAllowedRoles() {
return new UserRole[] { UserRole.MANAGER, UserRole.STUDY_PROGRAMME_LEADER, UserRole.ADMINISTRATOR };
}
}