2012-08-01 36 views
1

我需要構建一個在運行時提取字段值的java服務。規範和規範文檔本身的領域路徑應作爲輸入。在運行時提取字段值的Java服務

例如: fromDoc由其中的子文檔組成, fromDoc /數據/參數/過時

•fromDoc 

    •Data 

     •Parameters 

      •outDate(string) 

對於inStringValues我請輸入爲 'fromDoc /數據/參數/過時'

輸出應該返回變量的值「fromDoc /數據/參數/ outDate'。

我有一個代碼,它實現了與鍵值對邏輯。

IDataCursor pipelineCursor = pipeline.getCursor(); 

     // fromDoc 
IData  fromDoc = IDataUtil.getIData(pipelineCursor, "fromDoc"); 
String[] inStringValues = IDataUtil.getStringArray(pipelineCursor, "inStringValues"); 
if (fromDoc == null) 
{ 
    return; 
} 
pipelineCursor.destroy(); 
int len = inStringValues.length; 
String[] outStrings = new String[len]; 
IDataCursor fromCursor = fromDoc.getCursor(); 
boolean hasData = false; 

while(fromCursor.next()) 
{ 
    for(int i=0;i<len;i++) 
    { 
     String key = fromCursor.getKey(); 
     String val = fromCursor.getValue().toString(); 
     if(key.equals(inStringValues[i])) 
     { 
      outStrings[i]=key + "," + val; 
     } 
    } 
} 

fromCursor.destroy(); 

IDataCursor pipelineCursor_1 = pipeline.getCursor(); 
IDataUtil.put(pipelineCursor_1, "outStrings", outStrings); 

pipelineCursor_1.destroy(); 

請讓我知道如何修改此代碼以實現上述邏輯? 或者讓我知道,如果任何人有你這樣的現有服務。

+0

我不明白 - 數據保存在一些數據庫中,在文件系統上,究竟在哪裏? – radai 2012-08-01 05:14:14

+0

@radai - 它基本上是一個即時訪問的規範文件 – yourdroid 2012-08-01 05:23:27

回答

0

這是怎麼回事?

// fromDoc 
    IDataCursor cursor = pipeline.getCursor(); 
    IData fromDoc = IDataUtil.getIData(cursor, "fromDoc"); 

    if (fromDoc == null) { 
     return; 
    } 

    // Data 
    cursor = fromDoc.getCursor(); 
    IData Data = IDataUtil.getIData(cursor, "Data"); 

    if (Data == null) { 
     return; 
    } 

    // Parameters 
    cursor = Data.getCursor(); 
    IData Parameters = IDataUtil.getIData(cursor, "Parameters"); 

    if (Parameters == null) { 
     return; 
    } 

    // outDate 
    cursor = Parameters.getCursor(); 
    String outDate = IDataUtil.getString(cursor, "outDate"); 

    // Here I have the outDate value 
1

Tundra有一個服務,它完全符合您的需求:tundra.document:get($document, $key)

  • $document是要提取
  • $key價值com.wm.data.IData文件要提取密鑰的名稱,可以是完全合格的,包括數組索引,例如"path/to/my[1]/key"

相關的Java代碼如下:

public static final void get(IData pipeline) throws ServiceException { 
    IDataCursor cursor = pipeline.getCursor(); 

    try { 
    IData document = IDataUtil.getIData(cursor, "$document"); 
    String key = IDataUtil.getString(cursor, "$key"); 
    IDataUtil.put(cursor, "$value", get(document, key)); 
    } finally { 
    cursor.destroy(); 
    }   
} 

// wrapper class for fully qualified IData keys 
public static class Key { 
    public static final String SEPARATOR = "/"; 
    public static final java.util.regex.Pattern INDEX_PATTERN = java.util.regex.Pattern.compile("\\[(-?\\d+?)\\]$"); 

    protected boolean hasIndex = false; 
    protected int index = 0; 
    protected String key = null; 

    public Key(String key) { 
    java.util.regex.Matcher matcher = INDEX_PATTERN.matcher(key); 
    StringBuffer buffer = new StringBuffer(); 
    while(matcher.find()) { 
     hasIndex = true; 
     index = Integer.parseInt(matcher.group(1)); 
     matcher.appendReplacement(buffer, ""); 
    } 
    matcher.appendTail(buffer); 
    this.key = buffer.toString(); 
    } 

    public boolean hasIndex() { 
    return hasIndex; 
    } 

    public int getIndex() { 
    return index; 
    } 

    public String toString() { 
    return key; 
    } 

    public static java.util.Queue<Key> parse(String key) { 
    String[] parts = key.split(SEPARATOR); 
    java.util.Queue<Key> queue = new java.util.ArrayDeque<Key>(parts.length); 

    for (int i = 0; i < parts.length; i++) { 
     queue.add(new Key(parts[i])); 
    } 
    return queue; 
    } 

    public static boolean isFullyQualified(String key) { 
    return key != null && (key.contains(SEPARATOR) || INDEX_PATTERN.matcher(key).find()); 
    } 
} 

// returns the value associated with the given key from the given IData document 
public static Object get(IData input, String key) { 
    Object value = null; 
    if (input != null && key != null) { 
    // try finding a value that matches the literal key 
    IDataCursor cursor = input.getCursor(); 
    try { 
     value = IDataUtil.get(cursor, key); 
    } finally { 
     cursor.destroy(); 
    } 

    // if value wasn't found using the literal key, the key could be fully qualified 
    if (value == null && Key.isFullyQualified(key)) value = get(input, Key.parse(key)); 
    } 

    return value; 
} 

// gets a value from an IData document with a fully qualified key 
protected static Object get(IData input, java.util.Queue<Key> keys) { 
    Object value = null; 

    if (input != null && keys != null && keys.size() > 0) { 
    IDataCursor cursor = input.getCursor(); 
    Key key = keys.remove(); 

    if (keys.size() > 0) { 
     if (key.hasIndex()) { 
     IData[] array = IDataUtil.getIDataArray(cursor, key.toString()); 
     value = get(get(array, key.getIndex()), keys); 
     } else { 
     value = get(IDataUtil.getIData(cursor, key.toString()), keys); 
     } 
    } else { 
     if (key.hasIndex()) { 
     Object[] array = IDataUtil.getObjectArray(cursor, key.toString()); 
     value = get(array, key.getIndex()); 
     } else { 
     value = IDataUtil.get(cursor, key.toString()); 
     } 
    } 
    cursor.destroy(); 
    } 

    return value; 
} 

public static <T> T get(T[] array, int index) { 
    T item = null; 

    if (array != null) { 
    // support reverse/tail indexing 
    if (index < 0) index += array.length; 

    item = array[index]; 
    } 

    return item; 
} 

注:Tundra也有一個補充服務,用於設置com.wm.data.IData文檔中的值:tundra.document.put($document, $key, $value)