Buat fungsi Anda di SIL

Halo semuanya!

Pada artikel ini saya ingin memberi tahu cara membuat fungsi saya di SIL.

pengantar


SIL adalah kependekan dari Simple Issue Language, dibuat oleh pengembang cPrime untuk mengotomatiskan tindakan manual dalam Atlassian Jira dan Confluence.

Keuntungan utama SIL adalah bahwa SIL berisi fungsi yang tidak memerlukan pengetahuan tentang Atlassian Jira atau Atlassian Confluence APIs untuk menggunakannya. Ini secara signifikan mengurangi ambang untuk memasukkan SIL dan membuat kode program SIL lebih kecil volumenya daripada kode Java atau Groovy yang serupa.

Misalnya, Anda ingin memilih tiket dari Jira berdasarkan permintaan, sehingga Anda dapat melakukan beberapa tindakan terhadapnya. Untuk melakukan ini, di Jawa atau Groovy, Anda harus menulis selusin baris kode. Pada SIL, ini adalah satu baris:

selectIssues(" JQL ");

Selain itu, di Java atau Groovy Anda harus memastikan kompatibilitas kode pada Jira 7 dan Jira 8. Di SIL Anda tidak perlu memikirkan kompatibilitas. SelectIssues akan bekerja pada semua versi Jira yang didukung SIL.

Anda dapat menemukan lebih banyak tentang SIL di sini .
Tetapi bagaimana jika saya perlu melakukan sesuatu seperti ini, mengapa tidak ada fungsi di SIL? Sebagai contoh, saya perlu mendapatkan data dari plugin Table Grid Next Generation atau menghasilkan file PDF menggunakan eksportir PDF untuk plugin Jira.

Dalam hal ini, Anda memiliki dua opsi:

  1. SIL Groovy Connector - plugin ini memungkinkan Anda untuk menulis kode menggunakan Jira Java API di Java atau Groovy dan memanggil kode ini dari skrip SIL.
  2. Tulis plugin Jira Anda yang akan menambahkan fungsi Anda ke SIL, dan kemudian gunakan fungsi Anda dalam skrip SIL

Pada artikel ini, kita akan fokus pada bagaimana menulis plugin Jira Anda untuk memperluas fungsi SIL. Untuk mengulangi langkah-langkah dalam artikel ini, Anda akan memerlukan Atlassian SDK dan git.

Atur pola dasar pakar


Plugin yang akan memperpanjang SIL harus berisi logika yang akan menambahkan fungsi Anda ke SIL. Agar tidak menambahkan logika ini ke plugin setiap kali, tetapi untuk berkonsentrasi hanya pada fungsi penulisan, saya membuat arketipe maven yang akan membuat semua yang Anda butuhkan di plugin baru.

Pertama, tiruan arketipe dari repositori:

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

Folder sil-extenstion-archetype akan dibuat. Mari kita masuk ke dalamnya:

cd sil-extension-archetype

Sekarang instal arketipe di repositori pakar lokal Anda:

atlas-mvn install

Buat plugin


Buka folder di atas dan buat plugin baru

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

Anda akan ditanya pertanyaan standar saat membuat proyek melalui pakar. Saya memberikan jawaban saya untuk pertanyaan. Anda bisa mengubahnya.

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

Setelah itu, plugin akan dibuat.

Plugin pengujian


Buka folder yang dibuat (dalam kasus saya ini adalah ekstensi sil) dan jalankan Jira:

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

Anda akan melihat layar SIL Manager. Pilih opsi File Baru:



Buat file test.sil dengan konten berikut:

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

Layar di Jira akan terlihat seperti ini:



Plugin kami menambahkan tiga fungsi: SayHello, SayHello2, SayHello3. Test.sil memeriksa bahwa fungsi telah ditambahkan ke SIL.

Jalankan test.sil dengan mengklik tombol Run. Di tab Konsol, Anda akan melihat teks berikut:

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

Jika Anda melihat teks seperti itu, maka fungsi kami telah berhasil ditambahkan ke SIL.

Sekarang mari kita bicara tentang apa yang perlu diubah dalam plugin untuk membuat fungsi kita sendiri.

Buat kelas Java untuk fungsi kita


Setiap fungsi yang ingin Anda tambahkan ke SIL harus memiliki kelas sendiri. Kelas ini harus merupakan turunan dari kelas AbstractSILRoutine.

Untuk memahami apa yang perlu ditambahkan ke kelas baru, mari kita lihat contoh yang tersedia.

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

Garis pertama:

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

Baris ini mendefinisikan jenis dan jumlah parameter yang akan diteruskan ke fungsi Anda. Fungsi di SIL terlihat seperti ini:

mymethod(myparameter);

Dengan demikian, {{TypeInst.STRING}} berarti bahwa kita akan memiliki satu parameter dan tipenya adalah String. Jika Anda ingin melewatkan dua parameter dari tipe String, maka Anda perlu mengubah string seperti ini:

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

Di SIL, Anda dapat memanggil fungsi Anda seperti ini:

mymethod(myparameter1, myparameter2);

Jika fungsi Anda dapat menerima satu atau dua parameter. Istilah itu akan terlihat seperti ini:

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

Berikutnya datang:

public class SayHello extends AbstractSILRoutine<MutableString>

Kami mewarisi kelas kami dari AbstractSILRoutine, yang berarti bahwa kelas kami akan mengembalikan parameter tipe String.

Lebih lanjut:

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

Ini adalah konstruktornya. Anda mungkin tidak perlu mengubah apa pun di dalamnya.

Lebih lanjut:

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

Di sini kita menentukan jenis parameter yang dikembalikan. Dalam kasus kami, ini adalah String.

Lebih lanjut:

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

Ini adalah titik masuk utama untuk fungsi Anda. Ketika Anda menjalankan fungsi dalam SIL, Anda akan sampai di sini. Semua logika ada di sini.

Fungsi ini mengambil dua parameter:

silContext - memungkinkan Anda untuk mendapatkan variabel Jira dan SIL.

Misalnya, skrip SIL Anda berfungsi sebagai fungsi pos dan Anda ingin menerima tiket untuk skrip dijalankan:

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

daftar - memungkinkan Anda untuk mendapatkan nilai parameter yang diteruskan ke fungsi SIL.

SILValue param = list.get(0); 

Baris:

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

mengembalikan nilai. Anda harus mengembalikan nilai yang dipahami SIL, jadi gunakan SILValueFactory untuk menghasilkan nilai.

Lebih lanjut:

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

Ini mendefinisikan jenis fungsi di SIL Manager. Saat Anda mulai mengetik di manajer SIL, Anda akan diberi petunjuk tentang fungsi yang tersedia. Dalam kasus kami, Anda akan melihat:

yourmethod(name)

Tambahkan kelas kami ke mesin SIL


Anda telah membuat kelas Anda. Sekarang Anda perlu membuat SIL sadar akan fungsi Anda. Ini dilakukan dalam file ESLauncher.java. File ini berisi baris-baris ini:

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

Baris ini mengatakan bahwa kami menambahkan kelas SayHello ke SIL dengan nama SayHello. Nama dan fungsi kelas mungkin tidak cocok.

Selanjutnya, tambahkan baris berikut:

RoutineRegistry.unregister("SayHello");

Ubah SayHello ke nama fungsi Anda. Baris ini akan menurunkan fungsi Anda dari SIL jika Anda menghapus plugin dari Jira.

Lebih lanjut tentang SIL


Di kelas SayHello2, kami mengembalikan daftar.

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

Agar ini berfungsi, Anda juga perlu mengubah nilai kembali ke TypeInst.STRING_ARR dan mewarisi dari AbstractSILRoutine dengan KeyableArraySILObject.

Di SIL, Anda memanggil SayHello2 seperti ini:

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

Di SayHello3 kami mengembalikan Peta:

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

Di SIL, Anda dapat memanggil SayHello3 seperti ini:

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

Dalam hal ini, kita mendapatkan elemen array bukan dengan indeks, tetapi dengan kunci.

Jika Anda melihat kode di Java, maka dalam kedua kasus kami bekerja dengan KeyableArraySILObject. Faktanya adalah bahwa dalam Daftar dan Peta SIL diimplementasikan oleh kelas KeyableArraySILObject. Itu setiap array di SIL dapat diakses baik dengan indeks atau dengan kunci.

Kami melewatkan array sebagai parameter


Kami dapat mengembalikan array dari fungsi SIL. Sekarang mari kita lihat bagaimana cara melewatkan array sebagai parameter.

Kode akan terlihat seperti ini:

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

Pertama, kita mendapatkan objek dari kelas GenericArraySILObject dari parameter, dan kemudian kita mendapatkan Map darinya.

Di SIL, Anda bisa meneruskan array seperti ini:

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

Itu menyimpulkan artikel ini. Saya harap Anda telah memperoleh cukup pengetahuan untuk menulis fungsi Anda di SIL.

All Articles