/*
* Copyright 2003-2014 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 jetbrains.mps.smodel.adapter;
import jetbrains.mps.smodel.adapter.ids.MetaIdFactory;
import jetbrains.mps.smodel.adapter.structure.concept.SConceptAdapterById;
import jetbrains.mps.smodel.adapter.structure.concept.SInterfaceConceptAdapterById;
import jetbrains.mps.smodel.adapter.structure.link.SContainmentLinkAdapterById;
import jetbrains.mps.smodel.adapter.structure.property.SPropertyAdapterById;
import jetbrains.mps.smodel.adapter.structure.ref.SReferenceLinkAdapterById;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.language.SConcept;
import org.jetbrains.mps.openapi.language.SContainmentLink;
import org.jetbrains.mps.openapi.language.SInterfaceConcept;
import org.jetbrains.mps.openapi.language.SProperty;
import org.jetbrains.mps.openapi.language.SReferenceLink;
/**
* Counterpart for {@link jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory} which creates meta-objects tuned for bootstrap purposes.
*
* NOTE. THIS IS INTERNAL API AND SHALL NOT BE USED DIRECTLY FROM USER'S CODE.
*
* <h3>BOOTSTRAP META OBJECTS</h3>
* Bootstrap attribute indicates whether we can rely on regular MPS infrastructure to find out details about the meta object or not.
* Without generated classes for meta object (i.e. concept, property, link) descriptors, we face interpreted descriptors, and as long as we describe our
* concepts using themselves (e.g. BaseConcept and ConceptDeclaration, what we refer to as 'bootstrap' here), we need to tell certain meta objects
* shall not behave like others. Ultimate example is an attempt to find out name of <code>INamedConcept</code>, which keeps its name in the property
* <code>INamedConcept.name</code>, where we shall not use anything but values already known (i.e. can't go to ConceptRegistry to find concept and
* property descriptors as they are right in the process of being initialized).
* <p/>
* For the time being, it's only name which is guarded from going to ConceptRegistry. Consider the example with INamedConcept. An attempt to read name of
* INamedConcept node triggers propertyRead notification, which requires SProperty.getName(), and without bootstrap flag, we would go to find property
* descriptor, and then trigger sequence of unrelated load attempts that in turn would need INamedConcept.name.
* <p/>
* Generally, bootstrap meta objects shall not be used, thus we keep them separate from the rest of meta objects. Don't use them unless there's
* bootstrap dependency you're sure is indeed bootstrap one.
* <p/>
* Note, we do not cache these objects as there should be few of them and they are likely get reused anyway (e.g. as static field in SNodeUtil).
* If not re-used, why would they be declared bootstrap, after all?
*
* @author Artem Tikhomirov
*/
public class BootstrapAdapterFactory {
@NotNull
public static SConcept getConcept(long uuidHigh, long uuidLow, long concept, String conceptName) {
return new SConceptAdapterById(MetaIdFactory.conceptId(uuidHigh, uuidLow, concept), conceptName, true);
}
@NotNull
public static SInterfaceConcept getInterface(long uuidHigh, long uuidLow, long concept, String conceptName) {
return new SInterfaceConceptAdapterById(MetaIdFactory.conceptId(uuidHigh, uuidLow, concept), conceptName, true);
}
@NotNull
public static SProperty getProperty(long uuidHigh, long uuidLow, long concept, long prop, String propName) {
return new SPropertyAdapterById(MetaIdFactory.propId(uuidHigh, uuidLow, concept, prop), propName, true);
}
@NotNull
public static SReferenceLink getReferenceLink(long uuidHigh, long uuidLow, long concept, long ref, String refName) {
return new SReferenceLinkAdapterById(MetaIdFactory.refId(uuidHigh, uuidLow, concept, ref), refName, true);
}
@NotNull
public static SContainmentLink getContainmentLink(long uuidHigh, long uuidLow, long concept, long link, String linkName) {
return new SContainmentLinkAdapterById(MetaIdFactory.linkId(uuidHigh, uuidLow, concept, link), linkName, true);
}
}