2011-11-21 5 views
6

私たちのアプリケーションでは、プロパティファイルを非常に使用しています。私は数ヶ月以来、グアバを学び始めました。私はグアバを実際に多く気に入っていました。プロパティファイルからGuavaを使用してオブジェクトを作成する

Map<String, Datasource>を作成する最適な方法は何ですか?

プロパティファイルの形式は厳密ではありません。別の形式で表現すると変更できますか?

サンプルプロパティファイル:

datasource1.url=jdbc:mysql://192.168.11.46/db1 
datasource1.password=password 
datasource1.user=root 
datasource2.url=jdbc:mysql://192.168.11.45/db2 
datasource2.password=password 
datasource2.user=root 

答えて

5

Propertiesクラスは、順番に地図を実装ハッシュテーブルのサブクラスです。

あなたがしていつものようにそれをロードします。

Properties properties = new Properties(); 
    try { 
     properties.load(new FileInputStream("filename.properties")); 
    } catch (IOException e) { 
} 

編集:[OK]をので、あなたが<文字列、データソース>地図にそれを変換したい;)

//First convert properties to Map<String, String> 
Map<String, String> m = Maps.fromProperties(properties); 

//Sort them so that password < url < user for each datasource and dataSource1.* < dataSource2.*. In your case default string ordering is ok so we can take a normal treemap 
Map<String, String> sorted = Maps.newTreeMap(); 
sorted.putAll(m); 

//Create Multimap<String, List<String>> mapping datasourcename->[password,url, user ] 

    Function<Map.Entry<String, String>, String> propToList = new Function<String, Integer>() { 
     @Override 
     public String apply(Map.Entry<String, String> entry) { 
      return entry.getKey().split("\\.")[0]; 
     } 
    }; 

Multimap<Integer, String> nameToParamMap = Multimaps.index(m.entrySet(), propToList); 

//Convert it to map 
Map<String, Collection<String>> mm = nameToParamMap.asMap(); 

//Transform it to Map<String, Datasource> 
Map<String, Datasource> mSD = Maps.transformEntries(mm, new EntryTransformer<String, Collection<String>, DataSource>() { 
     public DataSource transformEntry(String key, Collection<String> value) { 
      // Create your datasource. You know by now that Collection<String> is actually a list so you can assume elements are in order: [password, url, user] 
      return new Datasource(.....) 
     } 
     }; 

//Copy transformed map so it's no longer a view 
Map<String, Datasource> finalMap = Maps.newHashMap(mSD); 

簡単な方法は、おそらくありますが、これはうまくいくはずです:

まだあなたはjsonまたはxmlで良いです。異なるファイルから異なるデータソースのプロパティを読み込むこともできます。

EDIT2:以下グアバ、より多くのJavaで:設定に使用しているファイルは厳密ではない場合

//Sort them so that password < url < user for each datasource and dataSource1.* < dataSource2.*. In your case default string ordering is ok so we can take a normal SortedSet 
SortedSet <String> sorted = new SortedSet<String>(); 
sorted.putAll(m.keySet); 

//Divide keys into lists of 3 
Iterable<List<String>> keyLists = Iterables.partition(sorted.keySet(), 3); 


Map<String, Datasource> m = new HashMap<String, Datasource>(); 
for (keyList : keyLists) { 
    //Contains datasourcex.password, datasroucex.url, datasourcex.user 
    String[] params = keyList.toArray(new String[keyList.size()]); 
    String password = properties.get(params[0]); 
    String url = properties.get(params[1]); 
    String user = properties.get(params[2]); 
    m.put(params[0].split("\\.")[0], new DataSource(....) 
} 
+0

私はこれを知っていますが、この後にあなたが作成することを提案していますMap Cemo

+0

私のソリューションでは、いくつかの行を保存することができます。私はそれらを残して、より読みやすいようにしました。 – soulcheck

+0

私は投票しました:)しかし、もう少し待っていたいと思います。ありがとう:)最初の質問の不明瞭なことに申し訳ありません。それは無視されたStackoverflow :) – Cemo

0

、あなたが定義のそれぞれで独立し保存するためにXMLファイルを使用することができます。

定義例:

<resources> 
<configuration> 
    <datasrouce> 
    <connection name="" url="" password="" user=""/> 
    <connection name="" url="" password="" user=""/> 
    </datasource> 
</configuration> 
</resources> 

使用して接続マネージャクラスあなただけの接続情報を取得するためにXMLを読み、接続のインスタンスを作成し、それらを疥癬ことができます。

6

最も簡単な方法は、JSONではなくプロパティは、このためにファイルを使用することが考えられます:

{ 
    "datasources": [ 
    { 
     "name": "datasource1", 
     "url": "jdbc:mysql://192.168.11.46/db1", 
     "user": "root", 
     "password": "password" 
    }, 
    { 
     "name": "datasource2", 
     "url": "jdbc:mysql://192.168.11.46/db2", 
     "user": "root", 
     "password": "password" 
    } 
    ] 
}

次に、あなただけのオブジェクトにそれを変換するために、このようなGsonとしてライブラリを使用することができます。

public class DataSources { 
    private List<DataSourceInfo> dataSources; 

    public Map<String, DataSource> getDataSources() { 
    // create the map 
    } 
} 

public class DataSourceInfo { 
    private String name; 
    private String url; 
    private String user; 
    private String password; 

    // constructor, getters 
} 

地図を取得するには:

Gson gson = new Gson(); 
Map<String, DataSource> dataSources = gson.fromJson(/* file or stream here */, 
    DataSources.class).getDataSources(); 
+0

アイデアとエレガントなソリューションのために私は投票しました。また、あなたが提案している解決策を使用するかもしれませんが、質問の答えに合うように私は別のものを選択します。 :)コリンのやり方では、私もあなたの大ファンです。 :)あなたの貢献に感謝します。しかし、私はまた、より良い学習のためにあなたのもう一つのすばらしい実装を見たいと思っていました。 ;) – Cemo

+0

@Sessizlikここで私のポイントは、仕事に適切なツールを使用することだと思います。ここには、読み込みたい構造化データがあります。プロパティファイルはフラットであり、構造をうまく表現しません。 Guavaはその事実を変えない。 Gson(偶然にもGoogleのJSON変換ライブラリ)が適切だと思われ、これは非常に簡単です。 – ColinD