/**
*
*/
package org.sinnlabs.dbvim.script;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.sinnlabs.dbvim.config.ConfigLoader;
import org.sinnlabs.dbvim.db.Database;
import org.sinnlabs.dbvim.db.DatabaseFactory;
import org.sinnlabs.dbvim.db.Entry;
import org.sinnlabs.dbvim.db.Value;
import org.sinnlabs.dbvim.evaluator.AbstractVariableSet;
import org.sinnlabs.dbvim.evaluator.DatabaseConditionBuilder;
import org.sinnlabs.dbvim.form.FormFieldResolver;
import org.sinnlabs.dbvim.form.FormFieldResolverFactory;
import org.sinnlabs.dbvim.model.Form;
import org.sinnlabs.dbvim.ui.IField;
import org.sinnlabs.dbvim.zk.SearchComposer;
/**
* Class represents form script api interface
* @author peter.liverovsky
*
*/
public class ScriptApi {
SearchComposer composer;
/**
* Creates ScriptApi instance
* @param composer Current search composer
*/
public ScriptApi(SearchComposer composer) {
this.composer = composer;
}
/**
* Creates a new entry in the form
* @param formName Form name
* @param entry Entry object contains column values
* @throws Exception
*/
public void pushEntry(String formName, Entry entry) throws Exception {
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
db.insertEntry(entry);
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Creates a new entry in the form
* @param formName form name
* @param r Record contains form values
* @throws Exception
*/
public void pushEntry(String formName, Record r) throws Exception {
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
Entry e = new Entry();
// fill the Entry object
for ( java.util.Map.Entry<String, Object> i : r.getValues().entrySet()) {
IField<?> field = resolver.getFields().get(i.getKey());
if (field == null)
throw new IllegalArgumentException("Unknown field: " + i.getKey() +
" on the form: " + f);
Value<?> dbVal = null;
if (i.getValue() == null || i.getValue() instanceof String) {
dbVal = field.fromString((String)i.getValue());
} else if (i.getValue() instanceof Value<?>) {
dbVal = (Value<?>) i.getValue();
} else {
dbVal = field.fromObject(i.getValue());
}
e.getValues().add(dbVal);
if (field.getDBField().isPrimaryKey())
e.getID().add(dbVal);
}
db.insertEntry(e);
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Query entries from the database
* @param formName Form name
* @param qualification search qualification string
* @return List of entries
* @throws Exception
*/
public List<Record> query(String formName, String qualification) throws Exception {
AbstractVariableSet<Value<?>> vars =
DatabaseConditionBuilder.buildVariablesFromFields(composer.getFields());
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
List<IField<?>> allFields = new ArrayList<IField<?>>();
allFields.addAll(resolver.getFields().values());
List<Entry> entries = db.query(allFields, qualification, 0, vars);
List<Record> records = new ArrayList<Record>(entries.size());
for (Entry e : entries) {
Record rec = new Record();
for (Value<?> v : e.getValues()) {
rec.getValues().put(resolver.findByDBField(v.getDBField()).getId(), v.getValue());
}
records.add(rec);
}
return records;
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Updates the existing entry
* @param formName Form name
* @param entry Entry contains valid id
* @throws Exception
*/
public void updateEntry(String formName, Entry entry) throws Exception {
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
db.updateEntry(entry, entry.getValues());
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Updates all matching request with values
* @param formName Form name
* @param qualification Update query qualification
* @param values new values
* @throws Exception
*/
public void updateEntry(String formName, String qualification, Record values) throws Exception {
AbstractVariableSet<Value<?>> vars =
DatabaseConditionBuilder.buildVariablesFromFields(composer.getFields());
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
// Fill db values list
List<Value<?>> newValues = new ArrayList<Value<?>>(values.getValues().size());
for (java.util.Map.Entry<String, Object> entry : values.getValues().entrySet()) {
Value<?> v = resolver.getFields().get(entry.getKey()).fromObject(entry.getValue());
newValues.add(v);
}
db.update(newValues, qualification, vars);
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Deletes entry
* @param formName Form name
* @param entry Entry contains valid id
* @throws Exception
*/
public void deleteEntry(String formName, Entry entry) throws Exception {
Form f = getForm(formName);
if (f!=null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
db.deleteEntry(entry);
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Deletes entry
* @param formName Form name
* @param r Record to be deleted
* @throws Exception
*/
public void deleteEntry(String formName, Record r) throws Exception {
Form f = getForm(formName);
if (f!= null) {
FormFieldResolver resolver = FormFieldResolverFactory.getResolver(f);
Database db = DatabaseFactory.createInstance(f, resolver);
Entry e = new Entry();
// fill the Entry object
for ( java.util.Map.Entry<String, Object> i : r.getValues().entrySet()) {
IField<?> field = resolver.getFields().get(i.getKey());
if (field == null)
throw new IllegalArgumentException("Unknown field: " + i.getKey() +
" on the form: " + f);
Value<?> dbVal = null;
if (i.getValue() == null || i.getValue() instanceof String) {
dbVal = field.fromString((String)i.getValue());
} else if (i.getValue() instanceof Value<?>) {
dbVal = (Value<?>) i.getValue();
} else {
dbVal = field.fromObject(i.getValue());
}
e.getValues().add(dbVal);
if (field.getDBField().isPrimaryKey())
e.getID().add(dbVal);
}
db.deleteEntry(e);
} else {
throw new IllegalArgumentException("Form does not exists.");
}
}
/**
* Deletes all matching entries from the form
* @param formName Form name
* @param qualification search qualification string
*/
public void deleteEntries(String formName, String qualification) {
}
/**
* Executes sql command directly.
* You can use parameterized query in JDBC style (select * from table where id = ?)
* @param sqlCommand The sql command
* @param params Parameters for parameterized query
*/
public void directSQL(String sqlCommand, Value<?> ...params) {
}
private Form getForm(String fName) throws SQLException {
return ConfigLoader.getInstance().getForms().queryForId(fName);
}
}