Makale Özeti

Bir önceki makalemizde Site ve SiteCollection üzerindeki Feature'lar üzerinde durmuş ve Feature'lar üzerinde programatik olarak bir kaç işlem gerçekleştirmiştik. Bu makalemizde Farm düzeyinde Feature'ları listeleyip hangilerinin belirtilen SiteCollection'da kullanıp kullanılmadığına göz atıyor olacağız.

Makale

Bir önceki makalemizde Feature ve Feature Definition kavramları üzerinde durmuştuk, Feature Definition bir önceki makaleden de hatırlanacağı üzere Farm düzeyinde Feature'ın tanımlaması ve Feature ise Farm düzeyindeki Feature Definition'ın Site'lar ve SiteCollection'larda kullanılan hali olarak tanımlanmaktadır. Bu makalede Farm düzeyinde kullanılan Feature'ları ve bunlardan hangilerinin belirtilen SiteCollection'da kullanıldığını listeleyen bir uygulama yazıyor olacağız. Makalenin ilerleyen bölümlerinde de listelemenin ardından SiteCollection'da kullanılan Feature'ları pasif hale getirip, Farm düzeyindekilerden bazılarını da aktif hale getirebiliyor olacağız.

Uygulamaya geliştirmeye başlamak için Visual Studio'da yeni bir Windows Application projesi açalım ve Microsoft.SharePoint.dll isimli dll'i referans olarak ekleyip ardından da Microsoft.SharePoint ve Microsoft.SharePoint.Administration NameSpace'lerini ekleyelim. Gerekli NameSpace'ler eklendikten sonra Feature'ları ve FeatureDefinition'ları listelemek ve üzerlerinde işlem yapmak için aşağıdaki formu tasarlayalım. Form üzerinde SiteCollection'ın adresinin belirtilebilmesi için bir TextBox Farm düzeyinde belirtilen SiteCollection'da  kullanılmayan Feature Definition'ları listemek ve SiteCollection'da kullanılan Feature'ları listelemek üzere iki tane ListBox kontrolü bulunmaktadır. Kullanıcı Button'a tıkladığında gerekli işlemler yapılıp ListBox'lar dolduruluyor olacaktır.

Tasaranan Form'un Görüntüsü

Form tasarlandıktan sonra Feature'ların DisplayName'lerini ve ID'lerini tutmak üzere küçük bir sınıf ekleniyor. Eklenen sınıf'ın nesne örnekleri her iki ListBox'larda da kullanılıyor olacaktır. Oluşturulan sınıfın kodları aşağıda yer almaktadır.

 class Feature
{
     public string FeatureDisplayName { get; set; }
     public Guid FeatureID { get; set; }

     public Feature()
     {

     }

     public Feature(string displayName,Guid id)
     {
          FeatureDisplayName = displayName;
          FeatureID = id;
     }
}

Feature'ları taşıyacak olan sınıfta yazıldıktan sonra sıra geldi Feature'ları ve FeatureDefinition'ları listelemeye. Gerekli lisyelemeyi gerçekleştirmek için de ayrı bir metod yazılıp Button'a tıklandığında gerekli metodun çağrılması sağlanmaktadır. Metod ismi olarak FeatureSorgula() belirleyelim ve ardından metodu yazalım. Metodun kodları aşağıda yer almaktadır. FeatureSorgula() isimli metodun içinde üzerinde çalışılan Feature'ın SiteCollection'da kullanılıp kullanılmadığına göz atmak için başka bir metod daha kullanılmaktadır. İlk olarak FeatureAktifMi() isimli bu metodun kodlarını inceliyor olalım. Metodlar yazılmadan her iki metodda da kullanılmak üzerinde Form1'de bir field tanımlandı, bu field SiteCollection'ın nesne örneğini tutuyor olacaktır.

 SPSite _siteCollection;

 private bool FeatureAktifMi(SPFeatureDefinition fetDef)
{
     foreach (SPFeature feture in _siteCollection.Features)
     {
          if (feture.Definition.Id == fetDef.Id)
         {
               return true;
         }
     }

     return false;
}

Kodlar incelendiğinde metodun parametre olarak SPFeatureDefinition tipinden bir parametre aldığı görülmektedir. Bu parametre az sonra kodlarını inceleyecek olduğumuz FeatureSorgula isimli metod tarafından buraya gönderilmektedir. Aslında bu alandaki mantık son derece basittir, bir önceki makaleden de hatırlanacağı üzere Feature'ın ID'si Farm düzeyindeki tanımlamasının ID'si ile aynı olmaktaydı ve bu metodda SiteCollection'da gönderilen FeatureDefinition'ın ID'sinin olup olmadığını kontrol ediyor ve eğer bulursa geriye true bulamaz ise geriye false değer döndürüyor. Diğer metodda da işlemler buradan dönen sonuca göre farklılık gösterecektir. FeatureSorgula metodunun kodları ise aşağıda yer almaktadır.

 private void FeatureSorgula()
{
     labelSC.Text = textBoxSiteURL.Text + "'ın Feature'ları";
     string connectionString = "Data Source=.\\OFFICESERVERS;
     Initial Catalog=SharePoint_Config_c354912f-0a87-4f0d-95d4-b8f1f8e0a51e;
     Integrated Security=True";
     _siteCollection = new SPSite(textBoxSiteURL.Text);

    SPFarm farm = SPFarm.Open(connectionString);

     List<Feature> featureDefs = new List<Feature>();
     List<Feature> features = new List<Feature>();

     foreach (SPFeatureDefinition def in farm.FeatureDefinitions)
     {

           Feature f = new Feature(def.DisplayName, def.Id);
           if (FeatureAktifMi(def))
          {
               features.Add(f);
          }
          else
          {
               featureDefs.Add(f);
          }
     }

     listBoxFeature.DataSource = features;
     listBoxFeature.DisplayMember = "FeatureDisplayName";
     listBoxFeature.ValueMember = "FeatureID";

     listBoxFeatureDef.DataSource = featureDefs;
     listBoxFeatureDef.DisplayMember = "FeatureDisplayName";
     listBoxFeatureDef.ValueMember = "FeatureID";
}

Yukarıdaki kodlarda Farm'a bağlanmak için ilk olarak bir tane bağlantı cümlesi tanımlandı ve ardından da SPFarm sınıfının Open static metodu ile Farm'a bağlantı kuruldu. Ardından da bağlanılan farmın FeatureDefinitions özelliği aracılığı ile farm da bulunan definitionlar elde edilerek foreach döngüsü ile elde ediler Feature Definition'lar üzerinde gezinilmeye başlandı. Belirtilen ve bağlanılan Site Collection'un içerisine bulunmasına veya bulunmamasına göre iki ayrı Generic List'te feature'lar toplandı ve ilk başta hedeflendiği gibi iki ayrı ListBox içerisinde kullanıcıya gösterildi. Metodun yazılmasının ardınan Button'a çift tıklayarak click olayı ele alındı ve çalışacak metodun içerisinde FeatureSorgula() isimli metod çağrıldıkran sonra uygulama çalıştırılarak aşağıdaki görünüm elde edilebilir.

Uygulama çalıştıktan sonra Feature'ların listelenmesi

Feature'lar ve Feature Definition'lar da listelendikten sonra sıra geldi Feature'ları aktif ve pasif etmeye bu işlem için her iki ListBox'ın da DoubleClick olayları ele alınabilir. İlk olarak solda yer alan yani Farm'daki Feature Definition'ları listeleyen ListBox'ın DoubleClick olayını ele alıp aşağıdaki kodları yazıyor olalım. Bu kodlar üzerine çift tıklanan Feature Definition'ı SiteCollection'da aktif hale getiriyor olacaktır...

private void listBoxFeatureDef_DoubleClick(object sender, EventArgs e)
{
     _siteCollection.Features.Add(new Guid(listBoxFeatureDef.SelectedValue.ToString()));
     FeatureSorgula();
}

SiteCollection'daki Feature'ı pasif hale getirmek için ise sağ tarafta yer alan ve SiteCollection'lardaki Feature'ları listeyelen ListBox'ın DoubleClick olayı ele alınıp aşağıdaki kodlar yazılıyor olmalıdır.

 private void listBoxFeature_DoubleClick(object sender, EventArgs e)
{
     _siteCollection.Features.Remove(new Guid(listBoxFeature.SelectedValue.ToString()));
     FeatureSorgula();
}

Görüleceği üzere ListBox'ların içeriğinin yenilenmesi için her iki durum sonunda da FeatureSorgula() isimli metodu bir kez daha çalıştırdık. SiteCollection'ların Feature'larını yönetmek için MOSS ekranı yavaş geliyorsa bu küçük programcığı da bir alternatif olarak kullanabilirsiniz :) Bir sonraki makalede görüşmek dileğiyle.

Burak Batur
www.burakbatur.com
burak.batur@netron.com.tr

Uygulama Visual Studio 2008'de .NET Framework 3.5 şablonları seçilerek geliştirilmiştir....