package de.uhh.l2g.plugins.admin;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.TimeZone;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.portlet.PortletClassLoaderUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.model.ResourcePermission;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.RoleConstants;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.service.ServiceContextFactory;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import de.uhh.l2g.plugins.model.ScheduledThread;
import de.uhh.l2g.plugins.model.Video;
import de.uhh.l2g.plugins.model.Videohitlist;
import de.uhh.l2g.plugins.model.impl.VideohitlistImpl;
import de.uhh.l2g.plugins.service.VideoLocalServiceUtil;
import de.uhh.l2g.plugins.service.VideohitlistLocalServiceUtil;
import de.uhh.l2g.plugins.util.PermissionManager;
import de.uhh.l2g.plugins.util.PortletScheduler;
public class ThreadManagement extends MVCPortlet {
/**Set default permissions (assumes fixed and unique role names)
*
* @param pm - PermissionManager
* @throws PortalException
* @throws SystemException
*/
private void setDefaultPermissions(PermissionManager pm) throws SystemException, PortalException{
//Remove view permission for Guest and edit for ordinary Site Members
pm.removeL2GLayoutViewPermission(RoleConstants.GUEST);
pm.removeL2GLayoutPermissions(RoleConstants.SITE_MEMBER, new String[] { ActionKeys.VIEW, ActionKeys.ADD_DISCUSSION, ActionKeys.CUSTOMIZE });
pm.setL2GLayoutViewPermission(AdminUserManagement.L2G_ADMIN);
}
@Override
public void render(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException {
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), renderRequest);
//Check if default Permissions are Set for this Context (requires L2G Roles)
//Delete Permissions for admin from DB to reset
//LOG.debug("Initialize Permissions");
Role admin = RoleLocalServiceUtil.fetchRole(serviceContext.getCompanyId(), AdminUserManagement.L2G_ADMIN);
if (admin != null){
//Check if Permission is set for L2go Admin Role and Context
PermissionManager pm = new PermissionManager(serviceContext);
ResourcePermission rp = pm.getPermissionforRole(AdminUserManagement.L2G_ADMIN);
if (rp == null) {
setDefaultPermissions(pm);
}
}else {
//This means User Portlet has not been initialized yet (we can't generate default permissions yet)
SessionErrors.add(renderRequest,"no-roles-error");
}
} catch (Exception e) {
throw new PortletException(e);
}
super.render(renderRequest, renderResponse);
}
/**Schedule an unscheduled Job (requires readable config)
*
* @param request
* @param response
*/
public void scheduleJob(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
String schedulerClassName = ParamUtil.getString(request, "schedulerName");
//Make sure to use the appropriate Message Consumer
ClassLoader classLoader = PortletClassLoaderUtil.getClassLoader(serviceContext.getPortletId()); //Where portletID is not null
PortletScheduler scheduler = (PortletScheduler) classLoader.loadClass(schedulerClassName).newInstance();
scheduler.initScheduler(schedulerClassName, serviceContext);
scheduler.schedule();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
System.out.println(e.getClass().getName());
e.printStackTrace();
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
/**Resume a paused job (works with each scheduler in memory)
*
* @param request
* @param response
*/
public void resumeJob(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
String schedulerClassName = ParamUtil.getString(request, "schedulerName");
//Make sure to use the appropriate Message Consumer
ClassLoader classLoader = PortletClassLoaderUtil.getClassLoader(serviceContext.getPortletId()); //Where portletID is not null
PortletScheduler scheduler = (PortletScheduler) classLoader.loadClass(schedulerClassName).newInstance();
scheduler.initScheduler(schedulerClassName, serviceContext);
//System.out.println(scheduler.getPortletId());
scheduler.resume();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
System.out.println(e.getClass().getName());
e.printStackTrace();
response.setRenderParameter("mvcPath",
"/admin/threads.jsp");
}
}
/**Pauses running Job (works with each scheduler in memory)
*
* @param request
* @param response
*/
public void pauseJob(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
String schedulerClassName = ParamUtil.getString(request, "schedulerName");
//Make sure to use the appropriate Message Consumer
ClassLoader classLoader = PortletClassLoaderUtil.getClassLoader(serviceContext.getPortletId()); //Where portletID is not null
PortletScheduler scheduler = (PortletScheduler) classLoader.loadClass(schedulerClassName).newInstance();
scheduler.initScheduler(schedulerClassName, serviceContext);
//System.out.println(scheduler.getPortletId());
scheduler.pause();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
System.out.println(e.getClass().getName());
e.printStackTrace();
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
/**Update Job (updates Trigger (the timing Element) of Job in memory)
* (Does nothing at the moment!)
*
* TODO: dynamic input with DB persitence
*
* @param request
* @param response
*/
public void updateJob(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
String schedulerClassName = ParamUtil.getString(request, "schedulerName");
//Make sure to use the appropriate Message Consumer
ClassLoader classLoader = PortletClassLoaderUtil.getClassLoader(serviceContext.getPortletId()); //Where portletID is not null
PortletScheduler scheduler = (PortletScheduler) classLoader.loadClass(schedulerClassName).newInstance();
scheduler.initScheduler(schedulerClassName, serviceContext);
//System.out.println(scheduler.getPortletId());
scheduler.update();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
System.out.println(e.getClass().getName());
e.printStackTrace();
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
/**Unchedules a Job from memory (deletes SchedulerEntry record)
*
* WARN: currently causes Liferay to duplicate Job on redeploy, if unschedule fails on unregister
* @param request
* @param response
*/
public void unscheduleJob(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
String schedulerClassName = ParamUtil.getString(request, "schedulerName");
//Make sure to use the appropriate Message Consumer
ClassLoader classLoader = PortletClassLoaderUtil.getClassLoader(serviceContext.getPortletId()); //Where portletID is not null
PortletScheduler scheduler = (PortletScheduler) classLoader.loadClass(schedulerClassName).newInstance();
scheduler.initScheduler(schedulerClassName, serviceContext);
System.out.println(scheduler.getPortletId());
scheduler.unschedule();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
System.out.println(e.getClass().getName());
e.printStackTrace();
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
public void removeAllJobs(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
PortletScheduler.removeAllJobs(serviceContext.getPortletId());
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
public void pauseAllJobs(ActionRequest request, ActionResponse response){
try {
ServiceContext serviceContext = ServiceContextFactory.getInstance(
ScheduledThread.class.getName(), request);
PortletScheduler.pauseAllJobs();
} catch (Exception e) {
SessionErrors.add(request, e.getClass().getName());
PortalUtil.copyRequestParameters(request, response);
response.setRenderParameter("mvcPath", "/admin/threads.jsp");
}
}
/**
* Statistics View is initilized in Statistic Management
*
*/
public void init() throws PortletException{
super.init();
}
private static Long HITS=new Long(20);
public void createPopularVideoList() throws SystemException {
List<Video> returnList = new ArrayList<Video>();
//1.get open access videos with more than 20 clicks
returnList = VideoLocalServiceUtil.getByHitsAndOpenAccess(HITS);
//2.truncate table videohitlist
VideohitlistLocalServiceUtil.deleteAll();
//3.fill table with data
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone( TimeZone.getTimeZone("CET") );
long msnow = calendar.getTimeInMillis();
Date d1 = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm");
for(Video v : returnList){
try {
d1 = df.parse(v.getGenerationDate());
long ms1 = d1.getTime();
long hits = v.getHits();
long timeinms = msnow - ms1;
// Durschnittswerte berechnen
//Berechne alter des Videos in...
long days = timeinms / (1000*60*60*24); //...Tagen
long week = timeinms / (1000*60*60*24*7); //...Wochen
long month = timeinms / 2628000000l; //....Monaten
long year = timeinms / (2628000000l*12l); //....Jahren
//Berechne die Hits pro...
long clicksperday = calcHitsPro(days, hits);
long clicksperweek = calcHitsPro(week, hits);
long clickspermonth = calcHitsPro(month, hits);
long clicksperyear = calcHitsPro(year, hits);
Videohitlist vhl = new VideohitlistImpl();
vhl.setVideoId(v.getVideoId());
vhl.setHitsPerDay(clicksperday);
vhl.setHitsPerWeek(clicksperweek);
vhl.setHitsPerMonth(clickspermonth);
vhl.setHitsPerYear(clicksperyear);
//save
VideohitlistLocalServiceUtil.addVideohitlist(vhl);
}catch (ParseException e) {
System.out.println("Simple Date Parsen Error!!");
}
}
}
private long calcHitsPro(long einheit, long hits){
if(einheit>=1)return (long) (hits/einheit); //Hits pro Einheit (tag, woche, monat, jahr...)
else return hits; //else: Das Video ist noch kein volles Jahr vollen Monat etc alt.
}
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws PortletException, IOException {
String resourceID = resourceRequest.getResourceID();
if(resourceID.equals("triggerVideohitlistThread")){
try {
createPopularVideoList();
} catch (SystemException e) {
e.printStackTrace();
}
}
}
}