2014-04-01 13 views
3

我正在開發Eclipse RPC項目。我需要保存和恢復所有視圖的所有內容。我沒有在我的項目中使用EMF,所以我不能使用所有的EMF API。如何使用EMF保存視圖部分

現在我能用什麼是IMementoIViewPartIMemento作爲參數具有saveState方法。

我正在調用saveState()並嘗試將其置於視野中。

示例代碼:

@Override 
public void saveState(IMemento memento) { 
    ColorBarModel model = _multiColorBarContainer.getColorBar().getColorBarUIModel().getModel(); 
    boolean isCutOff = _multiColorBarContainer.getColorBar().getColorBarUIModel().isCutOffEnabled(); 
    String colorMapName = model.getColorMap().getColorMapName(); 
    memento.putString("colorMapName", model.toString()); 
    memento.createChild("colorMapName1", model.toString()); 
    String selectionsMomento = memento.getString("colorMapName"); 
    IStructuredSelection ss = new StructuredSelection(memento.getChild("colorMapName1")); 
} 

我需要保存模型,它是類的引用(ColorBarModel.java是我的視圖模型),這樣我可以保存模型狀態,並在調用恢復。

IMemento只提供putString()createChild()方法

有人能指導我如何我可以保存類對象通過IMemento,並在需要時進行恢復?

我能夠保存該類的引用ID,但我不確定如何通過字符串形式通過referenceId獲取該類的屬性和行爲。

是否有可能以某種方式獲取?

+1

你需要什麼樣的信息存儲? IMemento僅適用於相對較少量的字符串。 –

+0

我想存儲整個模型信息,任何建議... – Arun

回答

0

如果你想保存大量的數據,你應該把它放在插件狀態的位置。你得到這個具有:

IPath path = Platform.getStateLocation(bundle); 

bundle是你的插件Bundle類。您可以使用

Bundle bundle = Platform.getBundle("plugin id"); 

狀態位置是在工作區.metadata/.plugins目錄從傳遞給插件激活的BundleContext或得到這個。只需使用普通的Java文件I/O操作即可在此位置讀取和寫入數據。

+0

感謝您的建議,但你可以plzzz詳細說明如何保存整個模型信息在Ipath中,我能夠找到捆綁包,但不知道如何存儲。這將是很大的幫助 – Arun

+0

我的模型包含大約10到20個變量,我需要存儲並希望在其他啓動時恢復。因此,這對我來說是一個乏味的事情。很不幸,我的項目不是emf模型,所以我不能使用EMF API; s :( – Arun

+0

我對你的代碼一無所知,所以我沒有看到我可以進一步提供建議 –

0

如果你懶,你可以使用谷歌GSON將模型轉換爲JSON並將其存儲爲字符串。 然後,您可以再次使用GSON從JSON字符串中加載定義的類。

0

IMemento提供了一個接口,使用層次結構將視圖狀態存儲在XML中。您可以:

  • 調用模型的方法,並嘗試以表示它在XML結構在磁盤上的視圖
  • 商店模型的init方法進行重建,並以某種方式引用它(例如:路徑)在紀念
  • 序列化的複雜對象的字節,將其轉換爲一個Base64 String並把它放在
0

我已經創建的類SimpleModelSerializer能夠輕鬆讀寫EMF模型的紀念並從不同的格式。使用readMementowriteMemento方法處理IMemento。該類可以很容易地擴展到其他格式。

它是最小,只能處理簡單的模型。以下是一些限制條件:

  • 非包含引用不處理
  • 不處理特徵值的分型輸入
  • EPackage必須位於全局包註冊表中。
  • 它可能只是在很多有效的模型上崩潰。
  • 未執行驗證。
  • 對擴展元數據的支持非常少。
  • 很多其他的事情...

儘管它是用於保存簡單的小事情,例如查看配置​​非常有用。

這是代碼:

/** 
* Contains code for reading and writing EMF models to and from other formats. 
*/ 
public class SimpleModelSerializer { 
    public interface ModelReader { 
     List<String> getMultiAttribute(String name); 
     String getAttribute(String name); 
     String getDefaultAttribute(String name); 
     List<ModelReader> getChildren(String name); 
    } 

    public interface ModelWriter { 
     void setAttribute(String name, String value); 
     void setDefaultAttribute(String name, String value); 
     void setMultiAttribute(String name, List<String> values); 
     ModelWriter createChild(String name); 
    } 

    @SuppressWarnings("unchecked") 
    private static void setFeature(EObject o, EStructuralFeature feature, Object value) { 
     if (feature.isMany()) { 
      ((List<Object>) o.eGet(feature)).add(value); 
     } else { 
      o.eSet(feature, value); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    private static List<?> getFeature(EObject o, EStructuralFeature feature) { 
     if (feature.isMany()) { 
      return (List<Object>) o.eGet(feature); 
     } else { 
      return Collections.singletonList(o.eGet(feature)); 
     } 
    } 

    public static <T extends EObject> T readMemento(IMemento mem, EClass cls, Class<T> instCls, ExtendedMetaData meta) { 
     return readCastedObject(cls, instCls, new MementoReader(mem), meta); 
    } 

    public static <T extends EObject> List<T> readMementos(IMemento mem, String name, EClass cls, Class<T> instCls, ExtendedMetaData meta) { 
     return readObjects(cls, instCls, new MementoReader(mem), name, meta); 
    } 


    public static <T extends EObject> List<T> readObjects(EClass cls, Class<T> instCls, ModelReader reader, String name, ExtendedMetaData meta) { 
     List<T> result = new ArrayList<>(); 
     for (ModelReader childReader : reader.getChildren(name)) { 
      result.add(instCls.cast(readObject(cls, childReader, meta))); 
     } 
     return result; 
    } 

    public static <T extends EObject> T readCastedObject(EClass cls, Class<T> instCls, ModelReader reader, ExtendedMetaData meta) { 
     return instCls.cast(readObject(cls, reader, meta)); 
    } 


    public static EObject readObject(EClass cls, ModelReader reader, ExtendedMetaData meta) { 
     if (meta == null) meta = ExtendedMetaData.INSTANCE; 

     EObject obj = EcoreUtil.create(cls); 

     for (EStructuralFeature feature : cls.getEAllStructuralFeatures()) { 
      if (feature.isTransient()) continue; 

      String name = meta.getName(feature); 

      List<Object> values = new ArrayList<>(); 

      if (feature instanceof EAttribute) { 
       EAttribute attr = (EAttribute) feature; 

       List<String> attrs; 
       if (attr.isMany()) attrs = reader.getMultiAttribute(name); 
       else if (name.equals(":0")) attrs = singletonList(reader.getDefaultAttribute(name)); 
       else attrs = singletonList(reader.getAttribute(name)); 

       for (String attrText : attrs) { 
        if (attrText != null) { 
         values.add(EcoreUtil.createFromString(attr.getEAttributeType(), attrText)); 
        } 
       } 
      } else if (feature instanceof EReference) { 
       EReference ref = (EReference) feature; 

       for (ModelReader childReader : reader.getChildren(name)) { 
        values.add(readObject(ref.getEReferenceType(), childReader, meta)); 
       } 
      } 

      for (Object value : values) { 
       setFeature(obj, feature, value); 
      } 
     } 

     return obj; 
    } 

    public static void writeMemento(IMemento mem, EObject o, ExtendedMetaData meta) { 
     writeObject(new MementoWriter(mem), o, meta); 
    } 

    public static void writeMementos(IMemento mem, String childName, Collection<? extends EObject> os, ExtendedMetaData meta) { 
     MementoWriter writer = new MementoWriter(mem); 
     for (EObject o : os) { 
      writeObject(writer.createChild(childName), o, meta); 
     } 
    } 


    public static void writeObject(ModelWriter writer, EObject obj, ExtendedMetaData meta) { 
     if (meta == null) meta = ExtendedMetaData.INSTANCE; 

     EClass cls = obj.eClass(); 

     for (EStructuralFeature feature : cls.getEAllStructuralFeatures()) { 
      if (feature.isTransient()) continue; 

      String name = meta.getName(feature); 

      if (feature instanceof EAttribute) { 
       List<String> outputValues = new ArrayList<>(); 
       for (Object e : getFeature(obj, feature)) { 
        if (!Objects.equals(e, feature.getDefaultValue())) { 
         String textValue = EcoreUtil.convertToString((EDataType) feature.getEType(), e); 
         outputValues.add(textValue); 
        } 
       } 

       if (feature.isMany()) { 
        writer.setMultiAttribute(name, outputValues); 
       } else if (!outputValues.isEmpty()) { 
        if (name.equals(":0")) { 
         writer.setDefaultAttribute(name, outputValues.get(0)); 
        } else { 
         writer.setAttribute(name, outputValues.get(0)); 
        } 
       } 
      } else if (feature instanceof EReference) { 
       for (Object value : getFeature(obj, feature)) { 
        if (value != null) { 
         writeObject(writer.createChild(name), (EObject) value, meta); 
        } 
       } 
      } 
     } 
    } 

    private static class MementoReader implements ModelReader { 
     private final IMemento memento; 

     public MementoReader(IMemento memento) { 
      this.memento = memento; 
     } 

     @Override 
     public String getDefaultAttribute(String name) { 
      return memento.getTextData(); 
     } 

     @Override 
     public String getAttribute(String name) { 
      return memento.getString(name); 
     } 

     @Override 
     public List<String> getMultiAttribute(String name) { 
      IMemento[] childMems = memento.getChildren(name); 
      List<String> attrs = new ArrayList<>(childMems.length); 
      for (IMemento mem : childMems) { 
       attrs.add(mem.getTextData()); 
      } 
      return attrs; 
     } 

     @Override 
     public List<ModelReader> getChildren(String name) { 
      return Arrays.stream(memento.getChildren(name)).map(MementoReader::new).collect(toList()); 
     } 
    } 

    private static class MementoWriter implements ModelWriter { 
     private final IMemento memento; 

     public MementoWriter(IMemento memento) { 
      this.memento = memento; 
     } 

     @Override 
     public void setAttribute(String name, String value) { 
      memento.putString(name, value); 
     } 

     @Override 
     public void setMultiAttribute(String name, List<String> values) { 
      for (String value : values) { 
       memento.createChild(name).putTextData(value); 
      } 
     } 

     @Override 
     public ModelWriter createChild(String name) { 
      return new MementoWriter(memento.createChild(name)); 
     } 

     @Override 
     public void setDefaultAttribute(String name, String value) { 
      memento.putTextData(value); 
     } 
    } 
} 
相關問題