अपने कार्यों को एसआईएल में बनाएं

सभी को नमस्कार!

इस लेख में मैं यह बताना चाहता हूं कि एसआईएल में अपना फ़ंक्शन कैसे बनाया जाए।

परिचय


SIL का अर्थ सिंपल इश्यू लैंग्वेज है, जिसे CPrime Developers द्वारा Atlassian Jira और Confluence में मैन्युअल क्रियाओं को स्वचालित करने के लिए बनाया गया था।

एसआईएल का मुख्य लाभ यह है कि एसआईएल में ऐसे कार्य होते हैं जिनके उपयोग के लिए एटलसियन जीरा या एटलसियन कॉन्फ्लुएंस एपीआई के ज्ञान की आवश्यकता नहीं होती है। यह एसआईएल में प्रवेश करने की सीमा को काफी कम कर देता है और इसी तरह के जावा या ग्रूवी कोड की तुलना में एसआईएल प्रोग्राम कोड को वॉल्यूम में छोटा बनाता है।

उदाहरण के लिए, आप अनुरोध पर जीरा से टिकट का चयन करना चाहते हैं, ताकि आप उन पर कुछ कार्रवाई कर सकें। ऐसा करने के लिए, जावा या ग्रूवी में, आपको कोड की एक दर्जन लाइनें लिखनी होंगी। एसआईएल पर, यह एक पंक्ति है:

selectIssues(" JQL ");

इसके अलावा, जावा या ग्रूवी में आपको जीरा 7 और जीरा 8. पर कोड की अनुकूलता सुनिश्चित करनी होगी। एसआईएल में आपको संगतता के बारे में सोचने की जरूरत नहीं है। SelectIssues जीरा के सभी संस्करणों पर काम करेगा जो एसआईएल का समर्थन करता है।

आप SIL के बारे में और जानकारी यहाँ पा सकते हैं
लेकिन क्या होगा अगर मुझे ऐसा कुछ करने की आवश्यकता है, तो एसआईएल में कोई कार्य क्यों नहीं हैं? उदाहरण के लिए, मुझे टेबल ग्रिड नेक्स्ट जनरेशन प्लगइन से डेटा प्राप्त करने की आवश्यकता है या जीरा प्लगइन के लिए पीडीएफ निर्यातक का उपयोग करके एक पीडीएफ फाइल उत्पन्न करना है।

इस मामले में, आपके पास दो विकल्प हैं:

  1. एसआई ग्रूवी कनेक्टर - यह प्लगइन आपको जावा या ग्रूवी में जीरा जावा एपीआई का उपयोग करके कोड लिखने और इस कोड को एसआईएल स्क्रिप्ट से कॉल करने की अनुमति देता है।
  2. अपने जीरा प्लगइन को लिखें जो आपके कार्यों को एसआईएल में जोड़ देगा, और फिर एसआईएल स्क्रिप्ट में अपने कार्यों का उपयोग करेगा

इस लेख में, हम इस बात पर ध्यान देंगे कि एसआईएल के कार्यों को बढ़ाने के लिए अपने जीरा प्लगइन को कैसे लिखें। इस लेख में चरणों को दोहराने के लिए, आपको एटलसियन एसडीके और गिट की आवश्यकता होगी।

मावेन आर्किटाइप सेट करें


एक प्लगइन जो SIL का विस्तार करेगा, उसमें तर्क शामिल होने चाहिए जो आपके कार्यों को SIL में जोड़ देगा। इस तर्क को हर बार प्लगइन में नहीं जोड़ने के लिए, लेकिन केवल लेखन कार्यों पर ध्यान केंद्रित करने के लिए, मैंने मावेन आर्कहाइप बनाया, जो आपको नए प्लगइन में आवश्यक सब कुछ पैदा करेगा।

सबसे पहले, रिपॉजिटरी से चापलूसी को क्लोन करें:

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

साइलेंट-एक्स्टेंशन-आर्कहाइप फ़ोल्डर बनाया जाएगा। आइए इसमें चलते हैं:

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

उसके बाद, प्लगइन बनाया जाएगा।

परीक्षण प्लगइन


बनाए गए फोल्डर में जाएं (मेरे मामले में यह साइलेंट-एक्सटेंशन है) और जीरा चलाएं:

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

आप एसआईएल प्रबंधक स्क्रीन देखेंगे। नया फ़ाइल विकल्प चुनें:



निम्नलिखित सामग्री के साथ एक 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"]);

जीरा की स्क्रीन कुछ इस तरह दिखाई देगी:



हमारे प्लगइन ने तीन फ़ंक्शन जोड़े: SayHello, SayHello2, SayHello3। परीक्षण। Sil जाँच करता है कि कार्यों को SIL में जोड़ा गया है।

Run बटन पर क्लिक करके test.sil चलाएं। कंसोल टैब में, आपको निम्न पाठ देखना चाहिए:

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

यदि आपने ऐसा पाठ देखा है, तो हमारे कार्यों को सफलतापूर्वक एसआईएल में जोड़ दिया गया है।

अब बात करते हैं कि अपने स्वयं के फ़ंक्शन को बनाने के लिए प्लगइन में क्या बदलने की आवश्यकता है।

हमारे फ़ंक्शन के लिए एक जावा वर्ग बनाएं


प्रत्येक फ़ंक्शन जिसे आप एसआईएल में जोड़ना चाहते हैं, उसका अपना वर्ग होना चाहिए। इस वर्ग को 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 }};

यह रेखा उन प्रकारों और संख्याओं को परिभाषित करती है जो आपके कार्य के लिए पारित किए जाएंगे। एसआईएल में फ़ंक्शन इस तरह दिखता है:

mymethod(myparameter);

तदनुसार, {{TypeInst.STRING}} का अर्थ है कि हमारे पास एक पैरामीटर होगा और इसका प्रकार स्ट्रिंग होगा। यदि आप स्ट्रिंग के दो मापदंडों को पास करना चाहते हैं, तो आपको स्ट्रिंग को इस तरह बदलने की आवश्यकता है:

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

एसआईएल में, आप अपने कार्य को इस तरह कह सकते हैं:

mymethod(myparameter1, myparameter2);

यदि आपका फ़ंक्शन एक या दो मापदंडों को स्वीकार कर सकता है। यह शब्द इस तरह दिखेगा:

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

अगला आता है:

public class SayHello extends AbstractSILRoutine<MutableString>

हम AbstractSILRoutine से अपनी क्लास इनहेरिट करते हैं, जिसका अर्थ है कि हमारी क्लास टाइप स्ट्रिंग के एक पैरामीटर को लौटा देगी।

आगे की:

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());
}

यह आपके फ़ंक्शन का मुख्य प्रवेश बिंदु है। जब आप एसआईएल में किसी कार्य को अंजाम देंगे, तो आप यहां पहुंच जाएंगे। सारा तर्क यहीं है।

यह फ़ंक्शन दो मापदंडों को लेता है:

silContext - आपको जीरा और एसआई चर प्राप्त करने की अनुमति देता है।

उदाहरण के लिए, आपकी एसआईएल स्क्रिप्ट एक पोस्ट फ़ंक्शन के रूप में काम करती है और आप एक टिकट प्राप्त करना चाहते हैं जिसके तहत स्क्रिप्ट निष्पादित होती है:

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

सूची - आपको एसआईएल फ़ंक्शन को दिए गए मापदंडों के मूल्यों को प्राप्त करने की अनुमति देता है।

SILValue param = list.get(0); 

रेखा:

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

मान लौटाता है। आपको वे मान वापस करने होंगे जो SIL समझता है, इसलिए मान उत्पन्न करने के लिए SILValueFactory का उपयोग करें।

आगे की:

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

यह SIL मैनेजर में फ़ंक्शन के प्रकार को परिभाषित करता है। जब आप एसआईएल प्रबंधक में टाइप करना शुरू करते हैं, तो आपको उपलब्ध कार्यों के संकेत के साथ प्रस्तुत किया जाता है। हमारे मामले में, आप देखेंगे:

yourmethod(name)

हमारी कक्षा को एसआईएल इंजन में जोड़ें


आपने अपनी क्लास बना ली है। अब आपको अपने फंक्शन के बारे में एसआईएल को अवगत कराना होगा। यह ESLauncher.java फ़ाइल में किया जाता है। इस फ़ाइल में ये पंक्तियाँ हैं:

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

यह पंक्ति कहती है कि हम SayHello नाम के तहत SayHello वर्ग को SIL में जोड़ रहे हैं। वर्ग नाम और फ़ंक्शन मेल नहीं खा सकते हैं।

अगला, निम्नलिखित पंक्ति जोड़ें:

RoutineRegistry.unregister("SayHello");

SayHello को अपने फ़ंक्शन के नाम में बदलें। यदि आप जीरा से अपना प्लगइन हटाते हैं तो यह लाइन एसआईएल से आपके फ़ंक्शन को अनलोड करेगी।

एसआईएल के बारे में अधिक


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);

इसे काम करने के लिए, आपको KeyInArraySILObject के साथ AbstractSILRoutine से TypeInst.STRING_ARR और इनहेरिट का रिटर्न मान भी बदलना होगा।

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"]);

इस मामले में, हमें सरणी के तत्व इंडेक्स से नहीं, बल्कि चाबियों से मिलते हैं।

यदि आप जावा में कोड को देखते हैं, तो दोनों मामलों में हम KeyableArraySILObject के साथ काम करते हैं। तथ्य यह है कि एसआईएल सूची और मानचित्र 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 वर्ग की वस्तु प्राप्त करते हैं, और फिर हमें इससे नक्शा मिलता है।

एसआईएल में, आप इस तरह से एक सरणी पास कर सकते हैं:

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

यही इस लेख का समापन करता है। मुझे आशा है कि आपने एसआईएल में अपना कार्य लिखने के लिए पर्याप्त ज्ञान प्राप्त किया है।

All Articles