26 Eyl 2010

Android .Net Web Servis bağlantısı

Merhaba,

Android uygulamamızın .Net Web Servisi ile haberleşmesine bir örnek yapacağız.
Android uygulamamızda butona basıldığında Edittext'imizde web servisimizden gelecek olan cevabı yazmasını sağlayacağız.

Önce .Net web servisimizin örnek kodları
using System.ComponentModel;
using System.Data;
using System.Web.Services;

namespace WebService1
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://192.168.1.10/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        
    }
}

Burada dikkat etmemiz gereken noktalardan birisi [WebService(Namespace= http://192.168.1.10/)] dir. Namespace alanı java tarafında isim olarak kullanılacaktır.

IIS'e web servisimizi publish ettikten sonra bendeki IIS de http://192.168.1.10/HelloService.asmx şeklinde web servis çalışmaktadır bu da bir diğer önemli noktadır.

Web Servisimizde HelloWorld metodunu çağırdığımızda SOAP mesajı olarak bize cevap dönmektedir.

Android tarafına gelirsek
Burada da dikkat edilecek bir nokta ksoap2 kütüphanesinin (jar) projeye import edilmesi gereklilidir. Buradaki linkten android için olanı indirebilirsiniz.

java kodlarımız
Ekran için kodlar
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/edt_goster"
    />
    <Button
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/btn_goster"
    />
</LinearLayout>


Ayrıca manifest dosyasına
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
satırını eklemeyi unutmuyoruz, çünkü bu uygulamızın internet erişimine açılmasını sağlamaktadır.
Manifest dosyamız
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.mustafayildirim.android.example.webservice"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest> 

Uygulamaya ait java kaynak kodları:
package org.mustafayildirim.android.example.webservice;

import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.ksoap2.*;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.xmlpull.v1.XmlPullParserException;

public class main extends Activity {
    /** Called when the activity is first created. */

    private static final String SOAP_ACTION = "http://192.168.1.10/HelloWorld";
    private static final String METHOD_NAME = "HelloWorld";
    private static final String NAMESPACE = "http://192.168.1.10/";
    private static final String URL = "http://192.168.1.10/HelloService.asmx";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button btn_goster = (Button) findViewById(R.id.btn_goster);
        final EditText edt_goster = (EditText) findViewById(R.id.edt_goster);

        btn_goster.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
                envelope.dotNet = true;
                envelope.setOutputSoapObject(request);

                AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);

                SoapPrimitive result = null;
                try {
                    httpTransport.call(SOAP_ACTION, envelope);
                    result = (SoapPrimitive) envelope.getResponse();
                    edt_goster.setText(result.toString());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    edt_goster.setText(e.getMessage());
                } catch (XmlPullParserException e) {
                    // TODO Auto-generated catch block
                    edt_goster.setText(e.getMessage());
                }

            }

        });

    }
}

Burada SOAP_ACTION uygulamamıza gelen soap mesajı parse edilirken burayı dikkate alır.
Android emülatorü kendisi localhost'u kullandığı için IP yerine localhost yazarsanız hata alacak ya da çalışmayacaktır.

.Net Web Servisi ekran görüntüsü















Android tarafı ekran görüntüsü
















Buradaki linkte .Net web servisi örneği mevcuttur.
Buradaki linkte Android uygulaması örneği mevcuttur.

16 Eyl 2010

Windows Servislerde admin olmayan kullanıcılar için yetki verilmesi

Bugün yaşadığımız bir sorunda sunucuda bir windows servisin normal bir kullanıcı tarafından restart edildiğinde sorun yaşadığını servisin çalışmadığını öğrendik yaptığım bir kaç araştırmada sorunun şu şekilde çözülebiliceğini buldum.

SUBINACL /SERVICE \\MachineName\ServiceName /GRANT=[DomainName\]UserName[=Access] 
Grant ile verilebilecek izinler
   F : Full Control
   R : Generic Read
   W : Generic Write
   X : Generic eXecute
   L : Read controL
   Q : Query Service Configuration
   S : Query Service Status
   E : Enumerate Dependent Services
   C : Service Change Configuration
   T : Start Service
   O : Stop Service
   P : Pause/Continue Service
   I : Interrogate Service 
   U : Service User-Defined Control Commands

Örnek olarak ise:
SUBINACL /SERVICE \\SunucuAdı\ServisAdı /GRANT=[DomainName\]UserName[=Access] 
SUBINACL /SERVICE \\Websunucu\w3svc /GRANT=ornekDomain\kullanciAdi=TO
Burada kullanıcımıza servisi stop,start edebilme yeteneği verdik.

Buradaki linkte detaylı açıklama mevcuttur

15 Eyl 2010

Documentum'dan dosya alma ve dosya ekleme

Documentumda repository'e dosya eklemek ve dosya almak için aşağıdaki kodlar kullanılabilir.


Dfs sınıfında Temel özelliklerin metotlar halinde sunulduğu yapı mevcuttur.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Emc.Documentum.FS.DataModel.Core.Context;
using Emc.Documentum.FS.Runtime.Context;
using Emc.Documentum.FS.Services.Core;
using Emc.Documentum.FS.DataModel.Core;
using Emc.Documentum.FS.DataModel.Core.Profiles;
using Emc.Documentum.FS.DataModel.Core.Properties;
using Emc.Documentum.FS.DataModel.Core.Content;
using System.IO;

namespace WindowsFormsApplication3
{
    class Dfs
    {
        string m_RepositoryName;
        string m_Username;
        string m_Password;
        
        public string Password
        {
          get { return m_Password; }
          set { m_Password = value; }
        }

        public string Username
        {
            get {return m_Username;}
            set { m_Username = value;}
        }
      
        public string Repository
        {
            get{ return m_RepositoryName; }
            set{m_RepositoryName = value;}
        }
        
        /// <summary>
        /// Create ServiceContext
        /// </summary>
        /// <param name="repository"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public IServiceContext createContext(String repository, String userName, String password)
        {
            //build context factory and an empty context
            ContextFactory cf = ContextFactory.Instance;
            IServiceContext context = cf.NewContext();

            //create a repository ID and seed it with the login credentials
            RepositoryIdentity repoIdent = new RepositoryIdentity(repository, userName, password, "");

            //seed the IServiceContext with the Repository ID
            context.AddIdentity(repoIdent);

            ContentTransferProfile ctp = new ContentTransferProfile();
            ctp.TransferMode = ContentTransferMode.UCF;
            context.SetProfile(ctp);
            
            return context;
        }
        /// <summary>
        /// Register the IServiceContent
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public IObjectService createObjectService(IServiceContext context)
        {
            //create a service factory and instantiate the IObjectService
            ServiceFactory sf = ServiceFactory.Instance;
            IObjectService objectService =
                sf.GetRemoteService<IObjectService>(context);
            return objectService;
        }

        public void createDocument(IObjectService objectService,String objName,String filePath)
        {
            //build object identity
            ObjectIdentity docIdent = new ObjectIdentity();
            docIdent.RepositoryName = Repository;

            //build data object, seed with object identity
            DataObject dataObj = new DataObject(docIdent, "dm_document");
            
            dataObj.Contents.Add(new FileContent(filePath, "jpeg"));

            Console.Out.WriteLine("Creating new PropertySet instance...");

            //build property set
            PropertySet propertySet = new PropertySet();
            propertySet.Set("object_name", objName);

            //seed data object with property set
            dataObj.Properties = propertySet;

            //build data package, seed with data object
            DataPackage dataPack = new DataPackage(dataObj);
            OperationOptions options = null;

            //call the create method
            objectService.Create(dataPack, options);

        }

        public void getDocumentIdFromPath(IObjectService objectService, string filePath) 
        {
            ObjectPath docPath = new ObjectPath(filePath);
            ObjectIdentity docIdentity = new ObjectIdentity(docPath, "doc_rep");
            ObjectIdentitySet docSet = new ObjectIdentitySet();
            docSet.AddIdentity(docIdentity);

            PropertyProfile profProfile = new PropertyProfile();
            profProfile.FilterMode = PropertyFilterMode.ALL_NON_SYSTEM;

            ContentProfile contentProfile = new ContentProfile();
            contentProfile.FormatFilter = FormatFilter.ANY;

            OperationOptions options = new OperationOptions();
            options.PropertyProfile = profProfile;
            options.ContentProfile = contentProfile;

            DataPackage returnPack = objectService.Get(docSet, options);

            DataObject docObject = returnPack.DataObjects.ElementAt(0);
            /*
            FileContent content = (FileContent)docObject.Contents.ElementAt(0);
            
            byte[] file = content.GetAsByteArray();
            String fileFormat = content.Format;
            */
            byte[] file = docObject.Contents.ElementAt(0).GetAsByteArray();
            using (FileStream fs = File.Create(@"c:\getirilenDosya.doc"))
            {
                fs.Write(file, 0, file.Length);
            }

        }

    }
}

Implementasyon sınıfı olarak bir form uygulamasında butona tıklanıldığında dosya ekleyen ve verilen path'teki dosyayı bilgisayara kaydeden uygulama yapılmıştır
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emc.Documentum.FS.DataModel.Core.Query;
using Emc.Documentum.FS.DataModel.Core;
using Emc.Documentum.FS.Services.Core;
using Emc.Documentum.FS.Runtime.Context;
using Emc.Documentum.FS.Services.Search;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        Dfs dfs = new Dfs();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            
            dfs.Repository = "documentumRepository";
            dfs.Username = "username";
            dfs.Password = "password";
            IServiceContext objServiceContext=  dfs.createContext(dfs.Repository, dfs.Username, dfs.Password);
            IObjectService objService=  dfs.createObjectService(objServiceContext);
            
            //Bilgisayardan alınan dosyanın documentuma atılması
            String filePath = "C:\\test_picture.jpeg";
            dfs.createDocument(objService, "DosyaAdi",filePath);
            
            //Documentumda Path'i verilen dosyanın bilgilerini bilgisayarda belirttiğimiz yere aktarıyor.
            dfs.getDocumentIdFromPath(objService, "/dmadmin/mstDocument");
        }

    }
}

3 Eyl 2010

Documentum için Process Builder kurulumu hatası

Process Builder kurarken .An unhandled error occurred -- specify system property "is.debug" for more information hatasını alırsanız, bilgisayarınız dilini ingilizce olarak değiştirip kurulum yapmayı tekrar deneyin.

17 Ağu 2010

Doküman Yönetim Sistemi ve Documentum

Aradan geçen 4 ay boyunca Sistemcilikten Yazılımcılığa geçiş yaptım. Sistemci olarak geçirdiğim 8 ayı değerlendirirsek; Windows ve Linux (RedHat,Solaris) işletim sistemleri hakkında azda olsa sistem yöneticiliği yapacak kadar bilgi öğrendim.
Uygulama sunucular dünyasına derinlemesine bir dalış yaparak IIS,Apacahe,Tomcat ve Oracle Application Server 10g deneyimlerim oldu. Sanal sunucular (VmWare) konusunda çalıştım, Telefon Bankacılığı sistem altyapısı (Nortel) hakkında bilgilendim, Banksoft'un kartlı ödeme sistemleri ile ilgili bilgiler edindim.
Aslında devam etsem alan çok genişti. Ülkenin en fazla kâr eden bankasının (ZiraatBank) sistem yöneticiliğini yaptım. Güzel bir 8 aydı, yeri geldi gece uykusuz kaldım yeri geldi yılbaşı günü çalıştım, zaman zaman sorunlar yarattım, sorunlar çözdüm zor ama bir o kadarda eğlenceli bir iş Sistem Yöneticiliği.

Gelelim bundan sonraki döneme, şu an yazılım altyapısı geliştiren ekibe katıldım, .NET ile yazılım geliştirmeye başladım şu anki proje bankaya EMC-Documentum Doküman Yönetim Sistemini Entegre etmek ve geliştirmelerde bulunmak, yeni bir konu benim için doküman yönetimi şimdilik eğitimlere katılıyorum. Toplamda 4-5 hafta sürecek olan bu eğitimlerin bitiminden sonra doküman yönetim sistemlerini anlamış olacağımı düşünüyorum.

Farklı bir alanda kariyerime başladım istediğim ama bilmediğim bir yöne doğru kaydı, sonraki dönemde de farklı bir şeyler olacağını düşünüyorum.

EMC-Documentum; Java altyapısı ile yazılmış, dokumanların meta-bilgilerini veritabanında saklayıp dokümanların kendilerini bir file-storage üzerinde tutuyor.
Java Web Servisleri yardımı ile sisteme entegre yazılımlar geliştirilebilir. MS Office ürünleri ile neredeyse tam uyumlu, Word de doküman oluşturup Check-In yaptığınızda dosya sisteme direk olarak eklenebiliyor. (check-out: dosyayı kendi üzerinize almak, check-in: dosyayı sunucuya göndermek) Web tabanlı erişim için WebTop veya TaskSpace kullanılabilir. Geliştirmeler Eclipse'in özelleştirilmiş hali olan Composer ile yapılır. Deploy etmek 3-4 tıklama ile oluyor. Sistemde 64 üzeri 8 adet farklı dosya saklanabiliyor.

Documentum'u öğrendikçe çeşitli bilgiler aktaracağım.

14 Nis 2010

Gelecek

1.Mobile (mobile yönelik)
2.Location-Based (konum tabanlı)
3.Advertising (reklamcılık) ya da Fun (Eğlenceye yönelik)