blob: bf03cb11f1d63bce88ecc4bfcd386a36b568c945 [file] [log] [blame]
/*
* Copyright 2000-2013 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.application.options.PathMacrosImpl;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.impl.ApplicationImpl;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.NamedJDOMExternalizable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
class ApplicationStoreImpl extends ComponentStoreImpl implements IApplicationStore {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.components.impl.stores.ApplicationStoreImpl");
private static final String XML_EXTENSION = ".xml";
private static final String DEFAULT_STORAGE_SPEC = StoragePathMacros.APP_CONFIG + "/" + PathManager.DEFAULT_OPTIONS_FILE_NAME + XML_EXTENSION;
private static final String ROOT_ELEMENT_NAME = "application";
private final ApplicationImpl myApplication;
private final StateStorageManager myStateStorageManager;
private final DefaultsStateStorage myDefaultsStateStorage;
private String myConfigPath;
// created from PicoContainer
@SuppressWarnings({"UnusedDeclaration"})
public ApplicationStoreImpl(final ApplicationImpl application, PathMacroManager pathMacroManager) {
myApplication = application;
myStateStorageManager = new StateStorageManagerImpl(pathMacroManager.createTrackingSubstitutor(), ROOT_ELEMENT_NAME, application, application.getPicoContainer()) {
@Override
protected StorageData createStorageData(String storageSpec) {
return new FileBasedStorage.FileStorageData(ROOT_ELEMENT_NAME);
}
@Nullable
@Override
protected String getOldStorageSpec(Object component, final String componentName, final StateStorageOperation operation) {
if (component instanceof NamedJDOMExternalizable) {
return StoragePathMacros.APP_CONFIG + "/" + ((NamedJDOMExternalizable)component).getExternalFileName() + XML_EXTENSION;
}
else {
return DEFAULT_STORAGE_SPEC;
}
}
@Override
protected String getVersionsFilePath() {
String configPath = myConfigPath;
if (configPath == null) {
configPath = PathManager.getConfigPath();
}
return configPath + "/options/appComponentVersions.xml";
}
@Override
protected TrackingPathMacroSubstitutor getMacroSubstitutor(@NotNull final String fileSpec) {
if (fileSpec.equals(StoragePathMacros.APP_CONFIG + "/" + PathMacrosImpl.EXT_FILE_NAME + XML_EXTENSION)) return null;
return super.getMacroSubstitutor(fileSpec);
}
};
myDefaultsStateStorage = new DefaultsStateStorage(null);
}
@Override
public void load() throws IOException {
long t = System.currentTimeMillis();
myApplication.init();
t = System.currentTimeMillis() - t;
LOG.info(myApplication.getComponentConfigurations().length + " application components initialized in " + t + " ms");
}
@Override
public void setOptionsPath(@NotNull String path) {
myStateStorageManager.addMacro(StoragePathMacros.APP_CONFIG, path);
}
@Override
public void setConfigPath(@NotNull final String configPath) {
myStateStorageManager.addMacro(StoragePathMacros.ROOT_CONFIG, configPath);
myConfigPath = configPath;
}
@Override
public boolean reload(@NotNull final Set<Pair<VirtualFile, StateStorage>> changedFiles,
@NotNull final Collection<String> notReloadableComponents) throws StateStorageException, IOException {
final SaveSession saveSession = startSave();
final Set<String> componentNames = saveSession.analyzeExternalChanges(changedFiles);
try {
if (componentNames == null) return false;
for (Pair<VirtualFile, StateStorage> pair : changedFiles) {
if (pair.second == null) return false;
}
for (String name : componentNames) {
if (!isReloadPossible(Collections.singleton(name))) {
notReloadableComponents.add(name);
}
}
StorageUtil.logStateDiffInfo(changedFiles, componentNames);
if (!isReloadPossible(componentNames)) {
return false;
}
}
finally {
finishSave(saveSession);
}
if (!componentNames.isEmpty()) {
myApplication.getMessageBus().syncPublisher(BatchUpdateListener.TOPIC).onBatchUpdateStarted();
try {
doReload(changedFiles, componentNames);
reinitComponents(componentNames, false);
}
finally {
myApplication.getMessageBus().syncPublisher(BatchUpdateListener.TOPIC).onBatchUpdateFinished();
}
}
return true;
}
@NotNull
@Override
public StateStorageManager getStateStorageManager() {
return myStateStorageManager;
}
@Nullable
@Override
protected StateStorage getDefaultsStorage() {
return myDefaultsStateStorage;
}
}