You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by la...@apache.org on 2025/10/17 17:20:59 UTC
(airavata-custos) 15/26: AMIE person merge handler impl
This is an automated email from the ASF dual-hosted git repository.
lahirujayathilake pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-custos.git
commit e700694219da54def4825172bbe8819f2c4c4824
Author: lahiruj <la...@gmail.com>
AuthorDate: Thu Oct 9 18:04:29 2025 -0400
AMIE person merge handler impl
---
.../amie/handler/RequestAccountCreateHandler.java | 4 +-
.../amie/handler/RequestPersonMergeHandler.java | 95 ++++++++++++++++++++++
2 files changed, 98 insertions(+), 1 deletion(-)
diff --git a/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestAccountCreateHandler.java b/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestAccountCreateHandler.java
index 3939b007f..ee8c6dd4e 100644
--- a/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestAccountCreateHandler.java
+++ b/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestAccountCreateHandler.java
@@ -63,6 +63,7 @@ public class RequestAccountCreateHandler implements PacketHandler {
String userFirstName = body.path("UserFirstName").asText();
String userLastName = body.path("UserLastName").asText();
String userEmail = body.path("UserEmail").asText();
+ String userOrgCode = body.path("UserOrgCode").asText();
Assert.hasText(projectId, "'ProjectID' (the local project ID) must not be empty.");
Assert.hasText(userFirstName, "'UserFirstName' must not be empty.");
@@ -71,13 +72,14 @@ public class RequestAccountCreateHandler implements PacketHandler {
// TODO invoke actual cluster's user provisioning service. For the time being generating a local user ID and a username
String localUserPersonId = UUID.randomUUID().toString();
- String localUsername = (userFirstName.charAt(0) + userLastName).toLowerCase();
+ String localUsername = (userFirstName.trim().charAt(0) + userLastName.trim().replace(" ", "-")).toLowerCase();
LOGGER.info("Created local user account with PersonID [{}] and username [{}]", localUserPersonId, localUsername);
// Build and send the 'notify_account_create' reply
Map<String, Object> replyBody = new HashMap<>();
Map<String, Object> bodyContent = new HashMap<>();
+ bodyContent.put("UserOrgCode", userOrgCode);
bodyContent.put("ProjectID", projectId);
bodyContent.put("UserPersonID", localUserPersonId);
diff --git a/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestPersonMergeHandler.java b/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestPersonMergeHandler.java
new file mode 100644
index 000000000..d94419d41
--- /dev/null
+++ b/amie-decoder/src/main/java/org/apache/custos/amie/handler/RequestPersonMergeHandler.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.custos.amie.handler;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.custos.amie.client.AmieClient;
+import org.apache.custos.amie.model.PacketEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Handles the 'request_person_merge' AMIE packet.
+ * <p>
+ * This transaction is to merge two local user identities into one.
+ * This identifies a "surviving" user and a "retiring" user. The handler must
+ * re-associate all resources from the retiring user to the surviving user and then
+ * disable the retiring user's account.
+ * Upon successful processing, this handler sends an 'inform_transaction_complete' reply to close the transaction.
+ */
+@Component
+public class RequestPersonMergeHandler implements PacketHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RequestPersonMergeHandler.class);
+
+ private final AmieClient amieClient;
+
+ public RequestPersonMergeHandler(AmieClient amieClient) {
+ this.amieClient = amieClient;
+ }
+
+ @Override
+ public String supportsType() {
+ return "request_person_merge";
+ }
+
+ @Override
+ public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+ LOGGER.info("Starting 'request_person_merge' handler for packet amie_id [{}].", packetEntity.getAmieId());
+
+ JsonNode body = packetJson.path("body");
+ String survivingPersonId = body.path("PrimaryPersonID").asText();
+ String retiringPersonId = body.path("PersonID").asText();
+
+ Assert.hasText(survivingPersonId, "'PrimaryPersonID' (the surviving user) must not be empty.");
+ Assert.hasText(retiringPersonId, "'PersonID' (the retiring user) must not be empty.");
+ LOGGER.info("Packet validated. Merging user [{}] into user [{}].", retiringPersonId, survivingPersonId);
+
+ // TODO - perform the business logic
+ // - find the local user accounts for both the surviving and retiring IDs
+ // - re-associate all project memberships and allocations from the retiring user to the surviving user
+ // - handle the unix system changes
+ // - lock or disable the retiring user's local login account
+ LOGGER.info("Simulating business logic: Re-associating resources from [{}] to [{}] and disabling the retiring account.", retiringPersonId, survivingPersonId);
+
+ // Send the 'inform_transaction_complete' reply
+ sendSuccessReply(packetEntity.getAmieId());
+ }
+
+ private void sendSuccessReply(long packetRecId) {
+ Map<String, Object> reply = new HashMap<>();
+ Map<String, Object> itcBody = new HashMap<>();
+
+ itcBody.put("StatusCode", "Success");
+ itcBody.put("DetailCode", 1);
+ itcBody.put("Message", "Person merge transaction completed successfully.");
+
+ reply.put("type", "inform_transaction_complete");
+ reply.put("body", itcBody);
+
+ amieClient.replyToPacket(packetRecId, reply);
+
+ LOGGER.info("Successfully sent 'inform_transaction_complete' for person_merge packet_rec_id [{}].", packetRecId);
+ }
+}