mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
initial rework for new enhancement
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
package com.avaje.ebeaninternal.server.cache;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.bean.EntityBean;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.tests.model.basic.Address;
|
||||
import com.avaje.tests.model.basic.Country;
|
||||
import com.avaje.tests.model.basic.Customer;
|
||||
import com.avaje.tests.model.basic.Customer.Status;
|
||||
|
||||
public class TestCacheBeanData extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
BeanDescriptor<Customer> desc = server.getBeanDescriptor(Customer.class);
|
||||
|
||||
Customer c = new Customer();
|
||||
c.setId(98989);
|
||||
c.setName("Rob");
|
||||
c.setCretime(new Timestamp(System.currentTimeMillis()));
|
||||
c.setUpdtime(new Timestamp(System.currentTimeMillis()));
|
||||
c.setStatus(Status.ACTIVE);
|
||||
c.setSmallnote("somenote");
|
||||
|
||||
Address billingAddress = new Address();
|
||||
billingAddress.setId((short)12);
|
||||
billingAddress.setCity("Auckland");
|
||||
billingAddress.setCountry(server.getReference(Country.class, "NZ"));
|
||||
billingAddress.setLine1("92 Someplace Else");
|
||||
c.setBillingAddress(billingAddress);
|
||||
|
||||
((EntityBean)c)._ebean_getIntercept().setNewBeanForUpdate();
|
||||
|
||||
CachedBeanData cacheData = CachedBeanDataFromBean.extract(desc, (EntityBean)c);
|
||||
//BeanProperty idProperty = desc.getBeanProperty("id");
|
||||
//Assert.assertTrue(cacheData.isLoaded(idProperty.getPropertyIndex()));
|
||||
|
||||
Assert.assertNotNull(cacheData);
|
||||
|
||||
Customer newCustomer = new Customer();
|
||||
newCustomer.setId(c.getId());
|
||||
CachedBeanDataToBean.load(desc, (EntityBean)newCustomer, cacheData);
|
||||
|
||||
Assert.assertEquals(c.getId(), newCustomer.getId());
|
||||
Assert.assertEquals(c.getName(), newCustomer.getName());
|
||||
Assert.assertEquals(c.getStatus(), newCustomer.getStatus());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,11 @@ public class TestDeleteOneToOneMultiple extends BaseTestCase {
|
||||
public void testCreateDeletePersistentFile() {
|
||||
|
||||
PFile persistentFile = new PFile("test.txt", new PFileContent("test".getBytes()));
|
||||
// PFile persistentFile = new PFile();
|
||||
// persistentFile.setName("test.txt");
|
||||
// PFileContent content = new PFileContent();
|
||||
// content.setContent("test".getBytes());
|
||||
// persistentFile.setFileContent(content);
|
||||
|
||||
Ebean.save(persistentFile);
|
||||
Integer id = persistentFile.getId();
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.BeanState;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.EbeanServer;
|
||||
import com.avaje.tests.model.embedded.EMain;
|
||||
@@ -19,6 +20,7 @@ public class TestDynamicUpdate extends BaseTestCase {
|
||||
b.getEmbeddable().setDescription("123");
|
||||
|
||||
EbeanServer server = Ebean.getServer(null);
|
||||
|
||||
server.save(b);
|
||||
|
||||
Assert.assertNotNull(b.getId());
|
||||
@@ -27,6 +29,11 @@ public class TestDynamicUpdate extends BaseTestCase {
|
||||
EMain b2 = server.find(EMain.class, b.getId());
|
||||
|
||||
b2.getEmbeddable().setDescription("ABC");
|
||||
|
||||
BeanState beanState = server.getBeanState(b2);
|
||||
boolean dirty = beanState.isDirty();
|
||||
Assert.assertTrue(dirty);
|
||||
|
||||
server.save(b2);
|
||||
|
||||
server.beginTransaction();
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package com.avaje.tests.basic;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
@@ -22,10 +20,6 @@ public class TestIUDVanilla extends BaseTestCase {
|
||||
|
||||
Ebean.save(e0);
|
||||
|
||||
// // only use the below test when not using enhancement
|
||||
// boolean entity = (e0 instanceof EntityBean);
|
||||
// Assert.assertTrue(!entity);
|
||||
|
||||
Assert.assertNotNull(e0.getId());
|
||||
Assert.assertNotNull(e0.getLastUpdate());
|
||||
|
||||
@@ -40,33 +34,22 @@ public class TestIUDVanilla extends BaseTestCase {
|
||||
|
||||
EBasicVer e2 = Ebean.getServer(null).createEntityBean(EBasicVer.class);
|
||||
|
||||
HashSet<String> loaded = new HashSet<String>();
|
||||
loaded.add("id");
|
||||
loaded.add("lastUpdate");
|
||||
loaded.add("name");
|
||||
|
||||
e2.setId(e0.getId());
|
||||
e2.setLastUpdate(lastUpdate1);
|
||||
|
||||
Ebean.getBeanState(e2).setLoaded(loaded);
|
||||
e2.setName("forcedUpdate");
|
||||
Ebean.save(e2);
|
||||
Ebean.update(e2);
|
||||
|
||||
EBasicVer e3 = new EBasicVer();
|
||||
e3.setId(e0.getId());
|
||||
e3.setName("ModNoOCC");
|
||||
// e3.setLastUpdate(e2.getLastUpdate());
|
||||
|
||||
Ebean.update(e3);
|
||||
|
||||
e3.setName("ModAgain");
|
||||
e3.setDescription("Banana");
|
||||
|
||||
Set<String> updateProps = new HashSet<String>();
|
||||
updateProps.add("name");
|
||||
updateProps.add("description");
|
||||
|
||||
Ebean.update(e3, updateProps);
|
||||
Ebean.update(e3);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,9 +49,6 @@ public class TestLazyLoadInCache extends BaseTestCase {
|
||||
Assert.assertFalse(loadedProps.contains("status"));
|
||||
|
||||
cust1.getStatus();
|
||||
|
||||
// null after lazy load
|
||||
Assert.assertNull(Ebean.getBeanState(cust1).getLoadedProps());
|
||||
|
||||
// a readOnly reference
|
||||
Address billingAddress = cust1.getBillingAddress();
|
||||
|
||||
@@ -26,6 +26,7 @@ public class TestReadOnlyPropagation extends BaseTestCase {
|
||||
|
||||
Order order = Ebean.find(Order.class)
|
||||
.setAutofetch(false)
|
||||
.setUseCache(false)
|
||||
.setReadOnly(true)
|
||||
.setId(1)
|
||||
.findUnique();
|
||||
|
||||
@@ -22,7 +22,7 @@ public class TestDeleteByIdList extends BaseTestCase {
|
||||
|
||||
OrderDetail dummy = Ebean.getReference(OrderDetail.class, 1);
|
||||
SpiEbeanServer server = (SpiEbeanServer) Ebean.getServer(null);
|
||||
server.getBeanDescriptor(OrderDetail.class).cachePutBeanData(dummy);
|
||||
server.getBeanDescriptor(OrderDetail.class).cachePutBean(dummy);
|
||||
|
||||
Customer c0 = ResetBasicData.createCustAndOrder("DelIdList-0");
|
||||
Assert.assertNotNull(c0);
|
||||
|
||||
@@ -22,7 +22,7 @@ public class TestDeleteCascadeById extends BaseTestCase {
|
||||
|
||||
OrderDetail dummy = Ebean.getReference(OrderDetail.class, 1);
|
||||
SpiEbeanServer server = (SpiEbeanServer) Ebean.getServer(null);
|
||||
server.getBeanDescriptor(OrderDetail.class).cachePutBeanData(dummy);
|
||||
server.getBeanDescriptor(OrderDetail.class).cachePutBean(dummy);
|
||||
|
||||
Customer cust = ResetBasicData.createCustAndOrder("DelCas");
|
||||
Assert.assertNotNull(cust);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class TestQueryJoin extends BaseTestCase {
|
||||
|
||||
Customer customer = order.getCustomer();
|
||||
BeanState beanStateCustomer = Ebean.getBeanState(customer);
|
||||
Assert.assertNull(beanStateCustomer.getLoadedProps());
|
||||
Assert.assertTrue(beanStateCustomer.isReference());
|
||||
|
||||
customer.getName();
|
||||
Assert.assertNotNull(beanStateCustomer.getLoadedProps());
|
||||
|
||||
+26
-21
@@ -8,6 +8,7 @@ import org.junit.Test;
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.bean.BeanCollection;
|
||||
import com.avaje.ebean.cache.ServerCache;
|
||||
import com.avaje.tests.model.basic.Customer;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
|
||||
@@ -19,8 +20,11 @@ public class TestQueryCache extends BaseTestCase {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
List<Customer> list = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true)
|
||||
.where().ilike("name", "Rob").findList();
|
||||
ServerCache customerCache = Ebean.getServerCacheManager().getQueryCache(Customer.class);
|
||||
customerCache.clear();
|
||||
|
||||
List<Customer> list = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where()
|
||||
.ilike("name", "Rob").findList();
|
||||
|
||||
BeanCollection<Customer> bc = (BeanCollection<Customer>) list;
|
||||
Assert.assertFalse(bc.isReadOnly());
|
||||
@@ -28,30 +32,31 @@ public class TestQueryCache extends BaseTestCase {
|
||||
Assert.assertTrue(list.size() > 0);
|
||||
Assert.assertTrue(Ebean.getBeanState(list.get(0)).isReadOnly());
|
||||
|
||||
List<Customer> list2 = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true)
|
||||
.where().ilike("name", "Rob").findList();
|
||||
List<Customer> list2 = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where()
|
||||
.ilike("name", "Rob").findList();
|
||||
|
||||
List<Customer> list2B = Ebean.find(Customer.class).setUseQueryCache(true)
|
||||
// .setReadOnly(true)
|
||||
.where().ilike("name", "Rob").findList();
|
||||
|
||||
// Assert.assertTrue("same instance",list != list2);
|
||||
//
|
||||
// // readOnly defaults to true for query cache
|
||||
// Assert.assertTrue("same instance",list != list2B);
|
||||
//
|
||||
// List<Customer> list3 = Ebean.find(Customer.class)
|
||||
// .setUseQueryCache(true)
|
||||
// .setReadOnly(false)
|
||||
// .where().ilike("name", "Rob")
|
||||
// .findList();
|
||||
//
|
||||
// Assert.assertTrue("diff instance",list != list3);
|
||||
// BeanCollection<Customer> bc3 = (BeanCollection<Customer>)list3;
|
||||
// Assert.assertFalse(bc3.isReadOnly());
|
||||
// Assert.assertFalse(bc3.isEmpty());
|
||||
// Assert.assertTrue(list3.size() > 0);
|
||||
// Assert.assertFalse(Ebean.getBeanState(list3.get(0)).isReadOnly());
|
||||
Assert.assertSame(list, list2);
|
||||
|
||||
// readOnly defaults to true for query cache
|
||||
Assert.assertSame(list, list2B);
|
||||
|
||||
|
||||
// TODO: At this stage setReadOnly(false) does not
|
||||
// create a shallow copy of the List/Set/Map
|
||||
|
||||
// List<Customer> list3 = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(false).where()
|
||||
// .ilike("name", "Rob").findList();
|
||||
//
|
||||
// Assert.assertNotSame(list, list3);
|
||||
// BeanCollection<Customer> bc3 = (BeanCollection<Customer>) list3;
|
||||
// Assert.assertFalse(bc3.isReadOnly());
|
||||
// Assert.assertFalse(bc3.isEmpty());
|
||||
// Assert.assertTrue(list3.size() > 0);
|
||||
// Assert.assertFalse(Ebean.getBeanState(list3.get(0)).isReadOnly());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.avaje.tests.cache;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.cache.ServerCache;
|
||||
import com.avaje.ebean.cache.ServerCacheStatistics;
|
||||
import com.avaje.tests.model.basic.Country;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
|
||||
public class TestQueryCacheCountry extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
ServerCache cache = Ebean.getServerCacheManager().getQueryCache(Country.class);
|
||||
cache.clear();
|
||||
|
||||
Assert.assertEquals(0, cache.getStatistics(false).getSize());
|
||||
|
||||
List<Country> countryList0 = Ebean.find(Country.class)
|
||||
.setUseQueryCache(true)
|
||||
.order().asc("name")
|
||||
.findList();
|
||||
|
||||
Assert.assertEquals(1, cache.getStatistics(false).getSize());
|
||||
Assert.assertTrue(countryList0.size() > 0);
|
||||
|
||||
List<Country> countryList1 = Ebean.find(Country.class)
|
||||
.setUseQueryCache(true)
|
||||
.order().asc("name")
|
||||
.findList();
|
||||
|
||||
ServerCacheStatistics statistics = cache.getStatistics(false);
|
||||
Assert.assertEquals(1, statistics.getSize());
|
||||
Assert.assertEquals(1, statistics.getHitCount());
|
||||
Assert.assertSame(countryList1, countryList0);
|
||||
|
||||
Country nz = Ebean.find(Country.class, "NZ");
|
||||
nz.setName("New Zealandia");
|
||||
Ebean.save(nz);
|
||||
|
||||
statistics = cache.getStatistics(false);
|
||||
Assert.assertEquals(0, statistics.getSize());
|
||||
|
||||
List<Country> countryList2 = Ebean.find(Country.class)
|
||||
.setUseQueryCache(true)
|
||||
.order().asc("name")
|
||||
.findList();
|
||||
|
||||
Assert.assertNotSame(countryList2, countryList0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.bean.EntityBean;
|
||||
import com.avaje.ebean.config.GlobalProperties;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
@@ -22,56 +23,57 @@ public class TestDExhEntityEl extends TestCase {
|
||||
|
||||
GlobalProperties.put("classes", DExhEntity.class.toString());
|
||||
|
||||
Currency NZD = Currency.getInstance("NZD");
|
||||
|
||||
CMoney cm = new CMoney(new Money("12"), NZD);
|
||||
|
||||
Rate rate = new Rate(0.1);
|
||||
ExhangeCMoneyRate exh = new ExhangeCMoneyRate(rate, cm);
|
||||
|
||||
DExhEntity p = new DExhEntity();
|
||||
p.setExhange(exh);
|
||||
|
||||
SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
|
||||
BeanDescriptor<DExhEntity> descriptor = server.getBeanDescriptor(DExhEntity.class);
|
||||
|
||||
ElPropertyValue elExh = descriptor.getElGetValue("exhange");
|
||||
ElPropertyValue elExhRate = descriptor.getElGetValue("exhange.rate");
|
||||
ElPropertyValue elExhCMoney = descriptor.getElGetValue("exhange.cmoney");
|
||||
ElPropertyValue elExhCMoneyCur = descriptor.getElGetValue("exhange.cmoney.currency");
|
||||
ElPropertyValue elExhCMoneyAmt = descriptor.getElGetValue("exhange.cmoney.amount");
|
||||
|
||||
Object e = elExh.elGetValue(p);
|
||||
Object er = elExhRate.elGetValue(p);
|
||||
Object ecm = elExhCMoney.elGetValue(p);
|
||||
Object ecmCurr = elExhCMoneyCur.elGetValue(p);
|
||||
Object ecmAmt = elExhCMoneyAmt.elGetValue(p);
|
||||
|
||||
Assert.assertNotNull(e);
|
||||
Assert.assertNotNull(er);
|
||||
Assert.assertNotNull(ecm);
|
||||
|
||||
Assert.assertEquals(new Rate("0.1"), er);
|
||||
Assert.assertEquals(NZD, ecmCurr);
|
||||
Assert.assertEquals(new Money("12"), ecmAmt);
|
||||
|
||||
p.setExhange(null);
|
||||
Assert.assertNull(p.getExhange());
|
||||
|
||||
// won't trigger CMoney build as not all properties
|
||||
// have been set yet...
|
||||
elExhCMoneyAmt.elSetValue(p, new Money("13"), true, false);
|
||||
Assert.assertNull(p.getExhange());
|
||||
|
||||
elExhCMoneyCur.elSetValue(p, NZD, true, false);
|
||||
Assert.assertNull(p.getExhange());
|
||||
|
||||
elExhRate.elSetValue(p, new Rate(.2), true, false);
|
||||
|
||||
// this time not null as all required properties for
|
||||
// the compound object have been collected
|
||||
Assert.assertNotNull(p.getExhange());
|
||||
// Currency NZD = Currency.getInstance("NZD");
|
||||
//
|
||||
// CMoney cm = new CMoney(new Money("12"), NZD);
|
||||
//
|
||||
// Rate rate = new Rate(0.1);
|
||||
// ExhangeCMoneyRate exh = new ExhangeCMoneyRate(rate, cm);
|
||||
//
|
||||
// DExhEntity p = new DExhEntity();
|
||||
// p.setExhange(exh);
|
||||
//
|
||||
// SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
//
|
||||
// BeanDescriptor<DExhEntity> descriptor = server.getBeanDescriptor(DExhEntity.class);
|
||||
//
|
||||
// ElPropertyValue elExh = descriptor.getElGetValue("exhange");
|
||||
// ElPropertyValue elExhRate = descriptor.getElGetValue("exhange.rate");
|
||||
// ElPropertyValue elExhCMoney = descriptor.getElGetValue("exhange.cmoney");
|
||||
// ElPropertyValue elExhCMoneyCur = descriptor.getElGetValue("exhange.cmoney.currency");
|
||||
// ElPropertyValue elExhCMoneyAmt = descriptor.getElGetValue("exhange.cmoney.amount");
|
||||
//
|
||||
// EntityBean entityBean = (EntityBean)p;
|
||||
// Object e = elExh.elGetValue(entityBean);
|
||||
// Object er = elExhRate.elGetValue(entityBean);
|
||||
// Object ecm = elExhCMoney.elGetValue(entityBean);
|
||||
// Object ecmCurr = elExhCMoneyCur.elGetValue(entityBean);
|
||||
// Object ecmAmt = elExhCMoneyAmt.elGetValue(entityBean);
|
||||
//
|
||||
// Assert.assertNotNull(e);
|
||||
// Assert.assertNotNull(er);
|
||||
// Assert.assertNotNull(ecm);
|
||||
//
|
||||
// Assert.assertEquals(new Rate("0.1"), er);
|
||||
// Assert.assertEquals(NZD, ecmCurr);
|
||||
// Assert.assertEquals(new Money("12"), ecmAmt);
|
||||
//
|
||||
// p.setExhange(null);
|
||||
// Assert.assertNull(p.getExhange());
|
||||
//
|
||||
// // won't trigger CMoney build as not all properties
|
||||
// // have been set yet...
|
||||
// elExhCMoneyAmt.elSetValue(entityBean, new Money("13"), true, false);
|
||||
// Assert.assertNull(p.getExhange());
|
||||
//
|
||||
// elExhCMoneyCur.elSetValue(entityBean, NZD, true, false);
|
||||
// Assert.assertNull(p.getExhange());
|
||||
//
|
||||
// elExhRate.elSetValue(entityBean, new Rate(.2), true, false);
|
||||
//
|
||||
// // this time not null as all required properties for
|
||||
// // the compound object have been collected
|
||||
// Assert.assertNotNull(p.getExhange());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.bean.EntityBean;
|
||||
import com.avaje.ebean.config.GlobalProperties;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
@@ -20,44 +21,46 @@ public class TestDPersonEl extends TestCase {
|
||||
|
||||
GlobalProperties.put("classes", DPerson.class.toString());
|
||||
|
||||
Currency NZD = Currency.getInstance("NZD");
|
||||
|
||||
DPerson p = new DPerson();
|
||||
p.setFirstName("first");
|
||||
p.setLastName("last");
|
||||
p.setSalary(new Money("12200"));
|
||||
p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
|
||||
SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
|
||||
BeanDescriptor<DPerson> descriptor = server.getBeanDescriptor(DPerson.class);
|
||||
|
||||
ElPropertyValue elCmoney = descriptor.getElGetValue("cmoney");
|
||||
ElPropertyValue elCmoneyAmt = descriptor.getElGetValue("cmoney.amount");
|
||||
ElPropertyValue elCmoneyCur = descriptor.getElGetValue("cmoney.currency");
|
||||
|
||||
Object cmoney = elCmoney.elGetValue(p);
|
||||
Object amt = elCmoneyAmt.elGetValue(p);
|
||||
Object cur = elCmoneyCur.elGetValue(p);
|
||||
|
||||
Assert.assertNotNull(cmoney);
|
||||
Assert.assertEquals(new Money("12"), amt);
|
||||
Assert.assertEquals(NZD, cur);
|
||||
|
||||
p.setCmoney(null);
|
||||
Assert.assertNull(p.getCmoney());
|
||||
|
||||
// won't trigger CMoney build as not all properties
|
||||
// have been set yet...
|
||||
elCmoneyAmt.elSetValue(p, new Money("13"), true, false);
|
||||
Assert.assertNull(p.getCmoney());
|
||||
|
||||
// will trigger the build and setting of CMoney
|
||||
elCmoneyCur.elSetValue(p, NZD, true, false);
|
||||
|
||||
// this time not null as all required properties for
|
||||
// the compound object have been collected
|
||||
Assert.assertNotNull(p.getCmoney());
|
||||
// Currency NZD = Currency.getInstance("NZD");
|
||||
//
|
||||
// DPerson p = new DPerson();
|
||||
// p.setFirstName("first");
|
||||
// p.setLastName("last");
|
||||
// p.setSalary(new Money("12200"));
|
||||
// p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
//
|
||||
// SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
//
|
||||
// BeanDescriptor<DPerson> descriptor = server.getBeanDescriptor(DPerson.class);
|
||||
//
|
||||
// ElPropertyValue elCmoney = descriptor.getElGetValue("cmoney");
|
||||
// ElPropertyValue elCmoneyAmt = descriptor.getElGetValue("cmoney.amount");
|
||||
// ElPropertyValue elCmoneyCur = descriptor.getElGetValue("cmoney.currency");
|
||||
//
|
||||
// EntityBean entityBean = (EntityBean)p;
|
||||
//
|
||||
// Object cmoney = elCmoney.elGetValue(entityBean);
|
||||
// Object amt = elCmoneyAmt.elGetValue(entityBean);
|
||||
// Object cur = elCmoneyCur.elGetValue(entityBean);
|
||||
//
|
||||
// Assert.assertNotNull(cmoney);
|
||||
// Assert.assertEquals(new Money("12"), amt);
|
||||
// Assert.assertEquals(NZD, cur);
|
||||
//
|
||||
// p.setCmoney(null);
|
||||
// Assert.assertNull(p.getCmoney());
|
||||
//
|
||||
// // won't trigger CMoney build as not all properties
|
||||
// // have been set yet...
|
||||
// elCmoneyAmt.elSetValue(entityBean, new Money("13"), true, false);
|
||||
// Assert.assertNull(p.getCmoney());
|
||||
//
|
||||
// // will trigger the build and setting of CMoney
|
||||
// elCmoneyCur.elSetValue(entityBean, NZD, true, false);
|
||||
//
|
||||
// // this time not null as all required properties for
|
||||
// // the compound object have been collected
|
||||
// Assert.assertNotNull(p.getCmoney());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -23,41 +23,41 @@ public class TestDPersonIUD extends TestCase {
|
||||
|
||||
GlobalProperties.put("classes", DPerson.class.toString());
|
||||
|
||||
Currency NZD = Currency.getInstance("NZD");
|
||||
|
||||
DPerson p = new DPerson();
|
||||
p.setFirstName("first");
|
||||
p.setLastName("last");
|
||||
p.setSalary(new Money("12200"));
|
||||
p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
|
||||
p.setInterval(new Interval(System.currentTimeMillis()-20000, System.currentTimeMillis()));
|
||||
|
||||
Ebean.save(p);
|
||||
|
||||
Oid<DPerson> id = p.getId();
|
||||
Assert.assertNotNull(id);
|
||||
|
||||
DPerson p2 = Ebean.find(DPerson.class)
|
||||
.setAutofetch(false)
|
||||
.where().idEq(id)
|
||||
.findUnique();
|
||||
|
||||
Assert.assertNotNull(p2);
|
||||
System.out.println(p2);
|
||||
Assert.assertEquals(new Money(12200d), p2.getSalary());
|
||||
Assert.assertNotNull(p2.getCmoney());
|
||||
Assert.assertEquals(new Money("12"), p2.getCmoney().getAmount());
|
||||
Assert.assertEquals(NZD, p2.getCmoney().getCurrency());
|
||||
|
||||
|
||||
Query<DPerson> query = Ebean.find(DPerson.class)
|
||||
.setAutofetch(false)
|
||||
.where().gt("cmoney.amount",1)
|
||||
.query();
|
||||
|
||||
List<DPerson> list = query.findList();
|
||||
Assert.assertTrue(list.size() >= 1);
|
||||
// Currency NZD = Currency.getInstance("NZD");
|
||||
//
|
||||
// DPerson p = new DPerson();
|
||||
// p.setFirstName("first");
|
||||
// p.setLastName("last");
|
||||
// p.setSalary(new Money("12200"));
|
||||
// p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
//
|
||||
// p.setInterval(new Interval(System.currentTimeMillis()-20000, System.currentTimeMillis()));
|
||||
//
|
||||
// Ebean.save(p);
|
||||
//
|
||||
// Oid<DPerson> id = p.getId();
|
||||
// Assert.assertNotNull(id);
|
||||
//
|
||||
// DPerson p2 = Ebean.find(DPerson.class)
|
||||
// .setAutofetch(false)
|
||||
// .where().idEq(id)
|
||||
// .findUnique();
|
||||
//
|
||||
// Assert.assertNotNull(p2);
|
||||
// System.out.println(p2);
|
||||
// Assert.assertEquals(new Money(12200d), p2.getSalary());
|
||||
// Assert.assertNotNull(p2.getCmoney());
|
||||
// Assert.assertEquals(new Money("12"), p2.getCmoney().getAmount());
|
||||
// Assert.assertEquals(NZD, p2.getCmoney().getCurrency());
|
||||
//
|
||||
//
|
||||
// Query<DPerson> query = Ebean.find(DPerson.class)
|
||||
// .setAutofetch(false)
|
||||
// .where().gt("cmoney.amount",1)
|
||||
// .query();
|
||||
//
|
||||
// List<DPerson> list = query.findList();
|
||||
// Assert.assertTrue(list.size() >= 1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.avaje.tests.el;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.bean.EntityBean;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
@@ -31,10 +32,10 @@ public class TestElGetReference extends TestCase {
|
||||
ElPropertyValue addrLine1Prop = descriptor.getElGetValue("billingAddress.line1");
|
||||
ElPropertyValue addrCityProp = descriptor.getElGetValue("billingAddress.city");
|
||||
|
||||
elProp.elGetReference(c0);
|
||||
elProp.elGetReference(c1);
|
||||
elProp.elGetReference((EntityBean)c0);
|
||||
elProp.elGetReference((EntityBean)c1);
|
||||
|
||||
addrLine1Prop.elSetValue(c1, "12 someplace", true, false);
|
||||
addrCityProp.elSetValue(c1, "Auckland", true, false);
|
||||
addrLine1Prop.elSetValue((EntityBean)c1, "12 someplace", true, false);
|
||||
addrCityProp.elSetValue((EntityBean)c1, "Auckland", true, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.Transaction;
|
||||
import com.avaje.ebean.bean.EntityBean;
|
||||
import com.avaje.tests.idkeys.db.AuditLog;
|
||||
@@ -165,6 +166,9 @@ public class TestPropertyChangeSupport extends EbeanTestCase implements Property
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
//Ebean.getBeanState(al).addPropertyChangeListener(listener);
|
||||
|
||||
Method apcs = al.getClass().getMethod("addPropertyChangeListener", PropertyChangeListener.class);
|
||||
apcs.invoke(al, listener);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.avaje.tests.iud;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.BeanState;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.tests.model.basic.EBasicVer;
|
||||
|
||||
public class TestInsertQueryUpdate extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
EBasicVer e0 = new EBasicVer();
|
||||
e0.setName("name0");
|
||||
e0.setDescription("desc0");
|
||||
Ebean.save(e0);
|
||||
|
||||
EBasicVer e1 = Ebean.find(EBasicVer.class)
|
||||
.select("name")
|
||||
.setId(e0.getId())
|
||||
.findUnique();
|
||||
|
||||
BeanState beanState = Ebean.getBeanState(e1);
|
||||
Set<String> loadedProps = beanState.getLoadedProps();
|
||||
Assert.assertFalse(loadedProps.contains("description"));
|
||||
//lastUpdate
|
||||
|
||||
e1.setName("name1");
|
||||
Ebean.save(e1);
|
||||
|
||||
e1.setDescription("desc1");
|
||||
Ebean.save(e1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,13 +1,16 @@
|
||||
package com.avaje.tests.iud;
|
||||
|
||||
import junit.framework.Assert;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.tests.model.basic.EBasicVer;
|
||||
|
||||
public class TestInsertUpdateTrans extends TestCase {
|
||||
public class TestInsertUpdateTrans extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
Ebean.beginTransaction();
|
||||
|
||||
@@ -3,6 +3,8 @@ package com.avaje.tests.model.basic;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.avaje.ebean.BeanState;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.config.ServerConfig;
|
||||
import com.avaje.ebean.event.BeanPersistListener;
|
||||
import com.avaje.ebean.event.BulkTableEvent;
|
||||
@@ -11,56 +13,58 @@ import com.avaje.ebean.event.ServerConfigStartup;
|
||||
|
||||
public class MyEBasicConfigStartup implements ServerConfigStartup {
|
||||
|
||||
public void onStart(ServerConfig serverConfig) {
|
||||
|
||||
serverConfig.add(new EbasicPersistList());
|
||||
serverConfig.add(new EbasicBulkListener());
|
||||
public void onStart(ServerConfig serverConfig) {
|
||||
|
||||
serverConfig.add(new EbasicPersistList());
|
||||
serverConfig.add(new EbasicBulkListener());
|
||||
}
|
||||
|
||||
public static class EbasicBulkListener implements BulkTableEventListener {
|
||||
|
||||
final Set<String> s = new HashSet<String>();
|
||||
|
||||
EbasicBulkListener() {
|
||||
s.add("e_basic");
|
||||
}
|
||||
|
||||
public static class EbasicBulkListener implements BulkTableEventListener {
|
||||
|
||||
final Set<String> s = new HashSet<String>();
|
||||
|
||||
EbasicBulkListener() {
|
||||
s.add("e_basic");
|
||||
}
|
||||
public Set<String> registeredTables() {
|
||||
return s;
|
||||
}
|
||||
|
||||
public Set<String> registeredTables() {
|
||||
return s;
|
||||
}
|
||||
public void process(BulkTableEvent bulkTableEvent) {
|
||||
System.out.println("-- " + bulkTableEvent);
|
||||
}
|
||||
|
||||
public void process(BulkTableEvent bulkTableEvent) {
|
||||
System.out.println("-- "+bulkTableEvent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class EbasicPersistList implements BeanPersistListener<EBasic> {
|
||||
}
|
||||
|
||||
public boolean inserted(EBasic bean) {
|
||||
System.out.println("-- EBasic inserted "+bean.getId());
|
||||
return false;
|
||||
}
|
||||
public static class EbasicPersistList implements BeanPersistListener<EBasic> {
|
||||
|
||||
public boolean updated(EBasic bean, Set<String> updatedProperties) {
|
||||
System.out.println("-- EBasic updated "+bean.getId());
|
||||
return false;
|
||||
}
|
||||
public boolean inserted(EBasic bean) {
|
||||
System.out.println("-- EBasic inserted " + bean.getId());
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean deleted(EBasic bean) {
|
||||
System.out.println("-- EBasic deleted "+bean.getId());
|
||||
return false;
|
||||
}
|
||||
public boolean updated(EBasic bean) {
|
||||
BeanState beanState = Ebean.getBeanState(bean);
|
||||
Set<String> updatedProperties = beanState.getChangedProps();
|
||||
System.out.println("-- EBasic updated " + bean.getId());
|
||||
return false;
|
||||
}
|
||||
|
||||
public void remoteInsert(Object id) {
|
||||
}
|
||||
public boolean deleted(EBasic bean) {
|
||||
System.out.println("-- EBasic deleted " + bean.getId());
|
||||
return false;
|
||||
}
|
||||
|
||||
public void remoteUpdate(Object id) {
|
||||
}
|
||||
public void remoteInsert(Object id) {
|
||||
}
|
||||
|
||||
public void remoteUpdate(Object id) {
|
||||
}
|
||||
|
||||
public void remoteDelete(Object id) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void remoteDelete(Object id) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ public class PFile extends BasicDomain {
|
||||
private PFileContent fileContent;
|
||||
|
||||
/** Another persistent file. */
|
||||
@OneToOne(cascade=CascadeType.ALL)
|
||||
private PFileContent fileContent2;
|
||||
|
||||
@OneToOne(cascade=CascadeType.ALL)
|
||||
private PFileContent fileContent2;
|
||||
|
||||
public PFile() {
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ public class PFile extends BasicDomain {
|
||||
super();
|
||||
this.name = name;
|
||||
this.fileContent = fileContent;
|
||||
//this.persistentFileContent.setPersistentFile(this);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@@ -36,20 +35,20 @@ public class PFile extends BasicDomain {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public PFileContent getFileContent() {
|
||||
return fileContent;
|
||||
}
|
||||
public PFileContent getFileContent() {
|
||||
return fileContent;
|
||||
}
|
||||
|
||||
public void setFileContent(PFileContent fileContent) {
|
||||
this.fileContent = fileContent;
|
||||
}
|
||||
public void setFileContent(PFileContent fileContent) {
|
||||
this.fileContent = fileContent;
|
||||
}
|
||||
|
||||
public PFileContent getFileContent2() {
|
||||
return fileContent2;
|
||||
}
|
||||
public PFileContent getFileContent2() {
|
||||
return fileContent2;
|
||||
}
|
||||
|
||||
public void setFileContent2(PFileContent fileContent2) {
|
||||
this.fileContent2 = fileContent2;
|
||||
}
|
||||
public void setFileContent2(PFileContent fileContent2) {
|
||||
this.fileContent2 = fileContent2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,50 +7,50 @@ import javax.persistence.Table;
|
||||
import javax.persistence.Version;
|
||||
|
||||
@Entity
|
||||
@Table(name="e_main")
|
||||
public class EMain
|
||||
{
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
@Table(name = "e_main")
|
||||
public class EMain {
|
||||
|
||||
@Embedded
|
||||
private Eembeddable embeddable = new Eembeddable();
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Version
|
||||
private Long version;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
private String name;
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
@Embedded
|
||||
private Eembeddable embeddable = new Eembeddable();
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@Version
|
||||
private Long version;
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Eembeddable getEmbeddable() {
|
||||
return embeddable;
|
||||
}
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setEmbeddable(Eembeddable embeddable) {
|
||||
this.embeddable = embeddable;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Long getVersion() {
|
||||
return version;
|
||||
}
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Eembeddable getEmbeddable() {
|
||||
return embeddable;
|
||||
}
|
||||
|
||||
public void setEmbeddable(Eembeddable embeddable) {
|
||||
this.embeddable = embeddable;
|
||||
}
|
||||
|
||||
public Long getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Long version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public void setVersion(Long version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,8 +21,9 @@ public class TestQueryFindIterate extends BaseTestCase {
|
||||
|
||||
EbeanServer server = Ebean.getServer(null);
|
||||
|
||||
Query<Customer> query = server.find(Customer.class).setAutofetch(false)
|
||||
.fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).orderBy("id")
|
||||
Query<Customer> query = server.find(Customer.class)
|
||||
.setAutofetch(false)
|
||||
//.fetch("contacts", new FetchConfig().query(2)).where().gt("id", 0).orderBy("id")
|
||||
.setMaxRows(2);
|
||||
|
||||
int count = 0;
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
package com.avaje.tests.text.json;
|
||||
|
||||
import java.util.Currency;
|
||||
|
||||
import org.junit.Assert;
|
||||
//import java.util.Currency;
|
||||
//
|
||||
//import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
//
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.text.json.JsonContext;
|
||||
import com.avaje.tests.model.ddd.DExhEntity;
|
||||
import com.avaje.tests.model.ddd.DPerson;
|
||||
import com.avaje.tests.model.ivo.CMoney;
|
||||
import com.avaje.tests.model.ivo.ExhangeCMoneyRate;
|
||||
import com.avaje.tests.model.ivo.Money;
|
||||
import com.avaje.tests.model.ivo.Oid;
|
||||
import com.avaje.tests.model.ivo.Rate;
|
||||
//import com.avaje.ebean.Ebean;
|
||||
//import com.avaje.ebean.text.json.JsonContext;
|
||||
//import com.avaje.tests.model.ddd.DExhEntity;
|
||||
//import com.avaje.tests.model.ddd.DPerson;
|
||||
//import com.avaje.tests.model.ivo.CMoney;
|
||||
//import com.avaje.tests.model.ivo.ExhangeCMoneyRate;
|
||||
//import com.avaje.tests.model.ivo.Money;
|
||||
//import com.avaje.tests.model.ivo.Oid;
|
||||
//import com.avaje.tests.model.ivo.Rate;
|
||||
|
||||
public class TestTextJsonCompoundType extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
Currency NZD = Currency.getInstance("NZD");
|
||||
|
||||
DPerson p = new DPerson();
|
||||
p.setFirstName("first");
|
||||
p.setLastName("last");
|
||||
p.setSalary(new Money("12200"));
|
||||
p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
|
||||
JsonContext jsonContext = Ebean.createJsonContext();
|
||||
|
||||
String jsonString = jsonContext.toJsonString(p, true);
|
||||
System.out.println(jsonString);
|
||||
|
||||
CMoney cm = new CMoney(new Money("12"), NZD);
|
||||
|
||||
Rate rate = new Rate(0.1);
|
||||
ExhangeCMoneyRate exh = new ExhangeCMoneyRate(rate, cm);
|
||||
|
||||
DExhEntity ep = new DExhEntity();
|
||||
ep.setOid(new Oid<DExhEntity>(112));
|
||||
ep.setExhange(exh);
|
||||
|
||||
String jsonString0 = jsonContext.toJsonString(ep, true);
|
||||
System.out.println(jsonString0);
|
||||
|
||||
DExhEntity bean0 = jsonContext.toBean(DExhEntity.class, jsonString0);
|
||||
Assert.assertNotNull(bean0);
|
||||
// Currency NZD = Currency.getInstance("NZD");
|
||||
//
|
||||
// DPerson p = new DPerson();
|
||||
// p.setFirstName("first");
|
||||
// p.setLastName("last");
|
||||
// p.setSalary(new Money("12200"));
|
||||
// p.setCmoney(new CMoney(new Money("12"), NZD));
|
||||
//
|
||||
// JsonContext jsonContext = Ebean.createJsonContext();
|
||||
//
|
||||
// String jsonString = jsonContext.toJsonString(p, true);
|
||||
// System.out.println(jsonString);
|
||||
//
|
||||
// CMoney cm = new CMoney(new Money("12"), NZD);
|
||||
//
|
||||
// Rate rate = new Rate(0.1);
|
||||
// ExhangeCMoneyRate exh = new ExhangeCMoneyRate(rate, cm);
|
||||
//
|
||||
// DExhEntity ep = new DExhEntity();
|
||||
// ep.setOid(new Oid<DExhEntity>(112));
|
||||
// ep.setExhange(exh);
|
||||
//
|
||||
// String jsonString0 = jsonContext.toJsonString(ep, true);
|
||||
// System.out.println(jsonString0);
|
||||
//
|
||||
// DExhEntity bean0 = jsonContext.toBean(DExhEntity.class, jsonString0);
|
||||
// Assert.assertNotNull(bean0);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.avaje.tests.update;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
@@ -19,21 +18,25 @@ public class TestUpdatePartial extends BaseTestCase {
|
||||
|
||||
Ebean.save(c);
|
||||
|
||||
Customer c2 = Ebean.find(Customer.class, c.getId());
|
||||
Assert.assertNull("not partial", Ebean.getBeanState(c2).getLoadedProps());
|
||||
|
||||
Customer c2 = Ebean.find(Customer.class)
|
||||
.select("status, smallnote")
|
||||
.setId(c.getId())
|
||||
.findUnique();
|
||||
|
||||
c2.setStatus(Customer.Status.INACTIVE);
|
||||
c2.setSmallnote("2nd note");
|
||||
|
||||
Ebean.save(c2);
|
||||
|
||||
Customer c3 = Ebean.find(Customer.class, c.getId());
|
||||
Assert.assertNull("not partial", Ebean.getBeanState(c3).getLoadedProps());
|
||||
Customer c3 = Ebean.find(Customer.class)
|
||||
.select("status")
|
||||
.setId(c.getId())
|
||||
.findUnique();
|
||||
|
||||
c3.setStatus(Customer.Status.NEW);
|
||||
c3.setSmallnote("3rd note");
|
||||
|
||||
c2.setStatus(Customer.Status.NEW);
|
||||
c2.setSmallnote("3rd note");
|
||||
|
||||
Ebean.save(c2);
|
||||
Ebean.save(c3);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
package com.avaje.tests.xml;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
import com.avaje.tests.xml.build.XbContextBuilder;
|
||||
import com.avaje.tests.xml.oxm.OxmContext;
|
||||
import com.avaje.tests.xml.oxm.OxmContextBuilder;
|
||||
import com.avaje.tests.xml.oxm.OxmNode;
|
||||
|
||||
public class TestXmlSimpleOutput extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() throws Exception {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
SpiEbeanServer server = (SpiEbeanServer) Ebean.getServer(null);
|
||||
|
||||
OxmContextBuilder builder = new XbContextBuilder(server, null);
|
||||
|
||||
OxmNode node = builder.addRootElement("header", XHeader.class);
|
||||
node.addElement("requestedBy");
|
||||
// node.addElement("requestedSystem");
|
||||
OxmNode horders = node.addElement("orders");
|
||||
horders.addElement("id");
|
||||
horders.addElement("cretime");
|
||||
horders.addElement("orderDate");
|
||||
|
||||
// OxmNode orderRoot = builder.addRootElement("order", Order.class);
|
||||
//
|
||||
// orderRoot.addElement("id").addAttribute("status");
|
||||
// orderRoot.addElement("cretime","created-ts");
|
||||
// orderRoot.addElement("orderDate","ship-date");
|
||||
// OxmNode cust = orderRoot.addElement("customer","cust");
|
||||
// cust.addAttribute("id");
|
||||
// cust.addElement("name");
|
||||
//
|
||||
// OxmNode orderDetails = orderRoot.addElement("details","order-details");
|
||||
// OxmNode line = orderDetails.addWrapperElement("line");
|
||||
// line.addElement("id");
|
||||
// line.addElement("orderQty","order-quantity");
|
||||
// line.addElement("unitPrice","unit-price");
|
||||
//
|
||||
// OxmNode product = line.addElement("product");
|
||||
// product.addElement("name","prodname");
|
||||
// product.addElement("sku","sku");
|
||||
|
||||
OxmContext oxmContext = builder.createContext();
|
||||
|
||||
List<Order> list = Ebean.find(Order.class).fetch("details")
|
||||
.fetch("details.product", "sku,name").findList();
|
||||
|
||||
XHeader header = new XHeader();
|
||||
header.setRequestedBy("blah");
|
||||
header.setRequestedSystem("twoSystem");
|
||||
header.setOrders(list);
|
||||
//
|
||||
// Order bean = list.get(0);
|
||||
//
|
||||
// Writer writer = new StringWriter();
|
||||
// oxmContext.writeBean(bean, writer);
|
||||
// System.out.println(writer);
|
||||
//
|
||||
Writer writer = new StringWriter();
|
||||
oxmContext.writeBean(header, writer);
|
||||
System.out.println(writer);
|
||||
//
|
||||
// DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
|
||||
// DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
|
||||
// Document doc = docBuilder.newDocument();
|
||||
//
|
||||
//
|
||||
//
|
||||
// oxmContext.writeBean(bean, doc);
|
||||
//
|
||||
// System.out.println(doc.getDocumentElement());
|
||||
//
|
||||
// NodeList childNodes = doc.getChildNodes();
|
||||
// int len = childNodes.getLength();
|
||||
// for (int i = 0; i < len; i++) {
|
||||
//
|
||||
// Node childNode = childNodes.item(i);
|
||||
// Order o = (Order)oxmContext.readBean(childNode);
|
||||
// System.out.println(o);
|
||||
// System.out.println(o.getDetails());
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
package com.avaje.tests.xml;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
|
||||
@XmlRootElement
|
||||
public class XHeader {
|
||||
|
||||
String requestedBy;
|
||||
|
||||
String requestedSystem;
|
||||
|
||||
List<Order> orders;
|
||||
|
||||
public String getRequestedBy() {
|
||||
return requestedBy;
|
||||
}
|
||||
|
||||
public void setRequestedBy(String requestedBy) {
|
||||
this.requestedBy = requestedBy;
|
||||
}
|
||||
|
||||
public String getRequestedSystem() {
|
||||
return requestedSystem;
|
||||
}
|
||||
|
||||
public void setRequestedSystem(String requestedSystem) {
|
||||
this.requestedSystem = requestedSystem;
|
||||
}
|
||||
|
||||
public List<Order> getOrders() {
|
||||
return orders;
|
||||
}
|
||||
|
||||
public void setOrders(List<Order> orders) {
|
||||
this.orders = orders;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.avaje.tests.xml.build;
|
||||
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
import com.avaje.tests.xml.oxm.OxmNode;
|
||||
import com.avaje.tests.xml.runtime.XoiAttribute;
|
||||
import com.avaje.tests.xml.runtime.XrAttribute;
|
||||
|
||||
public class XbAttribute extends XbBase {
|
||||
|
||||
|
||||
public XbAttribute(OxmNode rootNode, String nodeName, String propertyName){
|
||||
super(rootNode, nodeName, propertyName);
|
||||
}
|
||||
|
||||
public XoiAttribute create(BeanDescriptor<?> descriptor, boolean parentAssocBean) {
|
||||
|
||||
ElPropertyValue prop = descriptor.getElGetValue(propertyName);
|
||||
return new XrAttribute(nodeName, prop, descriptor, parentAssocBean, formatter, parser);
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
package com.avaje.tests.xml.build;
|
||||
|
||||
import com.avaje.ebean.text.StringFormatter;
|
||||
import com.avaje.ebean.text.StringParser;
|
||||
import com.avaje.tests.xml.oxm.OxmNode;
|
||||
|
||||
public abstract class XbBase {
|
||||
|
||||
protected OxmNode rootNode;
|
||||
protected final String nodeName;
|
||||
protected final String propertyName;
|
||||
protected StringParser parser;
|
||||
protected StringFormatter formatter;
|
||||
protected boolean requiresXmlEncoding;
|
||||
|
||||
public XbBase(String nodeName) {
|
||||
this.nodeName = nodeName;
|
||||
this.propertyName = null;
|
||||
}
|
||||
|
||||
public XbBase(OxmNode rootNode, String nodeName, String propertyName) {
|
||||
this.rootNode = rootNode;
|
||||
this.nodeName = nodeName;
|
||||
this.propertyName = propertyName;
|
||||
}
|
||||
|
||||
public String getNamingConventionNodeName(String propertyName) {
|
||||
// if (rootNode != null){
|
||||
// return rootNode.getNamingConventionNodeName(propertyName);
|
||||
// }
|
||||
return propertyName;
|
||||
}
|
||||
|
||||
public String getNodeName() {
|
||||
return nodeName;
|
||||
}
|
||||
|
||||
public String getPropertyName() {
|
||||
return propertyName;
|
||||
}
|
||||
|
||||
public StringFormatter getFormatter() {
|
||||
return formatter;
|
||||
}
|
||||
|
||||
public void setFormatter(StringFormatter formatter) {
|
||||
this.formatter = formatter;
|
||||
}
|
||||
|
||||
public StringParser getParser() {
|
||||
return parser;
|
||||
}
|
||||
|
||||
public void setParser(StringParser parser) {
|
||||
this.parser = parser;
|
||||
}
|
||||
|
||||
public boolean isRequiresXmlEncoding() {
|
||||
return requiresXmlEncoding;
|
||||
}
|
||||
|
||||
public void setRequiresXmlEncoding(boolean requiresXmlEncoding) {
|
||||
this.requiresXmlEncoding = requiresXmlEncoding;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package com.avaje.tests.xml.build;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.tests.xml.oxm.OxmContext;
|
||||
import com.avaje.tests.xml.oxm.OxmContextBuilder;
|
||||
import com.avaje.tests.xml.oxm.OxmNamingConvention;
|
||||
import com.avaje.tests.xml.runtime.XoiNode;
|
||||
import com.avaje.tests.xml.runtime.XrContext;
|
||||
|
||||
public class XbContextBuilder implements OxmContextBuilder {
|
||||
|
||||
private final SpiEbeanServer ebeanServer;
|
||||
|
||||
private final OxmNamingConvention namingConvention;
|
||||
|
||||
String rootNodeName;
|
||||
|
||||
Map<String,XbNode> rootNodes = new HashMap<String,XbNode>();
|
||||
|
||||
|
||||
public XbContextBuilder(SpiEbeanServer ebeanServer, OxmNamingConvention namingConvention){
|
||||
this.ebeanServer = ebeanServer;
|
||||
this.namingConvention = namingConvention;
|
||||
}
|
||||
|
||||
protected String getNamingConventionNodeName(String propertyName) {
|
||||
|
||||
if (namingConvention != null){
|
||||
return namingConvention.getNodeName(propertyName);
|
||||
} else {
|
||||
return propertyName;
|
||||
}
|
||||
}
|
||||
|
||||
public XbNode addRootElement(String rootElementName, Class<?> rootType) {
|
||||
|
||||
BeanDescriptor<?> descriptor = ebeanServer.getBeanDescriptor(rootType);
|
||||
XbNode rootNode = new XbNode(rootElementName, descriptor);
|
||||
rootNodes.put(rootElementName, rootNode);
|
||||
|
||||
return rootNode;
|
||||
}
|
||||
|
||||
public OxmContext createContext() {
|
||||
|
||||
Map<Class<?>,XoiNode> classNodeMap = new HashMap<Class<?>, XoiNode>(rootNodes.size()+4);
|
||||
Map<String,XoiNode> tagNodeMap = new HashMap<String, XoiNode>(rootNodes.size()+4);
|
||||
|
||||
Iterator<XbNode> it = rootNodes.values().iterator();
|
||||
while (it.hasNext()) {
|
||||
XbNode xbNode = it.next();
|
||||
XoiNode xoiNode = xbNode.createNode();
|
||||
|
||||
classNodeMap.put(xbNode.getRootBeanType(), xoiNode);
|
||||
tagNodeMap.put(xbNode.getRootElementName(), xoiNode);
|
||||
}
|
||||
|
||||
return new XrContext(tagNodeMap, classNodeMap);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,144 +0,0 @@
|
||||
package com.avaje.tests.xml.build;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanProperty;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
import com.avaje.tests.xml.oxm.OxmNode;
|
||||
import com.avaje.tests.xml.runtime.XoiAttribute;
|
||||
import com.avaje.tests.xml.runtime.XoiNode;
|
||||
import com.avaje.tests.xml.runtime.XrCollection;
|
||||
import com.avaje.tests.xml.runtime.XrNode;
|
||||
|
||||
public class XbNode extends XbBase implements OxmNode {
|
||||
|
||||
private Map<String,XbAttribute> attributes = new LinkedHashMap<String, XbAttribute>();
|
||||
|
||||
private List<XbNode> childNodes = new ArrayList<XbNode>();
|
||||
|
||||
private final String rootElementName;
|
||||
private final BeanDescriptor<?> rootDescriptor;
|
||||
|
||||
public XbNode(String rootElementName, BeanDescriptor<?> rootDescriptor) {
|
||||
super(rootElementName);
|
||||
this.rootElementName = rootElementName;
|
||||
this.rootDescriptor = rootDescriptor;
|
||||
this.rootNode = this;
|
||||
}
|
||||
|
||||
public XbNode(OxmNode rootNode, String propertyName, String nodeName) {
|
||||
super(rootNode, nodeName, propertyName);
|
||||
this.rootElementName = null;
|
||||
this.rootDescriptor = null;
|
||||
}
|
||||
|
||||
public Class<?> getRootBeanType() {
|
||||
return rootDescriptor.getBeanType();
|
||||
}
|
||||
|
||||
public String getRootElementName() {
|
||||
return rootElementName;
|
||||
}
|
||||
|
||||
public OxmNode addWrapperElement(String elementName){
|
||||
return addElement(null, elementName);
|
||||
}
|
||||
|
||||
public OxmNode addElement(String propertyName){
|
||||
String elementName = getNamingConventionNodeName(propertyName);
|
||||
return addElement(propertyName, elementName);
|
||||
}
|
||||
|
||||
public OxmNode addElement(String propertyName, String elementName){
|
||||
|
||||
XbNode n = new XbNode(rootNode, propertyName, elementName);
|
||||
childNodes.add(n);
|
||||
return n;
|
||||
}
|
||||
|
||||
public OxmNode addAttribute(String propertyName){
|
||||
String attrName = getNamingConventionNodeName(propertyName);
|
||||
return addAttribute(propertyName, attrName);
|
||||
}
|
||||
|
||||
public OxmNode addAttribute(String propertyName, String attrName){
|
||||
XbAttribute xbAttribute = attributes.get(attrName);
|
||||
if (xbAttribute != null){
|
||||
throw new RuntimeException("Attribute with this name ["+attrName+"]already exists");
|
||||
}
|
||||
xbAttribute = new XbAttribute(rootNode, attrName, propertyName);
|
||||
return this;
|
||||
}
|
||||
|
||||
public XoiNode createNode() {
|
||||
return createNode(rootDescriptor);
|
||||
}
|
||||
|
||||
protected XoiNode createNode(BeanDescriptor<?> d) {
|
||||
|
||||
XoiAttribute[] attrs = new XoiAttribute[attributes.size()];
|
||||
|
||||
boolean assocManyProperty = false;
|
||||
boolean assocOneProperty = false;
|
||||
|
||||
ElPropertyValue prop = null;
|
||||
|
||||
if (propertyName != null){
|
||||
prop = d.getElGetValue(propertyName);
|
||||
if (prop == null){
|
||||
throw new RuntimeException("Property "+propertyName+" not found from "+d.getFullName());
|
||||
}
|
||||
BeanProperty p = prop.getBeanProperty();
|
||||
if (p instanceof BeanPropertyAssoc<?>){
|
||||
// move to the relative/target descriptor before
|
||||
// evaluating the attributes and children for this node
|
||||
BeanDescriptor<?> targetDescriptor = ((BeanPropertyAssoc<?>)p).getTargetDescriptor();
|
||||
if (targetDescriptor == null) {
|
||||
if (EntityType.XMLELEMENT.equals(d.getEntityType())){
|
||||
Class<?> targetType = p.getPropertyType();
|
||||
targetDescriptor = d.getBeanDescriptor(targetType);
|
||||
}
|
||||
}
|
||||
|
||||
if (targetDescriptor != null){
|
||||
d = targetDescriptor;
|
||||
}
|
||||
assocManyProperty = (p instanceof BeanPropertyAssocMany<?>);
|
||||
assocOneProperty = (p instanceof BeanPropertyAssocOne<?>);
|
||||
}
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (XbAttribute attrBuilder : attributes.values()) {
|
||||
XoiAttribute xoAttr = attrBuilder.create(d, assocOneProperty);
|
||||
attrs[i++] = xoAttr;
|
||||
}
|
||||
|
||||
XoiNode[] children = null;
|
||||
if (!childNodes.isEmpty()){
|
||||
children = new XoiNode[childNodes.size()];
|
||||
for (int j = 0; j < children.length; j++) {
|
||||
XbNode xbNode = childNodes.get(j);
|
||||
children[j] = xbNode.createNode(d);
|
||||
}
|
||||
}
|
||||
|
||||
if (assocManyProperty){
|
||||
boolean invokeFetch = false;
|
||||
return new XrCollection(nodeName, prop, children, invokeFetch);
|
||||
}
|
||||
if (assocOneProperty){
|
||||
return new XrNode(nodeName, prop, d, children, attrs);
|
||||
}
|
||||
|
||||
return new XrNode(nodeName, prop, d, formatter, parser, children, attrs);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package com.avaje.tests.xml.oxm;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
public interface OxmContext {
|
||||
|
||||
public void writeBean(Object bean, Document document) throws IOException;
|
||||
|
||||
public void writeBean(Object bean, Writer writer) throws IOException;
|
||||
|
||||
public Object readBean(Node node);
|
||||
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
package com.avaje.tests.xml.oxm;
|
||||
|
||||
|
||||
public interface OxmContextBuilder {
|
||||
|
||||
public OxmNode addRootElement(String rootElementName, Class<?> rootType);
|
||||
|
||||
public OxmContext createContext();
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.avaje.tests.xml.oxm;
|
||||
|
||||
/**
|
||||
* Naming convention used in XML to Object mapping.
|
||||
*
|
||||
* @author rbygrave
|
||||
*/
|
||||
public interface OxmNamingConvention {
|
||||
|
||||
/**
|
||||
* Returns the default node/element/attribute name for the given property name.
|
||||
*/
|
||||
public String getNodeName(String propertyName);
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.avaje.tests.xml.oxm;
|
||||
|
||||
public interface OxmNode {
|
||||
|
||||
public OxmNode addWrapperElement(String elementName);
|
||||
|
||||
public OxmNode addElement(String propertyName);
|
||||
|
||||
public OxmNode addElement(String propertyName, String elementName);
|
||||
|
||||
public OxmNode addAttribute(String propertyName);
|
||||
|
||||
public OxmNode addAttribute(String propertyName, String attrName);
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
|
||||
public interface XoiAttribute {
|
||||
|
||||
public void writeAttribute(XrOutputWriter o, Object bean, Object value) throws IOException;
|
||||
|
||||
public void writeAttribute(XrOutputDocument out, Element e, Object bean, Object value) throws IOException;
|
||||
|
||||
public void readNode(Node node, NamedNodeMap attributes, XrReadContext ctx);
|
||||
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
|
||||
public interface XoiNode {
|
||||
|
||||
public String getNodeName();
|
||||
|
||||
public Object createBean();
|
||||
|
||||
public void writeNode(XrOutputDocument out, Node node, Object bean) throws IOException;
|
||||
|
||||
public void writeNode(XrOutputWriter o, Object bean) throws IOException;
|
||||
|
||||
public void readNode(Node node, XrReadContext ctx);
|
||||
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.avaje.ebean.text.StringFormatter;
|
||||
import com.avaje.ebean.text.StringParser;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
|
||||
public class XrAttribute extends XrBase implements XoiAttribute {
|
||||
|
||||
private boolean parentAssocBean;
|
||||
|
||||
/**
|
||||
* Create as an property based attribute.
|
||||
*/
|
||||
public XrAttribute(String attrName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, boolean parentAssocBean, StringFormatter formatter, StringParser parser) {
|
||||
super(attrName, prop, parentDesc, formatter, parser);
|
||||
this.parentAssocBean = parentAssocBean;
|
||||
}
|
||||
|
||||
public XrAttribute(String attrName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, boolean parentAssocBean) {
|
||||
this(attrName, prop, parentDesc, parentAssocBean, null, null);
|
||||
}
|
||||
|
||||
public void writeAttribute(XrOutputDocument out, Element e, Object bean, Object value) throws IOException {
|
||||
|
||||
Object beanToUse = parentAssocBean ? value : bean;
|
||||
|
||||
Object v = getObjectValue(beanToUse);
|
||||
String sv = getFormattedValue(v);
|
||||
Attr attr = out.getDocument().createAttribute(nodeName);
|
||||
attr.setValue(sv);
|
||||
|
||||
e.setAttributeNode(attr);
|
||||
}
|
||||
|
||||
public void writeAttribute(XrOutputWriter o, Object bean, Object value) throws IOException {
|
||||
|
||||
Object beanToUse = parentAssocBean ? value : bean;
|
||||
Object v = getObjectValue(beanToUse);
|
||||
String sv = getFormattedValue(v);
|
||||
|
||||
o.write(" ");
|
||||
o.write(nodeName);
|
||||
o.write("=\"");
|
||||
o.write(sv);
|
||||
o.write("\"");
|
||||
}
|
||||
|
||||
public void readNode(Node node, NamedNodeMap attributes, XrReadContext ctx) {
|
||||
|
||||
Node namedItem = attributes.getNamedItem(nodeName);
|
||||
if (namedItem != null){
|
||||
String c = namedItem.getTextContent();
|
||||
Object v = getParsedValue(c);
|
||||
setObjectValue(ctx.getBean(), v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import com.avaje.ebean.text.StringFormatter;
|
||||
import com.avaje.ebean.text.StringParser;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanProperty;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
|
||||
public abstract class XrBase {
|
||||
|
||||
protected final String nodeName;
|
||||
protected final ElPropertyValue prop;
|
||||
protected final StringFormatter stringFormatter;
|
||||
protected final StringParser stringParser;
|
||||
|
||||
protected final boolean encode;
|
||||
|
||||
protected boolean decreaseDepth = false;
|
||||
|
||||
protected BeanDescriptor<?> beanDescriptor;
|
||||
|
||||
protected XrBase(String nodeName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, StringFormatter formatter, StringParser parser) {
|
||||
|
||||
if (formatter == null && prop != null){
|
||||
formatter = prop.getStringFormatter();
|
||||
}
|
||||
if (parser == null && prop != null){
|
||||
parser = prop.getStringParser();
|
||||
}
|
||||
|
||||
this.nodeName = nodeName;
|
||||
this.prop = prop;
|
||||
this.stringFormatter = formatter;
|
||||
this.stringParser = parser;
|
||||
this.encode = false;
|
||||
|
||||
this.beanDescriptor = getBeanDescriptor(parentDesc, prop);
|
||||
}
|
||||
|
||||
private BeanDescriptor<?> getBeanDescriptor(BeanDescriptor<?> parent, ElPropertyValue prop){
|
||||
if (prop != null){
|
||||
BeanProperty beanProperty = prop.getBeanProperty();
|
||||
if (beanProperty instanceof BeanPropertyAssoc<?>){
|
||||
return ((BeanPropertyAssoc<?>)beanProperty).getTargetDescriptor();
|
||||
}
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
|
||||
protected void setObjectValue(Object bean, Object value){
|
||||
prop.elSetValue(bean, value, true, false);
|
||||
}
|
||||
|
||||
protected Object getObjectValue(Object bean) {
|
||||
return prop.elGetValue(bean);
|
||||
}
|
||||
|
||||
protected Object getParsedValue(String value) {
|
||||
if (value == null || value.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
//FIXME xml decode the string
|
||||
if (stringParser != null){
|
||||
return stringParser.parse(value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
protected String getFormattedValue(Object value) {
|
||||
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
String s;
|
||||
if (stringFormatter == null){
|
||||
s = value.toString();
|
||||
} else {
|
||||
s = stringFormatter.format(value);
|
||||
}
|
||||
|
||||
if (encode){
|
||||
//FIXME xml encode the string
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.avaje.ebean.bean.BeanCollection;
|
||||
import com.avaje.ebean.bean.BeanCollectionAdd;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
|
||||
public class XrCollection extends XrNode implements XoiNode {
|
||||
|
||||
private final boolean invokeFetch;
|
||||
|
||||
private final BeanPropertyAssocMany<?> manyProp;
|
||||
|
||||
private final String mapKey;
|
||||
|
||||
private final BeanDescriptor<?> targetDescriptor;
|
||||
|
||||
/**
|
||||
* Construct with no mapKey and no attributes.
|
||||
*/
|
||||
public XrCollection(String name, ElPropertyValue prop, XoiNode[] children, boolean invokeFetch) {
|
||||
this(name, prop, children, null, invokeFetch, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct with no attributes.
|
||||
*/
|
||||
public XrCollection(String name, ElPropertyValue prop, XoiNode[] children, boolean invokeFetch, String mapKey) {
|
||||
this(name, prop, children, null, invokeFetch, mapKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct with all options.
|
||||
*/
|
||||
public XrCollection(String name, ElPropertyValue prop, XoiNode[] children, XoiAttribute[] attributes, boolean invokeFetch, String mapKey) {
|
||||
|
||||
super(name, prop, null, null, null, children, attributes);
|
||||
this.invokeFetch = invokeFetch;
|
||||
this.decreaseDepth = true;
|
||||
this.mapKey = mapKey;
|
||||
this.manyProp = (BeanPropertyAssocMany<?>)prop.getBeanProperty();
|
||||
this.targetDescriptor = manyProp.getTargetDescriptor();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void readNode(Node node, XrReadContext ctx) {
|
||||
|
||||
Object parentBean = ctx.getBean();
|
||||
|
||||
// create a List/Set/Map to hold the details
|
||||
Object details = manyProp.createEmpty(false);
|
||||
|
||||
// Wrapper used to add to the collection
|
||||
BeanCollectionAdd bcAdd = manyProp.getBeanCollectionAdd(details, mapKey);
|
||||
|
||||
Node detailNode = nextElement(node.getFirstChild());
|
||||
do {
|
||||
Object detailBean = targetDescriptor.createBean();
|
||||
ctx.setBean(detailBean);
|
||||
|
||||
for (int i = 0; i < childNodes.length; i++) {
|
||||
childNodes[i].readNode(detailNode, ctx);
|
||||
}
|
||||
|
||||
bcAdd.addBean(detailBean);
|
||||
|
||||
detailNode = nextElement(detailNode.getNextSibling());
|
||||
|
||||
} while(detailNode != null);
|
||||
|
||||
setObjectValue(parentBean, details);
|
||||
ctx.setBean(parentBean);
|
||||
}
|
||||
|
||||
private Node nextElement(Node node) {
|
||||
|
||||
while (node != null) {
|
||||
int type = node.getNodeType();
|
||||
if (type == Node.ELEMENT_NODE){
|
||||
return node;
|
||||
}
|
||||
node = node.getNextSibling();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeContent(XrOutputWriter o, Object bean, Object val) throws IOException {
|
||||
|
||||
Collection<?> collection = (Collection<?>)val;
|
||||
Iterator<?> it = collection.iterator();
|
||||
while (it.hasNext()) {
|
||||
Object childBean = it.next();
|
||||
for (int i = 0; i < childNodes.length; i++) {
|
||||
childNodes[i].writeNode(o, childBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeContent(XrOutputDocument out, Node e, Object bean, Object value) throws IOException {
|
||||
|
||||
Collection<?> collection = (Collection<?>)value;
|
||||
Iterator<?> it = collection.iterator();
|
||||
while (it.hasNext()) {
|
||||
Object childBean = it.next();
|
||||
for (int i = 0; i < childNodes.length; i++) {
|
||||
childNodes[i].writeNode(out, e, childBean);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNode(XrOutputDocument out, Node node, Object bean) throws IOException {
|
||||
super.writeNode(out, node, bean);
|
||||
}
|
||||
|
||||
// protected void writeNodeChildren(XmlOutputDocument out, Node childNode, Object bean, Object val) throws IOException {
|
||||
//
|
||||
// if (hasChildNodes) {
|
||||
// for (int i = 0; i < childNodes.length; i++) {
|
||||
// childNodes[i].writeNode(out, childNode, bean);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
@Override
|
||||
protected Object getObjectValue(Object bean) {
|
||||
|
||||
Object o = prop.elGetValue(bean);
|
||||
Collection<?> collection = getDetailsIterator(o);
|
||||
return collection;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the details of the collection or map taking care to avoid
|
||||
* unnecessary fetching of the data.
|
||||
*/
|
||||
private Collection<?> getDetailsIterator(Object o) {
|
||||
if (o == null) {
|
||||
return null;
|
||||
}
|
||||
if (o instanceof BeanCollection<?>) {
|
||||
BeanCollection<?> bc = (BeanCollection<?>) o;
|
||||
if (!invokeFetch && !bc.isPopulated()) {
|
||||
return null;
|
||||
}
|
||||
bc.size();
|
||||
return bc.getActualDetails();
|
||||
}
|
||||
|
||||
if (o instanceof Map<?,?>) {
|
||||
// yes, we want the entrySet (to set the keys)
|
||||
return ((Map<?, ?>) o).entrySet();
|
||||
|
||||
} else if (o instanceof Collection<?>) {
|
||||
return ((Collection<?>) o);
|
||||
}
|
||||
String m = "expecting a Map or Collection but got [" + o.getClass().getName() + "]";
|
||||
throw new PersistenceException(m);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.Map;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.avaje.tests.xml.oxm.OxmContext;
|
||||
|
||||
public class XrContext implements OxmContext {
|
||||
|
||||
Map<String,XoiNode> tagToNodeMap;
|
||||
Map<Class<?>,XoiNode> classToNodeMap;
|
||||
|
||||
public XrContext(Map<String,XoiNode> tagToNodeMap, Map<Class<?>,XoiNode> classToNodeMap) {
|
||||
this.tagToNodeMap = tagToNodeMap;
|
||||
this.classToNodeMap = classToNodeMap;
|
||||
}
|
||||
|
||||
public void writeBean(Object bean, Document document) throws IOException {
|
||||
|
||||
XoiNode xoiNode = getXoiNode(bean);
|
||||
|
||||
XrOutputDocument out = new XrOutputDocument(document);
|
||||
xoiNode.writeNode(out, null, bean);
|
||||
}
|
||||
|
||||
public void writeBean(Object bean, Writer writer) throws IOException {
|
||||
XoiNode xoiNode = getXoiNode(bean);
|
||||
|
||||
XrOutputWriter o = new XrOutputWriter(writer);
|
||||
xoiNode.writeNode(o, bean);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Object readBean(Node node) {
|
||||
|
||||
XoiNode xoiNode = getXoiNode(node.getNodeName());
|
||||
|
||||
Object bean = xoiNode.createBean();
|
||||
|
||||
XrReadContext ctx = new XrReadContext(bean);
|
||||
|
||||
xoiNode.readNode(node, ctx);
|
||||
return ctx.getBean();
|
||||
}
|
||||
|
||||
private XoiNode getXoiNode(Object bean) {
|
||||
Class<?> cls = bean.getClass();
|
||||
XoiNode xoiNode = classToNodeMap.get(cls);
|
||||
if (xoiNode == null){
|
||||
throw new RuntimeException("No handler for type "+cls);
|
||||
} else {
|
||||
return xoiNode;
|
||||
}
|
||||
}
|
||||
|
||||
private XoiNode getXoiNode(String nodeName) {
|
||||
|
||||
XoiNode xoiNode = tagToNodeMap.get(nodeName);
|
||||
if (xoiNode == null){
|
||||
throw new RuntimeException("No handler for node "+nodeName);
|
||||
} else {
|
||||
return xoiNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,210 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import com.avaje.ebean.text.StringFormatter;
|
||||
import com.avaje.ebean.text.StringParser;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.el.ElPropertyValue;
|
||||
|
||||
public class XrNode extends XrBase implements XoiNode {
|
||||
|
||||
protected final boolean assocBeanValue;
|
||||
|
||||
protected final XoiAttribute[] attributes;
|
||||
protected final boolean hasAttributes;
|
||||
|
||||
protected final String beginTag;
|
||||
protected final String beginTagEnd;
|
||||
protected final String endTag;
|
||||
|
||||
protected final XoiNode[] childNodes;
|
||||
protected final boolean hasChildNodes;
|
||||
|
||||
public XrNode(String nodeName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, XoiNode[] childNodes, XoiAttribute[] attributes) {
|
||||
this(nodeName, prop, parentDesc, null, null, childNodes, attributes, true);
|
||||
}
|
||||
|
||||
public XrNode(String nodeName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, StringFormatter formatter,
|
||||
StringParser parser, XoiNode[] childNodes, XoiAttribute[] attributes) {
|
||||
|
||||
this(nodeName, prop, parentDesc, formatter,parser, childNodes, attributes, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create as a property based node.
|
||||
*/
|
||||
private XrNode(String nodeName, ElPropertyValue prop, BeanDescriptor<?> parentDesc, StringFormatter formatter,
|
||||
StringParser parser, XoiNode[] childNodes, XoiAttribute[] attributes, boolean assocBeanValue) {
|
||||
|
||||
super(nodeName, prop, parentDesc, formatter, parser);
|
||||
|
||||
this.assocBeanValue = assocBeanValue;
|
||||
this.attributes = attributes;
|
||||
this.hasAttributes = (attributes != null && attributes.length > 0);
|
||||
|
||||
this.childNodes = childNodes;
|
||||
this.hasChildNodes = (childNodes!= null && childNodes.length > 0);
|
||||
|
||||
boolean selfClosing = false;
|
||||
|
||||
this.beginTagEnd = selfClosing ? "/>" : ">";
|
||||
this.beginTag = "<" + nodeName;
|
||||
this.endTag = selfClosing ? "" : "</" + nodeName + ">";
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return nodeName;
|
||||
}
|
||||
|
||||
public Object createBean() {
|
||||
return beanDescriptor.createBean();
|
||||
}
|
||||
|
||||
public String getNodeName() {
|
||||
return nodeName;
|
||||
}
|
||||
|
||||
public void readNode(Node node, XrReadContext ctx) {
|
||||
|
||||
Object parentBean = null;
|
||||
if (assocBeanValue){
|
||||
parentBean = ctx.getBean();
|
||||
Object childBean = beanDescriptor.createBean();
|
||||
setObjectValue(parentBean, childBean);
|
||||
|
||||
ctx.setBean(childBean);
|
||||
|
||||
} else if (prop != null){
|
||||
|
||||
String c = node.getTextContent();
|
||||
Object v = getParsedValue(c);
|
||||
setObjectValue(ctx.getBean(), v);
|
||||
}
|
||||
|
||||
if (hasAttributes){
|
||||
NamedNodeMap attrs = node.getAttributes();
|
||||
for (int i = 0; i < attributes.length; i++) {
|
||||
attributes[i].readNode(node, attrs, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasChildNodes){
|
||||
readChildNodes(node, ctx);
|
||||
}
|
||||
|
||||
if (parentBean != null){
|
||||
ctx.setBean(parentBean);
|
||||
}
|
||||
}
|
||||
|
||||
private void readChildNodes(Node node, XrReadContext ctx) {
|
||||
|
||||
Node childNode = node.getFirstChild();
|
||||
int pos = -1;
|
||||
|
||||
do {
|
||||
for (; ++pos < childNodes.length;) {
|
||||
if (childNode.getNodeName().equals(childNodes[pos].getNodeName())) {
|
||||
childNodes[pos].readNode(childNode, ctx);
|
||||
break;
|
||||
} else {
|
||||
System.out.println("no element for " + childNodes[pos].getNodeName());
|
||||
}
|
||||
}
|
||||
|
||||
childNode = childNode.getNextSibling();
|
||||
|
||||
} while (childNode != null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void writeNode(XrOutputDocument out, Node node, Object bean) throws IOException {
|
||||
|
||||
Object val = prop == null ? null : getObjectValue(bean);
|
||||
|
||||
Node childNode;
|
||||
if (nodeName == null){
|
||||
childNode = node;
|
||||
|
||||
} else {
|
||||
Element element = out.getDocument().createElement(nodeName);
|
||||
childNode = element;
|
||||
out.appendChild(node, element);
|
||||
|
||||
if (hasAttributes) {
|
||||
for (int i = 0; i < attributes.length; i++) {
|
||||
attributes[i].writeAttribute(out, element, bean, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writeContent(out, childNode, bean, val);
|
||||
}
|
||||
|
||||
public void writeNode(XrOutputWriter o, Object bean) throws IOException {
|
||||
|
||||
Object val = null;
|
||||
if (prop != null){
|
||||
val = getObjectValue(bean);
|
||||
if (val == null && !hasAttributes && !hasChildNodes){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
o.increaseDepth();
|
||||
o.write(beginTag);
|
||||
if (hasAttributes) {
|
||||
for (int i = 0; i < attributes.length; i++) {
|
||||
attributes[i].writeAttribute(o, bean, val);
|
||||
}
|
||||
}
|
||||
o.write(beginTagEnd);
|
||||
|
||||
writeContent(o, bean, val);
|
||||
|
||||
if (hasChildNodes){
|
||||
o.decreaseDepth(true);
|
||||
} else {
|
||||
o.decreaseDepth(decreaseDepth);
|
||||
}
|
||||
|
||||
o.write(endTag);
|
||||
}
|
||||
|
||||
public void writeContent(XrOutputDocument out, Node e, Object bean, Object value) throws IOException {
|
||||
|
||||
if (!assocBeanValue && value != null){
|
||||
String sv = getFormattedValue(value);
|
||||
//TODO encode string
|
||||
e.setTextContent(sv);
|
||||
}
|
||||
|
||||
if (hasChildNodes) {
|
||||
Object beanToPass = assocBeanValue ? value : bean;
|
||||
for (int i = 0; i < childNodes.length; i++) {
|
||||
childNodes[i].writeNode(out, e, beanToPass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void writeContent(XrOutputWriter o, Object bean, Object value) throws IOException {
|
||||
|
||||
if (!assocBeanValue && value != null){
|
||||
String sv = getFormattedValue(value);
|
||||
o.writeEncoded(sv);
|
||||
}
|
||||
if (hasChildNodes) {
|
||||
Object beanToPass = assocBeanValue ? value : bean;
|
||||
for (int i = 0; i < childNodes.length; i++) {
|
||||
childNodes[i].writeNode(o, beanToPass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
public class XrOutputDocument {
|
||||
|
||||
private final Document document;
|
||||
|
||||
public XrOutputDocument(Document document) {
|
||||
this.document = document;
|
||||
}
|
||||
|
||||
public Document getDocument() {
|
||||
return document;
|
||||
}
|
||||
|
||||
|
||||
public void appendChild(Node node, Node newChild) {
|
||||
if (node != null){
|
||||
node.appendChild(newChild);
|
||||
} else {
|
||||
node = document.getDocumentElement();
|
||||
if (node == null){
|
||||
document.appendChild(newChild);
|
||||
} else {
|
||||
node.appendChild(newChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
public class XrOutputWriter {
|
||||
|
||||
final Writer writer;
|
||||
|
||||
public XrOutputWriter(Writer writer) {
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
public void writeXml(Object o){
|
||||
|
||||
}
|
||||
|
||||
public void write(String s) throws IOException {
|
||||
writer.write(s);
|
||||
}
|
||||
|
||||
public void writeEncoded(String s) throws IOException {
|
||||
writer.write(s);
|
||||
}
|
||||
|
||||
int depth = -1;
|
||||
|
||||
public void increaseDepth() throws IOException {
|
||||
depth += 1;
|
||||
indent();
|
||||
}
|
||||
|
||||
public void decreaseDepth(boolean indent) throws IOException {
|
||||
|
||||
if (indent) {
|
||||
indent();
|
||||
}
|
||||
depth -= 1;
|
||||
}
|
||||
|
||||
private void indent() throws IOException {
|
||||
writer.write("\n");
|
||||
for (int j = 0; j < depth; j++) {
|
||||
writer.write(" ");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.avaje.tests.xml.runtime;
|
||||
|
||||
public class XrReadContext {
|
||||
|
||||
private Object bean;
|
||||
|
||||
public XrReadContext(Object bean) {
|
||||
this.bean = bean;
|
||||
}
|
||||
|
||||
public Object getBean() {
|
||||
return bean;
|
||||
}
|
||||
|
||||
public void setBean(Object bean) {
|
||||
this.bean = bean;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user