summaryrefslogtreecommitdiff
path: root/plugins/editorconfig/src/org/editorconfig/configmanagement/EncodingManager.java
blob: 919f0861055fb8693a0a24a895bfc5930e1ce14f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package org.editorconfig.configmanagement;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import org.editorconfig.Utils;
import org.editorconfig.core.EditorConfig.OutPair;
import org.editorconfig.plugincomponents.SettingsProviderComponent;
import org.jetbrains.annotations.NotNull;

import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EncodingManager extends FileDocumentManagerAdapter {
  // Handles the following EditorConfig settings:
  private static final String charsetKey = "charset";

  private final Logger LOG = Logger.getInstance("#org.editorconfig.codestylesettings.EncodingManager");
  private final Project project;

  private static final Map<String, Charset> encodingMap;

  static {
    Map<String, Charset> map = new HashMap<String, Charset>();
    map.put("latin1", Charset.forName("ISO-8859-1"));
    map.put("utf-8", Charset.forName("UTF-8"));
    map.put("utf-16be", Charset.forName("UTF-16BE"));
    map.put("utf-16le", Charset.forName("UTF-16LE"));
    encodingMap = Collections.unmodifiableMap(map);
  }

  private boolean isApplyingSettings;

  public EncodingManager(Project project) {
    this.project = project;
    isApplyingSettings = false;
  }

  @Override
  public void beforeDocumentSaving(@NotNull Document document) {
    final VirtualFile file = FileDocumentManager.getInstance().getFile(document);
    if (!isApplyingSettings) {
      applySettings(file);
    }
  }

  private void applySettings(VirtualFile file) {
    if (file == null || !file.isInLocalFileSystem()) return;
    // Prevent "setEncoding" calling "saveAll" from causing an endless loop
    isApplyingSettings = true;
    final String filePath = file.getCanonicalPath();
    final List<OutPair> outPairs = SettingsProviderComponent.getInstance().getOutPairs(filePath);
    final EncodingProjectManager encodingProjectManager = EncodingProjectManager.getInstance(project);
    final String charset = Utils.configValueForKey(outPairs, charsetKey);
    if (!charset.isEmpty()) {
      if (encodingMap.containsKey(charset)) {
        encodingProjectManager.setEncoding(file, encodingMap.get(charset));
        LOG.debug(Utils.appliedConfigMessage(charset, charsetKey, filePath));
      }
      else {
        LOG.warn(Utils.invalidConfigMessage(charset, charsetKey, filePath));
      }
    }
    isApplyingSettings = false;
  }
}