Search in sources :

Example 6 with ServoyJSONObject

use of com.servoy.j2db.util.ServoyJSONObject in project servoy-client by Servoy.

the class FoundSetManager method insertToDataSource.

public Object[] insertToDataSource(String name, IDataSet dataSet, ColumnType[] columnTypes, WrappedObjectReference<String[]> pkNames, boolean create, boolean skipOnLoad, String server) throws ServoyException {
    if (name == null) {
        return null;
    }
    WrappedObjectReference<String[]> actualPkNames = pkNames;
    if (actualPkNames == null)
        actualPkNames = new WrappedObjectReference<String[]>(null);
    String dataSource = IServer.VIEW_SERVER.equals(server) ? DataSourceUtils.createViewDataSource(name) : DataSourceUtils.createInmemDataSource(name);
    // initial dataset to use, but can also be set later to a 0 row dataset that is created to match columnNames and columnTypes with an in-mem
    // table definition, if that is available and columns do not match with the initial dataset
    IDataSet fixedDataSet = dataSet;
    List<ColumnType> fixedColumnTypes;
    if (columnTypes == null) {
        ColumnType[] dataSetTypes = BufferedDataSetInternal.getColumnTypeInfo(dataSet);
        fixedColumnTypes = dataSetTypes == null ? null : asList(dataSetTypes);
    } else {
        fixedColumnTypes = asList(columnTypes);
    }
    // get column def from the first in-mem datasource found
    ServoyJSONObject columnsDef = null;
    Iterator<TableNode> tblIte = application.getFlattenedSolution().getTableNodes(dataSource);
    int onLoadMethodId = -1;
    while (tblIte.hasNext()) {
        TableNode tn = tblIte.next();
        if (columnsDef == null)
            columnsDef = tn.getColumns();
        if (onLoadMethodId == -1)
            onLoadMethodId = tn.getOnFoundSetLoadMethodID();
    }
    HashMap<String, ColumnInfoDef> columnInfoDefinitions = null;
    Set<Integer> columnsThatNeedToStringSerialize = null;
    if (columnsDef == null) {
        // if we have array columns, convert values using StringSerializer
        if (containsArrayType(fixedColumnTypes)) {
            columnsThatNeedToStringSerialize = new HashSet<>();
            for (int i = 0; i < fixedColumnTypes.size(); i++) {
                ColumnType columnType = fixedColumnTypes.get(i);
                if (columnType.getSqlType() == Types.ARRAY) {
                    fixedColumnTypes.set(i, ColumnType.getColumnType(IColumnTypes.TEXT));
                    columnsThatNeedToStringSerialize.add(Integer.valueOf(i));
                }
            }
        }
    } else {
        TableDef tableInfo = DatabaseUtils.deserializeTableInfo(columnsDef);
        // column names that are not SEQUENCE_AUTO_ENTER/DATABASE_IDENTITY from table node (columnsDef)
        List<String> inmemColumnNamesThatCanSetData = new ArrayList<>();
        // column types of columns that are not SEQUENCE_AUTO_ENTER/DATABASE_IDENTITY from table node (columnsDef)
        List<ColumnType> inmemColumnTypesForColumnsThatCanSetData = new ArrayList<>();
        // ALL column defs from design time table node (columnsDef)
        columnInfoDefinitions = new HashMap<String, ColumnInfoDef>();
        // pk/rowid column names from design time table node (columnsDef)
        List<String> inmemPKs = new ArrayList<>();
        for (int j = 0; j < tableInfo.columnInfoDefSet.size(); j++) {
            ColumnInfoDef cid = tableInfo.columnInfoDefSet.get(j);
            if (cid.autoEnterType != ColumnInfo.SEQUENCE_AUTO_ENTER || cid.autoEnterSubType != ColumnInfo.DATABASE_IDENTITY) {
                // we only support auto-enter for in-mem tables based on dbident (that is then handled by hsql)
                // that is why we only check for that here; for example, if one would define at design time a
                // uuid generator pk column on an in-mem table, that would not work; it would try to insert null into a non-nullable column
                inmemColumnNamesThatCanSetData.add(cid.name);
                inmemColumnTypesForColumnsThatCanSetData.add(cid.columnType);
            }
            if ((cid.flags & IBaseColumn.IDENT_COLUMNS) != 0) {
                inmemPKs.add(cid.name);
            }
            columnInfoDefinitions.put(cid.name, cid);
            // apply stringserializer on designed datasources
            if (JSONSerializerWrapper.STRING_SERIALIZER_NAME.equals(cid.converterName)) {
                if (columnsThatNeedToStringSerialize == null) {
                    columnsThatNeedToStringSerialize = new HashSet<>();
                }
                columnsThatNeedToStringSerialize.add(Integer.valueOf(j));
            }
        }
        if (actualPkNames.o == null && inmemPKs.size() > 0) {
            actualPkNames.o = inmemPKs.toArray(new String[inmemPKs.size()]);
        }
        if (!asList(dataSet.getColumnNames()).equals(inmemColumnNamesThatCanSetData) || !compareColumnTypes(fixedColumnTypes, inmemColumnTypesForColumnsThatCanSetData)) {
            if (dataSet.getColumnCount() > 0 && /*
													 * do not generate warning if this is just the initial load of a design time inmem table that adds 0 rows
													 * and doesn't care about columns
													 */
            !asList(dataSet.getColumnNames()).equals(inmemColumnNamesThatCanSetData)) {
                Debug.warn("Dataset column names definition does not match inmem table definition for datasource : " + dataSource + " columns of dataset: " + Arrays.toString(dataSet.getColumnNames()) + ", columns of in mem definition: " + inmemColumnNamesThatCanSetData);
            }
            if (fixedColumnTypes != null && !compareColumnTypes(fixedColumnTypes, inmemColumnTypesForColumnsThatCanSetData)) {
                Debug.warn("Dataset column types definition does not match inmem table definition for datasource : " + dataSource + " types of dataset: " + fixedColumnTypes + ", types of in mem definition: " + inmemColumnTypesForColumnsThatCanSetData);
            }
            fixedColumnTypes = inmemColumnTypesForColumnsThatCanSetData;
            fixedDataSet = BufferedDataSetInternal.createBufferedDataSet(inmemColumnNamesThatCanSetData.toArray(new String[inmemColumnNamesThatCanSetData.size()]), fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), new ArrayList<Object[]>(), false);
        }
    }
    // - in the else branch above (already defined at design time), columns that are not auto sequences or dbidents; see inmemColumnNames/inmemColumnTypes(which is at this point the same as fixedColumnTypes)
    if (fixedColumnTypes != null && dataSet.getRowCount() > 0 && dataSet.getRow(0).length != fixedColumnTypes.size()) {
        // $NON-NLS-1$
        throw new RepositoryException("Data set rows do not match column count");
    }
    if (columnsThatNeedToStringSerialize != null) {
        replaceValuesWithSerializedString(dataSet, columnsThatNeedToStringSerialize);
    }
    try {
        ITable table = IServer.VIEW_SERVER.equals(server) ? viewDataSources.get(dataSource) : inMemDataSources.get(dataSource);
        if (table == null && !create) {
            throw new RepositoryException("Appending to non-existing datasource: " + dataSource);
        }
        GlobalTransaction gt = getGlobalTransaction();
        String tid = null;
        String serverName = server == null ? (table == null ? IServer.INMEM_SERVER : table.getServerName()) : server;
        if (gt != null) {
            tid = gt.getTransactionID(serverName);
        }
        if (create && table != null) {
            // temp table was used before, delete all data in it
            FoundSet foundSet = (FoundSet) getSharedFoundSet(dataSource);
            foundSet.removeLastFound();
            try {
                QueryDelete delete = new QueryDelete(new QueryTable(table.getSQLName(), table.getDataSource(), table.getCatalog(), table.getSchema(), true));
                SQLStatement deleteStatement = new SQLStatement(ISQLActionTypes.DELETE_ACTION, table.getServerName(), table.getName(), null, tid, delete, null);
                application.getDataServer().performUpdates(application.getClientID(), new ISQLStatement[] { deleteStatement });
            } catch (Exception e) {
                Debug.log(e);
                table = null;
            }
            RowManager element = rowManagers.get(dataSource);
            if (element != null) {
                element.flushAllCachedRows();
            }
        }
        InsertResult insertResult = application.getDataServer().insertDataSet(application.getClientID(), fixedDataSet, dataSource, table == null ? IServer.INMEM_SERVER : table.getServerName(), table == null ? null : table.getName(), /* create temp table when null */
        tid, fixedColumnTypes == null ? null : fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), /* inferred from dataset when null */
        actualPkNames.o, columnInfoDefinitions);
        if (insertResult != null) {
            table = insertResult.getTable();
            // do we want to fix that somehow or the caller should just make sure it calls it with the correct column order?
            if (dataSet != fixedDataSet && dataSet.getRowCount() > 0) {
                insertResult = application.getDataServer().insertDataSet(application.getClientID(), dataSet, dataSource, table.getServerName(), table.getName(), tid, columnTypes, /* will be inferred by called method from dataset if null */
                actualPkNames.o, columnInfoDefinitions);
            }
            if (IServer.INMEM_SERVER.equals(serverName)) {
                inMemDataSources.put(dataSource, table);
            } else {
                viewDataSources.put(dataSource, table);
            }
            fireTableEvent(table);
            if (!skipOnLoad && dataSet.getRowCount() == 0 && onLoadMethodId > 0) {
                IFoundSetInternal sharedFoundSet = getSharedFoundSet(dataSource);
                executeFoundsetTriggerReturnFirst(sharedFoundSet.getTable(), new Object[] { DataSourceUtils.getInmemDataSourceName(dataSource) }, StaticContentSpecLoader.PROPERTY_ONFOUNDSETLOADMETHODID, false, (Scriptable) sharedFoundSet);
            }
            if (create) {
                // only refresh when it is a new full load, when adding data to an existing table, it is only applicable to the (shared) foundset
                refreshFoundSetsFromDB(dataSource, null, false);
            }
            return insertResult.getGeneratedPks();
        }
    } catch (RemoteException e) {
        throw new RepositoryException(e);
    }
    return null;
}
Also used : ColumnType(com.servoy.j2db.query.ColumnType) BaseColumnType(com.servoy.base.query.BaseColumnType) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) TableDef(com.servoy.j2db.util.xmlxport.TableDef) ColumnInfoDef(com.servoy.j2db.util.xmlxport.ColumnInfoDef) ITable(com.servoy.j2db.persistence.ITable) WrappedObjectReference(com.servoy.j2db.util.WrappedObjectReference) InsertResult(com.servoy.j2db.dataprocessing.IDataServer.InsertResult) QueryDelete(com.servoy.j2db.query.QueryDelete) RepositoryException(com.servoy.j2db.persistence.RepositoryException) BaseQueryTable(com.servoy.base.query.BaseQueryTable) QueryTable(com.servoy.j2db.query.QueryTable) ServoyException(com.servoy.j2db.util.ServoyException) JavaScriptException(org.mozilla.javascript.JavaScriptException) IOException(java.io.IOException) MarshallException(org.jabsorb.serializer.MarshallException) ApplicationException(com.servoy.j2db.ApplicationException) RemoteException(java.rmi.RemoteException) RepositoryException(com.servoy.j2db.persistence.RepositoryException) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) TableNode(com.servoy.j2db.persistence.TableNode) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) RemoteException(java.rmi.RemoteException)

Example 7 with ServoyJSONObject

use of com.servoy.j2db.util.ServoyJSONObject in project servoy-client by Servoy.

the class MetaDataUtils method serializeTableMetaDataContents.

/**
 * Serialize contents of buffered dataset to a string, includes column names and type info
 * @param dataSet
 * @return
 * @throws JSONException
 */
public static String serializeTableMetaDataContents(BufferedDataSet dataSet) throws JSONException {
    if (dataSet == null) {
        return null;
    }
    ServoyJSONObject json = new ServoyJSONObject();
    // columns
    JSONArray jsonColumns = new JSONArray();
    String[] columnNames = dataSet.getColumnNames();
    BaseColumnType[] columnTypes = BufferedDataSetInternal.getColumnTypeInfo(dataSet);
    for (int c = 0; c < columnNames.length; c++) {
        JSONObject jsonColumn = new JSONObject();
        jsonColumn.put("name", columnNames[c]);
        jsonColumn.put("type", XMLUtils.serializeColumnType(columnTypes[c]));
        jsonColumns.put(jsonColumn);
    }
    json.put("columns", jsonColumns);
    // rows
    JSONArray jsonRows = new JSONArray();
    for (int r = 0; r < dataSet.getRowCount(); r++) {
        Object[] row = dataSet.getRow(r);
        JSONArray rowobj = new JSONArray();
        for (int i = 0; i < row.length && i < columnNames.length; i++) {
            Object val;
            if (row[i] == null) {
                val = JSONObject.NULL;
            } else if (row[i] instanceof byte[]) {
                val = Utils.encodeBASE64((byte[]) row[i]);
            } else {
                val = row[i];
            }
            rowobj.put(val);
        }
        jsonRows.put(rowobj);
    }
    json.put("rows", jsonRows);
    // toString
    return json.toString(true);
}
Also used : ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) JSONArray(org.json.JSONArray) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) BaseColumnType(com.servoy.base.query.BaseColumnType)

Example 8 with ServoyJSONObject

use of com.servoy.j2db.util.ServoyJSONObject in project servoy-client by Servoy.

the class MetaDataUtils method deserializeTableMetaDataContents.

/**
 * Deserialize table contents string to of buffered dataset to a string, includes column names and type info
 *
 * @param data
 * @return
 * @throws JSONException
 */
public static BufferedDataSet deserializeTableMetaDataContents(String data) throws JSONException {
    if (data == null) {
        return null;
    }
    ServoyJSONObject json = new ServoyJSONObject(data, true);
    JSONArray jsonColumns = (JSONArray) json.get("columns");
    String[] columnNames = new String[jsonColumns.length()];
    ColumnType[] columnTypes = new ColumnType[jsonColumns.length()];
    for (int c = 0; c < jsonColumns.length(); c++) {
        JSONObject jsonColumn = (JSONObject) jsonColumns.get(c);
        columnNames[c] = jsonColumn.getString("name");
        JSONArray typeArray = new JSONArray(jsonColumn.getString("type"));
        columnTypes[c] = ColumnType.getInstance(typeArray.getInt(0), typeArray.getInt(1), typeArray.getInt(2));
    }
    List<Object[]> rows = new ArrayList<Object[]>();
    JSONArray jsonArray = (JSONArray) json.get("rows");
    for (int r = 0; r < jsonArray.length(); r++) {
        JSONArray rowobj = (JSONArray) jsonArray.get(r);
        Object[] row = new Object[columnNames.length];
        for (int i = 0; i < columnNames.length; i++) {
            Object val = rowobj.get(i);
            if (val == JSONObject.NULL) {
                row[i] = null;
            } else if (Column.mapToDefaultType(columnTypes[i].getSqlType()) == IColumnTypes.MEDIA && val instanceof String) {
                row[i] = Utils.decodeBASE64((String) val);
            } else if (Column.mapToDefaultType(columnTypes[i].getSqlType()) == IColumnTypes.DATETIME && val instanceof String) {
                Date parsed = ServoyJSONObject.parseDate((String) val);
                // convert when possible, otherwise leave to driver (fails on mysql)
                row[i] = parsed == null ? val : parsed;
            } else {
                row[i] = val;
            }
        }
        rows.add(row);
    }
    return BufferedDataSetInternal.createBufferedDataSet(columnNames, columnTypes, rows, false);
}
Also used : BaseColumnType(com.servoy.base.query.BaseColumnType) ColumnType(com.servoy.j2db.query.ColumnType) JSONArray(org.json.JSONArray) ArrayList(java.util.ArrayList) Date(java.util.Date) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject)

Example 9 with ServoyJSONObject

use of com.servoy.j2db.util.ServoyJSONObject in project servoy-client by Servoy.

the class FoundSetManager method getTable.

@SuppressWarnings("nls")
public ITable getTable(String dataSource) throws RepositoryException {
    if (dataSource == null) {
        return null;
    }
    if (application.getSolution() == null) {
        if (Debug.tracing()) {
            Debug.trace("Trying to get a table for a datasource: " + dataSource + " on an already closed solution", new RuntimeException());
        }
        return null;
    }
    ITable table = dataSource.startsWith(DataSourceUtils.VIEW_DATASOURCE_SCHEME_COLON) ? viewDataSources.get(dataSource) : inMemDataSources.get(dataSource);
    if (table == null) {
        // when it is a db:/server/table data source
        String[] servernameTablename = DataSourceUtilsBase.getDBServernameTablename(dataSource);
        if (servernameTablename != null && servernameTablename[0] != null) {
            try {
                IServer server = application.getSolution().getServer(servernameTablename[0]);
                if (server == null) {
                    // $NON-NLS-1$
                    throw new RepositoryException(Messages.getString("servoy.exception.serverNotFound", new Object[] { servernameTablename[0] }));
                }
                table = server.getTable(servernameTablename[1]);
            } catch (RemoteException e) {
                throw new RepositoryException(e);
            }
        } else if (getDataSourceServerName(dataSource) == IServer.INMEM_SERVER) {
            if (!inMemDataSources.containsKey(dataSource) && dataSourceExists(dataSource)) {
                try {
                    insertToDataSource(DataSourceUtils.getDataSourceTableName(dataSource), new BufferedDataSet(), null, null, true, false, IServer.INMEM_SERVER);
                } catch (Exception e) {
                    Debug.error(e);
                }
            }
            return inMemDataSources.get(dataSource);
        } else if (getDataSourceServerName(dataSource) == IServer.VIEW_SERVER) {
            Optional<ServoyJSONObject> columnDefintion;
            if (!viewDataSources.containsKey(dataSource) && (columnDefintion = getColumnDefintion(dataSource)).isPresent()) {
                Table tbl = new Table(IServer.VIEW_SERVER, DataSourceUtils.getViewDataSourceName(dataSource), true, ITable.VIEW, null, null);
                tbl.setDataSource(dataSource);
                DatabaseUtils.deserializeInMemoryTable(application.getFlattenedSolution().getPersistFactory(), tbl, columnDefintion.get());
                tbl.setExistInDB(true);
                tbl.setInitialized(true);
                viewDataSources.put(dataSource, tbl);
                try {
                    executeFoundsetTriggerReturnFirst(tbl, new Object[] { DataSourceUtils.getViewDataSourceName(dataSource) }, StaticContentSpecLoader.PROPERTY_ONFOUNDSETLOADMETHODID, false, // can't entity methods, not supported on view foundsets
                    null);
                } catch (ServoyException e) {
                    Debug.error("Error executing foundset method for datasource:  " + dataSource, e);
                }
            }
            return viewDataSources.get(dataSource);
        }
    }
    return table;
}
Also used : IServer(com.servoy.j2db.persistence.IServer) BaseQueryTable(com.servoy.base.query.BaseQueryTable) Table(com.servoy.j2db.persistence.Table) QueryTable(com.servoy.j2db.query.QueryTable) ITable(com.servoy.j2db.persistence.ITable) RepositoryException(com.servoy.j2db.persistence.RepositoryException) ServoyException(com.servoy.j2db.util.ServoyException) JavaScriptException(org.mozilla.javascript.JavaScriptException) IOException(java.io.IOException) MarshallException(org.jabsorb.serializer.MarshallException) ApplicationException(com.servoy.j2db.ApplicationException) RemoteException(java.rmi.RemoteException) RepositoryException(com.servoy.j2db.persistence.RepositoryException) ServoyException(com.servoy.j2db.util.ServoyException) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) ITable(com.servoy.j2db.persistence.ITable) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) RemoteException(java.rmi.RemoteException)

Example 10 with ServoyJSONObject

use of com.servoy.j2db.util.ServoyJSONObject in project servoy-client by Servoy.

the class WebObjectImpl method getFullJSONInFrmFile.

private static JSONObject getFullJSONInFrmFile(IBasicWebObject parentWebObject, String jsonKey, int index, boolean isNew) {
    try {
        JSONObject entireModel = (JSONObject) parentWebObject.getOwnProperty(StaticContentSpecLoader.PROPERTY_JSON.getPropertyName());
        if (entireModel == null)
            entireModel = new ServoyJSONObject();
        if (!isNew) {
            Object v;
            if (entireModel.has(jsonKey))
                v = entireModel.opt(jsonKey);
            else {
                // see if there is a default value in spec for this property
                v = parentWebObject.getPropertyDefaultValueClone(jsonKey);
                if (v == null)
                    v = new ServoyJSONObject();
            }
            JSONObject obj = null;
            if (v instanceof JSONArray) {
                obj = ((JSONArray) v).optJSONObject(index);
            } else {
                obj = (JSONObject) v;
            }
            return obj;
        } else {
            return new ServoyJSONObject();
        }
    } catch (JSONException e) {
        Debug.error(e);
    }
    return null;
}
Also used : ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject) ServoyJSONArray(com.servoy.j2db.util.ServoyJSONArray) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) JSONObject(org.json.JSONObject) ServoyJSONObject(com.servoy.j2db.util.ServoyJSONObject)

Aggregations

ServoyJSONObject (com.servoy.j2db.util.ServoyJSONObject)24 JSONObject (org.json.JSONObject)12 JSONException (org.json.JSONException)7 BaseColumnType (com.servoy.base.query.BaseColumnType)6 HashMap (java.util.HashMap)6 ArrayList (java.util.ArrayList)5 Map (java.util.Map)5 JSONArray (org.json.JSONArray)5 TableNode (com.servoy.j2db.persistence.TableNode)4 WebComponent (com.servoy.j2db.persistence.WebComponent)4 ServoyException (com.servoy.j2db.util.ServoyException)4 ServoyJSONArray (com.servoy.j2db.util.ServoyJSONArray)4 ColumnInfoDef (com.servoy.j2db.util.xmlxport.ColumnInfoDef)4 TableDef (com.servoy.j2db.util.xmlxport.TableDef)4 IOException (java.io.IOException)4 PropertyDescription (org.sablo.specification.PropertyDescription)4 BaseQueryTable (com.servoy.base.query.BaseQueryTable)3 ApplicationException (com.servoy.j2db.ApplicationException)3 Form (com.servoy.j2db.persistence.Form)3 ITable (com.servoy.j2db.persistence.ITable)3