1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
7
using System.Runtime.InteropServices;
9
using ICSharpCode.Core;
11
namespace ICSharpCode.XmlEditor
14
/// Keeps track of all the schemas that the XML Editor is aware of.
16
public class RegisteredXmlSchemas : IXmlSchemaCompletionDataFactory
18
List<string> readOnlySchemaFolders = new List<string>();
19
string userDefinedSchemaFolder;
20
XmlSchemaCompletionCollection schemas = new XmlSchemaCompletionCollection();
21
IFileSystem fileSystem;
22
IXmlSchemaCompletionDataFactory factory;
23
List<RegisteredXmlSchemaError> schemaErrors = new List<RegisteredXmlSchemaError>();
25
public event EventHandler UserDefinedSchemaAdded;
26
public event EventHandler UserDefinedSchemaRemoved;
28
public RegisteredXmlSchemas(string[] readOnlySchemaFolders,
29
string userDefinedSchemaFolder,
30
IFileSystem fileSystem,
31
IXmlSchemaCompletionDataFactory factory)
33
this.readOnlySchemaFolders.AddRange(readOnlySchemaFolders);
34
this.userDefinedSchemaFolder = userDefinedSchemaFolder;
35
this.fileSystem = fileSystem;
36
this.factory = factory;
39
public RegisteredXmlSchemas(string[] readOnlySchemaFolders, string userDefinedSchemaFolder, IFileSystem fileSystem)
40
: this(readOnlySchemaFolders, userDefinedSchemaFolder, fileSystem, null)
45
public XmlSchemaCompletionCollection Schemas {
46
get { return schemas; }
49
public bool SchemaExists(string namespaceUri)
51
return schemas.Contains(namespaceUri);
54
public void RemoveUserDefinedSchema(string namespaceUri)
56
XmlSchemaCompletion schema = schemas[namespaceUri];
58
if (fileSystem.FileExists(schema.FileName)) {
59
fileSystem.DeleteFile(schema.FileName);
61
schemas.Remove(schema);
62
OnUserDefinedSchemaRemoved();
66
void OnUserDefinedSchemaRemoved()
68
if (UserDefinedSchemaRemoved != null) {
69
UserDefinedSchemaRemoved(this, new EventArgs());
73
public void AddUserSchema(XmlSchemaCompletion schema)
75
if (!fileSystem.DirectoryExists(userDefinedSchemaFolder)) {
76
fileSystem.CreateDirectory(userDefinedSchemaFolder);
79
string newSchemaDestinationFileName = GetUserDefinedSchemaDestination(schema);
80
fileSystem.CopyFile(schema.FileName, newSchemaDestinationFileName);
82
schema.FileName = newSchemaDestinationFileName;
85
OnUserDefinedSchemaAdded();
88
string GetUserDefinedSchemaDestination(XmlSchemaCompletion schema)
90
string fileName = Path.GetFileName(schema.FileName);
91
return Path.Combine(userDefinedSchemaFolder, fileName);
94
void OnUserDefinedSchemaAdded()
96
if (UserDefinedSchemaAdded != null) {
97
UserDefinedSchemaAdded(this, new EventArgs());
101
public RegisteredXmlSchemaError[] GetSchemaErrors()
103
return schemaErrors.ToArray();
106
public void ReadSchemas()
108
foreach (string folder in readOnlySchemaFolders) {
109
ReadSchemas(folder, "*.xsd", true);
111
ReadSchemas(userDefinedSchemaFolder, "*.*", false);
114
void ReadSchemas(string directory, string searchPattern, bool readOnly)
116
if (fileSystem.DirectoryExists(directory)) {
117
foreach (string fileName in fileSystem.GetFilesInDirectory(directory, searchPattern)) {
118
XmlSchemaCompletion schema = ReadSchema(fileName, readOnly);
119
if (schema != null) {
126
XmlSchemaCompletion ReadSchema(string fileName, bool readOnly)
129
string baseUri = XmlSchemaCompletion.GetUri(fileName);
130
XmlSchemaCompletion schema = factory.CreateXmlSchemaCompletionData(baseUri, fileName);
131
schema.FileName = fileName;
132
schema.IsReadOnly = readOnly;
134
} catch (Exception ex) {
135
schemaErrors.Add(new RegisteredXmlSchemaError("Unable to read schema '" + fileName + "'.", ex));
140
XmlSchemaCompletion IXmlSchemaCompletionDataFactory.CreateXmlSchemaCompletionData(string baseUri, string fileName)
142
return new XmlSchemaCompletion(baseUri, fileName);
145
void AddSchema(XmlSchemaCompletion schema)
147
if (schema.HasNamespaceUri) {
150
schemaErrors.Add(new RegisteredXmlSchemaError("Ignoring schema with no namespace '" + schema.FileName + "'."));