/*
* Copyright 2003-2016 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.persistence.def.v9;
import jetbrains.mps.persistence.IndexAwareModelFactory.Callback;
import jetbrains.mps.persistence.MetaModelInfoProvider;
import jetbrains.mps.persistence.MetaModelInfoProvider.BaseMetaModelInfo;
import jetbrains.mps.persistence.MetaModelInfoProvider.RegularMetaModelInfo;
import jetbrains.mps.persistence.MetaModelInfoProvider.StuffedMetaModelInfo;
import jetbrains.mps.persistence.xml.XMLPersistence;
import jetbrains.mps.smodel.SModelHeader;
import jetbrains.mps.smodel.loading.ModelLoadResult;
import jetbrains.mps.smodel.loading.ModelLoadingState;
import jetbrains.mps.smodel.persistence.def.IHashProvider;
import jetbrains.mps.smodel.persistence.def.IModelPersistence;
import jetbrains.mps.smodel.persistence.def.IModelWriter;
import jetbrains.mps.smodel.persistence.def.ModelPersistence;
import jetbrains.mps.smodel.persistence.lines.LineContent;
import jetbrains.mps.util.xml.XMLSAXHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class ModelPersistence9 implements IModelPersistence, XMLPersistence {
// per-root
public static final String FILE_CONTENT = "content";
// elements
public static final String MODEL = ModelPersistence.MODEL;
public static final String MODEL_ATTRIBUTE = "attribute";
public static final String MODEL_PERSISTENCE = ModelPersistence.PERSISTENCE;
public static final String NODE = "node";
public static final String NODE_PROPERTY = "property";
public static final String NODE_REFERENCE = "ref";
public static final String LANGUAGES = "languages";
public static final String USED_LANGUAGE = "use";
public static final String ENGAGE_LANGUAGE = "engage";
public static final String DEVKIT = "devkit";
public static final String IMPORTS = "imports";
public static final String IMPORT = "import";
public static final String REGISTRY = "registry";
public static final String REGISTRY_LANGUAGE = "language";
public static final String REGISTRY_CONCEPT = "concept";
public static final String REGISTRY_PROPERTY = "property";
public static final String REGISTRY_ASSOCIATION = "reference";
public static final String REGISTRY_AGGREGATION = "child";
// attributes
public static final String REF = ModelPersistence.REF;
public static final String ID = "id";
public static final String NAME = "name";
public static final String VALUE = "value";
public static final String INDEX = "index";
public static final String FLAGS = "flags";
public static final String UNORDERED = "unordered";
public static final String TO = "to";
public static final String RESOLVE = "resolve";
public static final String CONCEPT_ID = "concept";
public static final String ROLE_ID = "role";
public static final String VERSION = "version";
public static final String IMPLICIT = "implicit";
public static final String STUB = "stub";
@Override
public int getVersion() {
return 9;
}
@Override
public IModelWriter getModelWriter(@Nullable SModelHeader header) {
final MetaModelInfoProvider mmiProvider;
if (header != null && header.getMetaInfoProvider() != null) {
mmiProvider = header.getMetaInfoProvider();
} else {
mmiProvider = new RegularMetaModelInfo(header == null ? null : header.getModelReference());
}
return new ModelWriter9(mmiProvider);
}
@Override
public IHashProvider getHashProvider() {
return new HashProvider9();
}
@Override
public XMLSAXHandler<ModelLoadResult> getModelReaderHandler(ModelLoadingState state, SModelHeader header) {
final boolean interfaceOnly = state == ModelLoadingState.INTERFACE_LOADED;
final boolean stripImplementation = state == ModelLoadingState.NO_IMPLEMENTATION;
MetaModelInfoProvider mmiProvider = header.getMetaInfoProvider();
if (mmiProvider == null) {
mmiProvider = new RegularMetaModelInfo(header.getModelReference());
}
IdInfoReadHelper readHelper = new IdInfoReadHelper(mmiProvider, interfaceOnly, stripImplementation);
return new ModelReader9Handler(header, readHelper);
}
@Override
public XMLSAXHandler<List<LineContent>> getLineToContentMapReaderHandler() {
// for annotation purposes, we don't need to publish meta-model or to query outer world, information from model file should be sufficient
MetaModelInfoProvider mmiProvider = new StuffedMetaModelInfo(new BaseMetaModelInfo());
IdInfoReadHelper readHelper = new IdInfoReadHelper(mmiProvider, true, true);
return new AnnotationInfoReader9Handler(readHelper);
}
@Override
public Indexer getIndexSupport(@NotNull Callback callback) {
return new Indexer9(callback);
}
}