blob: 32c76f3db64ea90752e10a181df2b1c67b91a7ba [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2017, 2019 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.internal.r.debug.core.model;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.jcommons.status.ProgressMonitor;
import org.eclipse.statet.jcommons.status.StatusException;
import org.eclipse.statet.rj.data.RDataUtils;
import org.eclipse.statet.rj.data.RLanguage;
import org.eclipse.statet.rj.data.RObject;
import org.eclipse.statet.rj.data.RObjectFactory;
import org.eclipse.statet.rj.data.UnexpectedRDataException;
import org.eclipse.statet.rj.data.impl.DefaultRObjectFactory;
import org.eclipse.statet.rj.services.FQRObject;
import org.eclipse.statet.rj.services.FQRObjectRef;
import org.eclipse.statet.rj.services.FunctionCall;
import org.eclipse.statet.rj.services.RService;
import org.eclipse.statet.rj.services.util.dataaccess.LazyRStore;
/**
* org.eclipse.statet.rj.services.util.dataaccess.AbstractRDataAdapter<TRObject, TFragmentObject>
* for simple objects
*/
@NonNullByDefault
public class RObjectAdapter<TRObject extends RObject> {
// org.eclipse.statet.rj.services.util.dataaccess
protected static final String API_R_PREFIX= "rj:::sda002"; //$NON-NLS-1$
protected static void addXRef(final FunctionCall fcall, final FQRObjectRef ref) {
fcall.add("x.env", ref.getEnv()); //$NON-NLS-1$
fcall.add("x.expr", DefaultRObjectFactory.INSTANCE.createExpression( //$NON-NLS-1$
"x.env$" + ((RLanguage) ref.getName()).getSource() )); //$NON-NLS-1$
}
// ----
private final byte objectType;
public RObjectAdapter(final byte objectType) {
this.objectType= objectType;
}
public TRObject loadObject(final FQRObjectRef ref, final RObject referenceObject,
final LazyRStore.Fragment<TRObject> fragment,
final RService r,
final ProgressMonitor m) throws StatusException, UnexpectedRDataException {
final RObject object;
if (((RLanguage) ref.getName()).getLanguageType() == RLanguage.NAME) {
final FQRObject fqrObject= r.findData(((RLanguage) ref.getName()).getSource(),
ref.getEnv(), false,
null, getLoadOptions(), RService.DEPTH_INFINITE,
m );
object= (fqrObject != null) ? fqrObject.getObject() : null;
}
else {
final FunctionCall fcall= r.createFunctionCall(getLoadObjectFName());
addXRef(fcall, ref);
object= fcall.evalData(null, getLoadOptions(), RService.DEPTH_INFINITE,
m );
}
return validateObject(object, referenceObject, fragment);
}
protected String getLoadObjectFName() {
return API_R_PREFIX + ".getObject"; //$NON-NLS-1$
}
protected int getLoadOptions() {
return RObjectFactory.F_WITH_DBG;
}
protected TRObject validateObject(final @Nullable RObject rObject, final RObject referenceObject,
final LazyRStore.Fragment<TRObject> fragment)
throws UnexpectedRDataException {
return (TRObject) RDataUtils.checkType(rObject, this.objectType);
}
}