إنشاء وظائفك في SIL

تحية للجميع!

في هذه المقالة ، أريد أن أخبرك عن كيفية إنشاء وظيفتي في SIL.

المقدمة


SIL تعني لغة الإصدار البسيطة ، تم إنشاؤها بواسطة مطوري cPrime لأتمتة الإجراءات اليدوية في Atlassian Jira و Confluence.

الميزة الرئيسية لـ SIL هي أن SIL يحتوي على وظائف لا تتطلب معرفة بـ Atlassian Jira أو Atlassian Confluence APIs لاستخدامها. هذا يقلل بشكل كبير من عتبة دخول SIL ويجعل رمز برنامج SIL أصغر في الحجم من كود Java أو Groovy مشابه.

على سبيل المثال ، تريد تحديد التذاكر من Jira عند الطلب ، حتى تتمكن من تنفيذ بعض الإجراءات عليها. للقيام بذلك ، في Java أو Groovy ، سيكون عليك كتابة عشرات الأسطر من التعليمات البرمجية. على SIL ، هذا سطر واحد:

selectIssues(" JQL ");

علاوة على ذلك ، في Java أو Groovy ، يجب عليك ضمان توافق الكود على Jira 7 و Jira 8. في SIL لا تحتاج إلى التفكير في التوافق. سيعمل SelectIssues على جميع إصدارات Jira التي تدعمها SIL.

يمكنك العثور على المزيد عن SIL هنا .
ولكن ماذا لو كنت بحاجة إلى القيام بشيء مثل هذا ، فلماذا لا توجد وظائف في SIL؟ على سبيل المثال ، أحتاج إلى الحصول على بيانات من المكوّن الإضافي Table Grid Next Generation أو إنشاء ملف PDF باستخدام مُصدِّر PDF للمكون الإضافي Jira.

في هذه الحالة ، لديك خياران:

  1. SIL Groovy Connector - يتيح لك هذا البرنامج المساعد كتابة التعليمات البرمجية باستخدام Jira Java API في Java أو Groovy واستدعاء هذا الرمز من SIL script.
  2. اكتب البرنامج المساعد Jira الذي سيضيف وظائفك إلى SIL ، ثم استخدم وظائفك في SIL النصية

في هذه المقالة ، سنركز على كيفية كتابة البرنامج المساعد Jira الخاص بك لتوسيع وظائف SIL. من أجل تكرار الخطوات في هذه المقالة ، ستحتاج إلى Atlassian SDK و git.

تعيين النموذج الأصلي مخضرم


يجب أن يحتوي المكون الإضافي الذي سيمد SIL على منطق يضيف وظائفك إلى SIL. لكي لا أضيف هذا المنطق إلى البرنامج المساعد في كل مرة ، ولكن من أجل التركيز فقط على وظائف الكتابة ، قمت بعمل النموذج الأصلي الذي سينشئ كل ما تحتاجه في المكون الإضافي الجديد.

أولاً ، استنساخ النموذج الأصلي من المستودع:

git clone https://alex1mmm@bitbucket.org/alex1mmm/sil-extension-archetype.git --branch v1 --single-branch

سيتم إنشاء مجلد sil-extenstion-archetype. دعنا نذهب إلى ذلك:

cd sil-extension-archetype

الآن قم بتثبيت النموذج الأصلي في مستودع مخضرمك المحلي:

atlas-mvn install

قم بإنشاء مكون إضافي


انتقل إلى المجلد أعلاه وقم بإنشاء مكون إضافي جديد

cd ..
atlas-mvn archetype:generate -DarchetypeCatalog=local

سيُطلب منك أسئلة قياسية عند إنشاء مشروع من خلال مخضرم. أعطي إجاباتي على الأسئلة. يمكنك تغييرها.

Choose archetype:

1: local -> com.cprime.jira.sil.extension:sil-extension-archetype (This is the com.cprime.jira.sil.extension:sil-extension plugin for Atlassian JIRA.)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 

Define value for property 'groupId': ru.matveev.alexey.sil.extension
Define value for property 'artifactId': sil-extension
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' ru.matveev.alexey.sil.extension: : 

Confirm properties configuration:
groupId: ru.matveev.alexey.sil.extension
artifactId: sil-extension
version: 1.0-SNAPSHOT
package: ru.matveev.alexey.sil.extension

 Y: : Y

بعد ذلك ، سيتم إنشاء البرنامج المساعد.

اختبار البرنامج المساعد


انتقل إلى المجلد الذي تم إنشاؤه (في حالتي هو امتداد sil) وقم بتشغيل Jira:

cd sil-extension
atlas-run</code>
 Jira   
<code>http://localhost:2990/jira/plugins/servlet/silmanager?autoSelectTree=sil.scripts

سترى شاشة SIL Manager. حدد خيار ملف جديد:



إنشاء ملف test.sil بالمحتويات التالية:

runnerLog(SayHello("Alexey"));
string[] res = SayHello2("Alexey", "Matveev");
runnerLog(res[0]);
runnerLog(res[1]);
res = SayHello3("Alexey", "Matveev");
runnerLog(res["param1"]);
runnerLog(res["param2"]);

ستبدو الشاشة في Jira على



النحو التالي: أضاف المكون الإضافي ثلاث وظائف: SayHello و SayHello2 و SayHello3. يتحقق Test.sil من إضافة الوظائف إلى SIL.

قم بتشغيل test.sil بالضغط على زر التشغيل. في علامة التبويب وحدة التحكم ، سترى النص التالي:

Hello Alexey
Hello Alexey
Hello Matveev
Hello Alexey
Hello Matveev
Done.

إذا رأيت مثل هذا النص ، فقد تمت إضافة وظائفنا بنجاح إلى SIL.

الآن دعونا نتحدث عن ما يجب تغييره في المكون الإضافي لإنشاء وظيفتنا الخاصة.

إنشاء فئة Java لوظيفتنا


يجب أن يكون لكل دالة تريد إضافتها إلى SIL فئة خاصة بها. يجب أن تكون هذه الفئة سلالة لفئة AbstractSILRoutine.

لفهم ما يلزم إضافته إلى فصل دراسي جديد ، دعنا نلقي نظرة على الأمثلة المتاحة.

SayHello.java


public class SayHello extends AbstractSILRoutine<MutableString> { 
  private static final SILType[][] types = {{ TypeInst.STRING }};

  public SayHello(ClassLoader classLoader, String name) { 
    super(classLoader, name, types);
  }

  @Override 
  public SILType<MutableString> getReturnType() { return TypeInst.STRING; }

  @Override 
  protected SILValue<MutableString> runRoutine(SILContext silContext,                                   List<SILValue<?>> list) { 
    SILValue param = list.get(0); 
    return SILValueFactory.string( "Hello " + param.toStringValue());
 }
  @Override 
  public String getParams() { return "(name)"; }

السطر الأول:

private static final SILType[][] types = {{ TypeInst.STRING }};

يحدد هذا الخط أنواع وعدد المعلمات التي سيتم تمريرها إلى وظيفتك. تبدو الدالة في SIL كما يلي:

mymethod(myparameter);

وفقًا لذلك ، يعني {{TypeInst.STRING}} أنه سيكون لدينا معلمة واحدة ونوعها هو String. إذا كنت ترغب في تمرير معلمتين من النوع String ، فأنت بحاجة إلى تغيير السلسلة مثل هذا:

private static final SILType[][] types = {{ TypeInst.STRING, TypeInst.STRING }};

في SIL ، يمكنك استدعاء وظيفتك على النحو التالي:

mymethod(myparameter1, myparameter2);

إذا كانت وظيفتك يمكن أن تقبل إما معلمة واحدة أو معلمتين. سيبدو هذا المصطلح كما يلي:

private static final SILType[][] types = {{ TypeInst.STRING},  
                                                          {TypeInst.STRING, TypeInst.STRING }};

يأتي التالي:

public class SayHello extends AbstractSILRoutine<MutableString>

نحن نرث صفنا من AbstractSILRoutine ، مما يعني أن فصلنا سيعيد معلمة من النوع String.

بالإضافة إلى ذلك:

public SayHello(ClassLoader classLoader, String name) { 
  super(classLoader, name, types);
}

هذا هو المنشئ. ربما لن تضطر إلى تغيير أي شيء فيه.

بالإضافة إلى ذلك:

@Override 
public SILType<MutableString> getReturnType() { return TypeInst.STRING; }

هنا نحدد نوع المعلمة المرتجعة. في حالتنا ، هو سلسلة.

بالإضافة إلى ذلك:

@Override 
protected SILValue<MutableString> runRoutine(SILContext silContext, List<SILValue<?>> list) { 
SILValue param = list.get(0); 
return SILValueFactory.string( "Hello " + param.toStringValue());
}

هذه هي نقطة الدخول الرئيسية لوظيفتك. عند تنفيذ وظيفة في SIL ، ستحصل هنا. كل المنطق هنا.

تأخذ هذه الوظيفة معلمتين:

silContext - يسمح لك بالحصول على متغيرات Jira و SIL.

على سبيل المثال ، يعمل SIL الخاص بك كوظيفة نشر وتريد الحصول على تذكرة يتم بموجبها تنفيذ البرنامج النصي:

Issue issue = (Issue) silContext.getAllMetaInformation().get("issue");

قائمة - تسمح لك بالحصول على قيم المعلمات التي تم تمريرها إلى دالة SIL.

SILValue param = list.get(0); 

خط:

SILValueFactory.string( "Hello " + param.toStringValue());

إرجاع القيمة. يجب عليك إرجاع القيم التي يفهمها SIL ، لذا استخدم SILValueFactory لتوليد القيم.

بالإضافة إلى ذلك:

@Override 
public String getParams() { return "(name)"; }

يحدد هذا نوع الوظيفة في SIL Manager. عند بدء الكتابة في مدير SIL ، تظهر لك تلميح من الوظائف المتاحة. في حالتنا ، سترى:

yourmethod(name)

أضف فئتنا إلى محرك SIL


لقد قمت بإنشاء صفك. تحتاج الآن إلى جعل SIL على علم بوظيفتك. يتم ذلك في ملف ESLauncher.java. يحتوي هذا الملف على الأسطر التالية:

RoutineRegistry.register(new SayHello( classLoader,"SayHello")); 

يقول هذا السطر أننا نضيف فئة SayHello إلى SIL تحت اسم SayHello. قد لا يتطابق اسم الفئة ووظيفتها.

بعد ذلك ، أضف السطر التالي:

RoutineRegistry.unregister("SayHello");

قم بتغيير SayHello إلى اسم وظيفتك. سيقوم هذا الخط بإلغاء تحميل وظيفتك من SIL إذا قمت بإزالة المكون الإضافي من Jira.

المزيد عن SIL


في فصل SayHello2 ، نرجع قائمة.

SILValue param1 = list.get(0); 
SILValue param2 = list.get(1); 
List<String> res = new ArrayList<>(); 
res.add("Hello " + param1.toStringValue()); 
res.add("Hello " + param2.toStringValue()); 
return SILValueFactory.stringArray(res);

لكي يعمل هذا ، تحتاج أيضًا إلى تغيير القيمة المرتجعة إلى TypeInst.STRING_ARR والوراثة من AbstractSILRoutine مع KeyableArraySILObject.

في SIL ، يمكنك استدعاء SayHello2 على النحو التالي:

string[] res = SayHello2("Alexey", "Matveev");
runnerLog(res[0]);
runnerLog(res[1]);

في SayHello3 ، نرجع الخريطة:

SILValue param1 = list.get(0); 
SILValue param2 = list.get(1); 
Map<String, String> res = new HashMap<>(); 
res.put("param1","Hello " + param1.toStringValue()); 
res.put("param2","Hello " + param2.toStringValue()); 
return SILValueFactory.stringArray(res);

في SIL ، يمكنك استدعاء SayHello3 على النحو التالي:

res = SayHello3("Alexey", "Matveev");
runnerLog(res["param1"]);
runnerLog(res["param2"]);

في هذه الحالة ، نحصل على عناصر المصفوفة ليس حسب الفهرس ، ولكن بالمفاتيح.

إذا نظرت إلى الشفرة في Java ، فإننا في كلتا الحالتين نعمل مع KeyableArraySILObject. والحقيقة هي أنه في قائمة وخريطة SIL يتم تنفيذها بواسطة فئة KeyableArraySILObject. أولئك. يمكن الوصول إلى أي صفيف في SIL إما عن طريق الفهرس أو عن طريق المفتاح.

نقوم بتمرير مصفوفة كمعلمة


يمكننا إرجاع صفيف من دالة SIL. الآن دعونا نرى كيفية تمرير مصفوفة كمعلمة.

سيبدو الرمز على النحو التالي:

@Override
protected SILValue<MutableString> runRoutine(SILContext silContext, List<SILValue<?>> list) {
    GenericArraySILObject rowsToUpdate =  (GenericArraySILObject) list.get(0).getObject();
    Map<String, int[]> keys = rowsToUpdate.getKeysMapping()
......
}

أولاً ، نحصل على كائن فئة GenericArraySILObject من المعلمة ، ثم نحصل على الخريطة منه.

في SIL ، يمكنك تمرير مصفوفة مثل هذا:

string[] arr;
arr["key1"] = "value1";
arr["key2"] = "value2";
yourmethod(arr);

وبذلك تنتهي هذه المقالة. آمل أن تكون قد اكتسبت المعرفة الكافية لكتابة وظيفتك في SIL.

All Articles