2012-02-28 15 views
2

は、一般的なVMware構成ファイルの以下の部分を考慮してください(* .vmxファイル):Javaプロパティファイルで指定されたBeanを逆シリアル化する方法は?

memsize = "2048" 
MemTrimRate = "-1" 
mks.enable3d = "TRUE" 
nvram = "Windows Server 2003 Standard Edition.nvram" 
pciBridge0.pciSlotNumber = "17" 
pciBridge0.present = "TRUE" 
pciBridge4.functions = "8" 
pciBridge4.pciSlotNumber = "18" 
pciBridge4.present = "TRUE" 
pciBridge4.virtualDev = "pcieRootPort" 
pciBridge5.functions = "8" 
pciBridge5.pciSlotNumber = "19" 
pciBridge5.present = "TRUE" 
pciBridge5.virtualDev = "pcieRootPort" 
pciBridge6.functions = "8" 
pciBridge6.pciSlotNumber = "20" 
pciBridge6.present = "TRUE" 
pciBridge6.virtualDev = "pcieRootPort" 
pciBridge7.functions = "8" 
pciBridge7.pciSlotNumber = "32" 
pciBridge7.present = "TRUE" 
pciBridge7.virtualDev = "pcieRootPort" 
replay.filename = "" 
replay.supported = "FALSE" 
roamingVM.exitBehavior = "go" 

この構成を観察することによって、人は次のシグネチャでPciBridgeのJava Beanタイプを想像することができます:

class PciBridge 
{ 
    public int pciSlotNumber; // or public int getPciSlotNumber(){...} and public void setPciSlotNumber(int v){...} 
    public boolean present; // or get/is/set methods 
    public int functions;  // or get/set methods 
    public String virtualDev; // or get/set methods 
} 

public <T> List<T> getObjects(final String prop, Class<T> clazz); 

また、VMXファイルを読み込むための責任を負う構成マネージャは、次のメソッドを公開かもしれません3210

上記の設定では、getObjects("pciBridge", PciBridge.class)を呼び出すと、コンフィグレーションで指定されたPciBridgeオブジェクトすべてのリストが返されます。

この機能を実装するにはどうすればよいですか?もちろん、私はいくつかの異なる製品で同じパターンを見てきました。そこで、この機能を実装する準備が整っているはずです。

アイデア?

ありがとうございました。

EDIT

修正 - 私はVMWareのは、(二重引用符が冗長である)は、Javaプロパティファイル形式を利用しますが、精神は同じであることを主張しません。また、同じパターンを利用する適切なJavaアプリケーションがあります。

答えて

1

私自身のソリューションを投稿しています。コードは、豆に反映するhttp://commons.apache.org/beanutils/と($ {}構文を使用してプロパティ参照をサポートするため)プロパティベースの設定を管理するhttp://commons.apache.org/configuration/に依存します。

public static <T> Collection<T> getBeans(String prop, Class<T> clazz) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
    Pattern pattern = Pattern.compile("^" + prop.replace(".", "\\.") + "(\\d*)\\.(\\w+)$"); 
    Map<String, T> beans = new TreeMap<String, T>(); 
    @SuppressWarnings("rawtypes") 
    Map description = null; 
    T tmpBean = null; 
    Iterator<String> itKeys = m_propStore.getKeys(); 
    while (itKeys.hasNext()) { 
    String key = itKeys.next(); 
    Matcher matcher = pattern.matcher(key); 
    boolean matchFound = matcher.find(); 

    if (matchFound) { 
     if (description == null) { 
     tmpBean = clazz.newInstance(); 
     description = BeanUtils.describe(tmpBean); 
     } 

     String beanPropName = matcher.group(2); 
     if (description.containsKey(beanPropName)) { 
     String beanKey = matcher.group(1); 
     T bean = beans.get(beanKey); 
     if (bean == null) { 
      bean = tmpBean == null ? clazz.newInstance() : tmpBean; 
      tmpBean = null; 
      beans.put(beanKey, bean); 
     } 
     try { 
      BeanUtils.setProperty(bean, beanPropName, m_propStore.getString(key)); 
     } catch (Exception e) { 
      m_logger.error(String.format("[SystemConfiguration]: failed to set the %s.%s bean property to the value of the %s configuration property - %s", 
      bean.getClass().getName(), beanPropName, key, e.getMessage())); 
     } 
     } 
    } 
    } 
    return beans.values(); 
} 
関連する問題