From 9bea101c9d5bbe67f40d9821bcf661fbcc23d305 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Sat, 30 Nov 2013 13:13:30 +0100 Subject: [PATCH] [Devel] Query engine transparent to the underlying implementation Currently querying in memory works, now we need the visitor pattern to abstract away the details of the in memory querying mechanism and allow other querying mechanisms --- .../strolch/runtime/query/AndSelection.java | 47 +++++++ .../runtime/query/BooleanSelection.java | 48 +++++++ ...rceQueryVisitor.java => ElementQuery.java} | 30 ++--- .../li/strolch/runtime/query/IdSelection.java | 52 ++++++++ .../strolch/runtime/query/NameSelection.java | 52 ++++++++ ...yElementSelection.java => Navigation.java} | 8 +- .../li/strolch/runtime/query/OrSelection.java | 44 +++++++ .../runtime/query/OrderTypeNavigation.java | 43 +++++++ .../java/li/strolch/runtime/query/Query.java | 31 +++++ .../{ResourceQuery.java => QueryVisitor.java} | 18 +-- .../runtime/query/ResourceTypeNavigation.java | 43 +++++++ ...sourceQueryVisitor.java => Selection.java} | 4 +- .../query/StrolchElementSelection.java | 44 +++++++ ...ection.java => StrolchTypeNavigation.java} | 9 +- .../query/inmemory/BooleanVisitor.java | 65 ++++++++++ .../query/inmemory/InMemoryQueryVisitor.java | 118 ++++++++++++++++++ .../runtime/query/inmemory/ListNavigator.java | 0 .../query/inmemory/OrderTypeNavigator.java | 1 - .../StrolchTypeNavigationVisitor.java | 30 +++++ .../query/visitor/StrolchElementVisitor.java | 43 +++++++ .../component}/ComponentContainerTest.java | 5 +- .../component}/ConfigurationParserTest.java | 2 +- .../component}/ControllerDependencyTest.java | 2 +- .../PersistenceHandlerTest.java | 2 +- .../PersistenceHandlerTestImpl.java | 2 +- .../{ => component}/PostInitializerTest.java | 2 +- .../PostInitializerTestImpl.java | 2 +- .../{ => component}/ServiceHandlerTest.java | 2 +- .../ServiceHandlerTestImpl.java | 2 +- .../{ => component}/ServiceResultTest.java | 2 +- .../{ => test/query}/ModelBuilder.java | 2 +- .../runtime/{ => test/query}/QueryTest.java | 8 +- .../query/inmemory/InMemoryQueryTest.java | 14 ++- 33 files changed, 712 insertions(+), 65 deletions(-) create mode 100644 src/main/java/li/strolch/runtime/query/AndSelection.java create mode 100644 src/main/java/li/strolch/runtime/query/BooleanSelection.java rename src/main/java/li/strolch/runtime/query/{inmemory/InMemoryResourceQueryVisitor.java => ElementQuery.java} (59%) create mode 100644 src/main/java/li/strolch/runtime/query/IdSelection.java create mode 100644 src/main/java/li/strolch/runtime/query/NameSelection.java rename src/main/java/li/strolch/runtime/query/{ByElementSelection.java => Navigation.java} (89%) create mode 100644 src/main/java/li/strolch/runtime/query/OrSelection.java create mode 100644 src/main/java/li/strolch/runtime/query/OrderTypeNavigation.java create mode 100644 src/main/java/li/strolch/runtime/query/Query.java rename src/main/java/li/strolch/runtime/query/{ResourceQuery.java => QueryVisitor.java} (81%) create mode 100644 src/main/java/li/strolch/runtime/query/ResourceTypeNavigation.java rename src/main/java/li/strolch/runtime/query/{ResourceQueryVisitor.java => Selection.java} (90%) create mode 100644 src/main/java/li/strolch/runtime/query/StrolchElementSelection.java rename src/main/java/li/strolch/runtime/query/{TypeSelection.java => StrolchTypeNavigation.java} (82%) create mode 100644 src/main/java/li/strolch/runtime/query/inmemory/BooleanVisitor.java create mode 100644 src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java rename src/{test => main}/java/li/strolch/runtime/query/inmemory/ListNavigator.java (100%) create mode 100644 src/main/java/li/strolch/runtime/query/inmemory/StrolchTypeNavigationVisitor.java create mode 100644 src/main/java/li/strolch/runtime/query/visitor/StrolchElementVisitor.java rename src/test/java/li/strolch/runtime/{ => test/component}/ComponentContainerTest.java (90%) rename src/test/java/li/strolch/runtime/{ => test/component}/ConfigurationParserTest.java (98%) rename src/test/java/li/strolch/runtime/{ => test/component}/ControllerDependencyTest.java (99%) rename src/test/java/li/strolch/runtime/test/{ => component}/PersistenceHandlerTest.java (77%) rename src/test/java/li/strolch/runtime/test/{ => component}/PersistenceHandlerTestImpl.java (92%) rename src/test/java/li/strolch/runtime/test/{ => component}/PostInitializerTest.java (59%) rename src/test/java/li/strolch/runtime/test/{ => component}/PostInitializerTestImpl.java (88%) rename src/test/java/li/strolch/runtime/test/{ => component}/ServiceHandlerTest.java (65%) rename src/test/java/li/strolch/runtime/test/{ => component}/ServiceHandlerTestImpl.java (90%) rename src/test/java/li/strolch/runtime/test/{ => component}/ServiceResultTest.java (80%) rename src/test/java/li/strolch/runtime/{ => test/query}/ModelBuilder.java (99%) rename src/test/java/li/strolch/runtime/{ => test/query}/QueryTest.java (78%) rename src/test/java/li/strolch/runtime/{ => test}/query/inmemory/InMemoryQueryTest.java (90%) diff --git a/src/main/java/li/strolch/runtime/query/AndSelection.java b/src/main/java/li/strolch/runtime/query/AndSelection.java new file mode 100644 index 000000000..bd2ddfe91 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/AndSelection.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import java.util.List; + +/** + * @author Robert von Burg + * + */ +public class AndSelection extends BooleanSelection { + + /** + * @param selections + */ + public AndSelection(List> selections) { + super(selections); + } + + public AndSelection(Selection leftHandSide, Selection rightHandSide) { + super(leftHandSide, rightHandSide); + } + + @Override + public void accept(QueryVisitor visitor) { + visitor.visitAnd(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/BooleanSelection.java b/src/main/java/li/strolch/runtime/query/BooleanSelection.java new file mode 100644 index 000000000..7abb8f1f7 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/BooleanSelection.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Robert von Burg + * + */ +public abstract class BooleanSelection implements Selection { + + protected List> selections; + + public BooleanSelection(Selection leftHandSide, Selection rightHandSide) { + this.selections = new ArrayList<>(); + this.selections.add(leftHandSide); + this.selections.add(rightHandSide); + } + + public BooleanSelection(List> selections) { + this.selections = selections; + } + + public List> getSelections() { + return this.selections; + } +} diff --git a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java b/src/main/java/li/strolch/runtime/query/ElementQuery.java similarity index 59% rename from src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java rename to src/main/java/li/strolch/runtime/query/ElementQuery.java index 7cc02ac8c..0b509b1d9 100644 --- a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java +++ b/src/main/java/li/strolch/runtime/query/ElementQuery.java @@ -19,37 +19,33 @@ * along with XXX. If not, see * . */ -package li.strolch.runtime.query.inmemory; +package li.strolch.runtime.query; import java.util.ArrayList; import java.util.List; -import li.strolch.model.Resource; -import li.strolch.runtime.component.ComponentContainer; -import li.strolch.runtime.query.ResourceQuery; -import li.strolch.runtime.query.ResourceQueryVisitor; +import li.strolch.runtime.query.visitor.StrolchElementVisitor; /** * @author Robert von Burg * */ -public class InMemoryResourceQueryVisitor implements ResourceQueryVisitor { +public class ElementQuery implements Query { - private ArrayList result; - - public List performQuery(ComponentContainer container, ResourceQuery query) { - this.result = new ArrayList<>(); + private Navigation navigation; + private List> selections; - query.accept(this); - - return this.result; + public ElementQuery(Navigation navigation) { + this.selections = new ArrayList<>(); } @Override - public void visit(ResourceQuery resourceQuery) { - // TODO Auto-generated method stub + public void visit(StrolchElementVisitor queryVisitor) { + this.navigation.accept(queryVisitor); + + for (Selection selection : this.selections) { + selection.accept(queryVisitor); + } } - - } diff --git a/src/main/java/li/strolch/runtime/query/IdSelection.java b/src/main/java/li/strolch/runtime/query/IdSelection.java new file mode 100644 index 000000000..1a8f5a431 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/IdSelection.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + * + */ +public class IdSelection implements Selection { + + private String id; + + /** + * @param id + */ + public IdSelection(String id) { + this.id = id; + } + + /** + * @return the id + */ + public String getId() { + return this.id; + } + + @Override + public void accept(StrolchElementVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/NameSelection.java b/src/main/java/li/strolch/runtime/query/NameSelection.java new file mode 100644 index 000000000..8c49dcc1d --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/NameSelection.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + * + */ +public class NameSelection implements Selection { + + private String name; + + /** + * @param name + */ + public NameSelection(String name) { + this.name = name; + } + + /** + * @return the name + */ + public String getName() { + return this.name; + } + + @Override + public void accept(StrolchElementVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/ByElementSelection.java b/src/main/java/li/strolch/runtime/query/Navigation.java similarity index 89% rename from src/main/java/li/strolch/runtime/query/ByElementSelection.java rename to src/main/java/li/strolch/runtime/query/Navigation.java index 18dabf240..279d1f0a5 100644 --- a/src/main/java/li/strolch/runtime/query/ByElementSelection.java +++ b/src/main/java/li/strolch/runtime/query/Navigation.java @@ -23,11 +23,9 @@ package li.strolch.runtime.query; /** * @author Robert von Burg - * + * */ -public class ByElementSelection { +public interface Navigation { - private String id; - private String name; - private String type; + public void accept(T visitor); } diff --git a/src/main/java/li/strolch/runtime/query/OrSelection.java b/src/main/java/li/strolch/runtime/query/OrSelection.java new file mode 100644 index 000000000..0b5d9741c --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/OrSelection.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import java.util.List; + +/** + * @author Robert von Burg + * + */ +public class OrSelection extends BooleanSelection { + + public OrSelection(List> selections) { + super(selections); + } + + public OrSelection(Selection leftHandSide, Selection rightHandSide) { + super(leftHandSide, rightHandSide); + } + + @Override + public void accept(QueryVisitor visitor) { + visitor.visitOr(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/OrderTypeNavigation.java b/src/main/java/li/strolch/runtime/query/OrderTypeNavigation.java new file mode 100644 index 000000000..4ea5650f8 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/OrderTypeNavigation.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + * + */ +public class OrderTypeNavigation extends StrolchTypeNavigation { + + /** + * @param type + */ + OrderTypeNavigation(String type) { + super(type); + } + + @Override + public void accept(StrolchElementVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/Query.java b/src/main/java/li/strolch/runtime/query/Query.java new file mode 100644 index 000000000..0dcd0044d --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/Query.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +/** + * @author Robert von Burg + * + */ +public interface Query { + + public void visit(T queryVisitor); +} diff --git a/src/main/java/li/strolch/runtime/query/ResourceQuery.java b/src/main/java/li/strolch/runtime/query/QueryVisitor.java similarity index 81% rename from src/main/java/li/strolch/runtime/query/ResourceQuery.java rename to src/main/java/li/strolch/runtime/query/QueryVisitor.java index d3cec2274..bb9234911 100644 --- a/src/main/java/li/strolch/runtime/query/ResourceQuery.java +++ b/src/main/java/li/strolch/runtime/query/QueryVisitor.java @@ -21,22 +21,14 @@ */ package li.strolch.runtime.query; -import java.util.List; - -import li.strolch.model.Resource; /** * @author Robert von Burg - * + * */ -public class ResourceQuery { - - - private String byType; - - +public interface QueryVisitor { - public void accept(ResourceQueryVisitor visitor) { - visitor.visit(this); - } + public void visitAnd(AndSelection andSelection); + + public void visitOr(OrSelection orSelection); } diff --git a/src/main/java/li/strolch/runtime/query/ResourceTypeNavigation.java b/src/main/java/li/strolch/runtime/query/ResourceTypeNavigation.java new file mode 100644 index 000000000..06008f74f --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/ResourceTypeNavigation.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + * + */ +public class ResourceTypeNavigation extends StrolchTypeNavigation{ + + /** + * @param type + */ + ResourceTypeNavigation(String type) { + super(type); + } + + @Override + public void accept(StrolchElementVisitor visitor) { + visitor.visit(this); + } +} diff --git a/src/main/java/li/strolch/runtime/query/ResourceQueryVisitor.java b/src/main/java/li/strolch/runtime/query/Selection.java similarity index 90% rename from src/main/java/li/strolch/runtime/query/ResourceQueryVisitor.java rename to src/main/java/li/strolch/runtime/query/Selection.java index f826bc2c2..8bce956fc 100644 --- a/src/main/java/li/strolch/runtime/query/ResourceQueryVisitor.java +++ b/src/main/java/li/strolch/runtime/query/Selection.java @@ -25,7 +25,7 @@ package li.strolch.runtime.query; * @author Robert von Burg * */ -public interface ResourceQueryVisitor { +public interface Selection { - public void visit(ResourceQuery query); + public void accept(T visitor); } diff --git a/src/main/java/li/strolch/runtime/query/StrolchElementSelection.java b/src/main/java/li/strolch/runtime/query/StrolchElementSelection.java new file mode 100644 index 000000000..c9d6e5c61 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/StrolchElementSelection.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query; + +import java.util.ArrayList; +import java.util.List; + +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + * + */ +public class StrolchElementSelection { + + private List> selections; + + public StrolchElementSelection() { + this.selections = new ArrayList<>(); + } + + public void addSelection(Selection selection) { + this.selections.add(selection); + } +} diff --git a/src/main/java/li/strolch/runtime/query/TypeSelection.java b/src/main/java/li/strolch/runtime/query/StrolchTypeNavigation.java similarity index 82% rename from src/main/java/li/strolch/runtime/query/TypeSelection.java rename to src/main/java/li/strolch/runtime/query/StrolchTypeNavigation.java index 7be6eb85e..f1185f71b 100644 --- a/src/main/java/li/strolch/runtime/query/TypeSelection.java +++ b/src/main/java/li/strolch/runtime/query/StrolchTypeNavigation.java @@ -21,18 +21,17 @@ */ package li.strolch.runtime.query; +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + /** * @author Robert von Burg * */ -public class TypeSelection { +public abstract class StrolchTypeNavigation implements Navigation { private String type; - /** - * @param type - */ - public TypeSelection(String type) { + StrolchTypeNavigation(String type) { this.type = type; } diff --git a/src/main/java/li/strolch/runtime/query/inmemory/BooleanVisitor.java b/src/main/java/li/strolch/runtime/query/inmemory/BooleanVisitor.java new file mode 100644 index 000000000..8f8450728 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/inmemory/BooleanVisitor.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query.inmemory; + +import java.util.List; + +import li.strolch.model.StrolchElement; +import li.strolch.runtime.query.AndSelection; +import li.strolch.runtime.query.BooleanSelection; +import li.strolch.runtime.query.OrSelection; +import li.strolch.runtime.query.QueryVisitor; + +/** + * @author Robert von Burg + * + */ +public class BooleanVisitor implements QueryVisitor { + + private List> selectors; + + /** + * @param selectors + */ + public BooleanVisitor(List> selectors) { + this.selectors = selectors; + } + + /** + * @param selection + */ + public void visit(BooleanSelection selection) { + selection.accept(this); + } + + @Override + public void visitAnd(AndSelection selection) { + // TODO Auto-generated method stub + + } + + @Override + public void visitOr(OrSelection selection) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java new file mode 100644 index 000000000..a9f4d7c72 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query.inmemory; + +import java.util.ArrayList; +import java.util.List; + +import li.strolch.model.StrolchElement; +import li.strolch.runtime.component.ComponentContainer; +import li.strolch.runtime.query.AndSelection; +import li.strolch.runtime.query.ElementQuery; +import li.strolch.runtime.query.IdSelection; +import li.strolch.runtime.query.NameSelection; +import li.strolch.runtime.query.OrSelection; +import li.strolch.runtime.query.OrderTypeNavigation; +import li.strolch.runtime.query.QueryVisitor; +import li.strolch.runtime.query.ResourceTypeNavigation; +import li.strolch.runtime.query.Selection; +import li.strolch.runtime.query.visitor.StrolchElementVisitor; + +/** + * @author Robert von Burg + */ +public class InMemoryQueryVisitor implements StrolchElementVisitor { + + private Navigator navigator; + private List> selectors; + private ComponentContainer container; + + public InMemoryQueryVisitor(ComponentContainer container) { + this.container = container; + this.selectors = new ArrayList<>(); + } + + /** + * @return the navigator + */ + public Navigator getNavigator() { + return this.navigator; + } + + /** + * @return the selectors + */ + public List> getSelectors() { + return this.selectors; + } + + public void visit(ElementQuery query) { + query.visit(this); + } + + @Override + public void visitAnd(AndSelection andSelection) { + InMemoryQueryVisitor visitor = new InMemoryQueryVisitor<>(this.container); + List> selections = andSelection.getSelections(); + for (Selection selection : selections) { + selection.accept(visitor); + } + + AndSelector andSelector = new AndSelector<>(visitor.getSelectors()); + this.selectors.add(andSelector); + } + + @Override + public void visitOr(OrSelection orSelection) { + InMemoryQueryVisitor visitor = new InMemoryQueryVisitor<>(this.container); + List> selections = orSelection.getSelections(); + for (Selection selection : selections) { + selection.accept(visitor); + } + + OrSelector andSelector = new OrSelector<>(visitor.getSelectors()); + this.selectors.add(andSelector); + } + + @Override + public void visit(IdSelection selection) { + this.selectors.add(new IdSelector(selection.getId())); + } + + @Override + public void visit(NameSelection selection) { + this.selectors.add(new NameSelector(selection.getName())); + } + + @SuppressWarnings("unchecked") + @Override + public void visit(OrderTypeNavigation navigation) { + this.navigator = (Navigator) new OrderTypeNavigator(navigation.getType(), this.container); + } + + @SuppressWarnings("unchecked") + @Override + public void visit(ResourceTypeNavigation navigation) { + // XXX not good... class should be parameterized, but then there is no sense in ResourceType... but then one would need the ElementMap passed in... + this.navigator = (Navigator) new ResourceTypeNavigator(navigation.getType(), this.container); + } +} diff --git a/src/test/java/li/strolch/runtime/query/inmemory/ListNavigator.java b/src/main/java/li/strolch/runtime/query/inmemory/ListNavigator.java similarity index 100% rename from src/test/java/li/strolch/runtime/query/inmemory/ListNavigator.java rename to src/main/java/li/strolch/runtime/query/inmemory/ListNavigator.java diff --git a/src/main/java/li/strolch/runtime/query/inmemory/OrderTypeNavigator.java b/src/main/java/li/strolch/runtime/query/inmemory/OrderTypeNavigator.java index 21316c880..094785111 100644 --- a/src/main/java/li/strolch/runtime/query/inmemory/OrderTypeNavigator.java +++ b/src/main/java/li/strolch/runtime/query/inmemory/OrderTypeNavigator.java @@ -28,7 +28,6 @@ import li.strolch.runtime.component.ComponentContainer; /** * @author Robert von Burg - * */ public class OrderTypeNavigator extends StrolchTypeNavigator { diff --git a/src/main/java/li/strolch/runtime/query/inmemory/StrolchTypeNavigationVisitor.java b/src/main/java/li/strolch/runtime/query/inmemory/StrolchTypeNavigationVisitor.java new file mode 100644 index 000000000..50d34cea8 --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/inmemory/StrolchTypeNavigationVisitor.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query.inmemory; + +/** + * @author Robert von Burg + * + */ +public class StrolchTypeNavigationVisitor { + +} diff --git a/src/main/java/li/strolch/runtime/query/visitor/StrolchElementVisitor.java b/src/main/java/li/strolch/runtime/query/visitor/StrolchElementVisitor.java new file mode 100644 index 000000000..70795ed5e --- /dev/null +++ b/src/main/java/li/strolch/runtime/query/visitor/StrolchElementVisitor.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Robert von Burg + * + * All rights reserved. + * + * This file is part of the XXX. + * + * XXX is free software: you can redistribute + * it and/or modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * XXX is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XXX. If not, see + * . + */ +package li.strolch.runtime.query.visitor; + +import li.strolch.runtime.query.IdSelection; +import li.strolch.runtime.query.NameSelection; +import li.strolch.runtime.query.OrderTypeNavigation; +import li.strolch.runtime.query.QueryVisitor; +import li.strolch.runtime.query.ResourceTypeNavigation; + +/** + * @author Robert von Burg + * + */ +public interface StrolchElementVisitor extends QueryVisitor { + + public void visit(IdSelection selection); + + public void visit(NameSelection selection); + + public void visit(OrderTypeNavigation navigation); + + public void visit(ResourceTypeNavigation navigation); +} diff --git a/src/test/java/li/strolch/runtime/ComponentContainerTest.java b/src/test/java/li/strolch/runtime/test/component/ComponentContainerTest.java similarity index 90% rename from src/test/java/li/strolch/runtime/ComponentContainerTest.java rename to src/test/java/li/strolch/runtime/test/component/ComponentContainerTest.java index 98aff4033..4994604e8 100644 --- a/src/test/java/li/strolch/runtime/ComponentContainerTest.java +++ b/src/test/java/li/strolch/runtime/test/component/ComponentContainerTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime; +package li.strolch.runtime.test.component; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -8,9 +8,6 @@ import java.io.File; import li.strolch.model.Resource; import li.strolch.runtime.agent.StrolchAgent; import li.strolch.runtime.component.ComponentContainer; -import li.strolch.runtime.test.PersistenceHandlerTest; -import li.strolch.runtime.test.ServiceHandlerTest; -import li.strolch.runtime.test.ServiceResultTest; import org.junit.Test; import org.slf4j.Logger; diff --git a/src/test/java/li/strolch/runtime/ConfigurationParserTest.java b/src/test/java/li/strolch/runtime/test/component/ConfigurationParserTest.java similarity index 98% rename from src/test/java/li/strolch/runtime/ConfigurationParserTest.java rename to src/test/java/li/strolch/runtime/test/component/ConfigurationParserTest.java index 94d06139a..98cf82dc9 100644 --- a/src/test/java/li/strolch/runtime/ConfigurationParserTest.java +++ b/src/test/java/li/strolch/runtime/test/component/ConfigurationParserTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime; +package li.strolch.runtime.test.component; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/src/test/java/li/strolch/runtime/ControllerDependencyTest.java b/src/test/java/li/strolch/runtime/test/component/ControllerDependencyTest.java similarity index 99% rename from src/test/java/li/strolch/runtime/ControllerDependencyTest.java rename to src/test/java/li/strolch/runtime/test/component/ControllerDependencyTest.java index 50bc05321..d84066c20 100644 --- a/src/test/java/li/strolch/runtime/ControllerDependencyTest.java +++ b/src/test/java/li/strolch/runtime/test/component/ControllerDependencyTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime; +package li.strolch.runtime.test.component; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/src/test/java/li/strolch/runtime/test/PersistenceHandlerTest.java b/src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTest.java similarity index 77% rename from src/test/java/li/strolch/runtime/test/PersistenceHandlerTest.java rename to src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTest.java index 9bfeeb934..b740e7774 100644 --- a/src/test/java/li/strolch/runtime/test/PersistenceHandlerTest.java +++ b/src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; import li.strolch.model.Resource; diff --git a/src/test/java/li/strolch/runtime/test/PersistenceHandlerTestImpl.java b/src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTestImpl.java similarity index 92% rename from src/test/java/li/strolch/runtime/test/PersistenceHandlerTestImpl.java rename to src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTestImpl.java index 5096f6044..582f8c4ca 100644 --- a/src/test/java/li/strolch/runtime/test/PersistenceHandlerTestImpl.java +++ b/src/test/java/li/strolch/runtime/test/component/PersistenceHandlerTestImpl.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; import li.strolch.model.Resource; import li.strolch.runtime.component.ComponentContainer; diff --git a/src/test/java/li/strolch/runtime/test/PostInitializerTest.java b/src/test/java/li/strolch/runtime/test/component/PostInitializerTest.java similarity index 59% rename from src/test/java/li/strolch/runtime/test/PostInitializerTest.java rename to src/test/java/li/strolch/runtime/test/component/PostInitializerTest.java index 5c620096b..f8c6b48c1 100644 --- a/src/test/java/li/strolch/runtime/test/PostInitializerTest.java +++ b/src/test/java/li/strolch/runtime/test/component/PostInitializerTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; public interface PostInitializerTest { diff --git a/src/test/java/li/strolch/runtime/test/PostInitializerTestImpl.java b/src/test/java/li/strolch/runtime/test/component/PostInitializerTestImpl.java similarity index 88% rename from src/test/java/li/strolch/runtime/test/PostInitializerTestImpl.java rename to src/test/java/li/strolch/runtime/test/component/PostInitializerTestImpl.java index 955923a37..7e3761146 100644 --- a/src/test/java/li/strolch/runtime/test/PostInitializerTestImpl.java +++ b/src/test/java/li/strolch/runtime/test/component/PostInitializerTestImpl.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; import li.strolch.runtime.component.ComponentContainer; import li.strolch.runtime.component.StrolchComponent; diff --git a/src/test/java/li/strolch/runtime/test/ServiceHandlerTest.java b/src/test/java/li/strolch/runtime/test/component/ServiceHandlerTest.java similarity index 65% rename from src/test/java/li/strolch/runtime/test/ServiceHandlerTest.java rename to src/test/java/li/strolch/runtime/test/component/ServiceHandlerTest.java index 166e5dbed..f3c47260d 100644 --- a/src/test/java/li/strolch/runtime/test/ServiceHandlerTest.java +++ b/src/test/java/li/strolch/runtime/test/component/ServiceHandlerTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; public interface ServiceHandlerTest { diff --git a/src/test/java/li/strolch/runtime/test/ServiceHandlerTestImpl.java b/src/test/java/li/strolch/runtime/test/component/ServiceHandlerTestImpl.java similarity index 90% rename from src/test/java/li/strolch/runtime/test/ServiceHandlerTestImpl.java rename to src/test/java/li/strolch/runtime/test/component/ServiceHandlerTestImpl.java index cf29a29d0..edfbb4bfc 100644 --- a/src/test/java/li/strolch/runtime/test/ServiceHandlerTestImpl.java +++ b/src/test/java/li/strolch/runtime/test/component/ServiceHandlerTestImpl.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; import li.strolch.runtime.component.ComponentContainer; import li.strolch.runtime.component.StrolchComponent; diff --git a/src/test/java/li/strolch/runtime/test/ServiceResultTest.java b/src/test/java/li/strolch/runtime/test/component/ServiceResultTest.java similarity index 80% rename from src/test/java/li/strolch/runtime/test/ServiceResultTest.java rename to src/test/java/li/strolch/runtime/test/component/ServiceResultTest.java index 0666784c9..ce2872fde 100644 --- a/src/test/java/li/strolch/runtime/test/ServiceResultTest.java +++ b/src/test/java/li/strolch/runtime/test/component/ServiceResultTest.java @@ -1,4 +1,4 @@ -package li.strolch.runtime.test; +package li.strolch.runtime.test.component; public class ServiceResultTest { diff --git a/src/test/java/li/strolch/runtime/ModelBuilder.java b/src/test/java/li/strolch/runtime/test/query/ModelBuilder.java similarity index 99% rename from src/test/java/li/strolch/runtime/ModelBuilder.java rename to src/test/java/li/strolch/runtime/test/query/ModelBuilder.java index 3aee6d4d9..0c660b0e3 100644 --- a/src/test/java/li/strolch/runtime/ModelBuilder.java +++ b/src/test/java/li/strolch/runtime/test/query/ModelBuilder.java @@ -19,7 +19,7 @@ * along with li.strolch.model. If not, see * . */ -package li.strolch.runtime; +package li.strolch.runtime.test.query; import java.util.ArrayList; import java.util.Date; diff --git a/src/test/java/li/strolch/runtime/QueryTest.java b/src/test/java/li/strolch/runtime/test/query/QueryTest.java similarity index 78% rename from src/test/java/li/strolch/runtime/QueryTest.java rename to src/test/java/li/strolch/runtime/test/query/QueryTest.java index 83fc0a981..15c121244 100644 --- a/src/test/java/li/strolch/runtime/QueryTest.java +++ b/src/test/java/li/strolch/runtime/test/query/QueryTest.java @@ -19,7 +19,7 @@ * along with XXX. If not, see * . */ -package li.strolch.runtime; +package li.strolch.runtime.test.query; import org.junit.Ignore; import org.junit.Test; @@ -35,11 +35,7 @@ public class QueryTest { @Ignore public void shouldQueryResourceWithParamValue() { -// ResourceQuery resQuery = new ResourceQuery(); -// resQuery.with(new TypeMatcher("MyType")); -// resQuery.with(new ParameterBagMatcher("Bla").with(ParameterMatcher.stringValue("color", "red"))); -// -// List result = resQuery.doQuery(); + // } } diff --git a/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java b/src/test/java/li/strolch/runtime/test/query/inmemory/InMemoryQueryTest.java similarity index 90% rename from src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java rename to src/test/java/li/strolch/runtime/test/query/inmemory/InMemoryQueryTest.java index bcf88c31c..171cd86e8 100644 --- a/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java +++ b/src/test/java/li/strolch/runtime/test/query/inmemory/InMemoryQueryTest.java @@ -19,7 +19,7 @@ * along with XXX. If not, see * . */ -package li.strolch.runtime.query.inmemory; +package li.strolch.runtime.test.query.inmemory; import static org.junit.Assert.assertEquals; @@ -35,7 +35,17 @@ import li.strolch.model.State; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.StringParameter; -import li.strolch.runtime.ModelBuilder; +import li.strolch.runtime.query.inmemory.AndSelector; +import li.strolch.runtime.query.inmemory.BooleanSelector; +import li.strolch.runtime.query.inmemory.IdSelector; +import li.strolch.runtime.query.inmemory.InMemoryQuery; +import li.strolch.runtime.query.inmemory.ListNavigator; +import li.strolch.runtime.query.inmemory.NameSelector; +import li.strolch.runtime.query.inmemory.OrSelector; +import li.strolch.runtime.query.inmemory.ParameterSelector; +import li.strolch.runtime.query.inmemory.ParameterizedElementSelector; +import li.strolch.runtime.query.inmemory.Selector; +import li.strolch.runtime.test.query.ModelBuilder; import org.junit.Test;