
com.morpheusdata.web.Dispatcher Maven / Gradle / Ivy
package com.morpheusdata.web;
import com.morpheusdata.core.Plugin;
import com.morpheusdata.web.PluginController;
import com.morpheusdata.core.PluginManager;
import com.morpheusdata.model.Permission;
import com.morpheusdata.views.ViewModel;
import java.lang.reflect.Method;
import java.util.*;
/**
* Dispatcher provides a way for a plugin to handle routes from morpheus-ui to a plugin.
* A Plugin may render html or json response back to the client.
*/
public class Dispatcher {
private final PluginManager pluginManager;
public Dispatcher(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}
/**
* Looks up plugin based on path, checks user permissions and responds.
* @param path - Path of url, eg /myPlugin/myAction
* @param usersPermissions - Permissions of the current user
* @return JsonResponse or TemplateResponse
*/
public Object handleRoute(String path, Map usersPermissions ) {
ViewModel model = new ViewModel<>();
return handleRoute(path, model, usersPermissions);
}
/**
* Looks up plugin based on path, checks user permissions and responds per the specified ViewModel
* @param path - Path of url, eg /myPlugin/myAction
* @param model - Model to pass to the controller containing the http request objects
* @param usersPermissions - Permissions of the current user
* @return JsonResponse or TemplateResponse
*/
public Object handleRoute(String path, ViewModel> model, Map usersPermissions) {
for(Plugin p: pluginManager.getPlugins()) {
for(PluginController controller: p.getControllers()) {
for(Route route: controller.getRoutes()) {
if(route.url.equals(path)) {
if(checkPermissions(usersPermissions, route.permissions)) {
return doDispatch(controller, route.method, model);
}
}
}
}
}
return null;
}
/**
* Given a list of a users permissions, checks to see if they have the required permissions.
* @param userPermissions - Permissions of the current user
* @param requiredPermissions - Required permissions, usually defined at the plugin level.
* @return boolean
*/
boolean checkPermissions(Map userPermissions, List requiredPermissions) {
for(Permission p : requiredPermissions) {
if(userPermissions.containsKey(p.getCode())) {
return true;
}
}
return false;
}
/**
* Using reflection, dynamically call the Class and method of a Plugin Controller.
* @param controller Plugin Controller
* @param methodName Name of method to call in Plugin Controller Class
* @param params ViewModel to pass to the controller containing request/response and params.
* @return JsonResponse or TemplateResponse
*/
public Object doDispatch(PluginController controller, String methodName, ViewModel> params) {
try {
Class[] argsList = new Class[]{ViewModel.class};
Method m = controller.getClass().getMethod(methodName, argsList);
return m.invoke(controller, params) ;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy