2
0
Fork 0

Switch to new meta model,fixed small bugs and made demo work pretty oke.

This commit is contained in:
Willem Cazander 2013-01-11 23:48:36 +01:00
parent afd821c360
commit b3635cf64d
46 changed files with 1055 additions and 688 deletions

View file

@ -102,7 +102,7 @@ public class XpqlHibernateVascBackend extends AbstractHibernateVascBackend {
i++;
}
if (isPageable() && state.getPageSize()>0) {
q.setFirstResult(state.getPageIndex());
q.setFirstResult(state.getPageIndex()*state.getPageSize());
q.setMaxResults(state.getPageSize());
}
List<Object> data = q.list();

View file

@ -102,7 +102,7 @@ public class XpqlPersistanceVascBackend extends AbstractPersistenceVascBackend
i++;
}
if (isPageable() && state.getPageSize()>0) {
q.setFirstResult(state.getPageIndex());
q.setFirstResult(state.getPageIndex()*state.getPageSize());
q.setMaxResults(state.getPageSize());
}
if (emTransaction) {

View file

@ -7,7 +7,7 @@
xsi:schemaLocation="http://eld.x4o.org/xml/ns/eld-root http://eld.x4o.org/xml/ns/eld-root-1.0.xsd"
providerName="vasc.forwardfire.net"
name="Vasc Backend JPA"
id="mod-vasc-backend-jpa"
id="vasc-backend-jpa"
>
<description>Provides VASC JPA backend support.</description>
<namespace uri="http://vasc.forwardfire.net/xml/ns/vasc-backend-jpa"

View file

@ -61,6 +61,8 @@ public class LdapVascBackend extends AbstractVascBackend {
private String keyAttribute = null;
private String ldapFilter = null;
private String createObjectClass = null;
private int timeLimit = 10000;
private boolean referralFollowing = true;
/**
* @return the ldapConnectionProvider
@ -75,9 +77,6 @@ public class LdapVascBackend extends AbstractVascBackend {
public void setLdapConnectionProvider(LdapConnectionProvider ldapConnectionProvider) {
this.ldapConnectionProvider = ldapConnectionProvider;
}
/**
* @see net.forwardfire.vasc.backend.VascBackend#execute()
@ -88,23 +87,21 @@ public class LdapVascBackend extends AbstractVascBackend {
List<Object> result = new ArrayList<Object>(50);
try {
LDAPSearchConstraints cons = new LDAPSearchConstraints();
cons.setBatchSize( 0 );
cons.setTimeLimit( 10000 ) ;
cons.setReferralFollowing(true);
cons.setTimeLimit(getTimeLimit() ) ;
cons.setReferralFollowing(isReferralFollowing());
connection.setConstraints(cons);
int searchScope = LDAPConnection.SCOPE_ONE;
String searchBase = baseDN;
//System.out.println("Reading object :" + searchBase + " with filter: " + ldapFilter);
LDAPSearchResults searchResults = connection.search(
searchBase, // object to read
searchScope, // scope - read single object
ldapFilter, // search filter
null, // return all attributes
false); // return attrs and values
searchBase, // object to read
searchScope, // scope - read single object
getLdapFilter(), // search filter
null, // return all attributes
false); // return attrs and values
while (searchResults.hasMore()) {
LDAPEntry entry = searchResults.next();
@ -114,7 +111,6 @@ public class LdapVascBackend extends AbstractVascBackend {
Iterator<LDAPAttribute> i = attributeSet.iterator();
while (i.hasNext()) {
LDAPAttribute attr = i.next();
//System.out.println("ATTR: "+attr.getName()+" value: "+attr.getStringValue());
String[] s = attr.getStringValueArray();
if (s.length==1) {
map.put(attr.getName(), attr.getStringValue());
@ -149,14 +145,12 @@ public class LdapVascBackend extends AbstractVascBackend {
String keyValue = (String)map.get(keyAttribute);
LDAPSearchConstraints cons = new LDAPSearchConstraints();
cons.setBatchSize( 0 );
cons.setTimeLimit( 10000 ) ;
cons.setReferralFollowing(true);
cons.setTimeLimit(getTimeLimit() ) ;
cons.setReferralFollowing(isReferralFollowing());
connection.setConstraints(cons);
int searchScope = LDAPConnection.SCOPE_ONE;
String searchBase = baseDN;
String filter = "(&("+keyAttribute+"="+keyValue+"))";
System.out.println("ldap filter: "+filter);
String filter = "(&"+ldapFilter+"("+keyAttribute+"="+keyValue+"))";
LDAPSearchResults searchResults = connection.search(
searchBase, // object to read
searchScope, // scope - read single object
@ -210,8 +204,9 @@ public class LdapVascBackend extends AbstractVascBackend {
}
LDAPModification[] m = new LDAPModification[mods.size()];
mods.toArray(m);
m = mods.toArray(m);
connection.modify(entry.getDN(), m);
return object;
} catch (Exception e) {
throw new VascException(e);
@ -270,7 +265,7 @@ public class LdapVascBackend extends AbstractVascBackend {
String keyValue = (String)map.get(keyAttribute);
int searchScope = LDAPConnection.SCOPE_ONE;
String searchBase = baseDN;
String filter = "(&("+ldapFilter+")("+keyAttribute+"="+keyValue+"))";
String filter = "(&"+ldapFilter+"("+keyAttribute+"="+keyValue+"))";
LDAPSearchResults searchResults = connection.search(
searchBase, // object to read
searchScope, // scope - read single object
@ -362,4 +357,32 @@ public class LdapVascBackend extends AbstractVascBackend {
public void setCreateObjectClass(String createObjectClass) {
this.createObjectClass = createObjectClass;
}
/**
* @return the timeLimit
*/
public int getTimeLimit() {
return timeLimit;
}
/**
* @param timeLimit the timeLimit to set
*/
public void setTimeLimit(int timeLimit) {
this.timeLimit = timeLimit;
}
/**
* @return the referralFollowing
*/
public boolean isReferralFollowing() {
return referralFollowing;
}
/**
* @param referralFollowing the referralFollowing to set
*/
public void setReferralFollowing(boolean referralFollowing) {
this.referralFollowing = referralFollowing;
}
}

View file

@ -26,7 +26,6 @@ import java.net.UnknownHostException;
import org.eobjects.metamodel.DataContext;
import org.eobjects.metamodel.mongodb.MongoDbDataContext;
import org.eobjects.metamodel.mongodb.MongoDbDataContextBean;
import com.mongodb.DB;
import com.mongodb.Mongo;
@ -51,13 +50,16 @@ public class MetaModelDataContextMongodb implements MetaModelDataContextProvider
protected Mongo mongo = null;
public DataContext getDataContext() {
MongoDbDataContextBean dataContext = new MongoDbDataContextBean(getMongodbConnection());
dataContext.setRegisterMBean(true);
dataContext.start();
//MongoDbDataContextBean dataContext = new MongoDbDataContextBean(getMongodbConnection());
///dataContext.setRegisterMBean(true);
//dataContext.start();
//MongoDbDataContextSchemaDetector detector = new MongoDbDataContextSchemaDetector();
//detector.setDataCheckSize(10);
//detector.setSearchReference(true);
//DataContext dataContext = detector.new MongoDbDataContextExtended(getMongodbConnection(),detector);
DataContext dataContext = new MongoDbDataContext(getMongodbConnection());
return dataContext;
}

View file

@ -23,7 +23,9 @@
package net.forwardfire.vasc.backend.metamodel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -67,6 +69,8 @@ public class MetaModelSchemaAutoEntry {
private String tableExclude = null;
private String entryPrefix = null;
private String vascGroupId = null;
private String veLinkPostfix = "_velink";
private String veListPostfix = "_velist";
private Map<String,VascEntryLocal> resultEntries = null;
private Map<String,VascEntryGroupLocal> resultEntryGroups = null;
@ -160,11 +164,9 @@ public class MetaModelSchemaAutoEntry {
if (tableName.equals(rs.getForeignTable().getName())==false) {
logger.finer("Creating Link entry for: "+rs.getForeignColumns()[0].getName()+" of table: "+rs.getForeignTable().getName());
createLinkEntry(rs,ve,metaTable);
//createLinkEntry(rs,ve,metaTable,id+"_"+rs.getForeignTable().getName()+"_"+rs.getForeignColumns()[0].getName()+"_link");
} else {
logger.finer("Creating List entry for: "+rs.getPrimaryColumns()[0].getName()+" of table: "+rs.getPrimaryTable().getName());
createListEntry(rs,ve,metaTable);
//createListEntry(rs,ve,metaTable,id+"_"+rs.getPrimaryTable().getName()+"_"+rs.getPrimaryColumns()[0].getName()+"_list");
}
}
@ -173,7 +175,7 @@ public class MetaModelSchemaAutoEntry {
}
private void createLinkEntry(Relationship rs2,VascEntryLocal ve,Table metaTable) {
String id = getEntryPrefix()+"_"+metaTable.getName()+"_link";
String id = getEntryPrefix()+"_"+rs2.getForeignTable().getName()+getVeLinkPostfix();
MetaModelVascBackend backendLink = new MetaModelVascBackend();
backendLink.setId(id+"_backend");
backendLink.setDataContextProvider(getDataContextProvider());
@ -195,26 +197,25 @@ public class MetaModelSchemaAutoEntry {
veLink.setBackendId(id+"_backend");
veLink.setPrimaryKeyFieldId(backendLink.getTableId());
veLink.setVascGroupId(getVascGroupId());
veLink.setAccessType(VascEntryAccessType.ENTRY_LIST);
veLink.setAccessType(VascEntryAccessType.ENTRY_LINK);
createFields(veLink,cols);
if (resultBackends.containsKey(backendLink.getId())==false) {
resultBackends.put(backendLink.getId(),backendLink);
resultEntries.put(veLink.getId(),veLink);
}
for (Relationship rs:rs2.getForeignTable().getRelationships()) {
logger.finer("Found relation FT: "+rs.getForeignTable().getName()+" PT: "+rs.getPrimaryTable().getName());
if (rs2.getForeignTable().getName().equals(rs.getForeignTable().getName())==false) {
//logger.info("Creating Link entry for: "+rs.getForeignColumns()[0].getName()+" of table: "+rs.getForeignTable().getName());
//createLinkEntry(rs,ve,rs2.getForeignTable(),id+"_"+rs.getForeignTable().getName()+"_"+rs.getForeignColumns()[0].getName()+"_link");
//createLinkEntry(rs,veLink,rs2.getForeignTable());
} else {
logger.fine("Creating List entry for: "+rs.getPrimaryColumns()[0].getName()+" of table: "+rs.getPrimaryTable().getName());
createListEntry(rs,veLink,rs2.getForeignTable());
//createListEntry(rs,veLink,rs2.getForeignTable(),id+"_"+rs.getPrimaryTable().getName()+"_"+rs.getPrimaryColumns()[0].getName()+"_list");
}
}
if (resultBackends.containsKey(backendLink.getId())==false) {
resultBackends.put(backendLink.getId(),backendLink);
resultEntries.put(veLink.getId(),veLink);
}
DefaultVascEntryLink vle = new DefaultVascEntryLink();
vle.setId(id+"Link");
vle.setVascEntryLinkType(VascEntryLinkType.DEFAULT_TYPE);
@ -225,7 +226,7 @@ public class MetaModelSchemaAutoEntry {
}
private void createListEntry(Relationship rs,VascEntry ve,Table metaTable) {
String id = getEntryPrefix()+"_"+metaTable.getName()+"_list";
String id = getEntryPrefix()+"_"+rs.getPrimaryTable().getName()+getVeListPostfix();
MetaModelVascBackend backendList = new MetaModelVascBackend();
backendList.setId(id+"_backend");
backendList.setDataContextProvider(getDataContextProvider());
@ -263,27 +264,34 @@ public class MetaModelSchemaAutoEntry {
VascSelectItemModelEntry itemModel = new VascSelectItemModelEntry();
itemModel.setEntryId(veList.getId());
itemModel.setDisplayFieldId(veList.getDisplayNameFieldId());
if (veList.getDisplayNameFieldId()==null) {
itemModel.setDisplayFieldId(veList.getPrimaryKeyFieldId()); // display can be null see createFields(), in vasc display is not null but defaulted on primary id.
} else {
itemModel.setDisplayFieldId(veList.getDisplayNameFieldId());
}
vef.getVascEntryFieldType().setDataObject(itemModel);
}
private void createFields(VascEntryLocal ve,Column[] cols) {
for (Column c:cols) {
String name = c.getName().toLowerCase();
DefaultVascEntryField vef = new DefaultVascEntryField();
vef.setId(c.getName());
vef.setVascEntryFieldType(getVascController().getVascEntryFieldTypeController().getVascEntryFieldTypeByClass(c.getType().getJavaEquivalentClass()));
if (vef.getId().equals(ve.getPrimaryKeyFieldId())) {
vef.setEditReadOnly(true);
// vef.setCreate(false); mmm
vef.setCreate(false);
}
if (vef.getVascEntryFieldType()==null || "TextField".equals(vef.getVascEntryFieldType().getId())) {
if (c.getName().toLowerCase().contains("desc") || c.getName().toLowerCase().contains("text")) {
if (name.contains("desc") || name.contains("text") || name.contains("comment") || name.contains("memo") ) {
vef.setVascEntryFieldType(getVascController().getVascEntryFieldTypeController().getVascEntryFieldTypeById("TextAreaField"));
}
if (c.getName().toLowerCase().contains("active")) {
if (name.contains("active")) {
vef.setDefaultValue("true");
vef.setVascEntryFieldType(getVascController().getVascEntryFieldTypeController().getVascEntryFieldTypeById("BooleanField"));
} /* todo
if (c.getName().toLowerCase().contains("email")) {
@ -293,25 +301,55 @@ public class MetaModelSchemaAutoEntry {
vef.setVascEntryFieldType(getVascController().getVascEntryFieldTypeController().getVascEntryFieldTypeById("URLField"));
} */
}
if (vef.getVascEntryFieldType()!=null && vef.getVascEntryFieldType().getAutoDetectClass()==Date.class) {
vef.setDefaultValue("now()");
if (name.contains("create") || name.contains("modified")) {
vef.setEdit(false);
vef.setCreate(false);
}
if (name.contains("update")) {
vef.setCreate(false);
}
}
ve.addVascEntryField(vef);
if (ve.getDisplayNameFieldId()==null && c.getName().equals(ve.getPrimaryKeyFieldId())==false && c.getType().getJavaEquivalentClass()==String.class) {
ve.setDisplayNameFieldId(c.getName());
}
}
// Disable lists when id contains;
for (VascEntryField vef:ve.getVascEntryFields()) {
String id = vef.getId().toLowerCase();
if (ve.getDisplayNameFieldId()!=null && ve.getDisplayNameFieldId().equals(vef.getId())) {
continue;
}
if (ve.getPrimaryKeyFieldId()!=null && ve.getPrimaryKeyFieldId().equals(vef.getId())) {
continue;
}
if (vef.getList()!=null && vef.getList()==false) {
continue;
}
if ( id.contains("email") |
id.contains("phone") |
id.contains("data") |
id.contains("value") |
id.contains("create") |
id.contains("update") |
id.contains("delete") |
id.contains("classname") |
id.contains("description")
) {
vef.setList(false);
}
}
// Some auto detection on fields so default imported list view looks oke on 8++ columns.
if (ve.getVascEntryFields().size()>8) {
if (ve.getVascEntryFields().size()>10) {
List<String> vefListIds = new ArrayList<String>(20);
int max = 0;
for (VascEntryField vef:ve.getVascEntryFields()) {
String id = vef.getId().toLowerCase();
if ( id.contains("create") |
id.contains("update") |
id.contains("delete") |
id.contains("classname") |
id.contains("description")
) {
vef.setList(false);
}
if (ve.getDisplayNameFieldId()!=null && ve.getDisplayNameFieldId().equals(vef.getId())) {
continue;
}
@ -322,14 +360,15 @@ public class MetaModelSchemaAutoEntry {
continue;
}
vefListIds.add(vef.getId());
}
if (vefListIds.size()<8) {
List<String> vefListFalseIds = vefListIds.subList(8-1, vefListIds.size());
for (String key:vefListFalseIds) {
VascEntryField vef = ve.getVascEntryFieldById(key);
vef.setList(false);
max++;
if (max>8) {
break;
}
}
for (String key:vefListIds) {
VascEntryField vef = ve.getVascEntryFieldById(key);
vef.setList(false);
}
}
}
@ -406,22 +445,43 @@ public class MetaModelSchemaAutoEntry {
/**
* @return the resultEntries
*/
public Collection<VascEntryLocal> getResultEntries() {
return resultEntries.values();
public List<VascEntryLocal> getResultEntries() {
List<VascEntryLocal> result = new ArrayList<VascEntryLocal>(resultEntries.values());
Collections.sort(result, new Comparator<VascEntryLocal>() {
@Override
public int compare(VascEntryLocal o1, VascEntryLocal o2) {
return o1.getId().compareTo(o2.getId());
}
});
return result;
}
/**
* @return the resultEntryGroups
*/
public Collection<VascEntryGroupLocal> getResultEntryGroups() {
return resultEntryGroups.values();
public List<VascEntryGroupLocal> getResultEntryGroups() {
List<VascEntryGroupLocal> result = new ArrayList<VascEntryGroupLocal>(resultEntryGroups.values());
Collections.sort(result, new Comparator<VascEntryGroupLocal>() {
@Override
public int compare(VascEntryGroupLocal o1, VascEntryGroupLocal o2) {
return o1.getId().compareTo(o2.getId());
}
});
return result;
}
/**
* @return the resultBackends
*/
public Collection<MetaModelVascBackend> getResultBackends() {
return resultBackends.values();
public List<MetaModelVascBackend> getResultBackends() {
List<MetaModelVascBackend> result = new ArrayList<MetaModelVascBackend>(resultBackends.values());
Collections.sort(result, new Comparator<MetaModelVascBackend>() {
@Override
public int compare(MetaModelVascBackend o1, MetaModelVascBackend o2) {
return o1.getId().compareTo(o2.getId());
}
});
return result;
}
/**
@ -437,4 +497,32 @@ public class MetaModelSchemaAutoEntry {
public void removeTable(String table) {
tables.remove(table);
}
/**
* @return the veLinkPostfix
*/
public String getVeLinkPostfix() {
return veLinkPostfix;
}
/**
* @param veLinkPostfix the veLinkPostfix to set
*/
public void setVeLinkPostfix(String veLinkPostfix) {
this.veLinkPostfix = veLinkPostfix;
}
/**
* @return the veListPostfix
*/
public String getVeListPostfix() {
return veListPostfix;
}
/**
* @param veListPostfix the veListPostfix to set
*/
public void setVeListPostfix(String veListPostfix) {
this.veListPostfix = veListPostfix;
}
}

View file

@ -32,10 +32,13 @@ import org.eobjects.metamodel.DataContext;
import org.eobjects.metamodel.UpdateableDataContext;
import org.eobjects.metamodel.data.DataSet;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.jdbc.JdbcDataContext;
import org.eobjects.metamodel.query.OrderByItem.Direction;
import org.eobjects.metamodel.query.Query;
import org.eobjects.metamodel.query.SelectItem;
import org.eobjects.metamodel.query.builder.SatisfiedQueryBuilder;
import org.eobjects.metamodel.query.builder.SatisfiedWhereBuilder;
import org.eobjects.metamodel.schema.Column;
import org.eobjects.metamodel.schema.Schema;
import org.eobjects.metamodel.schema.Table;
@ -131,6 +134,14 @@ public class MetaModelVascBackend extends AbstractVascBackend {
return true;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#isSortable()
*/
@Override
public boolean isSortable() {
return true;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#fetchTotalExecuteSize(net.forwardfire.vasc.backend.VascBackendState)
*/
@ -208,8 +219,23 @@ public class MetaModelVascBackend extends AbstractVascBackend {
throw new VascException("Could not get meta table for: '"+table+"'.");
}
Query q = createFilterQuery(state,t,false);
if (isSortable() && state.getSortField() != null) {
Column orderColumn = t.getColumnByName(state.getSortField());
if (state.isSortAscending()) {
q.orderBy(orderColumn,Direction.ASC);
} else {
q.orderBy(orderColumn,Direction.DESC);
}
}
if (isPageable() && state.getPageSize()>0) {
q.setFirstRow(state.getPageIndex()+1); // +1 for mm ?
if (state.getPageIndex()>0) {
q.setFirstRow((state.getPageIndex()*state.getPageSize())+1); // MM is 1 based ??
// workaround for bug in MM in jdbc/pg mode which is zero based.
if (dataContext instanceof JdbcDataContext) {
q.setFirstRow((state.getPageIndex()*state.getPageSize())+0); // MM is 1 based but sql is 0 based
}
}
q.setMaxRows(state.getPageSize());
}
if (crudDataContext!=null) {
@ -227,7 +253,7 @@ public class MetaModelVascBackend extends AbstractVascBackend {
SelectItem[] cols = row.getSelectItems();
List<String> keys = new ArrayList<String>(1);
keys.add(cols[0].getColumn().getName());
UpdateableRowMapImpl rowMM = new UpdateableRowMapImpl(dataContext.getDefaultSchema().getTableByName(table),keys);
UpdateableRowMapImpl rowMM = new UpdateableRowMapImpl(dataContext.getDefaultSchema().getTableByName(table),keys,cols);
for (SelectItem col:cols) {
Object value = row.getValue(col);
rowMM.setValue(col, value);

View file

@ -46,7 +46,7 @@ public class MongoDbDataContextSchemaDetector /* implements MetaModelSchemaDetec
private int dataCheckSize = 100;
private boolean searchReference = true;
public MongoDbDataContextSchemaDetector() {
private MongoDbDataContextSchemaDetector() {
}
public class MongoDbDataContextExtended extends QueryPostprocessDataContext /* MongoDbDataContext */ {
@ -153,8 +153,10 @@ public class MongoDbDataContextSchemaDetector /* implements MetaModelSchemaDetec
private boolean _closed;
private volatile DBObject _dbObject;
public MongoDbDataSet(DBCursor cursor, Column[] columns,
boolean queryPostProcessed) {
public MongoDbDataSet(DBCursor cursor, Column[] columns,boolean queryPostProcessed) {
super(columns); // create header
_cursor = cursor;
_selectItems = new SelectItem[columns.length];
for (int i = 0; i < columns.length; i++) {
@ -211,7 +213,7 @@ public class MongoDbDataContextSchemaDetector /* implements MetaModelSchemaDetec
Object value = _dbObject.get(key);
values[i] = toValue(_selectItems[i].getColumn(), value);
}
return new DefaultRow(_selectItems, values);
return new DefaultRow(getHeader(), values);
}
private Object toValue(Column column, Object value) {
@ -440,6 +442,7 @@ public class MongoDbDataContextSchemaDetector /* implements MetaModelSchemaDetec
// Override to make public
class PublicTable extends MutableTable {
private static final long serialVersionUID = 1L;
public PublicTable(String name,TableType type) {
super(name,type);
}

View file

@ -2,7 +2,6 @@ package net.forwardfire.vasc.backend.metamodel.crud;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.eobjects.metamodel.DataContext;
@ -45,15 +44,15 @@ abstract public class AbstractCrudDataContext implements CrudDataContext {
public void persist(final UpdateableRow row) {
UpdateableDataContext dataContext = abstractProviderUpdateableDataContext();
dataContext.executeUpdate(new UpdateScript() {
public void run(UpdateCallback backendImpl) {
RowInsertionBuilder query = backendImpl.insertInto(row.getTable());
for (int i=0;i<row.size();i++) {
SelectItem si = row.getSelectItem(i);
Object value = row.getValue(i);
query.value(si.getColumn(), value);
}
query.execute();
}
public void run(UpdateCallback backendImpl) {
RowInsertionBuilder query = backendImpl.insertInto(row.getTable());
for (int i=0;i<row.size();i++) {
SelectItem si = row.getSelectItem(i);
Object value = row.getValue(i);
query.value(si.getColumn(), value);
}
query.execute();
}
});
}
@ -70,18 +69,18 @@ abstract public class AbstractCrudDataContext implements CrudDataContext {
boolean first = true;
List<String> primaryKeyColumns = new ArrayList<String>(30);
Collections.addAll(primaryKeyColumns, row.getPrimaryKeys());
for (String column:primaryKeyColumns) {
Object value = row.getValue(column);
queryWhereBuilderUpdate(qWhere,column,value,first);
first = false;
}
List<String> columns = new ArrayList<String>(30);
for (String column:primaryKeyColumns) {
Object value = row.getValue(column);
queryWhereBuilderUpdate(qWhere,column,value,first);
first = false;
}
List<String> columns = new ArrayList<String>(30);
Collections.addAll(columns, row.getTable().getColumnNames());
columns.removeAll(primaryKeyColumns);
for (String column:columns) {
Object value = row.getValue(column);
((RowUpdationBuilder)qWhere).value(column, value);
}
Object value = row.getValue(column);
((RowUpdationBuilder)qWhere).value(column, value);
}
if (first==false) {
((RowUpdationBuilder)qWhere).execute();
} else {
@ -92,18 +91,18 @@ abstract public class AbstractCrudDataContext implements CrudDataContext {
Object qWhere = dataContext.query().from(row.getTable()).select(row.getTable().getColumns());
boolean first = true;
for (String column:row.getPrimaryKeys()) {
Object value = row.getValue(column);
queryWhereBuilder(qWhere,column,value,first);
first = false;
}
Query mergeSelectQuery = ((SatisfiedQueryBuilder<?>)qWhere).toQuery();
DataSet ds = dataContext.executeQuery(mergeSelectQuery);
if (ds.next()==false) {
ds.close();
throw new IllegalStateException("Could not fetch row after merging.");
}
UpdateableRow rowResult = wrapOrCreateToUpdateableRow(ds.getRow(),row.getTable());
for (String column:row.getPrimaryKeys()) {
Object value = row.getValue(column);
queryWhereBuilder(qWhere,column,value,first);
first = false;
}
Query mergeSelectQuery = ((SatisfiedQueryBuilder<?>)qWhere).toQuery();
DataSet ds = dataContext.executeQuery(mergeSelectQuery);
if (ds.next()==false) {
ds.close();
throw new IllegalStateException("Could not fetch row after merging.");
}
UpdateableRow rowResult = wrapOrCreateToUpdateableRow(ds.getRow(),row.getTable());
ds.close();
return rowResult;
}
@ -111,131 +110,71 @@ abstract public class AbstractCrudDataContext implements CrudDataContext {
public void delete(final UpdateableRow row) {
UpdateableDataContext dataContext = abstractProviderUpdateableDataContext();
dataContext.executeUpdate(new UpdateScript() {
public void run(UpdateCallback backendImpl) {
Object qWhere = backendImpl.deleteFrom(row.getTable());
boolean first = true;
for (String column:row.getPrimaryKeys()) {
Object value = row.getValue(column);
queryWhereBuilderDelete(qWhere,column,value,first);
first = false;
}
if (first==false) {
((RowDeletionBuilder)qWhere).execute();
} else {
///logger.warning no where clause
}
}
public void run(UpdateCallback backendImpl) {
Object qWhere = backendImpl.deleteFrom(row.getTable());
boolean first = true;
for (String column:row.getPrimaryKeys()) {
Object value = row.getValue(column);
queryWhereBuilderDelete(qWhere,column,value,first);
first = false;
}
if (first==false) {
((RowDeletionBuilder)qWhere).execute();
} else {
///logger.warning no where clause
}
}
});
}
// TODO: redo these queryWhereBuilder methods to cleaner code
protected Object queryWhereBuilder(Object qWhere,String key,Object value,boolean first) {
if (value instanceof Number) {
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).equals((Number)value);
} else {
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).equals((Number)value);
}
} else if (value instanceof Date) {
if (value==null) {
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).equals((Date)value);
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).isNull();
} else {
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).equals((Date)value);
}
} else if (value instanceof Boolean) {
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).equals((Boolean)value);
} else {
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).equals((Boolean)value);
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).isNull();
}
} else {
if (value==null) {
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).isNull();
} else {
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).isNull();
}
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).isEquals(value);
} else {
if (first) {
qWhere = ((SatisfiedQueryBuilder<?>)qWhere).where(key).equals(value.toString());
} else {
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).equals(value.toString());
}
qWhere = ((SatisfiedWhereBuilder<?>)qWhere).and(key).isEquals(value);
}
}
return qWhere;
}
protected Object queryWhereBuilderUpdate(Object qWhere,String key,Object value,boolean first) {
if (value instanceof Number) {
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Number)value);
} else {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Number)value);
}
} else if (value instanceof Date) {
if (value==null) {
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Date)value);
qWhere = ((RowUpdationBuilder)qWhere).where(key).isNull();
} else {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Date)value);
}
} else if (value instanceof Boolean) {
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Boolean)value);
} else {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals((Boolean)value);
qWhere = ((RowUpdationBuilder)qWhere).where(key).isNull();
}
} else {
if (value==null) {
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).isNull();
} else {
qWhere = ((RowUpdationBuilder)qWhere).where(key).isNull();
}
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).isEquals(value);
} else {
if (first) {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals(value.toString());
} else {
qWhere = ((RowUpdationBuilder)qWhere).where(key).equals(value.toString());
}
qWhere = ((RowUpdationBuilder)qWhere).where(key).isEquals(value);
}
}
return qWhere;
}
protected Object queryWhereBuilderDelete(Object qWhere,String key,Object value,boolean first) {
if (value instanceof Number) {
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Number)value);
} else {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Number)value);
}
} else if (value instanceof Date) {
if (value==null) {
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Date)value);
qWhere = ((RowDeletionBuilder)qWhere).where(key).isNull();
} else {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Date)value);
}
} else if (value instanceof Boolean) {
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Boolean)value);
} else {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals((Boolean)value);
qWhere = ((RowDeletionBuilder)qWhere).where(key).isNull();
}
} else {
if (value==null) {
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).isNull();
} else {
qWhere = ((RowDeletionBuilder)qWhere).where(key).isNull();
}
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).isEquals(value);
} else {
if (first) {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals(value.toString());
} else {
qWhere = ((RowDeletionBuilder)qWhere).where(key).equals(value.toString());
}
qWhere = ((RowDeletionBuilder)qWhere).where(key).isEquals(value);
}
}
return qWhere;

View file

@ -22,7 +22,8 @@ abstract public class AbstractUpdateableRow extends AbstractRow implements Updat
}
public int indexOf(String columnName) {
if (columnName==null) {
return UpdateableRow.INDEX_NOT_FOUND;
throw new NullPointerException("Can't search for null column name.");
//return UpdateableRow.INDEX_NOT_FOUND;
}
int index = 0;
for (SelectItem si:getIndexedSelectItemList()) {
@ -31,7 +32,8 @@ abstract public class AbstractUpdateableRow extends AbstractRow implements Updat
}
index++;
}
return UpdateableRow.INDEX_NOT_FOUND;
throw new IndexOutOfBoundsException("Can't find key of column: "+columnName);
////return UpdateableRow.INDEX_NOT_FOUND;
}
public void setValue(Row row) {
@ -66,7 +68,7 @@ abstract public class AbstractUpdateableRow extends AbstractRow implements Updat
if (selectItem.getSubQuerySelectItem() != null) {
value = getValue(selectItem.getSubQuerySelectItem());
style = getStyle(selectItem.getSubQuerySelectItem());
style = getStyle(selectItem.getSubQuerySelectItem());
}
if (value == null) {
value = getValue(selectItem);

View file

@ -11,6 +11,7 @@ import org.eobjects.metamodel.UpdateScript;
import org.eobjects.metamodel.UpdateableDataContext;
import org.eobjects.metamodel.data.DataSet;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.query.CompiledQuery;
import org.eobjects.metamodel.query.Query;
import org.eobjects.metamodel.query.builder.InitFromBuilder;
import org.eobjects.metamodel.query.builder.InitFromBuilderImpl;
@ -81,7 +82,7 @@ public class CrudDataContextImpl extends AbstractCrudDataContext implements Abst
if (row==null) {
result.addSelectItems(table.getColumns()); // create new when row is null
} else {
result.addSelectItems(row.getSelectItems());
result.addSelectItems(row.getSelectItems());
result.setValue(row); // copy all values to impl
}
return result;
@ -205,4 +206,12 @@ public class CrudDataContextImpl extends AbstractCrudDataContext implements Abst
public DataSet executeQuery(String queryString) throws MetaModelException {
return dataContextDelegate.executeQuery(queryString);
}
public CompiledQuery compileQuery(Query q) throws MetaModelException {
return dataContextDelegate.compileQuery(q);
}
public DataSet executeQuery(CompiledQuery cq, Object... args) {
return dataContextDelegate.executeQuery(cq, args);
}
}

View file

@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eobjects.metamodel.data.DataSetHeader;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.query.SelectItem;
import org.eobjects.metamodel.schema.Table;
@ -47,6 +48,9 @@ public class UpdateableRowMapImpl extends AbstractUpdateableRow {
}
public void setValue(int index, Object value) throws IndexOutOfBoundsException {
if (index == UpdateableRow.INDEX_NOT_FOUND) {
throw new IndexOutOfBoundsException("Can't save value without key index: "+UpdateableRow.INDEX_NOT_FOUND+" value:"+value);
}
dataMap.put(index, value);
}
@ -57,4 +61,8 @@ public class UpdateableRowMapImpl extends AbstractUpdateableRow {
public Row getSubSelection(SelectItem[] selectItems) {
return getSubSelectionFromImpl(new UpdateableRowMapImpl(table,primaryKeys,selectItems),selectItems);
}
public Row getSubSelection(DataSetHeader header) {
return getSubSelection(header.getSelectItems());
}
}

View file

@ -3,6 +3,7 @@ package net.forwardfire.vasc.backend.metamodel.jndi;
import org.eobjects.metamodel.DataContext;
import org.eobjects.metamodel.MetaModelException;
import org.eobjects.metamodel.data.DataSet;
import org.eobjects.metamodel.query.CompiledQuery;
import org.eobjects.metamodel.query.Query;
import org.eobjects.metamodel.query.builder.InitFromBuilder;
import org.eobjects.metamodel.schema.Column;
@ -53,4 +54,12 @@ public class JndiReadOnlyDataContext /* extends DataContextProxy */ implements D
public DataSet executeQuery(String queryString) throws MetaModelException {
return proxyDataContext.executeQuery(queryString);
}
@Override
public CompiledQuery compileQuery(Query q) throws MetaModelException {
return proxyDataContext.compileQuery(q);
}
@Override
public DataSet executeQuery(CompiledQuery cq, Object... args) {
return proxyDataContext.executeQuery(cq, args);
}
}

View file

@ -7,7 +7,6 @@ import javax.naming.NamingException;
import org.eobjects.metamodel.DataContext;
import org.eobjects.metamodel.mongodb.MongoDbDataContext;
import org.eobjects.metamodel.mongodb.MongoDbDataContextBean;
import com.mongodb.DB;
import com.mongodb.Mongo;
@ -31,27 +30,38 @@ public class JndiMongodbDataContextLoader implements JndiDataContextLoader {
}
public DataContext loadDataContext(JndiDataContextLoaderConfig config) {
MongoDbDataContextBean result = null;
//MongoDbDataContextBean result = null;
DB mongoDb = null;
if (useJndiResource) {
config.checkBackendUrl();
result = new MongoDbDataContextBean(getMongodbJdni(config.getJndiObjectName(),config.getBackendUrl()));
//result = new MongoDbDataContextBean(,));
mongoDb = getMongodbJdni(config.getJndiObjectName(),config.getBackendUrl());
} else {
int mongoPort = 27017;
if (config.getBackendPort()!=null && config.getBackendPort().isEmpty()==false) {
mongoPort = new Integer(config.getBackendPort());
}
result = new MongoDbDataContextBean(getMongodbConnection(
mongoDb = getMongodbConnection(
config.getJndiObjectName(),
config.getBackendHost(),
mongoPort,
config.getBackendDatabase(),
config.getBackendUsername(),
config.getBackendPassword()
));
);
}
result.setRegisterMBean(true); // TODO: make flag
result.start();
return result;
//MongoDbDataContextSchemaDetector detector = new MongoDbDataContextSchemaDetector();
//detector.setDataCheckSize(10);
//detector.setSearchReference(true);
//DataContext dataContext = detector.new MongoDbDataContextExtended(mongoDb,detector);
DataContext dataContext = new MongoDbDataContext(mongoDb);
return dataContext;
//result.setRegisterMBean(true); // TODO: make flag
//result.start();
//return result;
}
protected DB getMongodbJdni(String objectName,String jndiName) {