diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0345ab4..0815c94 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# Version 1.1.0 (?)
+
+* [new] Add Bean Validation support to Morphia (at pre-persist)
+
# Version 1.0.1 (2016-02-09)
* [fix] Flawed release process made this add-on unusable by clients
diff --git a/core/pom.xml b/core/pom.xml
index d835d1c..7aa071c 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.addons.mongodb
mongodb
- 1.0.1-SNAPSHOT
+ 1.1.0-SNAPSHOT
mongodb-core
diff --git a/morphia/pom.xml b/morphia/pom.xml
index 7c489b9..34a7f64 100644
--- a/morphia/pom.xml
+++ b/morphia/pom.xml
@@ -14,7 +14,7 @@
org.seedstack.addons.mongodb
mongodb
- 1.0.1-SNAPSHOT
+ 1.1.0-SNAPSHOT
mongodb-morphia
@@ -31,17 +31,47 @@
${business.version}
true
-
- org.mongodb.morphia
- morphia
- ${morphia.version}
-
+
+ org.mongodb.morphia
+ morphia
+ ${morphia.version}
+
+
+ org.mongodb.morphia
+ morphia-logging-slf4j
+ ${morphia.version}
+
+
+ org.seedstack.addons.validation
+ validation
+ ${validation-addon.version}
+ true
+
+
+ javax.validation
+ validation-api
+ 1.1.0.Final
+ provided
+
+
org.seedstack.seed
seed-testing
${seed.version}
test
+
+ org.hibernate
+ hibernate-validator
+ 5.1.3.Final
+ test
+
+
+ javax.el
+ javax.el-api
+ 2.2.5
+ test
+
ch.qos.logback
logback-classic
@@ -53,13 +83,13 @@
business-core
${business.version}
test
-
+
org.mongodb
mongodb-driver-async
${mongodb.version}
test
-
+
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaIT.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaIT.java
index b3dec22..80c48ed 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaIT.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaIT.java
@@ -7,26 +7,35 @@
*/
package org.seedstack.mongodb.morphia;
+import com.google.inject.Inject;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Key;
-import org.seedstack.seed.it.AbstractSeedIT;
import org.seedstack.mongodb.morphia.fixtures.user.Address;
import org.seedstack.mongodb.morphia.fixtures.user.User;
+import org.seedstack.seed.it.AbstractSeedIT;
-import com.google.inject.Inject;
+import javax.validation.ConstraintViolationException;
+
+import static org.assertj.core.api.Fail.fail;
+
+public class MorphiaIT extends AbstractSeedIT {
+ @Inject
+ @MorphiaDatastore(clientName = "client1", dbName = "db1")
+ private Datastore datastore;
+ @Test
+ public void datastore_test() {
+ User user = new User(1L, "Gerard", "menvuça", new Address("France", "78300", "Poissy", "avenue de l'europe", 1));
+ Key keyUser = datastore.save(user);
+ Assertions.assertThat(keyUser).isNotNull();
+ }
-public class MorphiaIT extends AbstractSeedIT{
- @Inject
- @MorphiaDatastore(clientName = "client1",dbName="db1")
- private Datastore datastore;
-
- @Test
- public void datastore_test(){
- User user = new User(1L,"Gerard", "menvuça", new Address("France", "78300", "Poissy", "avenue de l'europe", 1));
- Key keyUser = datastore.save(user);
- Assertions.assertThat(keyUser).isNotNull();
- }
+ @Test(expected = ConstraintViolationException.class)
+ public void validation_is_working() {
+ User user = new User(1L, null, "menvuça", new Address("France", "78300", "Poissy", "avenue de l'europe", 1));
+ datastore.save(user);
+ fail("should not have saved");
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java
index a3bdfc7..cec7d40 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/MorphiaRepositoryIT.java
@@ -7,126 +7,135 @@
*/
package org.seedstack.mongodb.morphia;
-import com.google.inject.*;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
import com.google.inject.util.Types;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.seedstack.business.domain.Repository;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy1;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy2;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy3;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy4;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy5;
+import org.seedstack.mongodb.morphia.fixtures.dummyobject.Dummy6;
+import org.seedstack.mongodb.morphia.fixtures.user.Address;
+import org.seedstack.mongodb.morphia.fixtures.user.User;
import org.seedstack.mongodb.morphia.internal.MorphiaErrorCodes;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.it.AbstractSeedIT;
-import org.seedstack.mongodb.morphia.fixtures.dummyobject.*;
-import org.seedstack.mongodb.morphia.fixtures.user.Address;
-import org.seedstack.mongodb.morphia.fixtures.user.User;
public class MorphiaRepositoryIT extends AbstractSeedIT {
- @Inject
- @Morphia
- private Repository userRepository;
+ @Inject
+ @Morphia
+ private Repository userRepository;
+
+ @Inject
+ private Injector injector;
- @Inject
- private Injector injector;
+ @Test
+ public void repository_injection_test_no_client_for_aggregate() {
+ try {
- @Test
- public void repository_injection_test_no_client_for_aggregate() {
- try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy1.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage());
+ }
+ }
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy1.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage());
- }
- }
+ @Test
+ public void repository_injection_test_no_dbName_for_aggregate() {
+ try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy2.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_DATABASE).getMessage());
+ }
+ }
- @Test
- public void repository_injection_test_no_dbName_for_aggregate() {
- try {
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy2.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_DATABASE).getMessage());
- }
- }
+ @Test
+ public void repository_injection_test_no_mongoDb_client() {
+ try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy3.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage());
+ }
+ }
- @Test
- public void repository_injection_test_no_mongoDb_client() {
- try {
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy3.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT).getMessage());
- }
- }
+ @Test
+ public void repository_injection_test_no_mongoDb_database() {
+ try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy4.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATABASE_NAME).getMessage());
+ }
+ }
- @Test
- public void repository_injection_test_no_mongoDb_database() {
- try {
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy4.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATABASE_NAME).getMessage());
- }
- }
+ @Test
+ public void repository_injection_test_no_mongodb_for_aggregate() {
+ try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy5.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CONFIGURATION).getMessage());
+ }
+ }
- @Test
- public void repository_injection_test_no_mongodb_for_aggregate() {
- try {
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy5.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CONFIGURATION).getMessage());
- }
- }
+ @Test
+ public void repository_injection_async_client() {
+ try {
+ injector.getInstance(
+ Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy6.class, Long.class)),
+ Morphia.class));
+ } catch (ProvisionException e) {
+ Assertions.assertThat(e.getCause().getMessage())
+ .isEqualTo(SeedException.createNew(MorphiaErrorCodes.ERROR_ASYNC_CLIENT).getMessage());
+ }
+ }
- @Test
- public void repository_injection_async_client() {
- try {
- injector.getInstance(
- Key.get(TypeLiteral.get(Types.newParameterizedType(Repository.class, Dummy6.class, Long.class)),
- Morphia.class));
- } catch (ProvisionException e) {
- Assertions.assertThat(e.getCause().getMessage())
- .isEqualTo(SeedException.createNew(MorphiaErrorCodes.ERROR_ASYNC_CLIENT).getMessage());
- }
- }
+ @Test
+ public void mongodb_repository_test() {
+ Assertions.assertThat(userRepository).isNotNull();
+ User user1 = getUser(1L, "N°", "1");
+ userRepository.persist(user1);
+ User user2 = userRepository.load(user1.getEntityId());
+ Assertions.assertThat(user1.getId()).isEqualTo(user2.getId());
+ Assertions.assertThat(user1.getEntityId()).isEqualTo(user2.getEntityId());
+ userRepository.delete(user1);
+ User user3 = userRepository.load(user1.getEntityId());
+ Assertions.assertThat(user3).isEqualTo(null);
+ User user5 = getUser(2L, "N°", "2");
+ userRepository.delete(user5);
+ userRepository.save(user5);
+ User user6 = userRepository.load(user5.getEntityId());
+ Assertions.assertThat(user6.getId()).isEqualTo(user5.getId());
+ userRepository.delete(user5);
+ user6 = userRepository.load(user5.getEntityId());
+ Assertions.assertThat(user6).isEqualTo(null);
+ userRepository.persist(user5);
+ Assertions.assertThat(userRepository.load(2L)).isNotEqualTo(null);
+ }
- @Test
- public void mongodb_repository_test() {
- Assertions.assertThat(userRepository).isNotNull();
- User user1 = getUser(1L, "N°", "1");
- userRepository.persist(user1);
- User user2 = userRepository.load(user1.getEntityId());
- Assertions.assertThat(user1.getId()).isEqualTo(user2.getId());
- Assertions.assertThat(user1.getEntityId()).isEqualTo(user2.getEntityId());
- userRepository.delete(user1);
- User user3 = userRepository.load(user1.getEntityId());
- Assertions.assertThat(user3).isEqualTo(null);
- User user5 = getUser(2L, "N°", "2");
- userRepository.delete(user5);
- userRepository.save(user5);
- User user6 = userRepository.load(user5.getEntityId());
- Assertions.assertThat(user6.getId()).isEqualTo(user5.getId());
- userRepository.delete(user5);
- user6 = userRepository.load(user5.getEntityId());
- Assertions.assertThat(user6).isEqualTo(null);
- userRepository.persist(user5);
- Assertions.assertThat(userRepository.load(2L)).isNotEqualTo(null);
- }
-
- public User getUser(long id, String firstname, String lastName) {
- return new User(id, firstname, lastName, new Address("France", "75001", "Paris", "Champ Elysee avenue", 1));
- }
+ public User getUser(long id, String firstname, String lastName) {
+ return new User(id, firstname, lastName, new Address("France", "75001", "Paris", "Champ Elysee avenue", 1));
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy1.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy1.java
index 025b50d..88b6892 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy1.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy1.java
@@ -11,9 +11,9 @@
public class Dummy1 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy2.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy2.java
index fe0c315..261d011 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy2.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy2.java
@@ -9,11 +9,11 @@
import org.seedstack.business.domain.BaseAggregateRoot;
-public class Dummy2 extends BaseAggregateRoot {
+public class Dummy2 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy3.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy3.java
index 470f861..8508d6e 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy3.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy3.java
@@ -9,11 +9,11 @@
import org.seedstack.business.domain.BaseAggregateRoot;
-public class Dummy3 extends BaseAggregateRoot {
+public class Dummy3 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy4.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy4.java
index 818315d..51780aa 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy4.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy4.java
@@ -11,10 +11,9 @@
public class Dummy4 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- // TODO Auto-generated method stub
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy5.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy5.java
index b512472..33906be 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy5.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy5.java
@@ -11,10 +11,9 @@
public class Dummy5 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- // TODO Auto-generated method stub
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
\ No newline at end of file
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy6.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy6.java
index 31000b6..ed87007 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy6.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/dummyobject/Dummy6.java
@@ -11,10 +11,9 @@
public class Dummy6 extends BaseAggregateRoot {
- @Override
- public Long getEntityId() {
- // TODO Auto-generated method stub
- return null;
- }
+ @Override
+ public Long getEntityId() {
+ return null;
+ }
}
\ No newline at end of file
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java
index 225d1d9..c87bebe 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/Address.java
@@ -11,57 +11,66 @@
import org.seedstack.business.domain.ValueObject;
@Embedded
-public class Address implements ValueObject{
- private String country;
- private String zipcode;
- private String city;
- private String street;
- private Integer number;
-
-
-
- public Address() {
- super();
- }
- public Address(String country, String zipcode, String city, String street, Integer number) {
- super();
- this.country = country;
- this.zipcode = zipcode;
- this.city = city;
- this.street = street;
- this.number = number;
- }
- public String getCountry() {
- return country;
- }
- public void setCountry(String country) {
- this.country = country;
- }
- public String getZipcode() {
- return zipcode;
- }
- public void setZipcode(String zipcode) {
- this.zipcode = zipcode;
- }
- public String getCity() {
- return city;
- }
- public void setCity(String city) {
- this.city = city;
- }
- public String getStreet() {
- return street;
- }
- public void setStreet(String street) {
- this.street = street;
- }
- public Integer getNumber() {
- return number;
- }
- public void setNumber(Integer number) {
- this.number = number;
- }
-
-
-
+public class Address implements ValueObject {
+ private String country;
+ private String zipCode;
+ private String city;
+ private String street;
+ private Integer number;
+
+
+ public Address() {
+ super();
+ }
+
+ public Address(String country, String zipCode, String city, String street, Integer number) {
+ super();
+ this.country = country;
+ this.zipCode = zipCode;
+ this.city = city;
+ this.street = street;
+ this.number = number;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public Integer getNumber() {
+ return number;
+ }
+
+ public void setNumber(Integer number) {
+ this.number = number;
+ }
+
+
}
diff --git a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/User.java b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/User.java
index 659d867..cd82f20 100644
--- a/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/User.java
+++ b/morphia/src/it/java/org/seedstack/mongodb/morphia/fixtures/user/User.java
@@ -11,70 +11,69 @@
import org.mongodb.morphia.annotations.Id;
import org.seedstack.business.domain.AggregateRoot;
+import javax.validation.constraints.NotNull;
+
@Entity
-public class User implements AggregateRoot{
-
-
-
- public User() {
- super();
- // TODO Auto-generated constructor stub
- }
-
- public User(long id, String name, String lastname, Address address) {
- super();
- this.id = id;
- this.name = name;
- this.lastname = lastname;
- this.address = address;
- }
-
- @Id
- private long id;
-
- private String name;
-
- private String lastname;
-
- private Address address;
-
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- @Override
- public Long getEntityId() {
- return id;
- }
-
-
+public class User implements AggregateRoot {
+
+
+ public User() {
+ }
+
+ public User(long id, String name, String lastName, Address address) {
+ this.id = id;
+ this.name = name;
+ this.lastname = lastName;
+ this.address = address;
+ }
+
+ @Id
+ private long id;
+
+ @NotNull
+ private String name;
+
+ private String lastname;
+
+ private Address address;
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ @Override
+ public Long getEntityId() {
+ return id;
+ }
+
+
}
diff --git a/morphia/src/it/resources/logback-test.xml b/morphia/src/it/resources/logback-test.xml
index a92e301..06dda42 100644
--- a/morphia/src/it/resources/logback-test.xml
+++ b/morphia/src/it/resources/logback-test.xml
@@ -15,6 +15,6 @@
-
+
\ No newline at end of file
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java
index 072b466..e698e19 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/BaseMorphiaRepository.java
@@ -13,56 +13,54 @@
import org.mongodb.morphia.Datastore;
import org.seedstack.business.domain.AggregateRoot;
import org.seedstack.business.domain.BaseRepository;
-import org.seedstack.mongodb.morphia.internal.MorphiaPlugin;
+import org.seedstack.mongodb.morphia.internal.MorphiaUtils;
import org.seedstack.seed.Application;
/**
* This class serves as inheritance base for the Mongodb repositories.
*
- * @param
- * Mongodb Entity Type (DDD: Aggregate)
- * @param
- * key type
+ * @param Mongodb Entity Type (DDD: Aggregate)
+ * @param key type
* @author redouane.loulou@ext.mpsa.com Date: 20/10/2015
*/
public abstract class BaseMorphiaRepository, K> extends BaseRepository {
- private Datastore datastore;
+ private Datastore datastore;
- protected Datastore getDatastore() {
- return datastore;
- }
+ protected Datastore getDatastore() {
+ return datastore;
+ }
- @Inject
- private void initDatastore(Application application, Injector injector) {
- datastore = injector.getInstance(Key.get(Datastore.class, MorphiaPlugin.getMongoDatastore(application, aggregateRootClass)));
- }
+ @Inject
+ private void initDatastore(Application application, Injector injector) {
+ datastore = injector.getInstance(Key.get(Datastore.class, MorphiaUtils.getMongoDatastore(application, aggregateRootClass)));
+ }
- @Override
- protected A doLoad(K id) {
- return datastore.get(aggregateRootClass, id);
- }
+ @Override
+ protected A doLoad(K id) {
+ return datastore.get(aggregateRootClass, id);
+ }
- @Override
- protected void doDelete(K id) {
- datastore.delete(aggregateRootClass, id);
- }
+ @Override
+ protected void doDelete(K id) {
+ datastore.delete(aggregateRootClass, id);
+ }
- @Override
- protected void doDelete(A aggregate) {
- datastore.delete(aggregate);
+ @Override
+ protected void doDelete(A aggregate) {
+ datastore.delete(aggregate);
- }
+ }
- @Override
- protected void doPersist(A aggregate) {
- datastore.save(aggregate);
+ @Override
+ protected void doPersist(A aggregate) {
+ datastore.save(aggregate);
- }
+ }
- @Override
- protected A doSave(A aggregate) {
- return datastore.get(aggregateRootClass, datastore.save(aggregate).getId());
- }
+ @Override
+ protected A doSave(A aggregate) {
+ return datastore.get(aggregateRootClass, datastore.save(aggregate).getId());
+ }
}
\ No newline at end of file
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/MorphiaDatastore.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/MorphiaDatastore.java
index 1bde3ae..3958dd4 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/MorphiaDatastore.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/MorphiaDatastore.java
@@ -7,14 +7,14 @@
*/
package org.seedstack.mongodb.morphia;
+import com.google.inject.BindingAnnotation;
+
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import com.google.inject.BindingAnnotation;
-
/**
* This qualifier marks the use of the Mongodb persistence.
*
@@ -23,9 +23,10 @@
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
-@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@BindingAnnotation
public @interface MorphiaDatastore {
- String clientName();
- String dbName();
+ String clientName();
+
+ String dbName();
}
\ No newline at end of file
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java
index ce8801d..ae521c9 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DatastoreProvider.java
@@ -7,47 +7,45 @@
*/
package org.seedstack.mongodb.morphia.internal;
-import org.mongodb.morphia.Datastore;
-import org.mongodb.morphia.Morphia;
-import org.seedstack.seed.Application;
-import org.seedstack.mongodb.morphia.MorphiaDatastore;
-
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.name.Names;
import com.mongodb.MongoClient;
+import org.mongodb.morphia.Datastore;
+import org.mongodb.morphia.Morphia;
+import org.seedstack.mongodb.morphia.MorphiaDatastore;
+import org.seedstack.seed.Application;
+
/**
- *
* @author redouane.loulou@ext.mpsa.com
- *
*/
class DatastoreProvider implements Provider {
- @Inject
- private Injector injector;
+ @Inject
+ private Injector injector;
- @Inject
- private Application application;
+ @Inject
+ private Application application;
- private Class> mappedclass;
+ private Class> mappedclass;
- private MorphiaDatastore morphiaDatastore;
+ private MorphiaDatastore morphiaDatastore;
- private final Morphia morphia;
+ private final Morphia morphia;
- @Override
- public Datastore get() {
- MongoClient mongoClient = injector
- .getInstance(Key.get(MongoClient.class, Names.named(morphiaDatastore.clientName())));
- return morphia.createDatastore(mongoClient, morphiaDatastore.dbName());
- }
+ @Override
+ public Datastore get() {
+ MongoClient mongoClient = injector
+ .getInstance(Key.get(MongoClient.class, Names.named(morphiaDatastore.clientName())));
+ return morphia.createDatastore(mongoClient, morphiaDatastore.dbName());
+ }
- public DatastoreProvider(MorphiaDatastore morphiaDatastore, Morphia morphia) {
- super();
- this.morphiaDatastore = morphiaDatastore;
- this.morphia = morphia;
- }
+ public DatastoreProvider(MorphiaDatastore morphiaDatastore, Morphia morphia) {
+ super();
+ this.morphiaDatastore = morphiaDatastore;
+ this.morphia = morphia;
+ }
}
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DefaultMorphiaRepository.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DefaultMorphiaRepository.java
index facd5f4..7204367 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DefaultMorphiaRepository.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/DefaultMorphiaRepository.java
@@ -7,15 +7,14 @@
*/
package org.seedstack.mongodb.morphia.internal;
-import javax.inject.Inject;
-
+import com.google.inject.assistedinject.Assisted;
import org.seedstack.business.domain.AggregateRoot;
import org.seedstack.business.spi.GenericImplementation;
import org.seedstack.mongodb.morphia.BaseMorphiaRepository;
-import org.seedstack.seed.core.utils.SeedCheckUtils;
import org.seedstack.mongodb.morphia.Morphia;
+import org.seedstack.seed.core.utils.SeedCheckUtils;
-import com.google.inject.assistedinject.Assisted;
+import javax.inject.Inject;
/**
* Default Morphia implementation for Repository. Used only when no implementation is provided for an aggregate.
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/InternalValidationExtension.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/InternalValidationExtension.java
new file mode 100644
index 0000000..4946657
--- /dev/null
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/InternalValidationExtension.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2013-2016, The SeedStack authors
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.seedstack.mongodb.morphia.internal;
+
+import com.mongodb.DBObject;
+import org.mongodb.morphia.AbstractEntityInterceptor;
+import org.mongodb.morphia.Morphia;
+import org.mongodb.morphia.mapping.Mapper;
+import org.seedstack.validation.api.VerboseConstraintViolationException;
+
+import javax.validation.ValidatorFactory;
+import java.util.Set;
+
+class InternalValidationExtension extends AbstractEntityInterceptor {
+ private final ValidatorFactory validatorFactory;
+
+ InternalValidationExtension(final ValidatorFactory validatorFactory, final Morphia morphia) {
+ this.validatorFactory = validatorFactory;
+ morphia.getMapper().addInterceptor(this);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void prePersist(final Object ent, final DBObject dbObj, final Mapper mapper) {
+ final Set result = validatorFactory.getValidator().validate(ent);
+ if (!result.isEmpty()) {
+ throw new VerboseConstraintViolationException(result);
+ }
+ }
+}
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaDatastoreImpl.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaDatastoreImpl.java
index da45bef..6359e64 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaDatastoreImpl.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaDatastoreImpl.java
@@ -7,68 +7,67 @@
*/
package org.seedstack.mongodb.morphia.internal;
+import org.seedstack.mongodb.morphia.MorphiaDatastore;
+
import java.io.Serializable;
import java.lang.annotation.Annotation;
-import org.seedstack.mongodb.morphia.MorphiaDatastore;
/**
- *
* @author redouane.loulou@ext.mpsa.com
- *
*/
-class MorphiaDatastoreImpl implements MorphiaDatastore, Serializable {
+class MorphiaDatastoreImpl implements MorphiaDatastore, Serializable {
+
+ private static final long serialVersionUID = 3861460142806494075L;
+ private String clientName;
+ private String dbName;
- private static final long serialVersionUID = 3861460142806494075L;
- private String clientName;
- private String dbName;
+ public MorphiaDatastoreImpl(String clientName, String dbName) {
+ this.clientName = clientName;
+ this.dbName = dbName;
+ }
- public MorphiaDatastoreImpl(String clientName, String dbName) {
- this.clientName = clientName;
- this.dbName = dbName;
- }
+ @Override
+ public Class extends Annotation> annotationType() {
+ return MorphiaDatastore.class;
+ }
- @Override
- public Class extends Annotation> annotationType() {
- return MorphiaDatastore.class;
- }
+ @Override
+ public String dbName() {
+ return dbName;
+ }
- @Override
- public String dbName() {
- return dbName;
- }
+ @Override
+ public String clientName() {
+ return clientName;
+ }
- @Override
- public String clientName() {
- return clientName;
- }
+ @Override
+ public int hashCode() {
+ return ((127 * "clientName".hashCode()) ^ clientName.hashCode())
+ + ((127 * "dbName".hashCode()) ^ dbName.hashCode());
+ }
- @Override
- public int hashCode() {
- return ((127 * "clientName".hashCode()) ^ clientName.hashCode())
- + ((127 * "dbName".hashCode()) ^ dbName.hashCode());
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof MorphiaDatastore))
+ return false;
+ MorphiaDatastoreImpl other = (MorphiaDatastoreImpl) obj;
+ if (clientName == null) {
+ if (other.clientName != null)
+ return false;
+ } else if (!clientName.equals(other.clientName))
+ return false;
+ if (dbName == null) {
+ if (other.dbName != null)
+ return false;
+ } else if (!dbName.equals(other.dbName))
+ return false;
+ return true;
+ }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (!(obj instanceof MorphiaDatastore))
- return false;
- MorphiaDatastoreImpl other = (MorphiaDatastoreImpl) obj;
- if (clientName == null) {
- if (other.clientName != null)
- return false;
- } else if (!clientName.equals(other.clientName))
- return false;
- if (dbName == null) {
- if (other.dbName != null)
- return false;
- } else if (!dbName.equals(other.dbName))
- return false;
- return true;
- }
-
}
\ No newline at end of file
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaErrorCodes.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaErrorCodes.java
index 11439e7..8febaf7 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaErrorCodes.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaErrorCodes.java
@@ -10,9 +10,7 @@
import org.seedstack.seed.ErrorCode;
/**
- *
* @author redouane.loulou@ext.mpsa.com
- *
*/
public enum MorphiaErrorCodes implements ErrorCode {
UNKNOW_DATASTORE_CONFIGURATION,
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java
index d0a7541..32c522a 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaModule.java
@@ -6,45 +6,42 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/**
- *
+ *
*/
package org.seedstack.mongodb.morphia.internal;
-import java.util.Collection;
-
+import com.google.inject.AbstractModule;
+import com.google.inject.Key;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.seedstack.mongodb.morphia.MorphiaDatastore;
-import com.google.inject.AbstractModule;
-import com.google.inject.Key;
+import java.util.Collection;
/**
* @author redouane.loulou@ext.mpsa.com
- *
*/
-class MorphiaModule extends AbstractModule{
-
- private Collection morphiaDatastoresAnnotation;
- private final Morphia morphia;
-
- public MorphiaModule(Collection morphiaDatastoresAnnotation, Morphia morphia) {
- super();
- this.morphiaDatastoresAnnotation = morphiaDatastoresAnnotation;
- this.morphia = morphia;
- }
-
- @Override
- protected void configure() {
- if(morphiaDatastoresAnnotation!=null && !morphiaDatastoresAnnotation.isEmpty()){
- for (MorphiaDatastore morphiaDatastore : morphiaDatastoresAnnotation) {
- DatastoreProvider datastoreProvider = new DatastoreProvider(morphiaDatastore, morphia);
- requestInjection(datastoreProvider);
- bind(Key.get(Datastore.class, morphiaDatastore)).toProvider(datastoreProvider);
- }
- }
- }
-
-
-
+class MorphiaModule extends AbstractModule {
+
+ private Collection morphiaDatastoresAnnotation;
+ private final Morphia morphia;
+
+ public MorphiaModule(Collection morphiaDatastoresAnnotation, Morphia morphia) {
+ super();
+ this.morphiaDatastoresAnnotation = morphiaDatastoresAnnotation;
+ this.morphia = morphia;
+ }
+
+ @Override
+ protected void configure() {
+ if (morphiaDatastoresAnnotation != null && !morphiaDatastoresAnnotation.isEmpty()) {
+ for (MorphiaDatastore morphiaDatastore : morphiaDatastoresAnnotation) {
+ DatastoreProvider datastoreProvider = new DatastoreProvider(morphiaDatastore, morphia);
+ requestInjection(datastoreProvider);
+ bind(Key.get(Datastore.class, morphiaDatastore)).toProvider(datastoreProvider);
+ }
+ }
+ }
+
+
}
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java
index 598395c..e23e256 100644
--- a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaPlugin.java
@@ -12,52 +12,78 @@
import io.nuun.kernel.api.plugin.context.InitContext;
import io.nuun.kernel.api.plugin.request.ClasspathScanRequest;
import io.nuun.kernel.core.AbstractPlugin;
-import org.apache.commons.configuration.Configuration;
import org.kametic.specifications.Specification;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.annotations.Embedded;
import org.mongodb.morphia.annotations.Entity;
import org.seedstack.mongodb.morphia.MorphiaDatastore;
import org.seedstack.seed.Application;
-import org.seedstack.seed.SeedException;
import org.seedstack.seed.core.internal.application.ApplicationPlugin;
import org.seedstack.seed.core.utils.BaseClassSpecifications;
+import org.seedstack.seed.core.utils.SeedReflectionUtils;
+import org.seedstack.validation.internal.ValidationPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import java.util.Arrays;
+import javax.validation.ValidatorFactory;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import static org.seedstack.seed.core.utils.BaseClassSpecifications.classIsAbstract;
/**
- *
- * @author redouane.loulou@ext.mpsa.com
+ * This plugin manages the MongoDb Morphia object/document mapping library.
*/
public class MorphiaPlugin extends AbstractPlugin {
+ private static final Logger logger = LoggerFactory.getLogger(MorphiaPlugin.class);
- private static final Specification> MORPHIA_MAPPED_CLASSES_SPECS = morphiaSpecification();
-
- private Collection morphiaDatastores = new HashSet();
-
+ private final Specification> MORPHIA_MAPPED_CLASSES_SPECS = morphiaSpecification();
+ private final Collection morphiaDatastores = new HashSet();
private final Morphia morphia = new Morphia();
-
@Override
public String name() {
return "morphia";
}
+ @Override
+ public Collection> requiredPlugins() {
+ ArrayList> requiredPlugins = Lists.>newArrayList(ApplicationPlugin.class, MongoDbPlugin.class);
+ if (isValidationPluginPresent()) {
+ requiredPlugins.add(ValidationPlugin.class);
+ }
+ return requiredPlugins;
+ }
+
+ private boolean isValidationPluginPresent() {
+ return SeedReflectionUtils.isClassPresent("org.seedstack.validation.internal.ValidationPlugin");
+ }
+
+ @Override
+ public Collection classpathScanRequests() {
+ return classpathScanRequestBuilder().specification(MORPHIA_MAPPED_CLASSES_SPECS).build();
+ }
+
@Override
public InitState init(InitContext initContext) {
Application application = initContext.dependency(ApplicationPlugin.class).getApplication();
+ if (isValidationPluginPresent()) {
+ ValidatorFactory validatorFactory = initContext.dependency(ValidationPlugin.class).getValidatorFactory();
+ if (validatorFactory != null) {
+ new InternalValidationExtension(validatorFactory, morphia);
+ logger.debug("Validation is enabled on Morphia entities");
+ }
+ }
+
if (MORPHIA_MAPPED_CLASSES_SPECS != null) {
Collection> morphiaScannedClasses = initContext.scannedTypesBySpecification().get(MORPHIA_MAPPED_CLASSES_SPECS);
if (morphiaScannedClasses != null && !morphiaScannedClasses.isEmpty()) {
morphia.map(new HashSet(morphiaScannedClasses));
for (Class> morphiaClass : morphiaScannedClasses) {
- MorphiaDatastore morphiaDatastore = getMongoDatastore(application, morphiaClass);
+ MorphiaDatastore morphiaDatastore = MorphiaUtils.getMongoDatastore(application, morphiaClass);
if (!morphiaDatastores.contains(morphiaDatastore)) {
morphiaDatastores.add(morphiaDatastore);
}
@@ -67,64 +93,13 @@ public InitState init(InitContext initContext) {
return InitState.INITIALIZED;
}
- /**
- * Returns an instance of the annotation MorphiaDatastore if the morphia configuration is ok.
- *
- * @param application Application
- * @param morphiaClass persistent morphia object
- * @return MorphiaDatastore
- */
- public static MorphiaDatastore getMongoDatastore(Application application, Class> morphiaClass) {
- Configuration morphiaEntityConfiguration = application.getConfiguration(morphiaClass).subset("morphia");
- if (morphiaEntityConfiguration.isEmpty()) {
- throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CONFIGURATION).put("aggregate",
- morphiaClass.getName());
- }
- String clientName = morphiaEntityConfiguration.getString("clientName");
- String dbName = morphiaEntityConfiguration.getString("dbName");
- if (clientName == null) {
- throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT)
- .put("aggregate", morphiaClass.getName()).put("clientName", clientName);
- }
- if (dbName == null) {
- throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_DATABASE)
- .put("aggregate", morphiaClass.getName()).put("clientName", clientName).put("dbName", dbName);
- }
- checkMongoClient(application.getConfiguration(), morphiaClass, clientName, dbName);
- MorphiaDatastore morphiaDatastore = new MorphiaDatastoreImpl(clientName, dbName);
- return morphiaDatastore;
- }
-
- private static void checkMongoClient(Configuration configuration, Class> mappedClass, String clientName, String dbName) {
- Configuration configurationClientMongodb = configuration.subset(MongoDbPlugin.CONFIGURATION_PREFIX + ".client." + clientName);
- if (configurationClientMongodb.isEmpty()) {
- throw SeedException.createNew(MongoDbErrorCodes.UNKNOWN_CLIENT_SPECIFIED)
- .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
- }
- boolean async = configurationClientMongodb.getBoolean("async", false);
- if (async) {
- throw SeedException.createNew(MorphiaErrorCodes.ERROR_ASYNC_CLIENT)
- .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
- }
- String[] dbNames = configurationClientMongodb.getStringArray("databases");
- if (dbNames != null && dbNames.length > 0 && !Arrays.asList(dbNames).contains(dbName)) {
- throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATABASE_NAME)
- .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
- }
- }
-
- @Override
- public Collection> requiredPlugins() {
- return Lists.>newArrayList(ApplicationPlugin.class, MongoDbPlugin.class);
- }
-
@Override
- public Collection classpathScanRequests() {
- return classpathScanRequestBuilder().specification(MORPHIA_MAPPED_CLASSES_SPECS).build();
+ public Object nativeUnitModule() {
+ return new MorphiaModule(morphiaDatastores, morphia);
}
@SuppressWarnings("unchecked")
- private static Specification> morphiaSpecification() {
+ private Specification> morphiaSpecification() {
Specification> specification;
specification = BaseClassSpecifications.and(
BaseClassSpecifications.or(BaseClassSpecifications.classAnnotatedWith(Entity.class),
@@ -133,11 +108,4 @@ private static Specification> morphiaSpecification() {
return specification;
}
-
- @Override
- public Object nativeUnitModule() {
- return new MorphiaModule(morphiaDatastores, morphia);
- }
-
-
}
\ No newline at end of file
diff --git a/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaUtils.java b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaUtils.java
new file mode 100644
index 0000000..0386ee5
--- /dev/null
+++ b/morphia/src/main/java/org/seedstack/mongodb/morphia/internal/MorphiaUtils.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2013-2016, The SeedStack authors
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.seedstack.mongodb.morphia.internal;
+
+import org.apache.commons.configuration.Configuration;
+import org.seedstack.mongodb.morphia.MorphiaDatastore;
+import org.seedstack.seed.Application;
+import org.seedstack.seed.SeedException;
+
+import java.util.Arrays;
+
+public final class MorphiaUtils {
+ private MorphiaUtils() {
+
+ }
+
+ /**
+ * Returns an instance of the annotation MorphiaDatastore if the morphia configuration is ok.
+ *
+ * @param application Application
+ * @param morphiaClass persistent morphia object
+ * @return MorphiaDatastore
+ */
+ public static MorphiaDatastore getMongoDatastore(Application application, Class> morphiaClass) {
+ Configuration morphiaEntityConfiguration = application.getConfiguration(morphiaClass).subset("morphia");
+ if (morphiaEntityConfiguration.isEmpty()) {
+ throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CONFIGURATION).put("aggregate",
+ morphiaClass.getName());
+ }
+ String clientName = morphiaEntityConfiguration.getString("clientName");
+ String dbName = morphiaEntityConfiguration.getString("dbName");
+ if (clientName == null) {
+ throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_CLIENT)
+ .put("aggregate", morphiaClass.getName()).put("clientName", clientName);
+ }
+ if (dbName == null) {
+ throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATASTORE_DATABASE)
+ .put("aggregate", morphiaClass.getName()).put("clientName", clientName).put("dbName", dbName);
+ }
+ checkMongoClient(application.getConfiguration(), morphiaClass, clientName, dbName);
+ MorphiaDatastore morphiaDatastore = new MorphiaDatastoreImpl(clientName, dbName);
+ return morphiaDatastore;
+ }
+
+ private static void checkMongoClient(Configuration configuration, Class> mappedClass, String clientName, String dbName) {
+ Configuration configurationClientMongodb = configuration.subset(MongoDbPlugin.CONFIGURATION_PREFIX + ".client." + clientName);
+ if (configurationClientMongodb.isEmpty()) {
+ throw SeedException.createNew(MongoDbErrorCodes.UNKNOWN_CLIENT_SPECIFIED)
+ .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
+ }
+ boolean async = configurationClientMongodb.getBoolean("async", false);
+ if (async) {
+ throw SeedException.createNew(MorphiaErrorCodes.ERROR_ASYNC_CLIENT)
+ .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
+ }
+ String[] dbNames = configurationClientMongodb.getStringArray("databases");
+ if (dbNames != null && dbNames.length > 0 && !Arrays.asList(dbNames).contains(dbName)) {
+ throw SeedException.createNew(MorphiaErrorCodes.UNKNOW_DATABASE_NAME)
+ .put("aggregate", mappedClass.getName()).put("clientName", clientName).put("dbName", dbName);
+ }
+ }
+}
diff --git a/morphia/src/test/resources/logback-test.xml b/morphia/src/test/resources/logback-test.xml
index a92e301..06dda42 100644
--- a/morphia/src/test/resources/logback-test.xml
+++ b/morphia/src/test/resources/logback-test.xml
@@ -15,6 +15,6 @@
-
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ec5282a..ce158d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,14 +19,15 @@
org.seedstack.addons.mongodb
mongodb
- 1.0.1-SNAPSHOT
+ 1.1.0-SNAPSHOT
pom
2.1.0
3.0.3
- 1.0.1
+ 1.1.1
2.1.0
+ 2.3.0-SNAPSHOT
1.0.0