การเรียกใช้ simple method ใน java

ในการพัฒนาระบบใน ofbiz นั้นโดยส่วนใหญ่แล้วเราจะใช้ภาษา mini-language ในการพัฒนาระบบ แต่ก็มีอยู่บ่อยๆที่เราใช้ภาษาอื่นเช่น ่java, groovy, bean-shell, ftl และอื่นๆอีกหลายตัว แต่ในที่นี้เรากำลังจะพูดถึงเฉพาะภาษา java ครับ. เวลาพัฒนาระบบด้วย java นั้น เราก็พัฒนาระบบโดยใช้ฟังก์ชั่นของตัว java เองและจากของ ofbiz เองบ้าง ซึ่งก็ไม่มีปัญหาอะไรเกิดขึ้นครับ หากเราเรียกใช้กับโคด java ด้วยกัน. ปัญหาเกิดขึ้นเมื่อเราต้องการเรียกใช้ ฟังก์ชั่นที่เขียนขึ้นโดยภาษา   mini-language หรือ simple method นั้นเอง เพราะขี้เกียจเขียนโคดเป็น java ใหม่ หรืออาจจะเสียเวลามาก หรือโคดที่เป็น simple method ก็ดีอยู่แล้ว ไม่ว่าจะเหตุผลใดวันนี้เราจะมาดูวิธีการแก้ปัญหาดังกล่าวกันครับ. ในการเรียกใช้ simple method ใน java นั้นเราจะใช้คลาส java ที่มีชื่อว่า SimpleMethod ครับ ตัวอย่างเช่น

SimpleMethod.runSimpleMethod("component://scrum/script/org/ofbiz/scrum/ScrumEvents.xml", "createProductBacklog", formInput);

จากตัวอย่างเป็นการเรียกใช้ method  "createProductBacklog" ในไฟล์ ScrumEvents.xml ครับ ซึ่งขั้นตอนการเรียกใช้นั้นจะเหมือนกัน ทั้งใน ่java event และ java service แต่จะมีความแตกต่างกันตรงที่วิธีการเตรียมข้อมูล input ครับ เช่น หากเป็นใน java service ก็จะเป็นแบบนี้ครับ

MethodContext formInput = new MethodContext(ctx, context, ScrumServices.class.getClassLoader());
  formInput.putParameter("backStatusId", "CRQ_ACCEPTED");
  formInput.putParameter("billed", "Y");
  formInput.putParameter("custEstimatedMilliSeconds", 0);
  formInput.putParameter("custRequestTypeId", "RF_UNPLAN_BACKLOG");
  formInput.putParameter("custSequenceNum", "");
  ...
แต่หากเป็นใน java event ก็จะอีกแบบหนึ่งครับ
MethodContext formInput = new MethodContext(request, response, ScrumEvents.class.getClassLoader());
  formInput.putParameter("backStatusId", "CRQ_ACCEPTED");
  formInput.putParameter("billed", "Y");
  formInput.putParameter("custEstimatedMilliSeconds", 0);
  formInput.putParameter("custRequestTypeId", "RF_UNPLAN_BACKLOG");
  formInput.putParameter("custSequenceNum", "");
  ...
จะสังเกตว่าสิ่งที่ต่างคือ input ของ method ครับ เพียงเท่านี้เราก็สามารถเรียก method ต่างๆจาก simple method ได้แล้วครับ.

ต่อไปนี้เป็นโคดตัวอย่างที่ใช้จริงครับ
public static Map autoToUnplannedBacklog(DispatchContext ctx, Map context) {
        Delegator delegator = ctx.getDelegator();
        LocalDispatcher dispatcher = ctx.getDispatcher();
        String communicationEventId = (String) context.get("communicationEventId");

        if (UtilValidate.isNotEmpty(communicationEventId)) {
            try {
                GenericValue communicationEvent = delegator.findByPrimaryKey("CommunicationEvent", UtilMisc.toMap("communicationEventId", communicationEventId));
                if (UtilValidate.isNotEmpty(communicationEvent)) {
                    String subject = communicationEvent.getString("subject");
                    if (UtilValidate.isNotEmpty(subject)) {
                        int pdLocation = subject.indexOf("JK#");
                        if (pdLocation >= 0) {
                            // scan until the first non digit character
                            int nonDigitLocation = pdLocation + 3;
                            while (nonDigitLocation < subject.length() && Character.isDigit(subject.charAt(nonDigitLocation))) {
                                nonDigitLocation++;
                            }
                            String productId = subject.substring(pdLocation + 3, nonDigitLocation);
                            GenericValue product = delegator.findByPrimaryKey("Product", UtilMisc.toMap("productId", productId));
                            if (UtilValidate.isNotEmpty(product)) {
                                List productRoleList = product.getRelated("ProductRole", UtilMisc.toMap("roleTypeId", "PRODUCT_OWNER"), UtilMisc.toList("roleTypeId"));
                                GenericValue productRoleMap = EntityUtil.getFirst(productRoleList);
                                //เตรียม พารามิเตอร์ input
                                MethodContext formInput = new MethodContext(ctx, context, ScrumServices.class.getClassLoader());
                                try {
                                    // prepare parameters
                                    formInput.putParameter("backStatusId", "CRQ_ACCEPTED");
                                    formInput.putParameter("billed", "Y");
                                    formInput.putParameter("custEstimatedMilliSeconds", 0);
                                    formInput.putParameter("custRequestTypeId", "RF_UNPLAN_BACKLOG");
                                    formInput.putParameter("custSequenceNum", "");
                                    formInput.putParameter("description", subject.substring(nonDigitLocation, subject.length()));
                                    formInput.putParameter("noteId", "");
                                    formInput.putParameter("noteInfo", "");
                                    formInput.putParameter("parentCustRequestId", "");
                                    formInput.putParameter("partyIdTo", productRoleMap.getString("partyId"));
                                    formInput.putParameter("productId", productId);
                                    formInput.putParameter("sequence", "");
                                    formInput.putParameter("story", communicationEvent.getString("content"));                        //การเรียกใช้
                                   SimpleMethod.runSimpleMethod("component://scrum/script/org/ofbiz/scrum/ScrumEvents.xml", "createProductBacklog", formInput);
                                    String custRequestId = formInput.getEnv("custRequestId");
                                    if (UtilValidate.isNotEmpty(custRequestId)) {
                                        GenericValue custRequestMap = delegator.findByPrimaryKey("CustRequest", UtilMisc.toMap("custRequestId", custRequestId));
                                        GenericValue userLogin = (GenericValue) context.get("userLogin");
                                        // also close the incoming communication event
                                        if (UtilValidate.isNotEmpty(custRequestMap)) {
                                            dispatcher.runSync("setCommunicationEventStatus", UtilMisc.toMap("communicationEventId", communicationEvent.getString("communicationEventId"), "statusId", "COM_COMPLETE", "userLogin", userLogin));
                                        }
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    return ServiceUtil.returnError("Error calling auto create unplnned backlog from jenkins:" + e.getMessage());
                                }
                            } else {
                                Debug.logInfo("Product id " + productId + " found in subject but not in database", module);
                            }
                        }
                    }
                }
                
            } catch (GenericEntityException e) {
                return ServiceUtil.returnError("find by primary key error:" + e.toString());
            }
            
            Map result = ServiceUtil.returnSuccess();
            return result;
        } else {
            Map result = ServiceUtil.returnError("A communication event id is required");
            return result;
        }
    }

About Nop

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment

0 comments:

Post a Comment