blob: dc07fee151e25cce93306a96b745313f291f664a [file] [log] [blame]
/*
* Copyright 2000-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 com.intellij.openapi.components.impl.stores;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.impl.ProjectManagerImpl;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
abstract class BaseFileConfigurableStoreImpl extends ComponentStoreImpl {
@NonNls protected static final String VERSION_OPTION = "version";
@NonNls public static final String ATTRIBUTE_NAME = "name";
private final ComponentManager myComponentManager;
private static final ArrayList<String> ourConversionProblemsStorage = new ArrayList<String>();
private final DefaultsStateStorage myDefaultsStateStorage;
private StateStorageManager myStateStorageManager;
protected BaseFileConfigurableStoreImpl(final ComponentManager componentManager) {
myComponentManager = componentManager;
final PathMacroManager pathMacroManager = PathMacroManager.getInstance(myComponentManager);
myDefaultsStateStorage = new DefaultsStateStorage(pathMacroManager);
}
public synchronized ComponentManager getComponentManager() {
return myComponentManager;
}
protected static class BaseStorageData extends FileBasedStorage.FileStorageData {
protected int myVersion;
public BaseStorageData(final String rootElementName) {
super(rootElementName);
}
protected BaseStorageData(BaseStorageData storageData) {
super(storageData);
myVersion = ProjectManagerImpl.CURRENT_FORMAT_VERSION;
}
@Override
public void load(@NotNull Element rootElement, @Nullable PathMacroSubstitutor pathMacroSubstitutor, boolean intern) {
super.load(rootElement, pathMacroSubstitutor, intern);
final String v = rootElement.getAttributeValue(VERSION_OPTION);
if (v != null) {
myVersion = Integer.parseInt(v);
}
else {
myVersion = ProjectManagerImpl.CURRENT_FORMAT_VERSION;
}
}
@Override
@NotNull
protected Element save() {
Element root = super.save();
if (root == null) {
root = new Element(myRootElementName);
}
root.setAttribute(VERSION_OPTION, Integer.toString(myVersion));
return root;
}
@Override
public StorageData clone() {
return new BaseStorageData(this);
}
@Override
protected int computeHash() {
int result = super.computeHash();
result = result * 31 + myVersion;
return result;
}
@Override
@Nullable
public Set<String> getDifference(final StorageData storageData, PathMacroSubstitutor substitutor) {
final BaseStorageData data = (BaseStorageData)storageData;
if (myVersion != data.myVersion) return null;
return super.getDifference(storageData, substitutor);
}
}
protected abstract XmlElementStorage getMainStorage();
@Nullable
static ArrayList<String> getConversionProblemsStorage() {
return ourConversionProblemsStorage;
}
@Override
public void load() throws IOException, StateStorageException {
getMainStorageData(); //load it
}
public BaseStorageData getMainStorageData() throws StateStorageException {
return (BaseStorageData)getMainStorage().getStorageData();
}
@Nullable
@Override
protected StateStorage getDefaultsStorage() {
return myDefaultsStateStorage;
}
@NotNull
@Override
public StateStorageManager getStateStorageManager() {
if (myStateStorageManager == null) {
myStateStorageManager = createStateStorageManager();
}
return myStateStorageManager;
}
@NotNull
protected abstract StateStorageManager createStateStorageManager();
}