(empty log message)
@@ -9,8 +9,6 @@ | ||
9 | 9 | import java.io.File; |
10 | 10 | import java.lang.instrument.Instrumentation; |
11 | 11 | |
12 | -import org.apache.commons.io.FileUtils; | |
13 | - | |
14 | 12 | import jp.sourceforge.mergedoc.pleiades.log.FileLogger; |
15 | 13 | import jp.sourceforge.mergedoc.pleiades.log.Logger; |
16 | 14 | import jp.sourceforge.mergedoc.pleiades.resource.Filez; |
@@ -92,6 +90,7 @@ | ||
92 | 90 | * @return Pleiades コンテキスト (not null) |
93 | 91 | */ |
94 | 92 | public static PleiadesContext getPleiadesContext() { |
93 | + | |
95 | 94 | if (pleiadesContext == null) { |
96 | 95 | Logger log = Logger.getLogger(Pleiades.class); |
97 | 96 | log.info("[JUnit/Tool] ツール向け PleiadesContext を生成しました。"); |
@@ -123,10 +122,7 @@ | ||
123 | 122 | |
124 | 123 | Logger log = Logger.getLogger(Pleiades.class); |
125 | 124 | log.fatal(e, message + "\n起動オプションに -clean を指定して起動してください。"); |
126 | - | |
127 | - // 念のため、次回 -clean 起動されるように、キャッシュファイルを削除 | |
128 | - File cache = Pleiades.temp(CacheFilez.TRANSFORMED_CLASS_CACHE); | |
129 | - FileUtils.deleteQuietly(cache); | |
125 | + CacheFilez.clear(); // 次回 -clean されなかった場合のために、キャッシュファイルを削除 | |
130 | 126 | System.exit(-1); |
131 | 127 | } |
132 | 128 | } |
@@ -380,6 +380,7 @@ | ||
380 | 380 | public void fatal(Throwable e, String message, Object... args) { |
381 | 381 | |
382 | 382 | println(LogLevel.FATAL, e, message, args); |
383 | + | |
383 | 384 | String dialogMessage = format(message, args); |
384 | 385 | if (e != null) { |
385 | 386 | dialogMessage += "\n原因:" + e + "\n\n" + ExceptionUtils.getStackTrace(e); |
@@ -405,7 +406,7 @@ | ||
405 | 406 | dialog.dispose(); |
406 | 407 | |
407 | 408 | } catch (Exception e) { |
408 | - e.printStackTrace(); // ログに出力できない場合を考慮し標準出力 | |
409 | + println(LogLevel.ERROR, e, message); | |
409 | 410 | } |
410 | 411 | } |
411 | 412 |
@@ -296,8 +296,11 @@ | ||
296 | 296 | os = zos; |
297 | 297 | } |
298 | 298 | List<String> keyList = store(os, header); |
299 | - | |
300 | - log.info("store %4.3f 秒 - %6d エントリー %s", (System.nanoTime() - startTime) / 1e9, size(), fileName); | |
299 | + if (keyList == null) { | |
300 | + log.warn("保存できませんでした。%s", fileName); | |
301 | + } else { | |
302 | + log.info("store %4.3f 秒 - %6d エントリー %s", (System.nanoTime() - startTime) / 1e9, size(), fileName); | |
303 | + } | |
301 | 304 | return keyList; |
302 | 305 | |
303 | 306 | } catch (IOException e) { |
@@ -339,7 +342,7 @@ | ||
339 | 342 | } |
340 | 343 | |
341 | 344 | // ------------------------------------------------------------------------- |
342 | - // 以下、java.util.Properties の拡張 | |
345 | + // 以下、java.util.Properties からの拡張 | |
343 | 346 | |
344 | 347 | /** ロードカウント (非同期ロードは未対応) */ |
345 | 348 | private int loadCount; |
@@ -446,18 +449,18 @@ | ||
446 | 449 | writeln(writer, "#" + new Date().toString()); |
447 | 450 | |
448 | 451 | // ConcurrentModificationException 低減のため clone |
449 | - HashMap<String, String> c = null; | |
450 | - try { | |
451 | - c = (HashMap<String, String>) clone(); | |
452 | - } catch (ConcurrentModificationException e) { | |
453 | - log.info("非同期変更により保存できませんでした。リトライします。"); | |
452 | + Map<String, String> c = null; | |
453 | + for (int i = 0; i < 3; i++) { | |
454 | 454 | try { |
455 | - c = (HashMap<String, String>) clone(); | |
456 | - } catch (ConcurrentModificationException e2) { | |
457 | - log.warn("非同期変更により保存できませんでした。"); | |
458 | - return null; | |
455 | + c = (Map<String, String>) clone(); | |
456 | + break; | |
457 | + } catch (ConcurrentModificationException e) { | |
458 | + log.warn("ConcurrentModificationException 保存リトライ"); | |
459 | 459 | } |
460 | 460 | } |
461 | + if (c == null) { | |
462 | + return null; | |
463 | + } | |
461 | 464 | |
462 | 465 | // キーでソート |
463 | 466 | List<String> keyList = new ArrayList<>(c.keySet()); |
@@ -735,7 +738,11 @@ | ||
735 | 738 | } |
736 | 739 | |
737 | 740 | private static void writeln(BufferedWriter bw, String s) throws IOException { |
741 | + | |
738 | 742 | bw.write(s); |
739 | - bw.newLine(); | |
743 | + | |
744 | + // 高速化: LF 固定 | |
745 | + //bw.newLine(); | |
746 | + bw.write('\n'); | |
740 | 747 | } |
741 | 748 | } |
@@ -57,7 +57,7 @@ | ||
57 | 57 | // → format エラーになるため別スレッドでログ出力 |
58 | 58 | Asyncz.execute("計測記録リトライ・ログ出力", () -> { |
59 | 59 | String k = key.replace(Pleiades.PACKAGE_NAME + ".", ""); |
60 | - log.warn("計測記録リトライ computeIfAbsent: %s", k); | |
60 | + log.warn("ConcurrentModificationException 計測記録リトライ computeIfAbsent: %s", k); | |
61 | 61 | }); |
62 | 62 | return computeIfAbsent(key, mappingFunction); // 再帰 (無限再帰は発生しない前提) |
63 | 63 | } |
@@ -123,14 +123,16 @@ | ||
123 | 123 | } |
124 | 124 | |
125 | 125 | /** |
126 | - * 非同期実行をシャットダウンして、終了するまで待ちます。 | |
127 | - * すでにシャットダウンされている場合は何も行いません。 | |
126 | + * awaitTermination を VM シャットダウンフックに登録します。<br> | |
127 | + * ここでは待機せずに、制御をすぐに返します。 | |
128 | 128 | */ |
129 | - public static synchronized void shutdownAwait() { | |
129 | + public static synchronized void awaitShutdownHook() { | |
130 | 130 | |
131 | - log.debug("非同期実行をシャットダウンします。"); | |
132 | - threadPoolForceClean = shutdownAwait(threadPoolForceClean); | |
133 | - threadPool = shutdownAwait(threadPool); | |
131 | + Runtime.getRuntime().addShutdownHook(new Thread(() -> { | |
132 | + log.debug("シャットダウンフックによる非同期実行シャットダウン"); | |
133 | + threadPoolForceClean = shutdownAwait(threadPoolForceClean); | |
134 | + threadPool = shutdownAwait(threadPool); | |
135 | + })); | |
134 | 136 | } |
135 | 137 | |
136 | 138 | /** |
@@ -139,6 +141,7 @@ | ||
139 | 141 | * @return 常に null |
140 | 142 | */ |
141 | 143 | private static ExecutorService shutdownAwait(final ExecutorService pool) { |
144 | + | |
142 | 145 | if (pool != null) { |
143 | 146 | try { |
144 | 147 | pool.shutdown(); |
@@ -176,12 +176,12 @@ | ||
176 | 176 | // Eclipse バージョン取得 |
177 | 177 | String buildId = Applicationz.getConfigIni("eclipse.buildId"); |
178 | 178 | if (buildId != null) { |
179 | - // 高速化: 以前はフィーチャーディレクトリ名から取得していたが config.ini から取得に変更 | |
179 | + // 高速化: 以前は features ディレクトリから探索していたが config.ini から取得に変更 | |
180 | 180 | // buildId 例: 4.20.0.I20210611-1600 |
181 | 181 | version = buildId.replaceFirst("^(\\d+\\.\\d+).*", "$1"); // 例: 4.20 |
182 | 182 | year = buildId.replaceFirst("^.+?\\.I(\\d{4}).*", "$1"); // 例: 2021 |
183 | 183 | } |
184 | - // config.ini から取得できない場合、フィーチャーを検索してディレクトリ名から Eclipse バージョン取得 | |
184 | + // config.ini から取得できない場合、features を検索してディレクトリ名から Eclipse バージョン取得 | |
185 | 185 | else { |
186 | 186 | File featuresDir = Applicationz.osgiHome("features"); |
187 | 187 | String[] featureNames = ArrayUtils.nullToEmpty(featuresDir.list()); |
@@ -92,7 +92,7 @@ | ||
92 | 92 | Asyncz.execute("-clean に依存しないプロパティーのロード", () -> { |
93 | 93 | |
94 | 94 | // ログの場所を標準出力 |
95 | - System.out.println("Pleiades ログなどの一時ディレクトリ: " + Pleiades.temp()); | |
95 | + System.out.println("Pleiades ログ出力場所: " + Pleiades.temp()); | |
96 | 96 | |
97 | 97 | // 起動トランスフォーマーのクラス名と Pleiades 起動時間を出力 |
98 | 98 | log.info("Pleiades AOP 起動トランスフォーマーを開始します。%s %.3f 秒", |
@@ -248,7 +248,7 @@ | ||
248 | 248 | // 高速化: main スレッドではなく別スレッドでログ出力 |
249 | 249 | log.info("-clean 元引数:%s 確定後:%s", containsCleanInArgs, pleiadesContext.isClean); |
250 | 250 | |
251 | - // プロセス間排他ロック | |
251 | + // プロセス内排他ロック | |
252 | 252 | // 以前は同期処理の中に入れると ClassCircularityError 発生していたが現在は発生しない 2021.06.12 |
253 | 253 | ProcessLockz.lock(); |
254 | 254 |
@@ -273,7 +273,7 @@ | ||
273 | 273 | |
274 | 274 | } finally { |
275 | 275 | |
276 | - // プロセス間排他ロック解除 | |
276 | + // プロセス内排他ロック解除 | |
277 | 277 | ProcessLockz.release(); |
278 | 278 | } |
279 | 279 | }); |
@@ -357,30 +357,37 @@ | ||
357 | 357 | }); |
358 | 358 | } |
359 | 359 | |
360 | - try { | |
361 | - // プロセス間排他ロック | |
362 | - ProcessLockz.lock(); | |
360 | + Asyncz.execute("キャッシュ保存", () -> { | |
363 | 361 | |
364 | - // AOP でキャッシュ破棄が指示されていた場合 (IDEA のみが使用) | |
365 | - if (TranslationDictionary.getInstance().isInvalidateCache) { | |
362 | + try { | |
363 | + // プロセス内排他ロック | |
364 | + ProcessLockz.lock(); | |
366 | 365 | |
367 | - // キャッシュをクリア | |
368 | - CacheFilez.clear(); | |
366 | + // AOP でキャッシュ破棄が指示されていた場合 (IDEA のみが使用) | |
367 | + if (TranslationDictionary.getInstance().isInvalidateCache) { | |
368 | + | |
369 | + // キャッシュをクリア | |
370 | + CacheFilez.clear(); | |
371 | + | |
372 | + } else { | |
373 | + | |
374 | + // キャッシュを保存 | |
375 | + TransformedClassCache.getInstance().shutdown(); | |
376 | + ExcludeClassNameCache.getInstance().shutdown(); | |
377 | + TranslationDictionary.getInstance().storeCache(); | |
378 | + } | |
379 | + | |
380 | + } catch (Exception e) { | |
381 | + log.warn(e, "キャッシュの更新に失敗しました。"); | |
382 | + | |
383 | + } finally { | |
384 | + | |
385 | + // プロセス内排他ロック解除 | |
386 | + ProcessLockz.release(); | |
387 | + | |
388 | + // awaitTermination を VM シャットダウンフックに登録 | |
389 | + Asyncz.awaitShutdownHook(); | |
369 | 390 | } |
370 | - else { | |
371 | - Asyncz.execute("変換済みクラス・キャッシュ保存", TransformedClassCache.getInstance()::shutdown); | |
372 | - Asyncz.execute("変換除外クラス名キャッシュ保存", ExcludeClassNameCache.getInstance()::shutdown); | |
373 | - Asyncz.execute("翻訳プロパティーキャッシュ保存", TranslationDictionary.getInstance()::shutdown); | |
374 | - Asyncz.shutdownAwait(); | |
375 | - } | |
376 | - | |
377 | - } catch (Exception e) { | |
378 | - log.warn(e, "キャッシュの更新に失敗しました。"); | |
379 | - | |
380 | - } finally { | |
381 | - | |
382 | - // プロセス間排他ロック解除 | |
383 | - ProcessLockz.release(); | |
384 | - } | |
391 | + }); | |
385 | 392 | } |
386 | 393 | } |
@@ -17,9 +17,7 @@ | ||
17 | 17 | import jp.sourceforge.mergedoc.pleiades.log.Logger; |
18 | 18 | |
19 | 19 | /** |
20 | - * プロセス間排他ロック・ユーティリティーです。 | |
21 | - * ロックは 1 つの Pleiades で 1 つ存在し、プロセス間の排他ロックを提供します。 | |
22 | - * <p> | |
20 | + * 同一プロセス内の排他ロック・ユーティリティーです。 | |
23 | 21 | * @author cypher256 |
24 | 22 | */ |
25 | 23 | public class ProcessLockz { |
@@ -37,31 +35,31 @@ | ||
37 | 35 | try { |
38 | 36 | LOCK_FILE.createNewFile(); |
39 | 37 | } catch (IOException e) { |
40 | - log.error(e, "プロセス間排他ロック・ファイルの作成に失敗しました。"); | |
38 | + log.error(e, "プロセス内排他ロック・ファイルの作成に失敗しました。"); | |
41 | 39 | } |
42 | 40 | } |
43 | 41 | |
44 | 42 | /** |
45 | 43 | * プロセスを排他ロックします。 |
46 | - * <pre> | |
47 | - * ・このプロセス内ですでにロックされている場合は何も行いません。 | |
48 | - * ・別プロセスでロックされている場合は一定時間待機します。 | |
49 | - * </pre> | |
44 | + * <ul> | |
45 | + * <li>このプロセス内ですでにロックされている場合は何も行いません。 | |
46 | + * <li>別プロセスでロックされている場合は一定時間待機します。 | |
47 | + * </ul> | |
50 | 48 | */ |
51 | 49 | public synchronized static void lock() { |
52 | - | |
50 | + | |
53 | 51 | if (fileChannel != null) { |
54 | - log.debug("すでにこのプロセス内でロックされています。"); | |
52 | + log.warn("すでにこのプロセス内でロックされています。"); | |
55 | 53 | return; |
56 | 54 | } |
57 | - log.debug("プロセス間排他ロックします。"); | |
58 | - | |
55 | + log.debug("プロセス内排他ロックします。"); | |
56 | + | |
59 | 57 | try (RandomAccessFile raf = new RandomAccessFile(LOCK_FILE.getPath(), "rw")) { |
60 | 58 | fileChannel = raf.getChannel(); |
61 | - | |
59 | + | |
62 | 60 | FileLock lock = fileChannel.tryLock(); |
63 | 61 | for (int i = 0; i < 10 && lock == null; i++) { |
64 | - log.debug("プロセス間排他ロック待機中..."); | |
62 | + log.warn("プロセス内排他ロック待機中..."); | |
65 | 63 | TimeUnit.SECONDS.sleep(i); |
66 | 64 | lock = fileChannel.tryLock(); |
67 | 65 | } |
@@ -69,27 +67,27 @@ | ||
69 | 67 | log.warn("プロセス間の排他ロックを無視して処理を続行します。"); |
70 | 68 | } |
71 | 69 | } catch (IOException | InterruptedException e) { |
72 | - log.error(e, "プロセス間排他ロックに失敗しました。"); | |
70 | + log.error(e, "プロセス内排他ロックに失敗しました。"); | |
73 | 71 | } |
74 | 72 | } |
75 | 73 | |
76 | 74 | /** |
77 | 75 | * プロセスの排他ロックを解除します。 |
78 | - * <pre> | |
79 | - * ・このプロセス内でロックされていない場合は何も行いません。 | |
80 | - * </pre> | |
76 | + * <ul> | |
77 | + * <li>このプロセス内でロックされていない場合は何も行いません。 | |
78 | + * </ul> | |
81 | 79 | */ |
82 | 80 | public synchronized static void release() { |
83 | - | |
81 | + | |
84 | 82 | try { |
85 | 83 | if (fileChannel != null) { |
86 | - | |
87 | - log.debug("プロセス間排他ロックを解除します。"); | |
84 | + | |
85 | + log.debug("プロセス内排他ロックを解除します。"); | |
88 | 86 | fileChannel.close(); |
89 | 87 | fileChannel = null; |
90 | 88 | } |
91 | 89 | } catch (IOException e) { |
92 | - log.error(e, "プロセス間排他ロック解除に失敗しました。"); | |
90 | + log.error(e, "プロセス内排他ロック解除に失敗しました。"); | |
93 | 91 | } |
94 | 92 | } |
95 | 93 | } |
@@ -34,10 +34,14 @@ | ||
34 | 34 | * すべてのキャッシュをクリアします。 |
35 | 35 | */ |
36 | 36 | public static void clear() { |
37 | - Pleiades.temp(TRANS_CACHE_PROP).delete(); | |
38 | - Pleiades.temp(MNEMONIC_CACHE_PROP).delete(); | |
39 | - Pleiades.temp(EXCLUDE_CLASS_LIST).delete(); | |
40 | - Pleiades.temp(TRANSFORMED_CLASS_CACHE).delete(); | |
41 | - log.info("すべてのキャッシュ・ファイルをクリアしました。"); | |
37 | + try { | |
38 | + Pleiades.temp(TRANS_CACHE_PROP).delete(); | |
39 | + Pleiades.temp(MNEMONIC_CACHE_PROP).delete(); | |
40 | + Pleiades.temp(EXCLUDE_CLASS_LIST).delete(); | |
41 | + Pleiades.temp(TRANSFORMED_CLASS_CACHE).delete(); | |
42 | + log.info("すべてのキャッシュ・ファイルをクリアしました。"); | |
43 | + } catch (Exception e) { | |
44 | + log.warn(e, "キャッシュ・ファイルのクリア失敗"); // NPE | |
45 | + } | |
42 | 46 | } |
43 | 47 | } |
@@ -111,7 +111,7 @@ | ||
111 | 111 | * ニーモニックは日本用に変換されます。 |
112 | 112 | * @param en 英語リソース文字列 (ニーモニック含む) |
113 | 113 | * @param joinPoint ジョイン・ポイント |
114 | - * @return 日本語リソース文字列 (ニーモニック含む)。 | |
114 | + * @return 日本語リソース文字列 (ニーモニックを処理する)。 | |
115 | 115 | */ |
116 | 116 | public String translateMnemonic(String en, RuntimeJoinPoint joinPoint) { |
117 | 117 | return translate(en, joinPoint, true); |
@@ -134,7 +134,7 @@ | ||
134 | 134 | * @param en 英語リソース文字列 (ニーモニック含む) : Not null |
135 | 135 | * @param joinPoint ジョイン・ポイント |
136 | 136 | * @param mnemonics ニーモニックを処理する場合は true |
137 | - * @return 日本語リソース文字列 (ニーモニック含む)。 | |
137 | + * @return 日本語リソース文字列 (ニーモニックを処理する)。 | |
138 | 138 | */ |
139 | 139 | // Java 11 以降で private だと AOP エラーになる |
140 | 140 | protected String translate(String en, RuntimeJoinPoint joinPoint, boolean mnemonics) { |
@@ -34,8 +34,7 @@ | ||
34 | 34 | import jp.sourceforge.mergedoc.pleiades.runtime.util.ValueHashPropertySet; |
35 | 35 | |
36 | 36 | /** |
37 | - * キャッシュ機構および実行時除外機構を持つ翻訳辞書クラスです。<br> | |
38 | - * Eclipse 実行時の動的翻訳に利用されるクラスです。 | |
37 | + * 日英翻訳辞書クラスです。 | |
39 | 38 | * @author cypher256 |
40 | 39 | */ |
41 | 40 | public class TranslationDictionary { |
@@ -270,10 +269,14 @@ | ||
270 | 269 | } |
271 | 270 | |
272 | 271 | /** |
273 | - * シャットダウンします。 | |
274 | - * 翻訳プロパティーはキャッシュとして永続化されます。 | |
272 | + * キャッシュを保存します。 | |
273 | + * <ul> | |
274 | + * <li>翻訳プロパティーはキャッシュとして永続化されます。 | |
275 | + * <li>JUnit やツールからの利用時は呼び出す必要はありません | |
276 | + * (キャッシュ・ファイル・パスが解決できないため例外が発生します)。 | |
277 | + * </ul> | |
275 | 278 | */ |
276 | - public void shutdown() { | |
279 | + public void storeCache() { | |
277 | 280 | |
278 | 281 | isLoadedDefault = true; |
279 | 282 | mnemonicCacheProp.store(MNEMONIC_CACHE_FILE); |
@@ -298,20 +301,19 @@ | ||
298 | 301 | /** |
299 | 302 | * 指定した英語リソース文字列から日本語リソースを探します。 |
300 | 303 | * ニーモニックは日本用に変換されます。 |
301 | - * @param enWithMnemonic 英語リソース文字列 (ニーモニック含む) | |
302 | - * @param joinPoint ジョイン・ポイント | |
303 | - * @return 日本語リソース文字列 (ニーモニック含む) | |
304 | + * @param enWithMnemonic 英語リソース文字列 (非 null、ニーモニック含む) | |
305 | + * @return 日本語リソース文字列。見つからない場合は enWithMnemonic。 | |
304 | 306 | */ |
305 | - public String lookup(String enWithMnemonic, RuntimeJoinPoint joinPoint) { | |
306 | - return lookup(enWithMnemonic, joinPoint, true); | |
307 | + public String lookup(String enWithMnemonic) { | |
308 | + return lookup(enWithMnemonic, null, true); | |
307 | 309 | } |
308 | 310 | |
309 | 311 | /** |
310 | 312 | * 指定した英語リソース文字列から日本語リソースを探します。 |
311 | - * @param enWithMnemonic 英語リソース文字列 (ニーモニック含む) : 1 文字以上 | |
312 | - * @param joinPoint ジョイン・ポイント | |
313 | + * @param enWithMnemonic 英語リソース文字列 (非 null、ニーモニック含む) | |
314 | + * @param joinPoint 実行時ジョイン・ポイント (null 可) | |
313 | 315 | * @param mnemonics ニーモニックを処理する場合は true |
314 | - * @return 日本語リソース文字列 (ニーモニック含む) | |
316 | + * @return 日本語リソース文字列。見つからない場合は enWithMnemonic。 | |
315 | 317 | */ |
316 | 318 | public String lookup(String enWithMnemonic, RuntimeJoinPoint joinPoint, boolean mnemonics) { |
317 | 319 |
@@ -320,13 +322,12 @@ | ||
320 | 322 | |
321 | 323 | // 高速化のため、単純に判定可能な場合はニーモニック処理フラグを OFF にする |
322 | 324 | if (mnemonics) { |
323 | - | |
324 | - if (en.length() > 200) { // 文字数が多い場合はニーモニック無しとみなす (HTML などが該当) | |
325 | + if ( | |
326 | + en.length() > 200 || // 文字数が多い場合はニーモニック無しとみなす (HTML などが該当) | |
327 | + en.indexOf('&') == -1 | |
328 | + ) { | |
325 | 329 | mnemonics = false; |
326 | 330 | } |
327 | - else if (en.indexOf('&') == -1) { | |
328 | - mnemonics = false; | |
329 | - } | |
330 | 331 | } |
331 | 332 | |
332 | 333 | // ニーモニック前処理 (除去) |
@@ -358,7 +359,7 @@ | ||
358 | 359 | } |
359 | 360 | |
360 | 361 | // 翻訳プロパティーから日本語訳を取得 |
361 | - String ja = lookupInternal(en, joinPoint); | |
362 | + String ja = lookupInternal(en); | |
362 | 363 | |
363 | 364 | // 訳が見つかった場合 |
364 | 365 | if (!en.equals(ja)) { |
@@ -422,10 +423,9 @@ | ||
422 | 423 | /** |
423 | 424 | * 日本語訳を取得します。 |
424 | 425 | * @param en 英語リソース文字列(ニーモニック無し) |
425 | - * @param joinPoint ジョイン・ポイント | |
426 | 426 | * @return 日本語リソース文字列(ニーモニック無し)。翻訳できない場合は en をそのまま返す。 |
427 | 427 | */ |
428 | - protected String lookupInternal(String en, RuntimeJoinPoint joinPoint) { | |
428 | + protected String lookupInternal(String en) { | |
429 | 429 | |
430 | 430 | // 翻訳キャッシュ・プロパティーから取得 |
431 | 431 | String ja = transCacheProp.get(en); |
@@ -1404,13 +1404,21 @@ | ||
1404 | 1404 | </pointCut> |
1405 | 1405 | |
1406 | 1406 | <!-- |
1407 | - 通常翻訳 (before・第 1 引数) 呼び出しトレースによる除外なし | |
1408 | - STS 起動時の遅延ロードを防ぐため条件付き (STS.properties の %REGEX% 対応もあり) 2021.06.08 | |
1409 | - 例: ClasspathListenerHandler addClasspathListener sts4.classpath.CSIPIcWCisBatched = true | |
1407 | + 通常翻訳 (before・第 1 引数) 呼び出しトレースによる除外なし、キャッシュ抑止条件あり | |
1410 | 1408 | --> |
1411 | 1409 | <pointCut editPoint="execution" timing="before"> |
1412 | 1410 | <advice><![CDATA[ |
1413 | - if ($1 != null && !$1.contains(" sts4.classpath.")) | |
1411 | + if ( | |
1412 | + $1 != null && | |
1413 | + | |
1414 | + // Eclipse キーバインドの競合メッセージ 2021.07.19 | |
1415 | + // 例: A\ conflict\ occurred\ for\ CTRL+SHIFT+T ~ .WorkbenchHandlerServiceHandler@1ff65426, | |
1416 | + !$1.startsWith("A conflict occurred for") && | |
1417 | + | |
1418 | + // STS 起動時の遅延ロードを防ぐため条件付き (STS.properties の %REGEX% 対応もあり) 2021.06.08 | |
1419 | + // 例: ClasspathListenerHandler addClasspathListener sts4.classpath.CSIPIcWCisBatched = true | |
1420 | + !$1.contains(" sts4.classpath.") | |
1421 | + ) | |
1414 | 1422 | $1 = ?{Translationz}.translate($1, null); |
1415 | 1423 | ]]></advice> |
1416 | 1424 |
@@ -9,19 +9,19 @@ | ||
9 | 9 | protected final TranslationDictionary dic = new TranslationDictionary(); |
10 | 10 | |
11 | 11 | protected void assertLookup(String input, String expected) { |
12 | - String result = dic.lookup(input, null); | |
12 | + String result = dic.lookup(input); | |
13 | 13 | System.out.println(input + "=" + result); |
14 | 14 | assertEquals(expected, result); |
15 | 15 | } |
16 | 16 | |
17 | 17 | protected void assertLookupFalse(String input) { |
18 | - String result = dic.lookup(input, null); | |
18 | + String result = dic.lookup(input); | |
19 | 19 | System.out.println(input + "=" + result); |
20 | 20 | assertEquals(input, result); |
21 | 21 | } |
22 | 22 | |
23 | 23 | protected void assertLookupFalse(String input, String expected) { |
24 | - String result = dic.lookup(input, null); | |
24 | + String result = dic.lookup(input); | |
25 | 25 | System.out.println(input + "=" + result); |
26 | 26 | assertEquals(expected, result); |
27 | 27 | } |