diff --git a/deploy/packaging/debian/matlab.noarch b/deploy/packaging/debian/matlab.noarch index 997eda5fa2..530d9820f0 100644 --- a/deploy/packaging/debian/matlab.noarch +++ b/deploy/packaging/debian/matlab.noarch @@ -16,8 +16,10 @@ ./usr/local/mdsplus/matlab/private/javaConnect.m ./usr/local/mdsplus/matlab/private/javaExecute.m ./usr/local/mdsplus/matlab/private/javaFromMatlab.m +./usr/local/mdsplus/matlab/private/javaFromMatlabCell.m ./usr/local/mdsplus/matlab/private/javaFromMatlabStruct.m ./usr/local/mdsplus/matlab/private/javaToMatlab.m +./usr/local/mdsplus/matlab/private/javaToMatlabCell.m ./usr/local/mdsplus/matlab/private/javaToMatlabStruct.m ./usr/local/mdsplus/matlab/private/pythonActivate.m ./usr/local/mdsplus/matlab/private/pythonConnect.m diff --git a/deploy/packaging/debian/python.noarch b/deploy/packaging/debian/python.noarch index 4086298248..9ca17ae7d4 100644 --- a/deploy/packaging/debian/python.noarch +++ b/deploy/packaging/debian/python.noarch @@ -13,9 +13,9 @@ ./usr/local/mdsplus/python/MDSplus/mdsdcl.py ./usr/local/mdsplus/python/MDSplus/mdsscalar.py ./usr/local/mdsplus/python/MDSplus/modpython.py +./usr/local/mdsplus/python/MDSplus/pyproject.toml ./usr/local/mdsplus/python/MDSplus/scope.py ./usr/local/mdsplus/python/MDSplus/setup.py -./usr/local/mdsplus/python/MDSplus/pyproject.toml ./usr/local/mdsplus/python/MDSplus/tests/__init__.py ./usr/local/mdsplus/python/MDSplus/tests/_common.py ./usr/local/mdsplus/python/MDSplus/tests/connection_case.py diff --git a/deploy/packaging/redhat/matlab.noarch b/deploy/packaging/redhat/matlab.noarch index a674d12481..776deed597 100644 --- a/deploy/packaging/redhat/matlab.noarch +++ b/deploy/packaging/redhat/matlab.noarch @@ -18,8 +18,10 @@ ./usr/local/mdsplus/matlab/private/javaConnect.m ./usr/local/mdsplus/matlab/private/javaExecute.m ./usr/local/mdsplus/matlab/private/javaFromMatlab.m +./usr/local/mdsplus/matlab/private/javaFromMatlabCell.m ./usr/local/mdsplus/matlab/private/javaFromMatlabStruct.m ./usr/local/mdsplus/matlab/private/javaToMatlab.m +./usr/local/mdsplus/matlab/private/javaToMatlabCell.m ./usr/local/mdsplus/matlab/private/javaToMatlabStruct.m ./usr/local/mdsplus/matlab/private/pythonActivate.m ./usr/local/mdsplus/matlab/private/pythonConnect.m diff --git a/deploy/packaging/redhat/python.noarch b/deploy/packaging/redhat/python.noarch index 10aaaf3ed2..64d9f4a033 100644 --- a/deploy/packaging/redhat/python.noarch +++ b/deploy/packaging/redhat/python.noarch @@ -14,9 +14,9 @@ ./usr/local/mdsplus/python/MDSplus/mdsdcl.py ./usr/local/mdsplus/python/MDSplus/mdsscalar.py ./usr/local/mdsplus/python/MDSplus/modpython.py +./usr/local/mdsplus/python/MDSplus/pyproject.toml ./usr/local/mdsplus/python/MDSplus/scope.py ./usr/local/mdsplus/python/MDSplus/setup.py -./usr/local/mdsplus/python/MDSplus/pyproject.toml ./usr/local/mdsplus/python/MDSplus/tests ./usr/local/mdsplus/python/MDSplus/tests/__init__.py ./usr/local/mdsplus/python/MDSplus/tests/_common.py diff --git a/java/mdsobjects/src/main/java/MDSplus/Apd.java b/java/mdsobjects/src/main/java/MDSplus/Apd.java index 65463243c5..241786bd4d 100644 --- a/java/mdsobjects/src/main/java/MDSplus/Apd.java +++ b/java/mdsobjects/src/main/java/MDSplus/Apd.java @@ -65,10 +65,12 @@ public Data getDescAt(int idx) { return descs[idx]; } + public int[] getShape() { - return new int[]{descs.length}; + return new int[]{nDescs}; } + protected void resizeDescs(int newDim) { if (descs == null) diff --git a/java/mdsobjects/src/main/java/MDSplus/Connection.java b/java/mdsobjects/src/main/java/MDSplus/Connection.java index 19d7d10e21..eef1cb2d29 100644 --- a/java/mdsobjects/src/main/java/MDSplus/Connection.java +++ b/java/mdsobjects/src/main/java/MDSplus/Connection.java @@ -96,21 +96,55 @@ public Data get(java.lang.String expr, Data args[]) throws MdsException { if (!checkArgs(args)) throw new MdsException( - "Invalid arguments: only scalars and arrays arguments can be passed to COnnection.get()"); - return get(sockId, expr, args); + "Invalid arguments: only scalars and arrays arguments can be passed to Connection.get()"); + java.lang.String expandedExpr; + if(expr.equals("$")) + { + expandedExpr = "serializeout(`("+expr+"))"; + } + else + { + expandedExpr = "serializeout(`(data(("+expr+"))))"; + } + Data serData = get(sockId, expandedExpr, args); + return Data.deserialize(serData.getByteArray()); + } public Data get(java.lang.String expr) throws MdsException { - return get(expr, new Data[0]); + java.lang.String expandedExpr = "serializeout(`(data(("+expr+"))))"; + Data serData = get(sockId, expandedExpr, new Data[0]); + if(serData instanceof Array) + return Data.deserialize(serData.getByteArray()); + else //error code + return serData; } - public void put(java.lang.String path, java.lang.String expr, Data args[]) throws MdsException + public void put(java.lang.String path, java.lang.String expr, Data inArgs[]) throws MdsException { + Data args[] = new Data[inArgs.length]; + //Check if any passed argument is Apd + boolean serialized = false; + for(int i = 0; i < inArgs.length; i++) + { + if(inArgs[i] instanceof Apd) + { + serialized = true; + } + } + + for(int i = 0; i < inArgs.length; i++) + { + if(serialized) + args[i] = new Uint8Array(inArgs[i].serialize()); + else + args[i] = inArgs[i]; + } if (!checkArgs(args)) throw new MdsException( "Invalid arguments: only scalars and arrays arguments can be passed to COnnection.put()"); - put(sockId, path, expr, args); + put(sockId, path, expr, args, serialized); } public void put(java.lang.String path, java.lang.String expr) throws MdsException @@ -136,7 +170,7 @@ public void put(java.lang.String path, Data data) throws MdsException public native Data get(int sockId, java.lang.String expr, Data args[]) throws MdsException; - public native void put(int sockId, java.lang.String path, java.lang.String expr, Data args[]) throws MdsException; + public native void put(int sockId, java.lang.String path, java.lang.String expr, Data args[], boolean serialized) throws MdsException; public GetMany getMany() { return new GetManyInConnection(); } @@ -145,7 +179,19 @@ public PutMany putMany() { return new PutManyInConnection(); } - + public static void main(java.lang.String args[]) + { + try { + + MDSplus.Connection c = new MDSplus.Connection("localhost:8001"); + c.openTree("test", -1); + System.out.println(c.get("anyapd")); + }catch(Exception exc) + { + System.out.println(exc); + } + } + ////////// GetMany class GetManyInConnection extends List implements GetMany { @@ -288,5 +334,7 @@ public void checkStatus(java.lang.String path) throws MdsException throw new MdsException(retMsg.getString()); } } + + } diff --git a/java/mdsobjects/src/main/java/MDSplus/Data.java b/java/mdsobjects/src/main/java/MDSplus/Data.java index 9a8ab19b85..1292811f15 100644 --- a/java/mdsobjects/src/main/java/MDSplus/Data.java +++ b/java/mdsobjects/src/main/java/MDSplus/Data.java @@ -453,10 +453,12 @@ public java.lang.String[] getStringArray() throws MdsException return data.getStringArray(); } - public int getSize() + public int getSize() throws MdsException { - final Data data = data(); - return data.getSize(); + final Data data = executeWithContext("SIZE($1)", this); + if (!(data instanceof Int32)) + throw new MdsException("Cannot get data size"); + return data.getInt(); } public int getSizeInBytes() diff --git a/java/mdsobjects/src/main/java/MDSplus/List.java b/java/mdsobjects/src/main/java/MDSplus/List.java index 437191383e..69f5e9fa4e 100644 --- a/java/mdsobjects/src/main/java/MDSplus/List.java +++ b/java/mdsobjects/src/main/java/MDSplus/List.java @@ -10,6 +10,7 @@ public List() public List(Data[] descs) { super(descs, null, null, null, null); + dtype = DTYPE_LIST; } public List(Data[] descs, Data help, Data units, Data error, Data validation) diff --git a/javamds/MDSplus_Connection.h b/javamds/MDSplus_Connection.h index 55a6905648..9e955d7864 100644 --- a/javamds/MDSplus_Connection.h +++ b/javamds/MDSplus_Connection.h @@ -63,7 +63,7 @@ extern "C" */ JNIEXPORT void JNICALL Java_MDSplus_Connection_put(JNIEnv *, jobject, jint, jstring, jstring, - jobjectArray); + jobjectArray, jboolean); #ifdef __cplusplus } diff --git a/javamds/mdsobjects.c b/javamds/mdsobjects.c index 61a2390af8..8cf411be12 100644 --- a/javamds/mdsobjects.c +++ b/javamds/mdsobjects.c @@ -3909,7 +3909,7 @@ Java_MDSplus_Connection_get(JNIEnv *env, jobject obj __attribute__((unused)), */ JNIEXPORT void JNICALL Java_MDSplus_Connection_put( JNIEnv *env, jobject obj __attribute__((unused)), jint sockId, - jstring jPath, jstring jExpr, jobjectArray jArgs) + jstring jPath, jstring jExpr, jobjectArray jArgs, jboolean serialized) { const char *expr = (*env)->GetStringUTFChars(env, jExpr, 0); const char *inPath = (*env)->GetStringUTFChars(env, jPath, 0); @@ -3936,12 +3936,25 @@ JNIEXPORT void JNICALL Java_MDSplus_Connection_put( else strcpy(path, inPath); + if(serialized) + { + putExpr = malloc(strlen("TreePutDeserialized(") + strlen(expr) + strlen(path) + 5 + + nArgs * 2 + 2); + if (nArgs > 0) + sprintf(putExpr, "TreePutDeserialized(\'%s\',\'%s\',", path, expr); + else + sprintf(putExpr, "TreePutDeserialized(\'%s\',\'%s\'", path, expr); + } + else + { putExpr = malloc(strlen("TreePut(") + strlen(expr) + strlen(path) + 5 + nArgs * 2 + 2); if (nArgs > 0) sprintf(putExpr, "TreePut(\'%s\',\'%s\',", path, expr); else sprintf(putExpr, "TreePut(\'%s\',\'%s\'", path, expr); + + } for (varIdx = 0; varIdx < nArgs; varIdx++) { if (varIdx < nArgs - 1) diff --git a/matlab/mdsput.m b/matlab/mdsput.m index 5d03c05d55..31cb3d7ce8 100755 --- a/matlab/mdsput.m +++ b/matlab/mdsput.m @@ -1,5 +1,51 @@ function [ status ] = mdsput( node, expression, varargin) % MDSPUT put data into MDSplus tree node -% This routine invokes treeput(node, expression, ...) -status = mdsvalue(sprintf('treeput($, $%s)', repmat(', $', 1, nargin - 2)), node, expression, varargin{:}); +% This routine uses the java or python interface +info = mdsInfo(); +n = nargin - 2; +if info.usePython + args = cell(n, 1); +else + if info.isConnected + extra = 0; + else + extra = 1; + end + args = javaArray('MDSplus.Data', max(1, n + extra)); +end +for k = 1 : n + argin = varargin(k); + if iscell(argin{1}) + argout = mdsFromMatlab(argin{1}); + else + argout = mdsFromMatlab(cell2mat(argin)); + end + if info.usePython + args{k} = argout; + else + args(k) = argout; + end +end +try + if info.isConnected + if n > 0 + if info.usePython + info.connection.put(node, expression, args{:}); + else + info.connection.put(node, expression, args); + end + else + info.connection.put(node, expression); + end + else + [mdsres, mdsok] = mdsvalue(sprintf('treeput($, $%s)', repmat(', $', 1, nargin - 2)), node, expression, varargin{:}); + if mdsok==0 || ~isnumeric(mdsres) || rem(mdsres,2)==0 + throw(MException('MDSplus:treeput', 'treeput error %d: %s', mdsok, string(mdsres))); + end + end + status = 1; +catch err + status = 0; + error(err.message); +end diff --git a/matlab/private/javaFromMatlab.m b/matlab/private/javaFromMatlab.m index 510428e09d..6cd58c642d 100644 --- a/matlab/private/javaFromMatlab.m +++ b/matlab/private/javaFromMatlab.m @@ -21,7 +21,8 @@ case 'uint8' javaclass = 'MDSplus.Uint8'; case 'cell' - javaclass = 'MDSplus.String'; + result = javaFromMatlabCell(value); + return case 'struct' result = javaFromMatlabStruct(value); return @@ -31,11 +32,10 @@ result = javaObject('MDSplus.String', value); return otherwise - result = value; - return + throw(MException('MDSplus:javaFromMatlab', 'Unsupported type')) end sz = size(value); -if isequal(sz, [1, 1]) +if isscalar(value) result = javaObject(javaclass, value); else result = javaObject(strcat(javaclass, 'Array'), reshape(value, [], 1), sz); diff --git a/matlab/private/javaFromMatlabCell.m b/matlab/private/javaFromMatlabCell.m new file mode 100644 index 0000000000..b486acd2dd --- /dev/null +++ b/matlab/private/javaFromMatlabCell.m @@ -0,0 +1,33 @@ +function result = javaFromMatlabCell(value) + if ~iscell(value) + throw(MException('MDSplus:javaFromMatlabCell', 'only cell allowed')); + end + result = MDSplus.Apd(); + if isscalar(value) + result.setDescAt(0, javaFromMatlab(value{:})); + elseif isvector(value) + numItems = length(value); + for itemIdx = 1:numItems + if isrow(value) + result.setDescAt(itemIdx - 1, javaFromMatlab(value{itemIdx})); + else + result.setDescAt(itemIdx - 1, javaFromMatlab({value{itemIdx}})); + end + end + elseif ismatrix(value) + elemSize = size(value); + for rowIdx = 1:elemSize(1) + result.setDescAt(rowIdx - 1, javaFromMatlab(value(rowIdx,:))); + end + else + elemSize = size(value); + n = ndims(value); + idx = cell(1,n); + idx(:) = {':'}; + for currDim = 1:elemSize(end) + idx{end} = currDim; + result.setDescAt(currDim - 1, javaFromMatlab(value(idx{:}))); + end + end + +end \ No newline at end of file diff --git a/matlab/private/javaFromMatlabStruct.m b/matlab/private/javaFromMatlabStruct.m index 12ab9a93c8..e1ba6dbcf3 100644 --- a/matlab/private/javaFromMatlabStruct.m +++ b/matlab/private/javaFromMatlabStruct.m @@ -1,5 +1,5 @@ function result = javaFromMatlabStruct(value) - if ~strcmp(class(value), 'struct') + if ~isstruct(value) throw(MException('MDSplus:javaFromMatlabStruct', 'only struct allowed')); end @@ -9,16 +9,36 @@ for fieldIdx = 1:length(fields) fieldName = fields{fieldIdx}; fieldValue = value.(fieldName); - javaFromMatlab(fieldValue); result.setItem(MDSplus.String(fieldName), javaFromMatlab(fieldValue)); end - else - result = MDSplus.Apd(); + elseif isvector(value) + result = MDSplus.List(); numItems = length(value); for itemIdx = 1:numItems - result.setDescAt(itemIdx - 1, javaFromMatlab(value(itemIdx))); + if isrow(value) + result.append(javaFromMatlabStruct(value(itemIdx))); + else + temp = MDSplus.List(); + temp.append(javaFromMatlabStruct(value(itemIdx))); + result.append(temp); + end + end + elseif ismatrix(value) + result = MDSplus.List(); + elemSize = size(value); + for rowIdx = 1:elemSize(1) + result.append(javaFromMatlabStruct(value(rowIdx,:))); + end + else + result = MDSplus.List(); + elemSize = size(value); + n = ndims(value); + idx = cell(1,n); + idx(:) = {':'}; + for currDim = 1:elemSize(end) + idx{end} = currDim; + result.append(javaFromMatlab(value(idx{:}))); end - end end \ No newline at end of file diff --git a/matlab/private/javaToMatlab.m b/matlab/private/javaToMatlab.m index 8915ca5a5a..a55cbd78eb 100644 --- a/matlab/private/javaToMatlab.m +++ b/matlab/private/javaToMatlab.m @@ -31,11 +31,13 @@ case 'MDSplus.Float32Array' result = reshape(mdsthing.getFloatArray, shape); case 'MDSplus.StringArray' - result = reshape(cellstr(string(mdsthing.getStringArray)), shape); + result = reshape(string(mdsthing.getStringArray), shape); case 'MDSplus.Dictionary' result = javaToMatlabStruct(mdsthing); - case 'MDSplus.Apd' + case 'MDSplus.List' result = javaToMatlabStruct(mdsthing); + case 'MDSplus.Apd' + result = javaToMatlabCell(mdsthing); otherwise throw(MException('MDSplus:mdsToMatlab', 'class %s not supported by mdsToMatlab function\n', class(mdsthing))); end diff --git a/matlab/private/javaToMatlabCell.m b/matlab/private/javaToMatlabCell.m new file mode 100755 index 0000000000..39e110dec0 --- /dev/null +++ b/matlab/private/javaToMatlabCell.m @@ -0,0 +1,32 @@ +function result = javaToMatlabCell(value) + if ~isa(value, 'MDSplus.Apd') + throw(MException('MDSplus:javaToMatlabCell', 'only MDSplus.Apd allowed')); + end + fields = value.getDescs(); + numItems = length(fields); + itemClasses = arrayfun(@class, fields, 'UniformOutput', false); + result = {}; + for itemIdx = 1:numItems + currElem = javaToMatlab(fields(itemIdx)); + if all(string(itemClasses)=='MDSplus.Apd') && numItems ~= 1 + + % build the index + if isscalar(currElem) || isvector(currElem) + numDims = 2; + else + numDims = ndims(currElem) + 1; + end + idx = cell(1, numDims); + idx(:) = {':'}; + if isscalar(currElem) || isvector(currElem) + idx{1} = itemIdx; + else + idx{end} = itemIdx; + end + + result(idx{:}) = currElem; + else + result(:, itemIdx) = {currElem}; + end + end +end \ No newline at end of file diff --git a/matlab/private/javaToMatlabStruct.m b/matlab/private/javaToMatlabStruct.m index a09ad98dfb..5e8665676f 100644 --- a/matlab/private/javaToMatlabStruct.m +++ b/matlab/private/javaToMatlabStruct.m @@ -1,21 +1,45 @@ function result = javaToMatlabStruct(value) - if ~strcmp(class(value), 'MDSplus.Dictionary') && ~strcmp(class(value), 'MDSplus.Apd') - throw(MException('MDSplus:javaToMatlabStruct', 'only MDSplus.Dictionary or MDSplus.Apd allowed')); - end - fields = value.getDescs(); - if strcmp(class(value), 'MDSplus.Dictionary') - numItems = length(fields)/2; - for itemIdx = 1:numItems - fieldName = javaToMatlab(fields(itemIdx * 2 - 1)); - fieldValue = javaToMatlab(fields(itemIdx * 2)); - result.(fieldName) = fieldValue; - end - else - numItems = length(fields); - for itemIdx = 1:numItems - result(itemIdx) = javaToMatlab(fields(itemIdx)); - end - - end - + if ~isa(value, 'MDSplus.Dictionary') && ~isa(value, 'MDSplus.List') + throw(MException('MDSplus:javaToMatlabStruct', 'only MDSplus.Dictionary and MDSplus.List allowed')); + end + fields = value.getDescs(); + if value.getSize() == 0 + result = struct(); + end + if isa(value, 'MDSplus.Dictionary') % structure + numItems = length(fields)/2; + for itemIdx = 1:numItems + fieldName = javaToMatlab(fields(itemIdx * 2 - 1)); + fieldValue = javaToMatlab(fields(itemIdx * 2)); + result.(fieldName) = fieldValue; + end + else + numItems = length(fields); + itemClasses = arrayfun(@class, fields, 'UniformOutput', false); + for itemIdx =1:numItems + if all(string(itemClasses)=='MDSplus.Dictionary') % list of dict mapped to struct array + result(itemIdx) = javaToMatlabStruct(fields(itemIdx)); + elseif all(string(itemClasses)=='MDSplus.List') % struct matrix + currElem = javaToMatlab(fields(itemIdx)); + + % build the index + if isscalar(currElem) || isvector(currElem) + numDims = 2; + else + numDims = ndims(currElem) + 1; + end + idx = cell(1, numDims); + idx(:) = {':'}; + if isscalar(currElem) || isvector(currElem) + idx{1} = itemIdx; + else + idx{end} = itemIdx; + end + + result(idx{:}) = currElem; + else + throw(MException('MDSplus:javaToMatlabStruct', 'incompatible types')); + end + end + end end \ No newline at end of file