2
0
Fork 0

WIP: left over open files for long...

This commit is contained in:
Willem 2017-06-10 02:22:01 +02:00
parent 0a2398c5c1
commit 76aa74990e
165 changed files with 4299 additions and 3373 deletions

View file

@ -0,0 +1,142 @@
/*
* Copyright 2007-2012 forwardfire.net All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.forwardfire.vasc.backend.metamodel;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import org.eobjects.metamodel.DataContext;
import net.forwardfire.vasc.backend.AbstractVascBackendLocal;
import net.forwardfire.vasc.backend.VascBackendAccessDataKey;
import net.forwardfire.vasc.backend.data.HashMapVascBackendAccessDataKey;
/**
* AbstractMetaModelVascBackend provides shared metamodel options.
*
* @author Willem Cazander
* @version 1.0 Oct 27, 2014
*/
abstract public class AbstractMetaModelVascBackend extends AbstractVascBackendLocal<HashMap<String,Serializable>> {
private Logger logger = Logger.getLogger(MetaModelVascBackendCrud.class.getName());
private MetaModelDataContextProvider dataContextProvider = null;
private DataContext dataContext = null;
private String table = null;
private String tableId = null;
private final Map<String,Class<?>> keyMapType = new HashMap<String,Class<?>>(5);
abstract protected void startBackendMetaModel();
@Override
protected void stopBackendLocal() {
dataContext = null;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackendLocal#startBackendLocal()
*/
@Override
protected final void startBackendLocal() {
requireNonNull(getDataContextProvider(), "dataContextProvider is null.");
requireNonEmpty(keyMapType.keySet(), "No primary keys defined.");
requireNonNull(table,"table needs value");
//requireNonNull(tableId,"table needs value");
long startTime = System.currentTimeMillis();
dataContext = dataContextProvider.getDataContext();
requireNonNull(dataContext,"dataContextProvider created null dataContext.");
long stopTime = System.currentTimeMillis();
logger.fine(dataContext.getClass().getSimpleName()+" created for: "+table+" in: "+(stopTime-startTime)+" ms.");
startBackendMetaModel();
}
protected final void addKeyMapType(String field,Class<?> fieldType) {
requireNonEmpty(field,"field has to have value");
requireNonNull(fieldType,"field has to have value");
keyMapType.put(field, fieldType);
}
protected final Map<String,Class<?>> getKeyMapType() {
return keyMapType;
}
protected DataContext getDataContext() {
return dataContext;
}
/**
* @see net.forwardfire.vasc.backend.VascBackend#createVascBackendAccessDataKey()
*/
@Override
public final VascBackendAccessDataKey<HashMap<String, Serializable>> createVascBackendAccessDataKey() {
return new HashMapVascBackendAccessDataKey(keyMapType);
}
/**
* @return the dataContextProvider
*/
public final MetaModelDataContextProvider getDataContextProvider() {
return dataContextProvider;
}
/**
* @param dataContextProvider the dataContextProvider to set
*/
public final void setDataContextProvider(MetaModelDataContextProvider dataContextProvider) {
this.dataContextProvider = dataContextProvider;
}
/**
* @return the table
*/
public final String getTable() {
return table;
}
/**
* @param table the table to set
*/
public final void setTable(String table) {
this.table = table;
}
/**
* @return the tableId
*/
public final String getTableId() {
return tableId;
}
/**
* @param tableId the tableId to set
*/
public final void setTableId(String tableId) {
this.tableId = tableId;
}
}

View file

@ -1,20 +1,36 @@
package net.forwardfire.vasc.backend.metamodel;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.query.SelectItem;
import net.forwardfire.vasc.backend.VascBackendException;
import net.forwardfire.vasc.backend.VascEntryFieldValue;
import net.forwardfire.vasc.backend.VascBackendAccessDataRecord;
import net.forwardfire.vasc.backend.metamodel.crud.UpdateableRow;
public class RowVascEntryFieldValue implements VascEntryFieldValue<Row> {
private static final long serialVersionUID = -806674640688182132L;
@SuppressWarnings("serial")
public class MetaModelVascBackendAccessDataRecord implements VascBackendAccessDataRecord<HashMap<String,Serializable>,Row> {
private final Map<String,Class<?>> keyMapType;
public MetaModelVascBackendAccessDataRecord(Map<String,Class<?>> keyMapType) {
this.keyMapType = keyMapType;
}
@Override
public HashMap<String, Serializable> getPrimaryKey(Row record) throws VascBackendException {
HashMap<String, Serializable> result = new HashMap<String, Serializable>();
for (String key:keyMapType.keySet()) {
result.put(key, getValue(key,record));
}
return result;
}
/**
* @see net.forwardfire.vasc.backend.VascEntryFieldValue#getValue(java.lang.String, java.lang.Object)
* @see net.forwardfire.vasc.backend.VascBackendAccessDataRecord#getValue(java.lang.String, java.lang.Object)
*/
@Override
public Serializable getValue(String backendName, Row record) throws VascBackendException {
@ -31,7 +47,7 @@ public class RowVascEntryFieldValue implements VascEntryFieldValue<Row> {
Serializable fieldValue = (Serializable) record.getValue(indexOf(backendName,record));
return fieldValue;
}
private int indexOf(String columnName,Row row) { // RM after MM Row update
if (columnName==null) {
return UpdateableRow.INDEX_NOT_FOUND;
@ -47,19 +63,7 @@ public class RowVascEntryFieldValue implements VascEntryFieldValue<Row> {
}
/**
* @see net.forwardfire.vasc.backend.VascEntryFieldValue#getDisplayValue(java.lang.String, java.lang.Object)
*/
@Override
public String getDisplayValue(String backendName, Row record) throws VascBackendException {
Object fieldValue = getValue(backendName,record);
if (fieldValue==null) {
fieldValue = "";
}
return fieldValue.toString();
}
/**
* @see net.forwardfire.vasc.backend.VascEntryFieldValue#setValue(java.lang.String, java.lang.Object, java.lang.Object)
* @see net.forwardfire.vasc.backend.VascBackendAccessDataRecord#setValue(java.lang.String, java.lang.Object, java.lang.Object)
*/
@Override
public void setValue(String backendName, Row record,Serializable value) throws VascBackendException {

View file

@ -0,0 +1,143 @@
/*
* Copyright 2007-2012 forwardfire.net All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.forwardfire.vasc.backend.metamodel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
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;
import net.forwardfire.vasc.backend.VascBackendAccessDataRecord;
import net.forwardfire.vasc.backend.VascBackendException;
import net.forwardfire.vasc.backend.crud.VascBackendCrud;
import net.forwardfire.vasc.backend.list.DefaultVascBackendListResult;
import net.forwardfire.vasc.backend.list.VascBackendListResult;
import net.forwardfire.vasc.backend.list.VascBackendListRequest;
import net.forwardfire.vasc.backend.metamodel.crud.CrudDataContext;
import net.forwardfire.vasc.backend.metamodel.crud.UpdateableRow;
import net.forwardfire.vasc.backend.metamodel.crud.CrudDataContextImpl;
import net.forwardfire.vasc.backend.metamodel.crud.UpdateableRowMapImpl;
/**
* MetaModelVascBackend provides vasc backend for metamodel.
*
* @author Willem Cazander
* @version 1.0 Dec 31, 2011
*/
public class MetaModelVascBackendCrud extends AbstractMetaModelVascBackend implements VascBackendCrud<HashMap<String,Serializable>,Row> {
private Logger logger = Logger.getLogger(MetaModelVascBackendCrud.class.getName());
private CrudDataContext crudDataContext = null;
@Override
protected void startBackendMetaModel() {
// if (isUpdateableDataContext()) {
// CrudDataContextImpl crudDataContextImpl = new CrudDataContextImpl(getUpdateableDataContext());
// if (tableId!=null && tableId.isEmpty()==false) {
// List<String> ids = new ArrayList<String>(1);
// ids.add(tableId);
// crudDataContextImpl.overridePrimaryKeysForTable(table,ids);
// }
// crudDataContext = crudDataContextImpl;
// }
}
@Override
public VascBackendAccessDataRecord<HashMap<String, Serializable>, Row> createVascBackendAccessDataRecord() {
// TODO Auto-generated method stub
return null;
}
@Override
public Row newRecord() throws VascBackendException {
return crudDataContext.createRow(crudDataContext.getTableByQualifiedLabel(getTable()));
}
@Override
public Row fetch(HashMap<String, Serializable> recordPK) throws VascBackendException {
// TODO Auto-generated method stub
return null;
}
/**
* Returns casted version of data context.
*/
private UpdateableDataContext getUpdateableDataContext() {
return (UpdateableDataContext)getDataContext();
}
/**
* Returns true when data context in updateable.
*/
private boolean isUpdateableDataContext() {
return getDataContext() instanceof UpdateableDataContext;
}
public boolean isReadOnly() {
return isUpdateableDataContext()==false;
}
@Override
public Row persist(Row object) throws VascBackendException {
if (crudDataContext==null) {
return object;
}
crudDataContext.persist((UpdateableRow) object);
return object;
}
@Override
public Row merge(Row object) throws VascBackendException {
if (crudDataContext==null) {
return object;
}
return crudDataContext.merge((UpdateableRow) object);
}
@Override
public void delete(HashMap<String, Serializable> recordPK) throws VascBackendException {
if (crudDataContext==null) {
return;
}
//crudDataContext.delete((UpdateableRow) object);
}
}

View file

@ -22,8 +22,11 @@
package net.forwardfire.vasc.backend.metamodel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
@ -42,12 +45,15 @@ import org.eobjects.metamodel.schema.Column;
import org.eobjects.metamodel.schema.Schema;
import org.eobjects.metamodel.schema.Table;
import net.forwardfire.vasc.backend.AbstractVascBackend;
import net.forwardfire.vasc.backend.DefaultVascBackendResult;
import net.forwardfire.vasc.backend.VascBackendAccessDataRecord;
import net.forwardfire.vasc.backend.VascBackendException;
import net.forwardfire.vasc.backend.VascBackendResult;
import net.forwardfire.vasc.backend.VascBackendState;
import net.forwardfire.vasc.backend.VascEntryRecordCreator;
import net.forwardfire.vasc.backend.crud.VascBackendCrud;
import net.forwardfire.vasc.backend.data.HashMapVascBackendAccessDataRecord;
import net.forwardfire.vasc.backend.list.DefaultVascBackendListResult;
import net.forwardfire.vasc.backend.list.VascBackendList;
import net.forwardfire.vasc.backend.list.VascBackendListFeature;
import net.forwardfire.vasc.backend.list.VascBackendListResult;
import net.forwardfire.vasc.backend.list.VascBackendListRequest;
import net.forwardfire.vasc.backend.metamodel.crud.CrudDataContext;
import net.forwardfire.vasc.backend.metamodel.crud.UpdateableRow;
import net.forwardfire.vasc.backend.metamodel.crud.CrudDataContextImpl;
@ -59,91 +65,39 @@ import net.forwardfire.vasc.backend.metamodel.crud.UpdateableRowMapImpl;
* @author Willem Cazander
* @version 1.0 Dec 31, 2011
*/
public class MetaModelVascBackend extends AbstractVascBackend<Row> {
public class MetaModelVascBackendList extends AbstractMetaModelVascBackend implements VascBackendList<HashMap<String,Serializable>,Row> {
private Logger logger = Logger.getLogger(MetaModelVascBackend.class.getName());
private MetaModelDataContextProvider dataContextProvider = null;
private DataContext dataContext = null;
private CrudDataContext crudDataContext = null;
private String table = null;
private String tableId = null;
/**
* Returns casted version of data context.
*/
private UpdateableDataContext getUpdateableDataContext() {
return (UpdateableDataContext)dataContext;
private Logger logger = Logger.getLogger(MetaModelVascBackendList.class.getName());
private final EnumSet<VascBackendListFeature> features = EnumSet.noneOf(VascBackendListFeature.class);
private final List<String> rowActions = new ArrayList<String>();
@Override
protected void startBackendMetaModel() {
}
/**
* Returns true when data context in updateable.
*/
private boolean isUpdateableDataContext() {
return dataContext instanceof UpdateableDataContext;
@Override
public VascBackendAccessDataRecord<HashMap<String,Serializable>,Row> createVascBackendAccessDataRecord() {
return new MetaModelVascBackendAccessDataRecord(getKeyMapType());
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#isReadOnly()
*/
@Override
public boolean isReadOnly() {
return isUpdateableDataContext()==false;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#startBackend()
*/
@Override
public void startBackend() {
if (table==null) {
throw new NullPointerException("Can't start with null table.");
}
if (table.isEmpty()) {
throw new NullPointerException("Can't start with empty table.");
}
long startTime = System.currentTimeMillis();
dataContext = dataContextProvider.getDataContext();
if (isUpdateableDataContext()) {
CrudDataContextImpl crudDataContextImpl = new CrudDataContextImpl(getUpdateableDataContext());
if (tableId!=null && tableId.isEmpty()==false) {
List<String> ids = new ArrayList<String>(1);
ids.add(tableId);
crudDataContextImpl.overridePrimaryKeysForTable(table,ids);
}
crudDataContext = crudDataContextImpl;
}
long stopTime = System.currentTimeMillis();
logger.fine(dataContext.getClass().getSimpleName()+" created for: "+table+" in: "+(stopTime-startTime)+" ms.");
public EnumSet<VascBackendListFeature> getSupportedFeatures() {
return features;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#stopBackend()
*/
@Override
public void stopBackend() {
dataContext = null;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#isPageable()
*/
@Override
public boolean isPageable() {
return true;
public List<String> getSupportedRowActions() {
return rowActions;
}
/**
* @see net.forwardfire.vasc.backend.AbstractVascBackend#isSortable()
*/
@Override
public boolean isSortable() {
return true;
public void executeRowAction(VascBackendListRequest request,List<HashMap<String, Serializable>> recordPKs, String actionName) throws VascBackendException {
}
private long fetchTotalExecuteSize(VascBackendState state) {
private long fetchTotalExecuteSize(VascBackendListRequest state) {
DataContext dataContext = getDataContext();
Schema schema = dataContext.getDefaultSchema();
Table t = schema.getTableByName(table);
Table t = schema.getTableByName(getTable());
Query q = createFilterQuery(state,t,true);
DataSet ds = dataContext.executeQuery(q);
if (ds.next()==false) {
@ -156,7 +110,9 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
return result.longValue();
}
private Query createFilterQuery(VascBackendState state,Table t,boolean count) {
private Query createFilterQuery(VascBackendListRequest state,Table t,boolean count) {
DataContext dataContext = getDataContext();
Object qWhere = null;
if (count==false) {
qWhere = dataContext.query().from(t).select(t.getColumns());
@ -208,18 +164,19 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
}
@Override
public VascBackendResult<Row> execute(VascBackendState state) throws VascBackendException {
return new DefaultVascBackendResult<Row>(executeList(state),fetchTotalExecuteSize(state));
public VascBackendListResult<Row> execute(VascBackendListRequest state) throws VascBackendException {
return new DefaultVascBackendListResult<Row>(executeList(state),fetchTotalExecuteSize(state));
}
private List<Row> executeList(VascBackendState state) throws VascBackendException {
private List<Row> executeList(VascBackendListRequest state) throws VascBackendException {
DataContext dataContext = getDataContext();
Schema schema = dataContext.getDefaultSchema();
Table t = schema.getTableByName(table);
Table t = schema.getTableByName(getTable());
if (t==null) {
throw new VascBackendException("Could not get meta table for: '"+table+"'.");
throw new VascBackendException("Could not get meta table for: '"+getTable()+"'.");
}
Query q = createFilterQuery(state,t,false);
if (isSortable() && state.getSortField() != null) {
if (state.getSortField() != null) {
Column orderColumn = t.getColumnByName(state.getSortField());
if (state.isSortAscending()) {
q.orderBy(orderColumn,Direction.ASC);
@ -227,7 +184,7 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
q.orderBy(orderColumn,Direction.DESC);
}
}
if (isPageable() && state.getPageSize()>0) {
if (state.getPageSize()>0) {
if (state.getPageIndex()>0) {
q.setFirstRow((state.getPageIndex()*state.getPageSize())+1); // MM is 1 based ??
@ -239,12 +196,12 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
q.setMaxRows(state.getPageSize());
}
List<Row> result = new ArrayList<Row>(50);
if (crudDataContext!=null) {
DataSet ds = crudDataContext.executeQuery(q);
result.addAll(ds.toRows());
ds.close();
return result;
}
// if (crudDataContext!=null) {
// DataSet ds = crudDataContext.executeQuery(q);
// result.addAll(ds.toRows());
// ds.close();
// return result;
// }
DataSet ds = dataContext.executeQuery(q);
while (ds.next()) {
@ -252,7 +209,7 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
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,cols);
UpdateableRowMapImpl rowMM = new UpdateableRowMapImpl(dataContext.getDefaultSchema().getTableByName(getTable()),keys,cols);
for (SelectItem col:cols) {
Object value = row.getValue(col);
rowMM.setValue(col, value);
@ -263,80 +220,4 @@ public class MetaModelVascBackend extends AbstractVascBackend<Row> {
return result;
}
@Override
public void persist(Row object) throws VascBackendException {
if (crudDataContext==null) {
return;
}
crudDataContext.persist((UpdateableRow) object);
}
@Override
public Row merge(Row object) throws VascBackendException {
if (crudDataContext==null) {
return object;
}
return crudDataContext.merge((UpdateableRow) object);
}
@Override
public void delete(Row object) throws VascBackendException {
if (crudDataContext==null) {
return;
}
crudDataContext.delete((UpdateableRow) object);
}
@Override
public RowVascEntryFieldValue provideVascEntryFieldValue() {
return new RowVascEntryFieldValue();
}
@Override
public VascEntryRecordCreator<Row> provideVascEntryRecordCreator() {
return new RowVascEntryRecordCreator(crudDataContext,crudDataContext.getDefaultSchema().getTableByName(table));
}
/**
* @return the dataContextProvider
*/
public MetaModelDataContextProvider getDataContextProvider() {
return dataContextProvider;
}
/**
* @param dataContextProvider the dataContextProvider to set
*/
public void setDataContextProvider(MetaModelDataContextProvider dataContextProvider) {
this.dataContextProvider = dataContextProvider;
}
/**
* @return the table
*/
public String getTable() {
return table;
}
/**
* @param table the table to set
*/
public void setTable(String table) {
this.table = table;
}
/**
* @return the tableId
*/
public String getTableId() {
return tableId;
}
/**
* @param tableId the tableId to set
*/
public void setTableId(String tableId) {
this.tableId = tableId;
}
}

View file

@ -1,25 +0,0 @@
package net.forwardfire.vasc.backend.metamodel;
import org.eobjects.metamodel.data.Row;
import org.eobjects.metamodel.schema.Table;
import net.forwardfire.vasc.backend.VascBackendException;
import net.forwardfire.vasc.backend.VascEntryRecordCreator;
import net.forwardfire.vasc.backend.metamodel.crud.CrudDataContext;
public class RowVascEntryRecordCreator implements VascEntryRecordCreator<Row> {
private static final long serialVersionUID = -1182678362367989090L;
private CrudDataContext dataContext = null;
private Table table = null;
public RowVascEntryRecordCreator(CrudDataContext dataContext,Table table) {
this.dataContext=dataContext;
this.table=table;
}
@Override
public Row newRecord() throws VascBackendException {
return dataContext.createRow(table);
}
}