/*=============================================================================# # Copyright (c) 2008-2016 Stephan Wahlbrink (WalWare.de) and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the GNU Lesser General Public License # v2.1 which accompanies this distribution, and is available at # http://www.gnu.org/licenses/lgpl.html # # Contributors: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.rj.server.jri; import java.io.IOException; import de.walware.rj.data.RCharacterStore; import de.walware.rj.data.RComplexStore; import de.walware.rj.data.RIntegerStore; import de.walware.rj.data.RJIO; import de.walware.rj.data.RLogicalStore; import de.walware.rj.data.RNumericStore; import de.walware.rj.data.RObject; import de.walware.rj.data.RRawStore; import de.walware.rj.data.RStore; import de.walware.rj.data.defaultImpl.REnvironmentImpl; import de.walware.rj.data.defaultImpl.RFactorDataStruct; import de.walware.rj.data.defaultImpl.RFunctionImpl; import de.walware.rj.data.defaultImpl.RMissing; import de.walware.rj.data.defaultImpl.RNull; import de.walware.rj.data.defaultImpl.RObjectFactoryImpl; import de.walware.rj.data.defaultImpl.ROtherImpl; import de.walware.rj.data.defaultImpl.RPromise; import de.walware.rj.data.defaultImpl.RReferenceImpl; import de.walware.rj.data.defaultImpl.RS4ObjectImpl; import de.walware.rj.data.defaultImpl.RVectorImpl; public class JRIObjectFactory extends RObjectFactoryImpl { @Override public RLogicalStore createLogiData(final boolean[] logiValues) { return new JRILogicalDataImpl(logiValues); } @Override public RIntegerStore createIntData(final int[] intValues) { return new JRIIntegerDataImpl(intValues); } @Override public RNumericStore createNumData(final double[] numValues) { return new JRINumericDataImpl(numValues); } @Override public RComplexStore createCplxData(final double[] reValues, final double[] imValues) { return new JRIComplexDataShortImpl(reValues, imValues); } @Override public RCharacterStore createCharData(final String[] charValues) { return new JRICharacterDataImpl(charValues); } @Override public RRawStore createRawData(final byte[] rawValues) { return new JRIRawDataImpl(rawValues); } @Override public RObject readObject(final RJIO io) throws IOException { final byte type = io.readByte(); int options; switch (type) { case -1: return null; case RObject.TYPE_NULL: return RNull.INSTANCE; case RObject.TYPE_VECTOR: { return new RVectorImpl(io, this); } case RObject.TYPE_ARRAY: return new JRIArrayImpl(io, this); case RObject.TYPE_LIST: options = io.readInt(); return new JRIListImpl(io, this, options); case RObject.TYPE_DATAFRAME: return new JRIDataFrameImpl(io, this); case RObject.TYPE_ENV: return new REnvironmentImpl(io, this); case RObject.TYPE_LANGUAGE: return new JRILanguageImpl(io, this); case RObject.TYPE_FUNCTION: return new RFunctionImpl(io, this); case RObject.TYPE_REFERENCE: return new RReferenceImpl(io, this); case RObject.TYPE_S4OBJECT: return new RS4ObjectImpl(io, this); case RObject.TYPE_OTHER: return new ROtherImpl(io, this); case RObject.TYPE_MISSING: return RMissing.INSTANCE; case RObject.TYPE_PROMISE: return RPromise.INSTANCE; default: throw new IOException("object type = " + type); } } @Override public RStore<?> readStore(final RJIO io, final long length) throws IOException { if ((io.flags & F_ONLY_STRUCT) == 0) { final byte storeType = io.readByte(); switch (storeType) { case RStore.LOGICAL: return new JRILogicalDataImpl(io, (int) length); case RStore.INTEGER: return new JRIIntegerDataImpl(io, (int) length); case RStore.NUMERIC: return new JRINumericDataImpl(io, (int) length); case RStore.COMPLEX: return new JRIComplexDataShortImpl(io, (int)length); case RStore.CHARACTER: return new JRICharacterDataImpl(io, (int) length); case RStore.RAW: return new JRIRawDataImpl(io, (int) length); case RStore.FACTOR: return new JRIFactorDataImpl(io, (int) length); default: throw new IOException("store type = " + storeType); } } else { final byte storeType = io.readByte(); switch (storeType) { case RStore.LOGICAL: return LOGI_STRUCT_DUMMY; case RStore.INTEGER: return INT_STRUCT_DUMMY; case RStore.NUMERIC: return NUM_STRUCT_DUMMY; case RStore.COMPLEX: return CPLX_STRUCT_DUMMY; case RStore.CHARACTER: return CHR_STRUCT_DUMMY; case RStore.RAW: return RAW_STRUCT_DUMMY; case RStore.FACTOR: return new RFactorDataStruct(io.readBoolean(), io.readInt()); default: throw new IOException("store type = " + storeType); } } } @Override public RStore<?> readNames(final RJIO io, final long length) throws IOException { final byte type = io.readByte(); if (type == RStore.CHARACTER) { return new JRICharacterDataImpl(io, (int) length); } if (type == 0) { return null; } throw new IOException(); } }