Open-MBEE是一个用于支持系统工程师进行并发协作设计的软件平台,它通过集成化的软件应用程序和服务,实现了工程模型和文档的一致性、可追溯性和精确性,从而提高系统工程的效率和质量。本文将对Open-MBEE中部分模块进行分析,以更加了解其功能与逻辑。
core模块
-这个模块包含了其他所有模块所使用的核心配置、常量、接口和对象类。下文将介绍其数据结构,角色与权限实现逻辑与core中各部分功能
核心数据组织概念(Core data organization)
-分级结构
-org(组织) -> project(项目) -> Commits and Branches(分支)
角色与权限
-组 -> 相同权限用户
-在本地,MMS使用基于角色的权限控制,这些角色应用于组织、项目和分支级别,用于用户和组。
-当前的角色包括ADMIN、READER、WRITER等,每个角色都授予一组特定的权限
角色可以根据组织/项目/分支分配给组
-存在一个特殊的组/权限,表示管理员状态的是mmsadmin。认证提供者可以将此添加到用户的权限中,以表示管理员状态, MMS将允许对所有端点的操作
Biulders
-权限的更新与管理
PermissionUpdateResponseBuilder
-提供一个包装器PermissionUpdateWrapper来封装PermissionUpdate(权限信息)对象
-比较两个PermissionUpdateWrapper对象是否相等。并基于permissionUpdate对象的某些字段来计算哈希码,这样当这些字段的值相同时,两个PermissionUpdateWrapper对象将具有相同的哈希码。可便于快速查找
-定义两个HashSet变量(removed、added),跟踪权限添加与移除
remove存储从某个集合或状态中被移除的PermissionUpdateWrapper对象
added存储被添加到某个集合或状态中的PermissionUpdateWrapper对象
使用HashSet确保每个PermissionUpdateWrapper对象在removed和added集合中只会出现一次
-处理权限更新请求,将新的或修改后的权限信息插入
细化针对不同类型的方法
-处理OrgGroupPerm对象集合的权限更新,使用OrgGroupPerm对象的组名而非用户名
-处理项目用户权限(ProjectUserPerm)和项目组权限(ProjectGroupPerm)的插入操作,增加了与项目相关的属性。
-处理与分支相关的权限
-填充了权限更新列表
创建响应对象
初始化更新列表
处理已移除的更新
处理已添加的更新
设置响应的更新列表
-权限更新的插入逻辑
创建包装器
处理添加操作
如果更新操作的动作是ADD,从removed集合中移除包装器对象。如果移除失败(即对象不在removed集合中),则将包装器对象添加到added集合中。
处理移除操作:如果动作不是ADD(可能是REMOVE或其他动作),尝试从added集合中移除包装器对象。如果移除失败,则将包装器对象添加到removed集合中。
PermissionUpdatesResponseBuilder
-实现了一个名为PermissionUpdatesResponseBuilder的构建器类,用于构建PermissionUpdatesResponse对象
-初始化内部状态
-设置和链式调用:通过提供一系列的设置方法(例如setInherit、setPublic、insertUsers、insertGroups等),调用者可以逐步配置构建器对象的内部状态。这些方法返回this,以支持链式调用
-构建最终对象:当所有的设置都完成后,调用者可以调用getPermissionUpdatesReponse方法来获取一个构建好的PermissionUpdatesResponse对象。这个方法会根据当前构建器的状态创建一个新的PermissionUpdatesResponse实例,并返回它。
-提供内部构建器的访问:允许调用者直接操作usersBuilder和groupsBuilder,如果这是符合设计意图的话。
-私有辅助方法,用于合并两个布尔值,便于处理可能为null的布尔值
Config
-配置文件相关信息
Dao
-数据访问对象接口,这些接口用于元数据和JSON的存储。
Delegation
-主要用途:控制和管理用户、组以及它们所拥有的权限,通过权限代理确定授权。权限代理实现可以根据输入执行任何操作以返回true/false
PermissionsDelegate
-检查指定的用户和组是否具有某个特定的权限
-权限的初始化设置
-权限的继承
-权限是否公开
-用户或组权限的更新
-记录重新计算后的权限信息或更新结果
PermissionsDelegateFactory
-使每个项目都有自己的权限设置和委托对象
-使每个组织都有自己的权限管理逻辑和策略,并将这些逻辑和策略封装
-在代码库的不同分支之间管理不同权限
exception
-记录运行时可能的异常,发生这些异常会返回相应的HTTP响应代码。包括:
- Bad Request
- Conflict
- Deleted
- Forbidden
- Internal Error
- MMSE
- Not Found
- Not Modified
- Unauthorized
objects
-存放对象、变量信息
pubsub
-主要用途:包含一个默认的事件服务(EventService),能够发布EventObject(Spring ApplicationEvent的扩展,包含事件类型、项目ID、分支ID和负载)。
其他模块可以使用发布者(publisher)来发布和监听事件(例如,crud在提交、创建分支等时发布事件,而webhooks监听这些事件)
DefaultEvent
-发布应用事件,依赖于Spring的ApplicationEventPublisher来发布事件。当你想要发布某个事件时,只需调用其publish方法,并传入一个EventObject即可。
EmbeddedHookService
-实现了一个简单的钩子(hook)机制。允许在应用程序中的特定点执行额外的逻辑操作
-实现了一个简单的发布-订阅机制,允许将不同的订阅者(EmbeddedHookSubscriber)对象注册到特定类的钩子事件上。
-当某个钩子事件被触发(调用hook方法)时,所有订阅了该事件的订阅者都会被通知并处理该事件
EmbeddedHookSubscriber
-实现一个订阅者(subscriber)的角色,该订阅者可以订阅一种或多种类型的事件,并在这些事件发生时被通知。
Eventconfig
-Spring配置类
security
MethodSecurity
-检查用户是否对某个组织(org)具有特定的权限
-检查用户是否对特定的项目(Project)或项目的分支(Branch)具有特定的权限,其使用了异步编程模型,通过CompletableFuture来实现权限检查和组织/项目/分支存在性的并行检查。
-对组织(Organization)、项目(Project)和分支(Branch)存在性的检查,及处理CompletableFuture对象完成情况。
service
-服务接口,主要的接口有ProjectService、BranchService、NodeService。
-Project和Node服务可以根据项目模式的不同实现来提供不同的行为
-默认的模式实现由crud模块注册
-由模块提供的新模式和服务需要通过注入并添加到ProjectSchemas(位于config下)来注册
(参见crud、cameo等模块作为示例。)
utils
-主要作用:获取用户的组信息
-定义了一个名为AuthenticationUtils的工具类,其中包含两个静态方法用于处理与认证相关的功能。与用户的权限组(或角色)有关。
-接受一个Authentication对象作为参数,并返回一个Set<String>,该集合包含了该认证对象中所有权限的名称。
-检查给定的Authentication对象是否包含指定的权限组(或角色)。