Use your own database table from frontend ( GWT )
Methods
The class OKMDatabaseMetadataService has the interface definition to access metadata services.
Method | return | Description |
---|---|---|
executeValueQuery(String table, String filter, String order) | List<Map<String,String>> |
Executes a selected query. |
updateValue(Map<String,String> map) | String | Executes an updated query. |
createValue(Map<String,String> map) |
String | Executes and creates a query. |
executeMultiValueQuery(List<String> tables, String query |
List<List<Map<String, String>>> | Executes a query that returns a results with several metadata tables. |
getNextSequenceValue(String table, String column) |
double | Gets the next value of a sequence. |
deleteValue(Map<String, String> map) |
void |
Executes and deletes a query. |
Sample
Register database metadata table definition
Table named "security" with tree columns:
- Column name "uuid_id" of type text.
- Column name "type" of type text.
- column name "name" of type text.
Go to Administration > Tools > Database query and execute the SQL:
INSERT INTO OKM_DB_METADATA_TYPE (DMT_TABLE, DMT_REAL_COLUMN, DMT_TYPE, DMT_VIRTUAL_COLUMN) VALUES ('security', 'col00', 'text', 'uuid_id');
INSERT INTO OKM_DB_METADATA_TYPE (DMT_TABLE, DMT_REAL_COLUMN, DMT_TYPE, DMT_VIRTUAL_COLUMN) VALUES ('security', 'col01', 'text', 'type');
INSERT INTO OKM_DB_METADATA_TYPE (DMT_TABLE, DMT_REAL_COLUMN, DMT_TYPE, DMT_VIRTUAL_COLUMN) VALUES ('security', 'col02', 'text', 'name');
Java classes
File GWTExtendedSecurity.java:
public class GWTExtendedSecurity extends DatabaseMetadataCommon implements IsSerializable {
public static final String TYPE_USER = "user";
public static final String TYPE_ROLE = "role";
// Metadata Virtual Name mapping
public static final String MV_TABLE_NAME = "security";
public static final String MV_COLUMN_NAME_UUID = "uuid_id";
public static final String MV_COLUMN_NAME_TYPE = "type";
public static final String MV_COLUMN_NAME_NAME = "name";
private String uuid;
private String type;
private String name;
@Override
public void loadFromMap(Map<String, String> map) {
super.loadFromMap(map);
if (map.containsKey(MV_COLUMN_NAME_UUID)) {
setUuid(map.get(MV_COLUMN_NAME_UUID));
}
if (map.containsKey(MV_COLUMN_NAME_TYPE)) {
setType(map.get(MV_COLUMN_NAME_TYPE));
}
if (map.containsKey(MV_COLUMN_NAME_NAME)) {
setName(map.get(MV_COLUMN_NAME_NAME));
}
}
@Override
public Map<String, String> restoreToMap() {
Map<String,String> map = super.restoreToMap();
if (uuid != null) {
map.put(MV_COLUMN_NAME_UUID, getUuid());
}
if (type != null) {
map.put(MV_COLUMN_NAME_TYPE, getType());
}
if (name != null) {
map.put(MV_COLUMN_NAME_NAME, getName());
}
return map;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
File Example.java:
public class Example {
private final OKMDatabaseMetadataServiceAsync metadataService = (OKMDatabaseMetadataServiceAsync) GWT.create(OKMDatabaseMetadataService.class);
public void test() {
// get sequence
metadataService.getNextSequenceValue("table_name", "col_name" , new AsyncCallback<Double>() {
@Override
public void onSuccess(Double result) {
int value = result.intValue();
}
@Override
public void onFailure(Throwable caught) {
}
});
// create value
final GWTExtendedSecurity security = new GWTExtendedSecurity();
security.setUuid("some uuid");
security.setName("some name");
security.setType(GWTExtendedSecurity.TYPE_ROLE);
security.setRealTable(GWTExtendedSecurity.MV_TABLE_NAME);
metadataService.createValue(security.restoreToMap(), new AsyncCallback<Double>() {
@Override
public void onSuccess(Double result) {
// created
}
@Override
public void onFailure(Throwable caught) {
}
});
// Execute query
String filter = "$" + GWTExtendedSecurity.MV_COLUMN_NAME_UUID + "='some uuid'";
metadataService.executeValueQuery(GWTExtendedSecurity.MV_TABLE_NAME, filter, "", new AsyncCallback<List<Map<String,String>>>() {
@Override
public void onSuccess(List<Map<String, String>> result) {
if (result.size() > 0) {
GWTExtendedSecurity security = new GWTExtendedSecurity();
security.loadFromMap(result.get(0));
}
}
@Override
public void onFailure(Throwable caught) {
GeneralComunicator.showError("executeValueQuery", caught);
}
});
// Update value
security.setName("some name changed");
metadataService.updateValue(security.restoreToMap(), new AsyncCallback<Object>() {
@Override
public void onSuccess(Object result) {
}
@Override
public void onFailure(Throwable caught) {
}
});
// Delete value
metadataService.deleteValue(security.restoreToMap(), new AsyncCallback<Object>() {
@Override
public void onSuccess(Object result) {
}
@Override
public void onFailure(Throwable caught) {
}
});
}
}
Advanced
Also can be done joins between tables for it should be used method executeMultiValueQuery:
List<String> tables = new ArrayList<String>();
tables.add(GWTCountry.MV_TABLE_NAME);
tables.add(GWTState.MV_TABLE_NAME);
String query = "from DatabaseMetadataValue dmv1, DatabaseMetadataValue dmv2 ";
query += "where dmv1.table='" + GWTCountry.MV_TABLE_NAME + "' ";
query += "and dmv2.table='" + GWTState.MV_TABLE_NAME + "' ";
query += "and dmv1.$" + GWTCountry.MV_COLUMN_COUNTRY_NAME + "='SPAIN' ";
query += "and dmv1.$" + GWTCountry.MV_COLUMN_COUNTRY_NAME + "=" + "dmv2.$" + GWTState.MV_COLUMN_COUNTRY_NAME;
metadataService.executeMultiValueQuery(tables, query, new AsyncCallback<List<List<Map<String,String>>>>() {
@Override
public void onSuccess(List<List<Map<String, String>>> result) {
if (!result.isEmpty()) {
List<Map<String, String>> dmvRow = result.get(0);
if (!dmvRow.isEmpty() && dmvRow.size() == 2) {
GWTState state = new GWTState();
state.loadFromMap(dmvRow.get(1));
}
}
}
@Override
public void onFailure(Throwable caught) {
}
});