Yapılandırma Düğümleri

Bellekte, yapılandırma şu şekilde kullanılarak ifade edilmektedir ConfigurationNodes. A ConfigurationNode ya bir değer taşır (bir sayı, dize veya liste gibi) yada alt düğümler, ağaç gibi bir yapılandırma yapısı vardır.Bir :javadoc:`ConfigurationLoader`kullanırken, yüklemek veya yeni yapılandırmalar oluşturmak için, **kök düğümü**döndürür. Her zaman bir yerde depolanan kök düğümü için bir referans saklamanız önerilir.

Not

Kullanılan ConfigurationLoader` a bağlı olarak, hatta normal ``ConfigurationNode davranışa ek olarak CommentedConfigurationNode yapılandırma dosyasında kalması sağlanacak açıklama tutabilen bir ConfigurationNode bile tutabilirsiniz.

Değerler

Temel Özellikler

Int, doubl, boolean veya String gibi temel değer türlerinin her biri kendi getter yöntemi vardır ve bu düğümler bir değer içermiyorsa öntanımlı değere döndürürler. Sunucu yöneticisi eklentimiz ile``modules.blockCheats.enabled`` yolundaki değere bakarak blockCheats modülü etkinleştirip etkinleştirmeyeceğini kontrol edelim.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();

Evet, aslında bu kadar kolay. Yukarıdaki örneğe benzer, ConfigurationNode#getInt(), ConfigurationNode#getDouble() yada ConfigurationNode#getString() metodlar var olan bu tür bir değeri uygun şekilde almanızı sağlar.

Bir düğüme temel değer ayarlamak için sadece ConfigurationNode#setValue(Object) yöntemini kullanın. Bir Object kabul ettiğine şaşırmayın - bu, kendi başına nasıl ilerleyeceğini belirleyecek ve her şey alabileceği anlamına gelir.

BlockCheats modülünün bir kullanıcı komutu tarafından devre dışı bırakıldığını düşünün. Bu değişikliğin yapılandırmaya yansıması gerekir ve şu şekilde yapılabilir:

rootNode.getNode("modules", "blockCheats", "enabled").setValue(false);

Uyarı

Temel değer türleri dışında bir şey bu temel işlevleri tarafından işlenemez ve bunun yerine okuma ve yazma, aşağıda açıklanan (de)serializing yöntemleri seri hale getirmede kullanılır. Temel türler, yerel olarak``ConfigurationLoader`` tarafından kullanılan dosya biçiminin temel uygulaması tarafından işlenen türlerdir ancak genellikle basit veri türler, Strings yada``List``s ve Maps temel türleri içerir.

(De)Serialization

Yukarıda belirtilen temel türlerinden biri olmayan bir nesneyi okumaya veya yazmaya çalışırsanız, önce bu nesneyi serileştirme işleminden geçirmeniz gerekir. ConfigurationNode kökünü oluşturmak için kullanılan ConfigurationOptions bir derlemesi vardır. Bu TypeSerializers yapılandırmada nesnelerini ConfigurationNode ve tersine dönüştürmede kullanılır.

Yapılandırmaya ne tür iş yapılacağını söylemek için`` TypeToken``’a guava sağlamamız gerekir.``towns.aFLARDia.mayor`` yapılandırma düğümünden UUID adlı bir oyuncuyu okumak istediğimizi düşünün. Bunu yapmak için, UUID sınıfını temsil eden bir TypeToken sağlarken getValue() yöntemini çağırmamız gerekir.

import java.util.UUID;

UUID mayor = rootNode.getNode("towns", "aFLARDia", "mayor").get(TypeToken.of(UUID.class));

Bu komut istemi yapılandırmalar UUIDs ler için uygun TypeSerializer ‘ı bulmasını ister ve daha sonra saklanan değeri bir UUID haline dönüştürmek için kullanır. `` TypeSerializer`` (ve yukarıdaki yöntem) eksik veya geçersiz verilerle karşılaşırsa bir ObjectMappingException atabilir.

Şimdi eğer yeni bir UUID``yapılandırma düğümü yazmak istersek, sözdizimi birbirine çok benzer. Seri hale getirmek istediğiniz nesne ve ``TypeToken ile setValue() yöntemini kullanın.

rootNode.getNode("towns","aFLARDia", "mayor").setValue(TypeToken.of(UUID.class), newUuid);

Not

Bir değeri seri hale getirmek verilen TypeToken için TypeSerializer bulunmuyorsa ObjectMappingException bulunabilir.

UUID gibi basit sınıflar için statik TypeToken.of() yöntemini kullanarak yeni bir TypeToken oluşturabilirsiniz. Ancak, kullanmak istediğiniz sınıfın kendi tür parametrelerine sahip olması durumunda (örneğin,``Map<String,UUID>``) sözdizimi biraz daha karmaşık hale gelir. Çoğu durumda, tür parametrelerinin derleme zamanında tam olarak ne olduğunu bilirsiniz, böylece yalnızca TypeToken’i anonim bir sınıf olarak oluşturabilirsiniz: new TypeToken<Map<String,UUID>>() {}. Bu şekilde, jenerik tipler bile rahatça yazılabilir ve okunabilir.

Ayrıca bakınız

TypeTokens hakkında daha fazla bilgiyi, guava dökümanları gösterir.

Bu metodları kullanarak serileştirilebilen türler:

  • Herhangi bir temel değer (yukarıya bakın)

  • Herhangi bir List veya Map serileştirilebilen türler

  • Java.util.UUID, java.net.URL, java.net.URI ve java.util.regex.Pattern tipleri

  • Gösterildiği gibi serileştirilmiş bütün :doc:` yapılandırılmış serileştirme sayfası <serialization>`:doc

Varsayılan

Sponge API farklı olarak, yapılandırma kitaplığında bulunmayan ancak boş olmayan değerler için Optional işlevi kullanılmaz. Basit yöntemler (getBoolean() veya getInt() gibi) getter’leri false veya 0 döndürebilirken, bir nesneyi döndürecek olan (getString()) herhangi bir değer mevcut değilse `` null`` döndürür. Bu özel durumları manuel olarak kullanmak istemiyorsanız, default values kullanabilirsiniz. Yukarıda bahsedilen her bir getXXX () yöntem varsayılan olarak ek bir parametre kabul eden aşırı yüklenmiş bir forma sahiptir.

Bir boolean değerini tekrar okuma için örneğine bir göz atalım.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean();

Bu çağrı, false değeri yapılandırmaya kaydedilirse veya değer yapılandırmada mevcut değilse false döndürülür. Bu iki durum birbirinden ayırt edilemezse değişkenimizi false olarak ayarlamak kolay değildir, ancak bu sadece yapılandırmada belirtilen değerdir. Varsayılan değer olarak true belirtilmediği takdirde.

boolean shouldEnable = rootNode.getNode("modules", "blockCheats", "enabled").getBoolean(true);

Benzer şekilde, yapılandırmadan aldığınız herhangi bir değere varsayılan değerler atayabilirsiniz, böylece tüm değerin yokluğundan kaynaklanan `` null`` dönüşlerinden veya ObjectMappingException``dan kaçınırsınız. Ayrıca, kaldırıcı olan ``getValue() yöntemi üzerinde de çalışır. Bazı örnekler:

String greeting = rootNode.getNode("messages", "greeting").getString("FLARD be with you good man!");

UUID mayor = rootNode.getNode("towns", "aFLARDia", "mayor")
                        .getValue(TypeToken.of(UUID.class), somePlayer.getUniqueId());

Bu varsayılanların bir diğer kullanışlı yönü, gerekirse yapılandırmanıza kopyalanabilmesidir. Kök yapılandırma düğümünüzün yapımı sırasında, setShouldCopyDefaults(true) ile ``ConfigurationOptions``larınızı oluşturabilirsiniz. Daha sonra, bir varsayılan değer verdiğinizde, yapılandırma öncesi almaya çalıştığınız değerin mevcut olup olmadığını kontrol edecek ve eğer değer yoksa, düğmeye varsayılan değerinizi yazacaktır.

Eklentinizin ilk kez çalıştığını ve yapılandırma dosyası henüz mevcut olmadığını varsayalım. Varsayılan değerlerin kopyalanmasına izin veren ve yapılandırma düğümünü ConfigurationOptions ile yüklemeyi deneyin. Şimdi rootNode.getNode("modules", "blockCheats", "enabled").getBoolean(true) satırını çalıştırın. Düğüm henüz mevcut olmadığından, yapılandırma bunu oluşturur ve onu döndürmeden önce ConfigurationOptions uyarınca``true`` değerini yazar. Yapılandırma tamamlandığında, true değeri açıkça ayarlanmadan düğüm mevcut olarak devam edecektir.