2011-08-08 3 views
1

私はps3メディアサーバー(http://www.w3.org/)のビジネスコードをGUIから分離するために、 /www.ps3mediaserver.org/)。このため私はsource forge(http://sourceforge.net/projects/pms-remote/)でホストされているプロジェクトを持っています。クライアントは、サーバーへの接続権を持つネットワーク内の任意の場所からサーバーを構成するための単純なフロントエンドでなければなりません。クライアントと接続するときにサーバーマシンのファイルシステムをブラウズする方法(Java)

サーバー側では、すべてのサービスがjavax.jwsを使用して公開されており、クライアントプロキシはwsimportを使用して生成されています。

現在の機能(実際には唯一のブロック機能)の特徴の1つは、サーバーによって共有されるフォルダを定義することです。クライアントとサーバーが同じマシン上で単一のアプリケーションとして実行されているので、ファイルシステムを参照するのは簡単です。

問題:サーバーマシンのファイルシステムをWebサービスを通じて公開したいと思います。これにより、使用可能なフォルダを表示したり、メディアサーバーに表示されるものを選択するために、クライアント(Java Swingを使用している元のものと同じです)を使用できます。最後に私が興味を持っているのは、絶対フォルダパス(文字列)だけです。

私はこの機能を私に与えるライブラリがあると思いましたが、何も見つかりませんでした。 UNCパスを使用してファイルをブラウズし、離れたマシンにアクセスすることは、ユーザーにとって透過的ではないため、実行可能ではないようです。

今のところ私はセキュリティ上の問題を心配したくはありませんが、残りのことが実現したら、これを把握していきます。

私はどんな入力にも感謝します。 ありがとう、フィリップ

答えて

2

私は結局、すべてのルートフォルダまたはすべての子フォルダを特定のパスのリストにする非常に簡単なWebサービスを作成しました。 このサービスにアクセスするには、(GUI)ブラウザを使用する必要があります。これを使用したい人のために

package net.pms.plugin.webservice.filesystem; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

import net.pms.plugin.webservice.ServiceBase; 

@WebService(serviceName = "FileSystem", targetNamespace = "http://ps3mediaserver.org/filesystem") 
public class FileSystemWebService extends ServiceBase { 

    @WebMethod() 
    public List<String> getRoots() { 
     List<String> roots = new ArrayList<String>(); 
     for(File child : File.listRoots()) { 
      roots.add(child.getAbsolutePath()); 
     } 
     return roots; 
    } 

    @WebMethod() 
    public List<String> getChildFolders(@WebParam(name="folderPath") String folderPath) throws FileNotFoundException { 
     List<String> children = new ArrayList<String>(); 
     File d = new File(folderPath); 
     if(d.isDirectory()) { 
      for(File child : d.listFiles()) { 
       if(child.isDirectory() && !child.isHidden()) { 
        children.add(child.getAbsolutePath()); 
       } 
      } 
     } else { 
      throw new FileNotFoundException(); 
     } 
     return children; 
    } 
} 

、ここServiceBaseクラスは同様だ

package net.pms.plugin.webservice; 

import javax.xml.ws.Endpoint; 

import org.apache.log4j.Logger; 

public abstract class ServiceBase { 
    private static final Logger log = Logger.getLogger(ServiceBase.class); 
    protected boolean isInitialized; 

    /** 
    * the published endpoint 
    */ 
    private Endpoint endpoint = null; 

    /** 
    * 
    * Start to listen for remote requests 
    * 
    * @param host ip or host name 
    * @param port port to use 
    * @param path name of the web service 
    */ 
    public void bind(String host, int port, String path) { 
     String endpointURL = "http://" + host + ":" + port + "/" + path; 
     try { 
      endpoint = Endpoint.publish(endpointURL, this); 
      isInitialized = true; 
      log.info("Sucessfully bound enpoint: " + endpointURL); 
     } catch (Exception e) { 
      log.error("Failed to bind enpoint: " + endpointURL, e); 
     } 
    } 

    /** 
    * Stop the webservice 
    */ 
    public void shutdown() { 
     log.info("Shut down " + getClass().getName()); 
     if (endpoint != null) 
      endpoint.stop(); 
     endpoint = null; 
    } 

} 
+0

これはもっと優雅です。あなたは文脈を詳しく説明できますか? – trashgod

+0

ありがとうございます。クライアントはフォルダツリー自体を作成しなければならないので、もっと知性を持たなければならないだろうが、それはクライアントがさまざまなテクノロジー(Java、ネット、Web、豊富な...)を使用できるソリューションに内在している。 私は離れたマシンで動作している可能性のあるクライアントから(サーバ上にある)共有フォルダを設定する必要がありました。これはあなたが文脈で守っていることですか? – Philippe

+0

間接;私は、Java(XMLベース)Webサービスではなく、Java Web Startの 'javax.jws'の' jws'部分を間違えました。 [tag:web-services]タグを追加します。 – trashgod

1

クライアントから、あなたはsmbclient -Lの出力を利用することができます。サーバー上では、適切なservletが該当する可能性があります。

+0

それはそこには、よりエレガントなものであるべきかのように思えます。 – trashgod

関連する問題