/*******************************************************************************
* Copyright (c) 2017 Association for Decentralized Information Management in
* Industry THTH ry.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VTT Technical Research Centre of Finland - initial API and implementation
* Semantum Oy - #7313
*******************************************************************************/
package org.simantics.charts.internal;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.simantics.databoard.type.Datatype;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.layer0.request.PossibleActiveVariableFromVariable;
import org.simantics.db.layer0.variable.RVI;
import org.simantics.db.layer0.variable.Variable;
import org.simantics.db.layer0.variable.VariableReference;
import org.simantics.db.layer0.variable.Variables;
import org.simantics.modeling.utils.VariableReferences;
/**
* @author Tuukka Lehtonen
* @since 1.28.1, 1.29.0
*/
public class VariableUtils {
public static Datatype getDatatype(ReadGraph graph, Resource resource, RVI rvi) throws DatabaseException {
Variable configuration = Variables.getConfigurationContext(graph, resource);
Variable active = graph.syncRequest(new PossibleActiveVariableFromVariable(configuration));
Variable var = rvi.resolve(graph, active != null ? active : configuration);
return var.getDatatype(graph);
}
/**
* @param graph
* @param targetModel
* @param source
* @return null
if the value is valid JSON but does not contain
* a variable reference
* @throws DatabaseException
* if the value fails to resolve as either JSON or an RVI string
*/
public static List getVariableReferencesFromString(ReadGraph graph, Resource targetModel, String source) throws DatabaseException {
try {
// JSON ?
Optional v = JsonUtils.tryParseJsonPropertyVariable(graph, source);
if (v.isPresent())
return graph.syncRequest(VariableReferences.variablesToReferences(targetModel, Collections.singletonList(v.get())));
// JSON, but no variable info in it.
return null;
} catch (DatabaseException e) {
// RVI as String?
RVI rvi = RVI.fromResourceFormat(graph, source);
return Collections.singletonList(new VariableReference(rvi, getDatatype(graph, targetModel, rvi), null));
}
}
}