/* * Copyright 2003-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.mps.openapi.model; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.language.SProperty; import org.jetbrains.mps.openapi.language.SReferenceLink; /** * Access to node "properties" using getters and setters declared in MPS. * This class is in openAPI for MPS to be able to generate openAPI code for smodel language queries. * It's implementation is not in openAPI since we don't want a dependency openAPI->kernel, but still want to access * ConstraintsManager, which is not in openAPI yet. Though the class looks like a util-class for outer user, it * is really contributed by code in MPSCore instantiating it's impl class, which sets myInstance field. This is a * temporary solution - this class should be implemented as a pure util class on the top of openAPI as soon as * LanguageRegistry (or something similar) will be an openAPI class. */ public abstract class SNodeAccessUtil { public static boolean hasProperty(SNode node, SProperty property) { return myInstance.hasPropertyImpl(node, property); } @Deprecated public static boolean hasProperty(SNode node, String name) { return myInstance.hasPropertyImpl(node, name); } public static String getProperty(SNode node, SProperty property) { return myInstance.getPropertyImpl(node, property); } @Deprecated public static String getProperty(SNode node, String name) { return myInstance.getPropertyImpl(node, name); } public static void setProperty(SNode node, SProperty property, String propertyValue) { myInstance.setPropertyImpl(node, property, propertyValue); } @Deprecated public static void setProperty(SNode node, String propertyName, String propertyValue) { myInstance.setPropertyImpl(node, propertyName, propertyValue); } public static void setReferenceTarget(SNode node, SReferenceLink referenceLink, @Nullable SNode target) { myInstance.setReferenceTargetImpl(node, referenceLink, target); } @Deprecated public static void setReferenceTarget(SNode node, String role, @Nullable SNode target) { myInstance.setReferenceTargetImpl(node, role, target); } public static void setReference(SNode node, SReferenceLink referenceLink, @Nullable org.jetbrains.mps.openapi.model.SReference reference) { //todo for symmetry. Not yet used myInstance.setReferenceImpl(node, referenceLink, reference); } @Deprecated public static void setReference(SNode node, String role, @Nullable org.jetbrains.mps.openapi.model.SReference reference) { //todo for symmetry. Not yet used myInstance.setReferenceImpl(node, role, reference); } //-------impl-------- //thread-safety is guaranteed because we access nodes holding protected static volatile SNodeAccessUtil myInstance; /** * Internal use ony. */ public static void setInstance(SNodeAccessUtil instance) { myInstance = instance; } protected abstract boolean hasPropertyImpl(SNode node, SProperty property); protected abstract boolean hasPropertyImpl(SNode node, String name); protected abstract String getPropertyImpl(SNode node, SProperty property); protected abstract String getPropertyImpl(SNode node, String name); protected abstract void setPropertyImpl(SNode node, SProperty property, String propertyValue); protected abstract void setPropertyImpl(SNode node, String propertyName, String propertyValue); protected abstract void setReferenceTargetImpl(SNode node, SReferenceLink referenceLink, SNode target); protected abstract void setReferenceTargetImpl(SNode node, String role, SNode target); protected abstract void setReferenceImpl(SNode node, SReferenceLink referenceLink, SReference reference); protected abstract void setReferenceImpl(SNode node, String role, SReference reference); }