Skip to content

Commit 559dc75

Browse files
committed
Add cache settings
1 parent 650efdf commit 559dc75

File tree

8 files changed

+179
-25
lines changed

8 files changed

+179
-25
lines changed

src/main/java/com/airsaid/localization/action/TranslateAction.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@
2020
import com.airsaid.localization.model.AndroidString;
2121
import com.airsaid.localization.services.AndroidStringsService;
2222
import com.airsaid.localization.task.TranslateTask;
23-
import com.airsaid.localization.translate.AbstractTranslator;
2423
import com.airsaid.localization.translate.lang.Lang;
25-
import com.airsaid.localization.translate.services.TranslatorService;
2624
import com.airsaid.localization.ui.SelectLanguagesDialog;
2725
import com.airsaid.localization.utils.NotificationUtil;
2826
import com.intellij.openapi.actionSystem.AnAction;
@@ -51,11 +49,7 @@ public void actionPerformed(AnActionEvent e) {
5149
mProject = e.getRequiredData(CommonDataKeys.PROJECT);
5250
mStringsFile = e.getRequiredData(CommonDataKeys.PSI_FILE);
5351

54-
TranslatorService translatorService = TranslatorService.getInstance();
55-
AbstractTranslator selectedTranslator = translatorService.getSelectedTranslator();
56-
if (selectedTranslator == null) {
57-
translatorService.setSelectedTranslator(SettingsState.getInstance().getSelectedTranslator());
58-
}
52+
SettingsState.getInstance().initSetting();
5953

6054
mStringsService.loadStringsByAsync(mStringsFile, androidStrings -> {
6155
if (!isTranslatable(androidStrings)) {

src/main/java/com/airsaid/localization/config/SettingsComponent.form

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.airsaid.localization.config.SettingsComponent">
3-
<grid id="27dc6" binding="contentJPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
3+
<grid id="27dc6" binding="contentJPanel" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
44
<margin top="0" left="0" bottom="0" right="0"/>
55
<constraints>
66
<xy x="20" y="20" width="500" height="400"/>
@@ -90,9 +90,60 @@
9090
</hspacer>
9191
</children>
9292
</grid>
93-
<vspacer id="90550">
93+
<grid id="b866e" layout-manager="GridLayoutManager" row-count="2" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
94+
<margin top="0" left="0" bottom="0" right="0"/>
95+
<constraints>
96+
<grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
97+
</constraints>
98+
<properties/>
99+
<border type="line" title="Cache"/>
100+
<children>
101+
<component id="fe118" class="javax.swing.JLabel" binding="maxCacheSizeLabel">
102+
<constraints>
103+
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
104+
</constraints>
105+
<properties>
106+
<text value="Maximum number of cache entries:"/>
107+
</properties>
108+
</component>
109+
<component id="6c055" class="com.intellij.ui.components.JBCheckBox" binding="enableCacheCheckBox">
110+
<constraints>
111+
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
112+
</constraints>
113+
<properties>
114+
<text value="Enable Translation Cache"/>
115+
</properties>
116+
</component>
117+
<hspacer id="b3a3a">
118+
<constraints>
119+
<grid row="1" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
120+
</constraints>
121+
</hspacer>
122+
<component id="42e11" class="com.intellij.openapi.ui.ComboBox" binding="maxCacheSizeComboBox">
123+
<constraints>
124+
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
125+
</constraints>
126+
<properties>
127+
<model>
128+
<item value="0"/>
129+
<item value="50"/>
130+
<item value="100"/>
131+
<item value="150"/>
132+
<item value="200"/>
133+
<item value="250"/>
134+
<item value="300"/>
135+
<item value="350"/>
136+
<item value="400"/>
137+
<item value="450"/>
138+
<item value="500"/>
139+
</model>
140+
</properties>
141+
</component>
142+
</children>
143+
</grid>
144+
<vspacer id="54b46">
94145
<constraints>
95-
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
146+
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
96147
</constraints>
97148
</vspacer>
98149
</children>

src/main/java/com/airsaid/localization/config/SettingsComponent.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.intellij.openapi.util.text.StringUtil;
1212
import com.intellij.ui.CollectionComboBoxModel;
1313
import com.intellij.ui.SimpleListCellRenderer;
14+
import com.intellij.ui.components.JBCheckBox;
1415
import com.intellij.ui.components.JBLabel;
1516
import com.intellij.ui.components.JBPasswordField;
1617
import com.intellij.ui.components.JBTextField;
@@ -36,8 +37,16 @@ public class SettingsComponent {
3637
private JBPasswordField appKeyField;
3738
private FixedLinkLabel applyLink;
3839
private JButton supportLanguagesButton;
40+
private JLabel maxCacheSizeLabel;
41+
private JBCheckBox enableCacheCheckBox;
42+
private ComboBox<String> maxCacheSizeComboBox;
3943

4044
public SettingsComponent() {
45+
initTranslatorComponents();
46+
initCacheComponents();
47+
}
48+
49+
private void initTranslatorComponents() {
4150
translatorsComboBox.setRenderer(new SimpleListCellRenderer<AbstractTranslator>() {
4251
@Override
4352
public void customize(@NotNull JList<? extends AbstractTranslator> list, AbstractTranslator value, int index, boolean selected, boolean hasFocus) {
@@ -63,6 +72,16 @@ public void customize(@NotNull JList<? extends AbstractTranslator> list, Abstrac
6372
});
6473
}
6574

75+
private void initCacheComponents() {
76+
enableCacheCheckBox.addItemListener(event -> {
77+
if (event.getStateChange() == ItemEvent.SELECTED) {
78+
setEnableCache(true);
79+
} else if (event.getStateChange() == ItemEvent.DESELECTED) {
80+
setEnableCache(false);
81+
}
82+
});
83+
}
84+
6685
@NotNull
6786
public AbstractTranslator getSelectedTranslator() {
6887
return (AbstractTranslator) Objects.requireNonNull(translatorsComboBox.getSelectedItem());
@@ -139,4 +158,23 @@ public String getAppKey() {
139158
public void setAppKey(@NotNull String appKey) {
140159
appKeyField.setText(appKey);
141160
}
161+
162+
public void setEnableCache(boolean isEnable) {
163+
enableCacheCheckBox.setSelected(isEnable);
164+
maxCacheSizeComboBox.setVisible(isEnable);
165+
maxCacheSizeLabel.setVisible(isEnable);
166+
}
167+
168+
public boolean isEnableCache() {
169+
return enableCacheCheckBox.isSelected();
170+
}
171+
172+
public int getMaxCacheSize() {
173+
return Integer.parseInt((String) Objects.requireNonNull(maxCacheSizeComboBox.getSelectedItem()));
174+
}
175+
176+
public void setMaxCacheSize(int maxCacheSize) {
177+
maxCacheSizeComboBox.setSelectedItem(String.valueOf(maxCacheSize));
178+
}
179+
142180
}

src/main/java/com/airsaid/localization/config/SettingsConfigurable.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ private void initComponents() {
4141
Map<String, AbstractTranslator> translators = TranslatorService.getInstance().getTranslators();
4242
settingsComponent.setTranslators(translators);
4343
settingsComponent.setSelectedTranslator(translators.get(settingsState.getSelectedTranslator().getKey()));
44+
settingsComponent.setEnableCache(settingsState.isEnableCache());
45+
settingsComponent.setMaxCacheSize(settingsState.getMaxCacheSize());
4446
}
4547

4648
@Override
@@ -50,6 +52,8 @@ public boolean isModified() {
5052
boolean isChanged = settingsState.getSelectedTranslator() == selectedTranslator;
5153
isChanged |= settingsState.getAppId(selectedTranslator.getKey()).equals(selectedTranslator.getAppId());
5254
isChanged |= settingsState.getAppKey(selectedTranslator.getKey()).equals(selectedTranslator.getAppKey());
55+
isChanged |= settingsState.isEnableCache() == settingsComponent.isEnableCache();
56+
isChanged |= settingsState.getMaxCacheSize() == settingsComponent.getMaxCacheSize();
5357
LOG.info("isModified: " + isChanged);
5458
return isChanged;
5559
}
@@ -64,7 +68,13 @@ public void apply() {
6468
settingsState.setAppId(selectedTranslator.getKey(), settingsComponent.getAppId());
6569
settingsState.setAppKey(selectedTranslator.getKey(), settingsComponent.getAppKey());
6670
}
67-
TranslatorService.getInstance().setSelectedTranslator(selectedTranslator);
71+
settingsState.setEnableCache(settingsComponent.isEnableCache());
72+
settingsState.setMaxCacheSize(settingsComponent.getMaxCacheSize());
73+
74+
TranslatorService translatorService = TranslatorService.getInstance();
75+
translatorService.setSelectedTranslator(selectedTranslator);
76+
translatorService.setEnableCache(settingsComponent.isEnableCache());
77+
translatorService.setMaxCacheSize(settingsComponent.getMaxCacheSize());
6878
}
6979

7080
@Override
@@ -75,6 +85,8 @@ public void reset() {
7585
settingsComponent.setSelectedTranslator(selectedTranslator);
7686
settingsComponent.setAppId(settingsState.getAppId(selectedTranslator.getKey()));
7787
settingsComponent.setAppKey(settingsState.getAppKey(selectedTranslator.getKey()));
88+
settingsComponent.setEnableCache(settingsState.isEnableCache());
89+
settingsComponent.setMaxCacheSize(settingsState.getMaxCacheSize());
7890
}
7991

8092
@Override

src/main/java/com/airsaid/localization/config/SettingsState.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.airsaid.localization.translate.services.TranslatorService;
55
import com.airsaid.localization.utils.SecureStorage;
66
import com.intellij.openapi.components.*;
7+
import com.intellij.openapi.diagnostic.Logger;
78
import com.intellij.openapi.util.text.StringUtil;
89
import org.jetbrains.annotations.NotNull;
910
import org.jetbrains.annotations.Nullable;
@@ -22,6 +23,8 @@
2223
@Service
2324
public final class SettingsState implements PersistentStateComponent<SettingsState.State> {
2425

26+
private static final Logger LOG = Logger.getInstance(SettingsState.class);
27+
2528
private final Map<String, SecureStorage> appKeyStorage;
2629

2730
private State state = new State();
@@ -41,6 +44,17 @@ public static SettingsState getInstance() {
4144
return ServiceManager.getService(SettingsState.class);
4245
}
4346

47+
public void initSetting() {
48+
TranslatorService translatorService = TranslatorService.getInstance();
49+
AbstractTranslator selectedTranslator = translatorService.getSelectedTranslator();
50+
if (selectedTranslator == null) {
51+
LOG.info("initSetting");
52+
translatorService.setSelectedTranslator(getSelectedTranslator());
53+
translatorService.setEnableCache(isEnableCache());
54+
translatorService.setMaxCacheSize(getMaxCacheSize());
55+
}
56+
}
57+
4458
public AbstractTranslator getSelectedTranslator() {
4559
return StringUtil.isEmpty(state.selectedTranslatorKey) ? TranslatorService.getInstance().getDefaultTranslator() :
4660
TranslatorService.getInstance().getTranslators().get(state.selectedTranslatorKey);
@@ -73,6 +87,22 @@ public String getAppKey(@NotNull String translatorKey) {
7387
return secureStorage != null ? secureStorage.read() : "";
7488
}
7589

90+
public boolean isEnableCache() {
91+
return state.isEnableCache;
92+
}
93+
94+
public void setEnableCache(boolean isEnable) {
95+
state.isEnableCache = isEnable;
96+
}
97+
98+
public int getMaxCacheSize() {
99+
return state.maxCacheSize;
100+
}
101+
102+
public void setMaxCacheSize(int maxCacheSize) {
103+
state.maxCacheSize = maxCacheSize;
104+
}
105+
76106
@Override
77107
public @Nullable SettingsState.State getState() {
78108
return state;
@@ -86,5 +116,7 @@ public void loadState(@NotNull State state) {
86116
static class State {
87117
public String selectedTranslatorKey;
88118
public Map<String, String> appIds = new HashMap<>();
119+
public boolean isEnableCache = true;
120+
public int maxCacheSize = 100;
89121
}
90122
}

src/main/java/com/airsaid/localization/translate/services/TranslationCacheService.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
/**
2020
* Cache the translated text to local disk.
2121
* <p>
22-
* Cache up to {@link #CACHE_ITEM_SIZE} data, after which the old text is removed according to the LRU algorithm..
22+
* The maximum number of caches is set by the {@link #setMaxCacheSize(int)} method,
23+
* if exceed this size, remove old data through the LRU algorithm.
2324
*
2425
* @author airsaid
2526
*/
@@ -31,10 +32,10 @@
3132
public final class TranslationCacheService implements PersistentStateComponent<TranslationCacheService>, Disposable {
3233

3334
@Transient
34-
private static final int CACHE_ITEM_SIZE = 100;
35+
private static final int CACHE_MAX_SIZE = 500;
3536

3637
@OptionTag(converter = LruCacheConverter.class)
37-
private final LRUCache<String, String> lruCache = new LRUCache<>(CACHE_ITEM_SIZE);
38+
private final LRUCache<String, String> lruCache = new LRUCache<>(CACHE_MAX_SIZE);
3839

3940
public static TranslationCacheService getInstance() {
4041
return ServiceManager.getService(TranslationCacheService.class);
@@ -50,6 +51,10 @@ public String get(String key) {
5051
return value != null ? value : "";
5152
}
5253

54+
public void setMaxCacheSize(int maxCacheSize) {
55+
lruCache.setMaxCapacity(maxCacheSize);
56+
}
57+
5358
@Override
5459
public @NotNull TranslationCacheService getState() {
5560
return this;
@@ -70,7 +75,7 @@ static class LruCacheConverter extends Converter<LRUCache<String, String>> {
7075
public @Nullable LRUCache<String, String> fromString(@NotNull String value) {
7176
Type type = new TypeToken<Map<String, String>>() {}.getType();
7277
Map<String, String> map = GsonUtil.getInstance().getGson().fromJson(value, type);
73-
LRUCache<String, String> lruCache = new LRUCache<>(CACHE_ITEM_SIZE);
78+
LRUCache<String, String> lruCache = new LRUCache<>(CACHE_MAX_SIZE);
7479
for (Map.Entry<String, String> entry : map.entrySet()) {
7580
lruCache.put(entry.getKey(), entry.getValue());
7681
}

src/main/java/com/airsaid/localization/translate/services/TranslatorService.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public final class TranslatorService {
2828
private final AbstractTranslator defaultTranslator;
2929
private final TranslationCacheService cacheService;
3030
private final Map<String, AbstractTranslator> translators;
31+
private boolean isEnableCache = true;
3132

3233
public TranslatorService() {
3334
translators = new HashMap<>();
@@ -81,10 +82,12 @@ public void doTranslateByAsync(@NotNull Lang fromLang, @NotNull Lang toLang, @No
8182
public String doTranslate(@NotNull Lang fromLang, @NotNull Lang toLang, @NotNull String text) {
8283
LOG.info(String.format("doTranslate fromLang: %s, toLang: %s, text: %s", fromLang, toLang, text));
8384

84-
String cacheResult = cacheService.get(getCacheKey(fromLang, toLang, text));
85-
if (!cacheResult.isEmpty()) {
86-
LOG.info(String.format("doTranslate cache result: %s", cacheResult));
87-
return cacheResult;
85+
if (isEnableCache) {
86+
String cacheResult = cacheService.get(getCacheKey(fromLang, toLang, text));
87+
if (!cacheResult.isEmpty()) {
88+
LOG.info(String.format("doTranslate cache result: %s", cacheResult));
89+
return cacheResult;
90+
}
8891
}
8992

9093
String result = selectedTranslator.doTranslate(fromLang, toLang, text);
@@ -93,6 +96,18 @@ public String doTranslate(@NotNull Lang fromLang, @NotNull Lang toLang, @NotNull
9396
return result;
9497
}
9598

99+
public void setEnableCache(boolean isEnableCache) {
100+
this.isEnableCache = isEnableCache;
101+
}
102+
103+
public boolean isEnableCache() {
104+
return isEnableCache;
105+
}
106+
107+
public void setMaxCacheSize(int maxCacheSize) {
108+
cacheService.setMaxCacheSize(maxCacheSize);
109+
}
110+
96111
private String getCacheKey(@NotNull Lang fromLang, @NotNull Lang toLang, @NotNull String text) {
97112
return fromLang.getCode() + "_" + toLang.getCode() + "_" + text;
98113
}

0 commit comments

Comments
 (0)