ConfigFileFactoryImpl -> idea-ui

This commit is contained in:
Dmitry Jemerov
2009-09-02 16:50:56 +04:00
parent d275cc2bae
commit 2c5a855e23
6 changed files with 0 additions and 0 deletions
@@ -0,0 +1,143 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.MultiValuesMap;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.Disposable;
import com.intellij.util.EventDispatcher;
import com.intellij.util.descriptors.*;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author nik
*/
public class ConfigFileContainerImpl implements ConfigFileContainer {
private final Project myProject;
private final EventDispatcher<ConfigFileListener> myDispatcher = EventDispatcher.create(ConfigFileListener.class);
private final MultiValuesMap<ConfigFileMetaData, ConfigFile> myConfigFiles = new MultiValuesMap<ConfigFileMetaData, ConfigFile>();
private ConfigFile[] myCachedConfigFiles;
private final ConfigFileMetaDataProvider myMetaDataProvider;
private final ConfigFileInfoSetImpl myConfiguration;
public ConfigFileContainerImpl(final Project project, final ConfigFileMetaDataProvider descriptorMetaDataProvider,
final ConfigFileInfoSetImpl configuration) {
myConfiguration = configuration;
myMetaDataProvider = descriptorMetaDataProvider;
myProject = project;
VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() {
public void propertyChanged(final VirtualFilePropertyEvent event) {
fileChanged(event.getFile());
}
public void fileMoved(final VirtualFileMoveEvent event) {
fileChanged(event.getFile());
}
}, this);
myConfiguration.setContainer(this);
}
private void fileChanged(final VirtualFile file) {
for (ConfigFile descriptor : myConfigFiles.values()) {
final VirtualFile virtualFile = descriptor.getVirtualFile();
if (virtualFile != null && VfsUtil.isAncestor(file, virtualFile, false)) {
myConfiguration.updateConfigFile(descriptor);
fireDescriptorChanged(descriptor);
}
}
}
@Nullable
public ConfigFile getConfigFile(ConfigFileMetaData metaData) {
final Collection<ConfigFile> descriptors = myConfigFiles.get(metaData);
if (descriptors == null || descriptors.isEmpty()) {
return null;
}
return descriptors.iterator().next();
}
public ConfigFile[] getConfigFiles() {
if (myCachedConfigFiles == null) {
final Collection<ConfigFile> descriptors = myConfigFiles.values();
myCachedConfigFiles = descriptors.toArray(new ConfigFile[descriptors.size()]);
}
return myCachedConfigFiles;
}
public Project getProject() {
return myProject;
}
public void addListener(final ConfigFileListener listener, final Disposable parentDisposable) {
myDispatcher.addListener(listener, parentDisposable);
}
public void fireDescriptorChanged(final ConfigFile descriptor) {
myDispatcher.getMulticaster().configFileChanged(descriptor);
}
public ConfigFileInfoSet getConfiguration() {
return myConfiguration;
}
public void dispose() {
int i = 0;
}
public void addListener(final ConfigFileListener listener) {
myDispatcher.addListener(listener);
}
public void removeListener(final ConfigFileListener listener) {
myDispatcher.removeListener(listener);
}
public ConfigFileMetaDataProvider getMetaDataProvider() {
return myMetaDataProvider;
}
public void updateDescriptors(final MultiValuesMap<ConfigFileMetaData, ConfigFileInfo> descriptorsMap) {
Set<ConfigFile> toDelete = new HashSet<ConfigFile>(myConfigFiles.values());
Set<ConfigFile> added = new HashSet<ConfigFile>();
for (Map.Entry<ConfigFileMetaData, Collection<ConfigFileInfo>> entry : descriptorsMap.entrySet()) {
ConfigFileMetaData metaData = entry.getKey();
Set<ConfigFileInfo> newDescriptors = new HashSet<ConfigFileInfo>(entry.getValue());
final Collection<ConfigFile> oldDescriptors = myConfigFiles.get(metaData);
if (oldDescriptors != null) {
for (ConfigFile descriptor : oldDescriptors) {
if (newDescriptors.contains(descriptor.getInfo())) {
newDescriptors.remove(descriptor.getInfo());
toDelete.remove(descriptor);
}
}
}
for (ConfigFileInfo configuration : newDescriptors) {
final ConfigFileImpl configFile = new ConfigFileImpl(this, configuration);
myConfigFiles.put(metaData, configFile);
added.add(configFile);
}
}
for (ConfigFile descriptor : toDelete) {
myConfigFiles.remove(descriptor.getMetaData(), descriptor);
}
myCachedConfigFiles = null;
for (ConfigFile configFile : added) {
myDispatcher.getMulticaster().configFileAdded(configFile);
}
for (ConfigFile configFile : toDelete) {
myDispatcher.getMulticaster().configFileRemoved(configFile);
}
}
}
@@ -0,0 +1,104 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.util.FileContentUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.descriptors.*;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* @author nik
*/
public class ConfigFileFactoryImpl extends ConfigFileFactory {
public ConfigFileMetaDataProvider createMetaDataProvider(final ConfigFileMetaData... metaDatas) {
return new ConfigFileMetaDataRegistryImpl(metaDatas);
}
public ConfigFileMetaDataRegistry createMetaDataRegistry() {
return new ConfigFileMetaDataRegistryImpl();
}
public ConfigFileInfoSet createConfigFileInfoSet(final ConfigFileMetaDataProvider metaDataProvider) {
return new ConfigFileInfoSetImpl(metaDataProvider);
}
public ConfigFileContainer createConfigFileContainer(final Project project, final ConfigFileMetaDataProvider metaDataProvider,
final ConfigFileInfoSet configuration) {
return new ConfigFileContainerImpl(project, metaDataProvider, (ConfigFileInfoSetImpl)configuration);
}
public CustomConfigFileSet createCustomConfigFileSet() {
return new CustomConfigFileSetImpl();
}
private static String getText(final String templateName) throws IOException {
final FileTemplateManager templateManager = FileTemplateManager.getInstance();
final FileTemplate template = templateManager.getJ2eeTemplate(templateName);
if (template == null) {
return "";
}
return template.getText(templateManager.getDefaultProperties());
}
@Nullable
public VirtualFile createFile(@Nullable Project project, String url, ConfigFileVersion version, final boolean forceNew) {
return createFileFromTemplate(project, url, version.getTemplateName(), forceNew);
}
@Nullable
private VirtualFile createFileFromTemplate(@Nullable final Project project, String url, final String templateName, final boolean forceNew) {
final LocalFileSystem fileSystem = LocalFileSystem.getInstance();
final File file = new File(VfsUtil.urlToPath(url));
final VirtualFile existingFile = fileSystem.refreshAndFindFileByIoFile(file);
if (existingFile != null && !forceNew) {
return existingFile;
}
try {
String text = getText(templateName);
final VirtualFile childData;
if (existingFile == null || existingFile.isDirectory()) {
final VirtualFile virtualFile;
if (!FileUtil.createParentDirs(file) ||
(virtualFile = fileSystem.refreshAndFindFileByIoFile(file.getParentFile())) == null) {
throw new IOException(IdeBundle.message("error.message.unable.to.create.file", file.getPath()));
}
childData = virtualFile.createChildData(this, file.getName());
}
else {
childData = existingFile;
}
FileContentUtil.setFileText(project, childData, text);
return childData;
}
catch (final IOException e) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
Messages.showErrorDialog(IdeBundle.message("message.text.error.creating.deployment.descriptor", e.getLocalizedMessage()),
IdeBundle.message("message.text.creating.deployment.descriptor"));
}
});
}
return null;
}
public ConfigFileContainer createSingleFileContainer(Project project, ConfigFileMetaData metaData) {
final ConfigFileMetaDataProvider metaDataProvider = createMetaDataProvider(metaData);
return createConfigFileContainer(project, metaDataProvider, createConfigFileInfoSet(metaDataProvider));
}
}
@@ -0,0 +1,125 @@
/*
* Copyright (c) 2007, Your Corporation. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener;
import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.descriptors.ConfigFile;
import com.intellij.util.descriptors.ConfigFileInfo;
import com.intellij.util.descriptors.ConfigFileMetaData;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author nik
*/
public class ConfigFileImpl implements ConfigFile {
@NotNull private ConfigFileInfo myInfo;
private VirtualFilePointer myFilePointer;
private PsiFile myPsiFile;
private final ConfigFileContainerImpl myContainer;
private final Project myProject;
private long myModificationCount;
private final VirtualFilePointerListener myListener = new VirtualFilePointerListener() {
public void beforeValidityChanged(final VirtualFilePointer[] pointers) {
}
public void validityChanged(final VirtualFilePointer[] pointers) {
myPsiFile = null;
onChange();
}
};
public ConfigFileImpl(@NotNull final ConfigFileContainerImpl container, @NotNull final ConfigFileInfo configuration) {
myContainer = container;
myInfo = configuration;
setUrl(configuration.getUrl());
Disposer.register(container, this);
myProject = myContainer.getProject();
}
private void setUrl(String url) {
final VirtualFilePointerManager pointerManager = VirtualFilePointerManager.getInstance();
myFilePointer = pointerManager.create(url, this, myListener);
onChange();
}
private void onChange() {
myModificationCount++;
myContainer.fireDescriptorChanged(this);
}
public String getUrl() {
return myFilePointer.getUrl();
}
public void setInfo(@NotNull final ConfigFileInfo info) {
myInfo = info;
}
@Nullable
public VirtualFile getVirtualFile() {
return myFilePointer.getFile();
}
@Nullable
public synchronized PsiFile getPsiFile() {
if (myPsiFile != null && myPsiFile.isValid()) {
return myPsiFile;
}
VirtualFile virtualFile = getVirtualFile();
if (virtualFile == null || !virtualFile.isValid()) return null;
myPsiFile = PsiManager.getInstance(myProject).findFile(virtualFile);
return myPsiFile;
}
@Nullable
public XmlFile getXmlFile() {
final PsiFile file = getPsiFile();
return file instanceof XmlFile ? (XmlFile)file : null;
}
public void dispose() {
}
@NotNull
public ConfigFileInfo getInfo() {
return myInfo;
}
public boolean isValid() {
final PsiFile psiFile = getPsiFile();
if (psiFile == null || !psiFile.isValid()) {
return false;
}
if (psiFile instanceof XmlFile) {
final XmlDocument document = ((XmlFile)psiFile).getDocument();
return document != null && document.getRootTag() != null;
}
return true;
}
@NotNull
public ConfigFileMetaData getMetaData() {
return myInfo.getMetaData();
}
public long getModificationCount() {
return myModificationCount;
}
}
@@ -0,0 +1,153 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.MultiValuesMap;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.util.descriptors.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
/**
* @author nik
*/
public class ConfigFileInfoSetImpl implements ConfigFileInfoSet {
private static final Logger LOG = Logger.getInstance("#com.intellij.util.descriptors.impl.ConfigFileInfoSetImpl");
@NonNls private static final String ELEMENT_NAME = "deploymentDescriptor";
@NonNls private static final String ID_ATTRIBUTE = "name";
@NonNls private static final String URL_ATTRIBUTE = "url";
private final MultiValuesMap<ConfigFileMetaData, ConfigFileInfo> myConfigFiles = new MultiValuesMap<ConfigFileMetaData, ConfigFileInfo>();
private @Nullable ConfigFileContainerImpl myContainer;
private final ConfigFileMetaDataProvider myMetaDataProvider;
public ConfigFileInfoSetImpl(final @NotNull ConfigFileContainerImpl container) {
myContainer = container;
myMetaDataProvider = container.getMetaDataProvider();
}
public ConfigFileInfoSetImpl(final ConfigFileMetaDataProvider metaDataProvider) {
myMetaDataProvider = metaDataProvider;
}
public void addConfigFile(ConfigFileInfo descriptor) {
myConfigFiles.put(descriptor.getMetaData(), descriptor);
onChange();
}
public void addConfigFile(final ConfigFileMetaData metaData, final String url) {
addConfigFile(new ConfigFileInfo(metaData, url));
}
public void removeConfigFile(ConfigFileInfo descriptor) {
myConfigFiles.remove(descriptor.getMetaData(), descriptor);
onChange();
}
public void replaceConfigFile(final ConfigFileMetaData metaData, final String newUrl) {
myConfigFiles.removeAll(metaData);
addConfigFile(new ConfigFileInfo(metaData, newUrl));
}
public ConfigFileInfo updateConfigFile(ConfigFile configFile) {
myConfigFiles.remove(configFile.getMetaData(), configFile.getInfo());
ConfigFileInfo info = new ConfigFileInfo(configFile.getMetaData(), configFile.getUrl());
myConfigFiles.put(info.getMetaData(), info);
((ConfigFileImpl)configFile).setInfo(info);
return info;
}
public void removeConfigFiles(final ConfigFileMetaData... metaData) {
for (ConfigFileMetaData data : metaData) {
myConfigFiles.removeAll(data);
}
onChange();
}
@NotNull
public Collection<ConfigFileInfo> getDescriptors(ConfigFileMetaData metaData) {
final Collection<ConfigFileInfo> collection = myConfigFiles.get(metaData);
return collection != null ? Collections.unmodifiableCollection(collection) : Collections.<ConfigFileInfo>emptyList();
}
@Nullable
public ConfigFileInfo getConfigFileInfo(ConfigFileMetaData metaData) {
final Collection<ConfigFileInfo> descriptors = myConfigFiles.get(metaData);
if (descriptors == null || descriptors.isEmpty()) {
return null;
}
return descriptors.iterator().next();
}
public ConfigFileInfo[] getConfigFileInfos() {
final Collection<ConfigFileInfo> configurations = myConfigFiles.values();
return configurations.toArray(new ConfigFileInfo[configurations.size()]);
}
public void setConfigFileInfos(final Collection<ConfigFileInfo> descriptors) {
myConfigFiles.clear();
for (ConfigFileInfo descriptor : descriptors) {
myConfigFiles.put(descriptor.getMetaData(), descriptor);
}
onChange();
}
private void onChange() {
if (myContainer != null) {
myContainer.updateDescriptors(myConfigFiles);
}
}
public ConfigFileMetaDataProvider getMetaDataProvider() {
return myMetaDataProvider;
}
public void readExternal(final Element element) throws InvalidDataException {
myConfigFiles.clear();
List<Element> children = element.getChildren(ELEMENT_NAME);
for (Element child : children) {
final String id = child.getAttributeValue(ID_ATTRIBUTE);
if (id != null) {
final ConfigFileMetaData metaData = myMetaDataProvider.findMetaData(id);
if (metaData != null) {
final String url = child.getAttributeValue(URL_ATTRIBUTE);
myConfigFiles.put(metaData, new ConfigFileInfo(metaData, url));
}
}
}
onChange();
}
@SuppressWarnings({"HardCodedStringLiteral"})
public void writeExternal(final Element element) throws WriteExternalException {
final TreeSet<ConfigFileInfo> sortedConfigFiles = new TreeSet<ConfigFileInfo>(new Comparator<ConfigFileInfo>() {
public int compare(final ConfigFileInfo o1, final ConfigFileInfo o2) {
final int id = Comparing.compare(o1.getMetaData().getId(), o2.getMetaData().getId());
return id != 0? id : Comparing.compare(o1.getUrl(), o2.getUrl());
}
});
sortedConfigFiles.addAll(myConfigFiles.collectValues());
for (ConfigFileInfo configuration : sortedConfigFiles) {
final Element child = new Element(ELEMENT_NAME);
final ConfigFileMetaData metaData = configuration.getMetaData();
child.setAttribute(ID_ATTRIBUTE, metaData.getId());
child.setAttribute(URL_ATTRIBUTE, configuration.getUrl());
element.addContent(child);
}
}
public void setContainer(@NotNull ConfigFileContainerImpl container) {
LOG.assertTrue(myContainer == null);
myContainer = container;
myContainer.updateDescriptors(myConfigFiles);
}
}
@@ -0,0 +1,55 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.util.descriptors.ConfigFileMetaData;
import com.intellij.util.descriptors.ConfigFileMetaDataRegistry;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
/**
* @author nik
*/
public class ConfigFileMetaDataRegistryImpl implements ConfigFileMetaDataRegistry {
private final List<ConfigFileMetaData> myMetaData = new ArrayList<ConfigFileMetaData>();
private final Map<String, ConfigFileMetaData> myId2MetaData = new HashMap<String, ConfigFileMetaData>();
private ConfigFileMetaData[] myCachedMetaData;
public ConfigFileMetaDataRegistryImpl() {
}
public ConfigFileMetaDataRegistryImpl(ConfigFileMetaData[] metaDatas) {
for (ConfigFileMetaData metaData : metaDatas) {
registerMetaData(metaData);
}
}
@NotNull
public ConfigFileMetaData[] getMetaData() {
if (myCachedMetaData == null) {
myCachedMetaData = myMetaData.toArray(new ConfigFileMetaData[myMetaData.size()]);
}
return myCachedMetaData;
}
@Nullable
public ConfigFileMetaData findMetaData(@NonNls @NotNull final String id) {
return myId2MetaData.get(id);
}
public void registerMetaData(@NotNull final ConfigFileMetaData... metaData) {
for (ConfigFileMetaData data : metaData) {
myMetaData.add(data);
myId2MetaData.put(data.getId(), data);
}
myCachedMetaData = null;
}
}
@@ -0,0 +1,83 @@
/*
* Copyright (c) 2000-2007 JetBrains s.r.o. All Rights Reserved.
*/
package com.intellij.util.descriptors.impl;
import com.intellij.util.descriptors.CustomConfigFileSet;
import com.intellij.util.descriptors.CustomConfigFile;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author nik
*/
public class CustomConfigFileSetImpl implements CustomConfigFileSet {
@NonNls private static final String ELEMENT_NAME = "deploymentDescriptor";
@NonNls private static final String URL_ATTRIBUTE = "url";
@NonNls private static final String OPTION_ELEMENT_NAME = "option";
@NonNls private static final String DEFAULT_DIR_OPTION = "DEFAULT_DIR";
@NonNls private static final String NAME_ATTRIBUTE = "name";
@NonNls private static final String VALUE_ATTRIBUTE = "value";
private final List<CustomConfigFile> myDescriptors = new ArrayList<CustomConfigFile>();
public void add(CustomConfigFile descriptor) {
myDescriptors.add(descriptor);
}
public void remove(CustomConfigFile descriptor) {
myDescriptors.remove(descriptor);
}
public CustomConfigFile[] getConfigFiles() {
return myDescriptors.toArray(new CustomConfigFile[myDescriptors.size()]);
}
public void setConfigFiles(final Collection<CustomConfigFile> descriptors) {
myDescriptors.clear();
myDescriptors.addAll(descriptors);
}
public void readExternal(Element element) throws InvalidDataException {
myDescriptors.clear();
List<Element> descriptors = element.getChildren(ELEMENT_NAME);
for (Element descriptor : descriptors) {
String url = descriptor.getAttributeValue(URL_ATTRIBUTE);
String directory = getDefaultDirOption(descriptor);
if (directory != null) {
myDescriptors.add(new CustomConfigFile(url, directory));
}
}
}
@Nullable
private static String getDefaultDirOption(final Element descriptor) {
List<Element> options = descriptor.getChildren(OPTION_ELEMENT_NAME);
for (Element option : options) {
if (DEFAULT_DIR_OPTION.equals(option.getAttributeValue(NAME_ATTRIBUTE))) {
return option.getAttributeValue(VALUE_ATTRIBUTE);
}
}
return null;
}
public void writeExternal(Element element) throws WriteExternalException {
for (CustomConfigFile descriptor : myDescriptors) {
final Element child = new Element(ELEMENT_NAME);
child.setAttribute(URL_ATTRIBUTE, descriptor.getUrl());
final Element option = new Element(OPTION_ELEMENT_NAME);
option.setAttribute(NAME_ATTRIBUTE, DEFAULT_DIR_OPTION);
option.setAttribute(VALUE_ATTRIBUTE, descriptor.getOutputDirectoryPath());
child.addContent(option);
element.addContent(child);
}
}
}