diff --git a/README.md b/README.md
new file mode 100755
index 0000000..2e65efe
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+a
\ No newline at end of file
diff --git a/documents/.gitkeep b/documents/.gitkeep
new file mode 100755
index 0000000..e69de29
diff --git a/softgroup/basis/common-datamapper/pom.xml b/softgroup/basis/common-datamapper/pom.xml
new file mode 100755
index 0000000..7ae0189
--- /dev/null
+++ b/softgroup/basis/common-datamapper/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.softgroup
+ basis
+
+ 0.0.1
+
+
+ common-datamapper
+ jar
+
+ 1.8
+ 1.8
+
+
+
+
+
+ com.softgroup
+ common-exceptions
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.7.4
+ jar
+
+
+
+
\ No newline at end of file
diff --git a/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/DataMapper.java b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/DataMapper.java
new file mode 100755
index 0000000..547b309
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/DataMapper.java
@@ -0,0 +1,33 @@
+package com.softgroup.common.datamapper;
+
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author vlischyshyn
+ */
+public interface DataMapper {
+
+ Map convertToMap(Object value);
+
+ T convert(Map map, Class dataType);
+
+ // T convert(HashMap map, Class dataType);
+
+ T mapData(String data, Class dataType);
+
+ T mapData(String data, TypeReference dataType);
+
+ T mapData(byte[] message, Class dataType);
+
+ T readValue(InputStream src, Class valueType);
+
+ String dataToString(T data);
+
+ String objectToString(Object data);
+
+}
diff --git a/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/JacksonDataMapper.java b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/JacksonDataMapper.java
new file mode 100755
index 0000000..fcbedce
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/JacksonDataMapper.java
@@ -0,0 +1,118 @@
+package com.softgroup.common.datamapper;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.softgroup.common.exceptions.MapperException;
+
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * @author Arthas
+ */
+public class JacksonDataMapper implements DataMapper {
+ private static final String CPJ = "Can't parse json";
+
+ private final ObjectMapper mapper;
+
+ public JacksonDataMapper() {
+ mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ public ObjectMapper getMapper() {
+ return mapper;
+ }
+
+ @Override
+ public Map convertToMap(final Object value) {
+ try {
+ return (Map) mapper.convertValue(value, Map.class);
+ } catch (Exception ex) {
+ throw new MapperException("Can't convert to map ", ex);
+ }
+ }
+
+// @Override
+// public convert(map, dataType) {
+// try {
+// return mapper.convertValue(map, dataType);
+// } catch (Exception ex) {
+// throw new MapperException("Can't convert map ", ex);
+// }
+// }
+
+ @Override
+ public T convert(Map map, Class dataType) {
+ try {
+ return mapper.convertValue(map, dataType);
+ } catch (Exception ex) {
+ throw new MapperException("Can't convert map ", ex);
+ }
+ }
+
+ @Override
+ public T mapData(String data, Class dataType) {
+ try {
+ return mapper.readValue(data, dataType);
+ } catch (Exception ex) {
+ throw new MapperException(CPJ, ex);
+ }
+ }
+
+ @Override
+ public T mapData(String data, TypeReference dataType) {
+ try {
+ return mapper.readValue(data, dataType);
+ } catch (Exception ex) {
+ throw new MapperException(CPJ, ex);
+ }
+ }
+
+ @Override
+ public T mapData(byte[] message, Class dataType) {
+ try {
+ return mapper.readValue(message, dataType);
+ } catch (Exception ex) {
+ throw new MapperException(CPJ, ex);
+ }
+ }
+
+ @Override
+ public T readValue(InputStream src, Class valueType) {
+ try {
+ return mapper.readValue(src, valueType);
+ } catch (Exception ex) {
+ throw new MapperException("Can't read from stream ", ex);
+ }
+ }
+
+ @Override
+ public String dataToString(T data) {
+ try {
+ return new String(mapper.writeValueAsBytes(data), "UTF-8");
+ } catch (Exception ex) {
+ throw new MapperException("Can't convert object to json string", ex);
+ }
+ }
+
+ @Override
+ public String objectToString(Object data) {
+ try {
+ return mapper.writeValueAsString(data);
+ } catch (Exception e) {
+ throw new MapperException("Can`t create string", e);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/configuration/DataMapperAppCfg.java b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/configuration/DataMapperAppCfg.java
new file mode 100755
index 0000000..8db784b
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/main/java/com/softgroup/common/datamapper/configuration/DataMapperAppCfg.java
@@ -0,0 +1,18 @@
+package com.softgroup.common.datamapper.configuration;
+
+import com.softgroup.common.datamapper.DataMapper;
+import com.softgroup.common.datamapper.JacksonDataMapper;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author DoctoRJurius
+ */
+@Configuration
+public class DataMapperAppCfg {
+ @Bean
+ public DataMapper dataMapper() {
+ return new JacksonDataMapper();
+ }
+
+}
diff --git a/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/DataMapperAppCfgIT.java b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/DataMapperAppCfgIT.java
new file mode 100755
index 0000000..0882b5f
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/DataMapperAppCfgIT.java
@@ -0,0 +1,30 @@
+package com.softgroup.common.datamapper;
+
+import com.softgroup.common.datamapper.configuration.DataMapperAppCfg;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {DataMapperAppCfg.class})
+public class DataMapperAppCfgIT {
+
+ @Autowired
+ DataMapper dataMapper;
+
+ @Test
+ public void test(){
+ assertThat(dataMapper, CoreMatchers.notNullValue());
+ assertEquals(JacksonDataMapper.class, dataMapper.getClass());
+ }
+}
diff --git a/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/MapperTest.java b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/MapperTest.java
new file mode 100755
index 0000000..f026c16
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/MapperTest.java
@@ -0,0 +1,139 @@
+package com.softgroup.common.datamapper;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.softgroup.common.datamapper.support.ModelA;
+import com.softgroup.common.datamapper.support.ModelB;
+import com.softgroup.common.datamapper.support.ModelWithEnum;
+import com.softgroup.common.exceptions.MapperException;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.*;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class MapperTest {
+
+ @Test
+ public void testNullArgs() {
+ final JacksonDataMapper mapper = new JacksonDataMapper();
+
+ assertThat(mapper.dataToString(null), is("null"));
+ assertThat(mapper.objectToString(null), is("null"));
+ assertThat(mapper.convert(null, ModelA.class), nullValue());
+
+ }
+
+ @Test
+ public void testMap() {
+ final JacksonDataMapper mapper = new JacksonDataMapper();
+
+ String str = "{\"name\":\"hello\"}";
+ ModelA ma = mapper.mapData(str, ModelA.class);
+ assertThat(ma.getName(), is("hello"));
+ assertThat(mapper.dataToString(ma), is(str));
+
+ Map map = new HashMap<>();
+ map.put("name", "hello world");
+
+ ma = mapper.convert(map, ModelA.class);
+ assertThat(ma.getName(), is("hello world"));
+
+ ma = mapper.mapData(str, new TypeReference() {});
+ assertThat(ma.getName(), is("hello"));
+ assertThat(mapper.dataToString(ma), is(str));
+
+ str = "{\"id\":\"1q2w3e\",\"list\":[{\"name\":\"asd\"},{\"name\":\"zxc\"}]}";
+ ModelB> mb = mapper.mapData(str, ModelB.class);
+ assertThat(mb.getId(), is("1q2w3e"));
+ assertThat(mb.getList(), notNullValue());
+ assertThat(mb.getList().size(), is(2));
+ assertThat(mb.getList().get(0), is(instanceOf(Map.class)));
+ ma = mapper.convert((Map) mb.getList().get(0), ModelA.class);
+ assertThat(ma.getName(), is("asd"));
+
+ Object oMap = mapper.convertToMap(mb);
+ assertThat(oMap, notNullValue());
+ assertThat(oMap , is(instanceOf(Map.class)));
+ map = (Map) oMap;
+ assertThat(map.get("id"), is("1q2w3e"));
+
+ assertThat(mapper.convertToMap(null), nullValue());
+ }
+
+ @Test(expected = MapperException.class)
+ public void testConvertEx() {
+ new JacksonDataMapper().convert(new HashMap<>(), (Class)null);
+ }
+
+ @Test(expected = MapperException.class)
+ public void testMapDataStringEx() {
+ new JacksonDataMapper().mapData((String) null, ModelA.class);
+ }
+
+ @Test(expected = MapperException.class)
+ public void testMapDataBytesEx() {
+ new JacksonDataMapper().mapData((byte[]) null, ModelA.class);
+ }
+
+ @Test(expected = MapperException.class)
+ public void testMapDataTypeRefEx() {
+ new JacksonDataMapper().mapData(null, new TypeReference() {});
+ }
+
+ @Test(expected = MapperException.class)
+ public void testConvertToMapEx() {
+ List list = new ArrayList<>();
+ list.add("q");
+ list.add("w");
+ new JacksonDataMapper().convertToMap(list);
+ }
+
+ @Test
+ public void testWithEnum() {
+ final JacksonDataMapper mapper = new JacksonDataMapper();
+
+ String str = "{\"name\":\"hello\",\"type\":1}";
+ ModelWithEnum me = mapper.mapData(str, ModelWithEnum.class);
+ assertThat(me.getName(), is("hello"));
+ assertThat(me.getType(), is(ModelWithEnum.ModelType.MODEL_X));
+ assertThat(mapper.dataToString(me), is(str));
+
+ str = "{\"name\":\"hello\",\"type\":2}";
+ me = mapper.mapData(str, ModelWithEnum.class);
+ assertThat(me.getName(), is("hello"));
+ assertThat(me.getType(), is(ModelWithEnum.ModelType.MODEL_Y));
+ assertThat(mapper.dataToString(me), is(str));
+
+ }
+
+ @Test(expected = MapperException.class)
+ public void testWithWrongEnumValue() {
+ final JacksonDataMapper mapper = new JacksonDataMapper();
+ String str = "{\"name\":\"hello\",\"type\":\"model_z\"}";
+ ModelWithEnum me = mapper.mapData(str, ModelWithEnum.class);
+ }
+
+ @Test
+ public void testWithNoEnumValue() {
+ final JacksonDataMapper mapper = new JacksonDataMapper();
+ String str = "{\"name\":\"hello\"}";
+ ModelWithEnum me = mapper.mapData(str, ModelWithEnum.class);
+ assertThat(me.getName(), is("hello"));
+ assertThat(me.getType(), nullValue());
+ assertThat(mapper.dataToString(me), is(str));
+
+ }
+
+}
+
diff --git a/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelA.java b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelA.java
new file mode 100755
index 0000000..4552178
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelA.java
@@ -0,0 +1,18 @@
+package com.softgroup.common.datamapper.support;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class ModelA {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelB.java b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelB.java
new file mode 100755
index 0000000..a08a04d
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelB.java
@@ -0,0 +1,29 @@
+package com.softgroup.common.datamapper.support;
+
+import java.util.List;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class ModelB {
+ private String id;
+ private List list;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public List getList() {
+ return list;
+ }
+
+ public void setList(List list) {
+ this.list = list;
+ }
+
+}
diff --git a/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelWithEnum.java b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelWithEnum.java
new file mode 100755
index 0000000..9fb6d76
--- /dev/null
+++ b/softgroup/basis/common-datamapper/src/test/java/com/softgroup/common/datamapper/support/ModelWithEnum.java
@@ -0,0 +1,61 @@
+package com.softgroup.common.datamapper.support;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class ModelWithEnum {
+
+ private String name;
+
+ private ModelType type;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ModelType getType() {
+ return type;
+ }
+
+ public void setType(ModelType type) {
+ this.type = type;
+ }
+
+ public enum ModelType{
+ MODEL_X(1),
+ MODEL_Y(2);
+
+ private final int code;
+
+
+ ModelType(int code) {
+ this.code = code;
+ }
+
+ @JsonValue
+ public int getCode() {
+ return code;
+ }
+
+ @JsonCreator
+ public static ModelType forValue(int code) {
+ for(ModelType v : values()){
+ if( v.getCode() == code){
+ return v;
+ }
+ }
+ return null;
+ }
+
+
+ }
+
+}
diff --git a/softgroup/basis/common-exceptions/pom.xml b/softgroup/basis/common-exceptions/pom.xml
new file mode 100755
index 0000000..3b60674
--- /dev/null
+++ b/softgroup/basis/common-exceptions/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+
+ com.softgroup
+ basis
+ 0.0.1
+
+
+ common-exceptions
+ jar
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/MapperException.java b/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/MapperException.java
new file mode 100755
index 0000000..2ab25d2
--- /dev/null
+++ b/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/MapperException.java
@@ -0,0 +1,17 @@
+package com.softgroup.common.exceptions;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class MapperException extends YouaException {//NOSONAR: this is exception class
+ private static final long serialVersionUID = 1400802494145013136L;
+
+ public MapperException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MapperException(String message) {
+ super(message);
+ }
+}
diff --git a/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/YouaException.java b/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/YouaException.java
new file mode 100755
index 0000000..d2bb625
--- /dev/null
+++ b/softgroup/basis/common-exceptions/src/main/java/com/softgroup/common/exceptions/YouaException.java
@@ -0,0 +1,38 @@
+package com.softgroup.common.exceptions;
+
+/**
+ * @author odin
+ * @since 15.02.17.
+ */
+public class YouaException extends RuntimeException {
+
+ private static final long serialVersionUID = 5235385826696520626L;
+
+ public YouaException() {
+ super();
+ }
+
+ public YouaException(String message) {
+ super(message);
+ }
+
+ public YouaException(String format, Object... args) {
+ this(String.format(format, args));
+ }
+
+ public YouaException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public YouaException(String format, Throwable cause, Object... args) {
+ this(String.format(format, args), cause);
+ }
+
+ public YouaException(Throwable cause) {
+ super(cause);
+ }
+
+ public YouaException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/softgroup/basis/pom.xml b/softgroup/basis/pom.xml
new file mode 100755
index 0000000..84e0736
--- /dev/null
+++ b/softgroup/basis/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+ com.softgroup
+ softgroup
+ 0.0.1
+
+ basis
+ pom
+
+ common-exceptions
+ common-datamapper
+
+
+
+
+
+ org.springframework
+ spring-context
+
+
+
+
\ No newline at end of file
diff --git a/softgroup/frontend/pom.xml b/softgroup/frontend/pom.xml
new file mode 100755
index 0000000..45a53fe
--- /dev/null
+++ b/softgroup/frontend/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+
+ com.softgroup
+ softgroup
+ 0.0.1
+
+
+ frontend
+ pom
+
+
+
+
+
+
+ ${project.build.directory}/endorsed
+ UTF-8
+
+
+
+
\ No newline at end of file
diff --git a/softgroup/pom.xml b/softgroup/pom.xml
new file mode 100755
index 0000000..3718af7
--- /dev/null
+++ b/softgroup/pom.xml
@@ -0,0 +1,205 @@
+
+
+ 4.0.0
+ com.softgroup
+ softgroup
+ 0.0.1
+
+ pom
+ courses-server
+
+
+ frontend
+ services
+ basis
+
+
+
+ UTF-8
+ UTF-8
+ 4.2.5.RELEASE
+
+
+
+
+
+
+
+ com.softgroup
+ common-datamapper
+ ${project.version}
+
+
+
+ com.softgroup
+ common-exceptions
+ ${project.version}
+
+
+
+
+ org.springframework
+ spring-core
+ ${spring.core.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.core.version}
+
+
+
+ org.springframework
+ spring-test
+ ${spring.core.version}
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+
+
+
+ javax
+ javaee-web-api
+ provided
+ 7.0
+
+
+
+ com.google.guava
+ guava
+ 19.0
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.4
+
+
+
+ commons-io
+ commons-io
+ 2.5
+
+
+
+ commons-codec
+ commons-codec
+ 1.10
+
+
+
+
+ com.mattbertolini
+ liquibase-slf4j
+ 2.0.0
+
+
+
+ biz.paluch.logging
+ logstash-gelf
+ 1.10.0
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+ junit-addons
+ junit-addons
+ 1.4
+ test
+
+
+
+ org.mockito
+ mockito-core
+ 2.0.54-beta
+ test
+
+
+
+ org.powermock
+ powermock-core
+ 1.6.5
+
+
+
+ org.powermock
+ powermock-module-junit4-rule-agent
+ 1.6.5
+ test
+
+
+
+ org.powermock
+ powermock-module-junit4
+ 1.6.5
+ test
+
+
+
+
+
+
+ org.powermock
+ powermock-api-easymock
+ 1.6.5
+
+
+
+ org.easymock
+ easymock
+ 3.4
+ test
+
+
+
+ com.openpojo
+ openpojo
+ 0.8.4
+ test
+
+
+
+ org.ow2.asm
+ asm
+ 5.1
+ test
+
+
+
+ org.hamcrest
+ hamcrest-core
+ 1.3
+ test
+
+
+
+ org.springframework
+ spring-test
+
+
+
+
\ No newline at end of file
diff --git a/softgroup/services/pom.xml b/softgroup/services/pom.xml
new file mode 100755
index 0000000..628c2e6
--- /dev/null
+++ b/softgroup/services/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.softgroup
+ softgroup
+ 0.0.1
+
+ services
+
+ pom
+
+
+
+
+
+
+ ${project.build.directory}/endorsed
+ UTF-8
+
+
+
\ No newline at end of file