Служба Java, которая извлекает значение поля во время выполнения

Мне нужно создать службу Java, которая извлекает значение поля во время выполнения. Путь к полю в каноническом и сам канонический документ нужно указать на вход.

Например: fromDoc состоит из поддокументов внутри него, в иерархии, т.е. fromDoc/Данные/Параметры/outDate

 •fromDoc

     •Data

        •Parameters

           •outDate(string)

Для inStringValues ​​я даю ввод как «fromDoc/Data/Parameters/outDate»

выходные данные должны возвращать значение переменной fromDoc/Data/Parameters/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();

Пожалуйста, дайте мне знать, как я могу изменить этот код для реализации вышеупомянутой логики? Или дайте мне знать, если у кого-то есть такая существующая услуга с вами.


person yourdroid    schedule 01.08.2012    source источник
comment
я не понимаю - данные хранятся в какой-то БД, в файловой системе, где именно?   -  person radai    schedule 01.08.2012
comment
@radai - это в основном канонический документ, к которому я обращаюсь   -  person yourdroid    schedule 01.08.2012


Ответы (2)


У Tundra есть служба, которая делает именно то, что вам нужно: tundra.document:get($document, $key).

  • $document — это com.wm.data.IData документ, из которого вы хотите извлечь значение
  • $key — это имя ключа, который вы хотите извлечь, оно может быть полным и включать индексацию массива, например "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).

person Lachlan Dowding    schedule 29.09.2012
comment
Как узнать, найден ключ или нет? Ключ может иметь значение null. Как вы различаете, когда ключ не найден и когда ключ имеет значение null. - person Farhan Shirgill Ansari; 10.12.2020

Что насчет этого ?

    // 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
person Teiva    schedule 12.08.2012