Skip to content
Snippets Groups Projects
Commit 4a28b6b3 authored by Michael Simon's avatar Michael Simon
Browse files

REGAPP-51 service connection sync and ui

parent a4f6ac34
No related branches found
No related tags found
No related merge requests found
/*
* *****************************************************************************
* Copyright (c) 2014 Michael Simon.
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Public License v3.0 which accompanies
* this distribution, and is available at http://www.gnu.org/licenses/gpl.html
*
* Contributors: Michael Simon - initial
* *****************************************************************************
*/
package edu.kit.scc.webreg.service.project;
import edu.kit.scc.webreg.entity.project.AttributeSourceProjectEntity;
import edu.kit.scc.webreg.service.BaseService;
public interface AttributeSourceProjectService extends BaseService<AttributeSourceProjectEntity> {
}
/*
* *****************************************************************************
* Copyright (c) 2014 Michael Simon.
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Public License v3.0 which accompanies
* this distribution, and is available at http://www.gnu.org/licenses/gpl.html
*
* Contributors: Michael Simon - initial
* *****************************************************************************
*/
package edu.kit.scc.webreg.service.project;
import javax.ejb.Stateless;
import javax.inject.Inject;
import edu.kit.scc.webreg.dao.BaseDao;
import edu.kit.scc.webreg.dao.project.AttributeSourceProjectDao;
import edu.kit.scc.webreg.entity.project.AttributeSourceProjectEntity;
import edu.kit.scc.webreg.service.impl.BaseServiceImpl;
@Stateless
public class AttributeSourceProjectServiceImpl extends BaseServiceImpl<AttributeSourceProjectEntity>
implements AttributeSourceProjectService {
private static final long serialVersionUID = 1L;
@Inject
private AttributeSourceProjectDao dao;
@Override
protected BaseDao<AttributeSourceProjectEntity> getDao() {
return dao;
}
}
......@@ -24,14 +24,15 @@ import javax.validation.constraints.NotNull;
import edu.kit.scc.webreg.entity.UserEntity;
import edu.kit.scc.webreg.entity.identity.IdentityEntity;
import edu.kit.scc.webreg.entity.project.AttributeSourceProjectEntity;
import edu.kit.scc.webreg.entity.project.LocalProjectEntity;
import edu.kit.scc.webreg.entity.project.ProjectAdminType;
import edu.kit.scc.webreg.entity.project.ProjectEntity;
import edu.kit.scc.webreg.entity.project.ProjectIdentityAdminEntity;
import edu.kit.scc.webreg.entity.project.ProjectInvitationTokenEntity;
import edu.kit.scc.webreg.exc.NotAuthorizedException;
import edu.kit.scc.webreg.service.UserService;
import edu.kit.scc.webreg.service.identity.IdentityService;
import edu.kit.scc.webreg.service.project.LocalProjectService;
import edu.kit.scc.webreg.service.project.ProjectInvitationTokenService;
import edu.kit.scc.webreg.service.project.ProjectService;
import edu.kit.scc.webreg.session.SessionManager;
......@@ -45,88 +46,88 @@ public class InviteToProjectBean implements Serializable {
@Inject
private SessionManager session;
@Inject
private LocalProjectService service;
@Inject
private ProjectService projectService;
private ProjectService service;
@Inject
private ProjectInvitationTokenService tokenService;
@Inject
private FacesMessageGenerator messageGenerator;
@Inject
private IdentityService identityService;
@Inject
private UserService userService;
private LocalProjectEntity entity;
private ProjectEntity entity;
private List<ProjectInvitationTokenEntity> tokenList;
private Long id;
private List<ProjectIdentityAdminEntity> adminList;
private ProjectIdentityAdminEntity adminIdentity;
private IdentityEntity identity;
@Email
@NotNull
private String rcptMail;
private String rcptName;
private String senderName;
private String senderMail;
private String customMessage;
private Set<String> senderEmailList;
private Set<String> senderNameList;
public void preRenderView(ComponentSystemEvent ev) {
for (ProjectIdentityAdminEntity a : getAdminList()) {
if (a.getIdentity().getId().equals(getIdentity().getId())) {
adminIdentity = a;
break;
}
}
if (adminIdentity == null) {
throw new NotAuthorizedException("Nicht autorisiert");
}
else {
if (! (ProjectAdminType.ADMIN.equals(adminIdentity.getType()) || ProjectAdminType.OWNER.equals(adminIdentity.getType()))) {
} else {
if (!(ProjectAdminType.ADMIN.equals(adminIdentity.getType())
|| ProjectAdminType.OWNER.equals(adminIdentity.getType()))) {
throw new NotAuthorizedException("Nicht autorisiert");
}
}
}
public void sendToken() {
tokenService.sendEmailToken(getEntity(), getIdentity(), rcptMail, rcptName, senderName, customMessage, "idty-" + session.getIdentityId());
messageGenerator.addResolvedInfoMessage("project.invite_project.token_send", "project.invite_project.token_send_detail", true);
tokenService.sendEmailToken(getEntity(), getIdentity(), rcptMail, rcptName, senderName, customMessage,
"idty-" + session.getIdentityId());
messageGenerator.addResolvedInfoMessage("project.invite_project.token_send",
"project.invite_project.token_send_detail", true);
tokenList = null;
}
public void deleteToken(ProjectInvitationTokenEntity token) {
tokenService.delete(token);
messageGenerator.addResolvedInfoMessage("project.invite_project.token_deleted", "project.invite_project.token_deleted_detail", true);
messageGenerator.addResolvedInfoMessage("project.invite_project.token_deleted",
"project.invite_project.token_deleted_detail", true);
tokenList = null;
}
public void resendToken(ProjectInvitationTokenEntity token) {
}
public List<ProjectIdentityAdminEntity> getAdminList() {
if (adminList == null) {
adminList = projectService.findAdminsForProject(getEntity());
adminList = service.findAdminsForProject(getEntity());
}
return adminList;
}
public Long getId() {
return id;
}
......@@ -135,9 +136,13 @@ public class InviteToProjectBean implements Serializable {
this.id = id;
}
public LocalProjectEntity getEntity() {
public ProjectEntity getEntity() {
if (entity == null) {
entity = service.findByIdWithAttrs(id);
if (!(entity instanceof LocalProjectEntity || entity instanceof AttributeSourceProjectEntity)) {
throw new NotAuthorizedException("Nicht autorisiert");
}
}
return entity;
......@@ -151,7 +156,7 @@ public class InviteToProjectBean implements Serializable {
if (tokenList == null) {
tokenList = tokenService.findAllByAttr("project", getEntity());
}
return tokenList;
}
......@@ -207,21 +212,21 @@ public class InviteToProjectBean implements Serializable {
}
return senderNameList;
}
private void fillSenderLists() {
List<UserEntity> userList = userService.findByIdentity(getIdentity());
senderEmailList = new HashSet<String>();
senderNameList = new HashSet<String>();
for (UserEntity user : userList) {
if (user.getEmail() != null) {
senderEmailList.add(user.getEmail());
}
if (user.getEmailAddresses() != null) {
senderEmailList.addAll(user.getEmailAddresses());
}
if (user.getGivenName() != null && user.getSurName() != null) {
senderNameList.add(user.getGivenName() + " " + user.getSurName());
}
......
/*******************************************************************************
* Copyright (c) 2014 Michael Simon.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Michael Simon - initial
******************************************************************************/
package edu.kit.scc.webreg.bean.project;
import java.io.Serializable;
import java.util.List;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import edu.kit.scc.webreg.entity.project.AttributeSourceProjectEntity;
import edu.kit.scc.webreg.entity.project.LocalProjectEntity_;
import edu.kit.scc.webreg.entity.project.ProjectAdminType;
import edu.kit.scc.webreg.entity.project.ProjectIdentityAdminEntity;
import edu.kit.scc.webreg.entity.project.ProjectMembershipEntity;
import edu.kit.scc.webreg.entity.project.ProjectServiceEntity;
import edu.kit.scc.webreg.exc.NotAuthorizedException;
import edu.kit.scc.webreg.service.project.AttributeSourceProjectService;
import edu.kit.scc.webreg.service.project.ProjectService;
import edu.kit.scc.webreg.session.SessionManager;
@Named
@ViewScoped
public class UserShowASProjectBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private SessionManager session;
@Inject
private AttributeSourceProjectService service;
@Inject
private ProjectService projectService;
private AttributeSourceProjectEntity entity;
private List<ProjectMembershipEntity> memberList;
private List<ProjectMembershipEntity> effectiveMemberList;
private List<ProjectIdentityAdminEntity> adminList;
private List<ProjectServiceEntity> serviceList;
private List<ProjectServiceEntity> serviceFromParentsList;
private ProjectIdentityAdminEntity adminIdentity;
private Long id;
public void preRenderView(ComponentSystemEvent ev) {
for (ProjectIdentityAdminEntity a : getAdminList()) {
if (a.getIdentity().getId().equals(session.getIdentityId())) {
adminIdentity = a;
break;
}
}
if (adminIdentity == null) {
throw new NotAuthorizedException("Nicht autorisiert");
} else {
if (!(ProjectAdminType.ADMIN.equals(adminIdentity.getType())
|| ProjectAdminType.OWNER.equals(adminIdentity.getType()))) {
throw new NotAuthorizedException("Nicht autorisiert");
}
}
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public AttributeSourceProjectEntity getEntity() {
if (entity == null) {
entity = service.findByIdWithAttrs(id, LocalProjectEntity_.projectServices);
}
return entity;
}
public void deleteMember(ProjectMembershipEntity pme) {
projectService.removeProjectMember(pme, "idty-" + session.getIdentityId());
memberList = null;
effectiveMemberList = null;
}
public void setEntity(AttributeSourceProjectEntity entity) {
this.entity = entity;
}
public List<ProjectMembershipEntity> getMemberList() {
if (memberList == null) {
memberList = projectService.findMembersForProject(getEntity());
}
return memberList;
}
public List<ProjectIdentityAdminEntity> getAdminList() {
if (adminList == null) {
adminList = projectService.findAdminsForProject(getEntity());
}
return adminList;
}
public List<ProjectServiceEntity> getServiceList() {
if (serviceList == null) {
serviceList = projectService.findServicesForProject(getEntity());
}
return serviceList;
}
public ProjectIdentityAdminEntity getAdminIdentity() {
return adminIdentity;
}
public List<ProjectServiceEntity> getServiceFromParentsList() {
if (serviceFromParentsList == null) {
serviceFromParentsList = projectService.findServicesFromParentsForProject(getEntity());
}
return serviceFromParentsList;
}
public List<ProjectMembershipEntity> getEffectiveMemberList() {
if (effectiveMemberList == null) {
effectiveMemberList = projectService.findMembersForProject(getEntity(), true);
}
return effectiveMemberList;
}
}
......@@ -93,7 +93,12 @@
</p:panel>
<div class="text full" style="margin-top: 0.4em;">
<a href="show-local-project.xhtml?id=#{inviteToProjectBean.entity.id}"><h:outputText value="#{messages.back}"/></a>
<p:outputPanel rendered="#{inviteToProjectBean.entity.class.simpleName == 'LocalProjectEntity'}">
<a href="show-local-project.xhtml?id=#{inviteToProjectBean.entity.id}"><h:outputText value="#{messages.back}"/></a>
</p:outputPanel>
<p:outputPanel rendered="#{inviteToProjectBean.entity.class.simpleName == 'AttributeSourceProjectEntity'}">
<a href="show-as-project.xhtml?id=#{inviteToProjectBean.entity.id}"><h:outputText value="#{messages.back}"/></a>
</p:outputPanel>
</div>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade" closable="false"
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<head>
<title></title>
</head>
<body>
<f:view>
<f:metadata>
<f:viewParam name="id" value="#{userShowASProjectBean.id}"/>
<f:event type="javax.faces.event.PreRenderViewEvent"
listener="#{userShowASProjectBean.preRenderView}" />
</f:metadata>
<ui:composition template="/template/default.xhtml">
<ui:param name="title" value="#{messages.title}"/>
<ui:define name="content">
<h:form id="form" class="full form">
<h2><h:outputText value="#{messages['project.local_project']}: #{userShowASProjectBean.entity.name}"/></h2>
<p:messages id="messageBox" showDetail="true" />
<p:panel header="#{messages.properties}">
<p:panelGrid id="baseData" columns="2">
<h:outputText value="#{messages.id}:"/>
<h:outputText value="#{userShowASProjectBean.entity.id}"/>
<h:outputText value="#{messages.name}:"/>
<h:outputText value="#{userShowASProjectBean.entity.name}"/>
<h:outputText value="#{messages.group_name}:"/>
<h:outputText value="#{userShowASProjectBean.entity.groupName}"/>
<h:outputText value="#{messages.parent_vo}:" rendered="#{userShowASProjectBean.entity.parentProject != null}"/>
<h:outputText value="#{userShowASProjectBean.entity.parentProject}" rendered="#{userShowASProjectBean.entity.parentProject != null}"/>
<h:outputText value="#{messages.services}:"/>
<p:repeat value="#{userShowASProjectBean.entity.projectServices}" var="s">
<div><h:outputText value="#{s.service.name} (#{s.status})"/></div>
</p:repeat>
</p:panelGrid>
</p:panel>
<p:panel>
<p:panelGrid columns="2">
<p:linkButton href="invite-to-project.xhtml" value="#{messages['project.show_local_project.invite_to_project_link']}">
<f:param name="id" value="#{userShowASProjectBean.entity.id}"/>
</p:linkButton>
<h:outputText value="#{messages['project.show_local_project.invite_to_project_link_text']}" />
</p:panelGrid>
</p:panel>
<div class="text full" style="margin-top: 0.4em;">
<a href="index.xhtml"><h:outputText value="#{messages.back}"/></a>
</div>
<h5 style="margin-top: 1em;"><h:outputText value="#{messages['project.members']}" /></h5>
<p:dataTable id="dataTableMember" var="member" value="#{userShowASProjectBean.memberList}">
<p:column sortBy="#{member.identity.prefUser.eppn}" filterBy="#{member.identity.prefUser.eppn}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="#{messages.name}" />
</f:facet>
<h:outputText value="#{member.identity.prefUser.eppn}" />
</p:column>
<p:column sortBy="#{member.identity.prefUser.surName}" filterBy="#{member.identity.prefUser.surName}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="#{messages.sur_name}" />
</f:facet>
<h:outputText value="#{member.identity.prefUser.surName}" />
</p:column>
<p:column sortBy="#{member.identity.prefUser.givenName}" filterBy="#{member.identity.prefUser.givenName}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="#{messages.given_name}" />
</f:facet>
<h:outputText value="#{member.identity.prefUser.givenName}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{messages.type}" />
</f:facet>
<h:outputText value="#{member.membershipType}" />
</p:column>
<p:column width="12%">
<p:tooltip for="@next" value="#{messages.delete}" position="top"/>
<p:commandButton action="#{userShowASProjectBean.deleteMember(member)}" immediate="true" update="@form"
icon="fa fa-fw fa-trash" style="font-size: 0.6em;">
<p:confirm header="#{messages.confirm_header}" escape="false"
message="#{messages['project.show_local_project.delete_member_confirm']}" />
</p:commandButton>
</p:column>
</p:dataTable>
<h5 style="margin-top: 1em;"><h:outputText value="#{messages['project.admins']}" /></h5>
<p:dataTable id="dataTableAdmin" var="admin" value="#{userShowASProjectBean.adminList}">
<p:column>
<f:facet name="header">
<h:outputText value="#{messages.id}" />
</f:facet>
<h:outputText value="#{admin.identity.id}" />
</p:column>
<p:column sortBy="#{admin.identity.prefUser.eppn}" filterBy="#{admin.identity.prefUser.eppn}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="#{messages.name}" />
</f:facet>
<h:outputText value="#{admin.identity.prefUser.eppn}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{messages.type}" />
</f:facet>
<h:outputText value="#{admin.type}" />
</p:column>
</p:dataTable>
<h5 style="margin-top: 1em;"><h:outputText value="#{messages['more_properties']}" /></h5>
<p:panelGrid id="descData" columns="2">
<h:outputText value="#{messages['project.short_description']}:"/>
<h:outputText value="#{userShowASProjectBean.entity.shortDescription}" />
<h:outputText value="#{messages['project.long_description']}:"/>
<h:outputText value="#{userShowASProjectBean.entity.description}" />
</p:panelGrid>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade" closable="false"
closeOnEscape="true" width="320">
<p:commandButton value="#{messages.yes}" type="button" styleClass="ui-confirmdialog-yes"/>
<p:commandButton value="#{messages.no}" type="button" styleClass="ui-confirmdialog-no"/>
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
</f:view>
</body>
</html>
package edu.kit.scc.webreg.service.project;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
......@@ -10,12 +11,15 @@ import org.slf4j.Logger;
import edu.kit.scc.webreg.dao.project.AttributeSourceProjectDao;
import edu.kit.scc.webreg.dao.project.BaseProjectDao;
import edu.kit.scc.webreg.entity.ServiceEntity;
import edu.kit.scc.webreg.entity.UserEntity;
import edu.kit.scc.webreg.entity.as.AttributeSourceEntity;
import edu.kit.scc.webreg.entity.identity.IdentityEntity;
import edu.kit.scc.webreg.entity.project.AttributeSourceProjectEntity;
import edu.kit.scc.webreg.entity.project.ProjectAdminType;
import edu.kit.scc.webreg.entity.project.ProjectIdentityAdminEntity;
import edu.kit.scc.webreg.entity.project.ProjectServiceStatusType;
import edu.kit.scc.webreg.entity.project.ProjectServiceType;
@ApplicationScoped
public class AttributeSourceProjectUpdater extends AbstractProjectUpdater<AttributeSourceProjectEntity> {
......@@ -31,6 +35,9 @@ public class AttributeSourceProjectUpdater extends AbstractProjectUpdater<Attrib
@Inject
private AttributeSourceProjectCreater projectCreater;
@Inject
private AttributeSourceProjectUpdater projectUpdater;
public boolean syncAttributeSourceProjects(List<String> externalNamesList, UserEntity user,
AttributeSourceEntity attributeSource) {
boolean changed = false;
......@@ -50,59 +57,53 @@ public class AttributeSourceProjectUpdater extends AbstractProjectUpdater<Attrib
for (ProjectIdentityAdminEntity pia : filteredAdminList) {
if (!externalNamesList.contains(((AttributeSourceProjectEntity) pia.getProject()).getExternalName())) {
logger.debug("Project {} no longer in external attribute source. Removing ProjectIdentityAdminEntity", pia.getProject().getId());
logger.debug("Project {} no longer in external attribute source. Removing ProjectIdentityAdminEntity",
pia.getProject().getId());
dao.removeAdminFromProject(pia);
changed = true;
}
}
for (String name : externalNamesList) {
AttributeSourceProjectEntity project = dao.findByExternalNameAttributeSource(name, attributeSource);
if (filteredAdminList.stream()
.filter(pia -> ((AttributeSourceProjectEntity) pia.getProject()).getExternalName().equals(name))
.findFirst().isEmpty()) {
logger.debug("Project {} not in ProjectIdentityAdminEntity for identity {}", name, identity.getId());
AttributeSourceProjectEntity project = dao.findByExternalNameAttributeSource(name, attributeSource);
if (project == null) {
project = projectCreater.create(name, name, name, name, attributeSource);
}
dao.addAdminToProject(project, identity, ProjectAdminType.OWNER);
}
logger.debug("Checking if service connections are correct for {}", project.getName());
Set<ServiceEntity> serviceList = attributeSource.getAttributeSourceServices().stream().map(asse -> asse.getService()).collect(Collectors.toSet());
projectUpdater.updateServices(project, serviceList, ProjectServiceType.PASSIVE_GROUP,ProjectServiceStatusType.ACTIVE, "attribute-srouce-" + attributeSource.getId());
// Add missing connections to service
// for (AttributeSourceServiceEntity asse : attributeSource.getAttributeSourceServices()) {
// if (project.getProjectServices().stream()
// .noneMatch(ps -> ps.getService().equals(asse.getService()))) {
// logger.debug("Connecting project {} with service {}", project.getName(), asse.getService().getName());
// projectUpdater.addOrChangeService(project, asse.getService(), ProjectServiceType.PASSIVE_GROUP,
// ProjectServiceStatusType.ACTIVE, "attribute-srouce-" + attributeSource.getId());
// }
// }
//
// for (ProjectServiceEntity ps : project.getProjectServices()) {
// if (attributeSource.getAttributeSourceServices().stream().noneMatch(asse -> asse.getService().equals(ps.getService()))) {
// logger.debug("Removing connectiion: project {} with service {}", project.getName(), ps.getService().getName());
// .
// }
// }
}
return changed;
}
/*
public void syncExternalOidcProject(String projectName, String externalName, String groupName, String shortName,
UserEntity user, AttributeSourceEntity attributeSource) {
logger.debug("Inspecting {}", projectName);
AttributeSourceProjectEntity project = dao.findByExternalNameAttributeSource(externalName, attributeSource);
if (shortName == null) {
// generate short name, if none is set
shortName = "p_" + (UUID.randomUUID().toString().replaceAll("-", "").substring(0, 24));
}
if (project == null) {
project = projectCreater.create(projectName, externalName, groupName, shortName, attributeSource);
}
project.setName(projectName);
project.setGroupName(groupName);
project.getProjectGroup().setName(groupName);
project.setShortName(shortName);
project.setAttributeSource(attributeSource);
if (dao.findByIdentityAndProject(user.getIdentity(), project) == null) {
dao.addMemberToProject(project, user.getIdentity(), ProjectMembershipType.MEMBER);
}
syncAllMembersToGroup(project, "idty-" + user.getIdentity());
triggerGroupUpdate(project, "idty-" + user.getIdentity());
}
*/
@Override
protected BaseProjectDao<AttributeSourceProjectEntity> getDao() {
return dao;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment