NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
My project is a client/server model that uses RMI to communicate across the network. The server returns a FlatField to the client generated from a netcdf file using Plain().open: public FlatField GetSOM(String stem) throws VisADException, IOException { Plain plain=new Plain(); String filename=GenerateNetcdf(stem); FlatField netcdf_data=(FlatField) plain.open(filename+".nc"); Process shell=Runtime.getRuntime().exec("/bin/rm -f "+filename+".nc"); return(netcdf_data); } However, I wanted to get rid of the dependance on netcdf because it requires I use ncgen to convert my CDL to a netcdf file which consequently makes it less portable. The replacement code is below. Now, if I call the server more than once it generates the exception: visad.TypeException: ScalarType: name already used at this line RealType X=new RealType("X",null,null); I need the name to be "X" because I use axis labels. I cannot figure out how to get around this problem. How can I fix the following method so one or more clients can call it repeatedly without generating this exception? Why does this work just fine if I use the above netcdf code? public FlatField GetSOM(String stem) throws VisADException, IOException { // construct a MathType ((X, Y) -> documents) RealType X=new RealType("X",null,null); RealType Y=new RealType("Y",null,null); RealTupleType XY=new RealTupleType(new RealType[] {X,Y}); RealType Documents=new RealType("documents",null,null); FunctionType field_type=new FunctionType(XY,Documents); Process shell=Runtime.getRuntime().exec("equinox get-som "+stem); BufferedReader in new BufferedReader(new InputStreamReader(shell.getInputStream())); StringTokenizer tokenstream=new StringTokenizer(in.readLine()," "); int width=Integer.parseInt(tokenstream.nextToken()); int height=Integer.parseInt(tokenstream.nextToken()); Integer2DSet domain_set=new Integer2DSet(width,height); FlatField field=new FlatField(field_type,domain_set); float[][] data=new float[1][width*height]; for (int i=0; i < (width*height); i++) { tokenstream=new StringTokenizer(in.readLine()," "); int x=Integer.parseInt(tokenstream.nextToken()); int y=Integer.parseInt(tokenstream.nextToken()); int z=Integer.parseInt(tokenstream.nextToken()); data[0][x+y*width]=z; } in.close(); field.setSamples(data); return(field); } As soon as I resolve this problem, I will making this application available on the Net so others can benefit from my efforts.
visad
archives: