/*
* 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.idea.core.module;
import jetbrains.mps.extapi.persistence.FileBasedModelRoot;
import jetbrains.mps.extapi.persistence.FolderModelRootBase;
import jetbrains.mps.library.ModulesMiner;
import jetbrains.mps.library.ModulesMiner.ModuleHandle;
import jetbrains.mps.util.io.ModelInputStream;
import jetbrains.mps.util.io.ModelOutputStream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.persistence.ModelRoot;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
/**
* evgeny, 12/12/12
*/
public class CachedModuleData {
private ModuleHandle myHandle;
private Map<String, List<CachedModelData>> myModels;
public CachedModuleData(@NotNull ModuleHandle handle, @NotNull Map<String, List<CachedModelData>> models) {
myHandle = handle;
myModels = models;
}
public ModuleHandle getHandle() {
return myHandle;
}
public List<CachedModelData> getModels(ModelRoot modelRoot) {
if (modelRoot instanceof FileBasedModelRoot) {
String signature = CachedRepositoryUtil.getSignature((FileBasedModelRoot) modelRoot);
return myModels.get(signature);
} else if (modelRoot instanceof FolderModelRootBase) {
String signature = CachedRepositoryUtil.getSignature((FolderModelRootBase) modelRoot);
return myModels.get(signature);
}
return null;
}
public void save(ModelOutputStream stream) throws IOException {
stream.writeByte(27);
new ModulesMiner().saveHandle(myHandle, stream);
Set<Entry<String, List<CachedModelData>>> entries = myModels.entrySet();
stream.writeInt(entries.size());
for (Entry<String, List<CachedModelData>> entry : entries) {
stream.writeString(entry.getKey());
List<CachedModelData> value = entry.getValue();
stream.writeInt(value.size());
for (CachedModelData model : value) {
model.save(stream);
}
}
stream.writeInt(0x674921);
}
public static CachedModuleData load(ModelInputStream stream) throws IOException {
if (stream.readByte() != 27) throw new IOException("bad stream: no module start marker");
ModuleHandle moduleHandle = new ModulesMiner().loadHandle(stream);
Map<String, List<CachedModelData>> modelsByPath = new HashMap<String, List<CachedModelData>>();
for (int size = stream.readInt(); size > 0; size--) {
String key = stream.readString();
int valueSize = stream.readInt();
List<CachedModelData> models = new ArrayList<CachedModelData>(valueSize);
for (; valueSize > 0; valueSize--) {
models.add(CachedModelData.load(stream));
}
modelsByPath.put(key, models);
}
if (stream.readInt() != 0x674921) throw new IOException("bad stream: no module end marker");
return new CachedModuleData(moduleHandle, modelsByPath);
}
}