Встроенный интерпретатор
От: Аноним  
Дата: 04.04.06 05:18
Оценка:
Здравствуйте!

Допустим у меня есть некий JavaBean. Хочется написать метод вида:

boolean match(Object object, String criteria)


Строка criteria может выглядеть примерно так:

((name like "X%") or (name="XXX" and length=12))


name и length — свойства соответствующего бина

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

Во избежание совета пользоваться HQL скажу, что к БД задача не имеет никакого отношения
Re: Встроенный интерпретатор
От: Victor Repetsky Украина  
Дата: 04.04.06 06:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?


Оно?
SCJP, SCEA
Re[2]: Встроенный интерпретатор
От: Аноним  
Дата: 04.04.06 08:19
Оценка:
Здравствуйте, Victor Repetsky, Вы писали:

VR>Здравствуйте, Аноним, Вы писали:


А>>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?


VR>Оно?


Совершенно не оно :( У меня нет XML, у меня простые бины, и мне всего лишь нужно знать, какие из них удовлетворяют набору ограничений, а какие нет. Грубо говоря:

public class MyBean {
    
    String name;
    int length;
    
    public MyBean(String name, int length) {
        this.name = name;
        this.length = length;
    }

    public int getLength() {
        return length;
    }

    public String getName() {
        return name;
    }

}


И еще есть List<MyBean>, по которому мне надо написать аналог

select * from list where ((name like "X%") or (name="XXX" and length=12))


Задействовать СУБД, даже встараиваемую, очень не хочется
Re[3]: Встроенный интерпретатор
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 04.04.06 08:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>И еще есть List<MyBean>, по которому мне надо написать аналог


А>
А>select * from list where ((name like "X%") or (name="XXX" and length=12))
А>


А>Задействовать СУБД, даже встараиваемую, очень не хочется


тогда josql
Re[3]: Встроенный интерпретатор
От: Victor Repetsky Украина  
Дата: 04.04.06 08:49
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Совершенно не оно У меня нет XML, у меня простые бины, и мне всего лишь нужно знать, какие из них удовлетворяют набору ограничений, а какие нет. Грубо говоря:


А>
А>public class MyBean {
    
А>    String name;
А>    int length;
    
А>    public MyBean(String name, int length) {
А>        this.name = name;
А>        this.length = length;
А>    }

А>    public int getLength() {
А>        return length;
А>    }

А>    public String getName() {
А>        return name;
А>    }

А>}
А>


А>И еще есть List<MyBean>, по которому мне надо написать аналог


А>
А>select * from list where ((name like "X%") or (name="XXX" and length=12))
А>


XML там не нужен. Читайте внимательней.

JXPath provides APIs for traversal of graphs of JavaBeans, DOM and other types of objects using the XPath syntax.


Этот пример будет примерно так

List<MyBean> list = ...;
JXPathContext context = JXPathContext.newContext( list );
Iterator it = context.iterate(".[(starts-with(@name,'X') or (@name='XXX' and @length = 12 )]");
while(it.hasNext()) {
   MyBean m = (MyBean)it.next();
}
SCJP, SCEA
Re: Встроенный интерпретатор
От: _javaman_  
Дата: 04.04.06 19:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!


А>Допустим у меня есть некий JavaBean. Хочется написать метод вида:


А>
А>boolean match(Object object, String criteria)
А>


А>Строка criteria может выглядеть примерно так:


А>
А>((name like "X%") or (name="XXX" and length=12))
А>


А>name и length — свойства соответствующего бина


А>Подскажите, может есть какие готовые инструменты, позволяющие упростить решение задачи и не писать свой парсер для criteria?


А>Во избежание совета пользоваться HQL скажу, что к БД задача не имеет никакого отношения


Groovy
BeanShell

Мож это поможет?
Re[4]: Встроенный интерпретатор
От: Аноним  
Дата: 21.04.06 06:41
Оценка:
Здравствуйте, Victor Repetsky, Вы писали:

VR>
VR>List<MyBean> list = ...;
VR>JXPathContext context = JXPathContext.newContext( list );
VR>Iterator it = context.iterate(".[(starts-with(@name,'X') or (@name='XXX' and @length = 12 )]");
VR>while(it.hasNext()) {
VR>   MyBean m = (MyBean)it.next();
VR>}
VR>


Не работает даже так:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.jxpath.JXPathContext;

public class JXPathTest {

    static private class MyBean {
        String name;
        int length;
        public MyBean(String name, int length) {
            this.name = name;
            this.length = length;
        }
        public int getLength() {
            return length;
        }
        public String getName() {
            return name;
        }
        public String toString() {
            return "MyBean : "+name+", "+(new Integer(length).toString());
        }
    } 
    
    public static void main(String[] args) {
        List<MyBean> list = new ArrayList<MyBean>();
        list.add(new MyBean("XYZ", 1));
        JXPathContext context = JXPathContext.newContext(list);
        Iterator it = context.iterate(".[@length=1]");
        while(it.hasNext()) {
           MyBean m = (MyBean)it.next();
           System.out.println(m);
        } 
    }

}


Ничего не выводится. А если использовать приведенное вами выражение, то я получу:

Exception in thread "main" org.apache.commons.jxpath.JXPathException: Invalid XPath: '.[((starts-with(@name,\'X\') or (@name=\'XXX\' and @length=12)]'. Syntax error after: '.['
    at org.apache.commons.jxpath.ri.Parser.parseExpression(Parser.java:60)
    at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.compileExpression(JXPathContextReferenceImpl.java:218)
    at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iterate(JXPathContextReferenceImpl.java:384)
    at JXPathTest.main(JXPathTest.java:32)


Т.е. есть подозрение, что starts-with просто не реализован.

Или я делаю что-то не так?
Re[5]: Встроенный интерпретатор
От: Аноним  
Дата: 21.04.06 07:02
Оценка:
А> static private class MyBean {

Не очень ясно почему, но MyBean должен быть public

А>
А>Exception in thread "main" org.apache.commons.jxpath.JXPathException: Invalid XPath: '.[((starts-with(@name,\'X\') or (@name=\'XXX\' and @length=12)]'. Syntax error after: '.['
А>    at org.apache.commons.jxpath.ri.Parser.parseExpression(Parser.java:60)
А>    at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.compileExpression(JXPathContextReferenceImpl.java:218)
А>    at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iterate(JXPathContextReferenceImpl.java:384)
А>    at JXPathTest.main(JXPathTest.java:32)
А>


А>Т.е. есть подозрение, что starts-with просто не реализован.


А как решить эту проблему?
Re[6]: Встроенный интерпретатор
От: Аноним  
Дата: 21.04.06 10:26
Оценка:
А> .[((starts-with(@name,'X') or (@name='XXX' and @length=12)]'

Здесь просто лишняя открывающая скобка

Но есть еще одна проблема:

        List<MyBean> list = new ArrayList<MyBean>();
        list.add(new MyBean("X1", 1));
        list.add(new MyBean("X2", 2));
        JXPathContext context = JXPathContext.newContext(list);
        Iterator it = context.iterate(".[starts-with(@name,'X')]");
        while(it.hasNext()) {
           MyBean m = (MyBean)it.next();
           System.out.println(m);
        }
        it = context.iterate(".[@name='X1']");
        while(it.hasNext()) {
           MyBean m = (MyBean)it.next();
           System.out.println(m);
        }


Первый цикл выводит оба бина, второй — ни одного. Почему?

Еще вопрос: как получить name второго по порядку бина? context.getValue("@name") выводит name первого, попытки использовать [] ни к чему не привели
Re[7]: Встроенный интерпретатор
От: Victor Repetsky Украина  
Дата: 21.04.06 12:10
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Первый цикл выводит оба бина, второй — ни одного. Почему?


Пиши просто name
context.iterate(".[name='X1']");

(почему — здесь).

А>Еще вопрос: как получить name второго по порядку бина? context.getValue("@name") выводит name первого, попытки использовать [] ни к чему не привели


context.getValue(".[2]/name")
SCJP, SCEA
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.