All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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