diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..ca5e558
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ bms-prototype
+ org.ridelab.bms
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ jar
+ common
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+ org.apache.commons
+ commons-lang3
+ 3.7
+
+
+
+
diff --git a/common/src/main/java/org/ridelab/bms/common/five/Five.java b/common/src/main/java/org/ridelab/bms/common/five/Five.java
new file mode 100644
index 0000000..1223cd8
--- /dev/null
+++ b/common/src/main/java/org/ridelab/bms/common/five/Five.java
@@ -0,0 +1,42 @@
+package org.ridelab.bms.common.five;
+
+import lombok.AccessLevel;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.UtilityClass;
+
+/**
+ * @see Five
+ */
+@UtilityClass
+@FieldDefaults(level = AccessLevel.PUBLIC)
+public class Five {
+
+ int five() {
+ return 5;
+ }
+
+ boolean isFive(int n) {
+ return five() == n;
+ }
+
+ String esperanto() {
+ return "kvin";
+ }
+
+ String greek() {
+ return "πέντε";
+ }
+
+ String pinyin() {
+ return "wǔ";
+ }
+
+ String morseCode() {
+ return ".....";
+ }
+
+ String oclock() {
+ return "\uD83D\uDD54";
+ }
+
+}
diff --git a/common/src/test/java/org/ridelab/bms/common/five/FiveTest.java b/common/src/test/java/org/ridelab/bms/common/five/FiveTest.java
new file mode 100644
index 0000000..d33d805
--- /dev/null
+++ b/common/src/test/java/org/ridelab/bms/common/five/FiveTest.java
@@ -0,0 +1,35 @@
+package org.ridelab.bms.common.five;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+import org.ridelab.bms.common.five.Five;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class FiveTest {
+
+ @Test
+ public void five() {
+ assertEquals(5, Five.five());
+ }
+
+ @Test
+ public void isFive() {
+ assertTrue(Five.isFive(5));
+ assertFalse(Five.isFive(6));
+ }
+
+ @Test
+ public void multilingual() {
+ assertTrue(StringUtils.isNoneBlank(
+ Five.esperanto(),
+ Five.greek(),
+ Five.pinyin(),
+ Five.morseCode(),
+ Five.oclock()
+ ));
+ }
+
+}
diff --git a/data-schema/pom.xml b/data-schema/pom.xml
new file mode 100644
index 0000000..fba5bd7
--- /dev/null
+++ b/data-schema/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ bms-prototype
+ org.ridelab.bms
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ jar
+ data-schema
+
+
+
+ org.ridelab.bms
+ common
+ 1.0-SNAPSHOT
+
+
+
+
diff --git a/data-schema/src/main/java/org/ridelab/bms/entity/Item.java b/data-schema/src/main/java/org/ridelab/bms/entity/Item.java
new file mode 100644
index 0000000..3f85de1
--- /dev/null
+++ b/data-schema/src/main/java/org/ridelab/bms/entity/Item.java
@@ -0,0 +1,13 @@
+package org.ridelab.bms.entity;
+
+import lombok.Value;
+
+@Value(staticConstructor = "of")
+public class Item {
+
+ String name;
+
+ long id;
+
+}
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..f8d413f
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,60 @@
+
+
+ 4.0.0
+
+ org.ridelab.bms
+ bms-prototype
+ pom
+ 1.0-SNAPSHOT
+
+
+ common
+ data-schema
+ service
+
+
+
+ utf-8
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.16.18
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.jetbrains
+ annotations
+ 15.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+ utf-8
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 2.9.1
+
+
+
+
+
diff --git a/scripts/ci.sh b/scripts/ci.sh
index 5c46f24..b7bad0b 100755
--- a/scripts/ci.sh
+++ b/scripts/ci.sh
@@ -4,4 +4,6 @@
scripts/lint-docs.sh
+mvn clean test
+
echo -e "\033[0;32mFinished\033[m"
diff --git a/service/pom.xml b/service/pom.xml
new file mode 100644
index 0000000..66338d0
--- /dev/null
+++ b/service/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ bms-prototype
+ org.ridelab.bms
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ jar
+ service
+
+
+
+ org.ridelab.bms
+ common
+ 1.0-SNAPSHOT
+
+
+ org.ridelab.bms
+ data-schema
+ 1.0-SNAPSHOT
+
+
+
+
diff --git a/service/src/main/java/org/ridelab/bms/service/ItemService.java b/service/src/main/java/org/ridelab/bms/service/ItemService.java
new file mode 100644
index 0000000..468e45c
--- /dev/null
+++ b/service/src/main/java/org/ridelab/bms/service/ItemService.java
@@ -0,0 +1,25 @@
+package org.ridelab.bms.service;
+
+import org.ridelab.bms.entity.Item;
+
+import java.util.Optional;
+
+public interface ItemService {
+
+ /**
+ * Find one by id
+ *
+ * @param id id
+ * @return found item
+ */
+ Optional- findOneById(long id);
+
+ /**
+ * Find all by name
+ *
+ * @param name name
+ * @return found items
+ */
+ Iterable
- findAllByName(String name);
+
+}
diff --git a/service/src/main/java/org/ridelab/bms/service/impl/ItemServiceImpl.java b/service/src/main/java/org/ridelab/bms/service/impl/ItemServiceImpl.java
new file mode 100644
index 0000000..440cac5
--- /dev/null
+++ b/service/src/main/java/org/ridelab/bms/service/impl/ItemServiceImpl.java
@@ -0,0 +1,50 @@
+package org.ridelab.bms.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
+import org.apache.commons.lang3.RandomUtils;
+import org.ridelab.bms.entity.Item;
+import org.ridelab.bms.service.ItemService;
+
+import java.util.Comparator;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+@Slf4j
+public class ItemServiceImpl implements ItemService {
+
+ @Override
+ public Optional
- findOneById(long id) {
+
+ if (id < 0) {
+
+ logger.debug("Can't find item with negative id {}", id);
+
+ return Optional.empty();
+
+ } else {
+
+ val item = Item.of("nothing", id);
+
+ logger.debug("Found item {}", item);
+
+ return Optional.of(item);
+ }
+ }
+
+ @Override
+ public Iterable
- findAllByName(String name) {
+
+ val items = IntStream.range(1, RandomUtils.nextInt(5, 10)).
+ mapToObj(i -> Item.of(name, RandomUtils.nextInt())).
+ sorted(Comparator.comparingLong(Item::getId)).
+ collect(Collectors.toList());
+
+ logger.debug("Found items {}", items.size(), items);
+
+ return items;
+ }
+
+}
+
diff --git a/service/src/test/java/org/ridelab/bms/service/ItemServiceTest.java b/service/src/test/java/org/ridelab/bms/service/ItemServiceTest.java
new file mode 100644
index 0000000..f28658d
--- /dev/null
+++ b/service/src/test/java/org/ridelab/bms/service/ItemServiceTest.java
@@ -0,0 +1,33 @@
+package org.ridelab.bms.service;
+
+import lombok.val;
+import org.junit.Test;
+import org.ridelab.bms.service.impl.ItemServiceImpl;
+
+import static org.junit.Assert.*;
+
+public class ItemServiceTest {
+
+ private final ItemService itemService = new ItemServiceImpl();
+
+ @Test
+ public void getOneById() {
+ val result = itemService.findOneById(1L);
+ assertTrue(result.isPresent());
+ assertEquals(1L, result.get().getId());
+ }
+
+ @Test
+ public void getOneByIdNonexistent() {
+ val result = itemService.findOneById(-1L);
+ assertFalse(result.isPresent());
+ }
+
+ @Test
+ public void findAllByName() {
+ val result = itemService.findAllByName("nothing");
+ assertTrue(result.iterator().hasNext());
+ assertEquals("nothing", result.iterator().next().getName());
+ }
+
+}