• R/O
  • SSH
  • HTTPS

mergedoc: コミット


コミットメタ情報

リビジョン503 (tree)
日時2009-03-13 05:01:03
作者cypher256

ログメッセージ

(メッセージはありません)

変更サマリ

差分

--- trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/MetadataDefaultInitializer.java (revision 502)
+++ trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/MetadataDefaultInitializer.java (nonexistent)
@@ -1,176 +0,0 @@
1-/*
2- * Copyright (c) 2005- Shinji Kashihara.
3- * All rights reserved. This program are made available under
4- * the terms of the Eclipse Public License v1.0 which accompanies
5- * this distribution, and is available at epl-v10.html.
6- */
7-package jp.sourceforge.mergedoc.pleiades.aspect;
8-
9-import java.io.File;
10-import java.io.IOException;
11-import java.net.URI;
12-import java.net.URISyntaxException;
13-import java.util.Collections;
14-import java.util.LinkedList;
15-import java.util.List;
16-
17-import jp.sourceforge.mergedoc.pleiades.Pleiades;
18-import jp.sourceforge.mergedoc.pleiades.log.Logger;
19-import jp.sourceforge.mergedoc.pleiades.resource.Files;
20-import jp.sourceforge.mergedoc.pleiades.resource.PropertySet;
21-
22-import org.apache.commons.io.FileUtils;
23-
24-/**
25- * metadata デフォルト・イニシャライザーです。
26- * <p>
27- * @author cypher256
28- */
29-public class MetadataDefaultInitializer {
30-
31- /** ロガー */
32- private static Logger log = Logger.getLogger(MetadataDefaultInitializer.class);
33-
34- /** 除外リスト */
35- @SuppressWarnings("serial")
36- private static final List<String> EXCLUDES = Collections.unmodifiableList(new LinkedList<String>() {
37-
38- {
39- // Ant デフォルト除外
40- add(".*~");
41- add("#.*#");
42- add(".#.*");
43- add("%.*%");
44- add("\\._.*");
45- add("CVS");
46- add("\\.cvsignore");
47- add("SCCS");
48- add("vssver\\.scc");
49- add("\\.svn");
50- add("\\.DS_Store");
51-
52- // その他 [#13834]
53- add("\\.bzr"); // Bazaar
54- add("\\.cdv"); // Codeville
55- add("\\.git"); // Git
56- add("\\.hg"); // Mercurial
57- add("\\.pc"); // quilt
58- add("RCS"); // RCS
59- add("_darcs"); // darcs
60- add("_sgbak"); // Vault/Fortress
61-
62- // その他 [#13834] (miau)
63- add("vssver2\\.scc"); // VSS2005
64- add("_svn"); // SVN オプション
65- }
66-
67- @Override
68- public boolean contains(Object name) {
69- for (String pattern : this) {
70- if (((String) name).matches(pattern)) {
71- return true;
72- }
73- }
74- return false;
75- }
76- });
77-
78- /** Eclipse ホーム親ディレクトリー */
79- private final String ECLIPSE_HOME_PARENT;
80-
81- /** metadata デフォルト・ディレクトリー */
82- private File metadataDefaultDir;
83-
84- /** metadata コピー元ルート・ディレクトリー */
85- private File srcRootDir;
86-
87- /** metadata コピー先ルート・ディレクトリー */
88- private File dstRootDir;
89-
90- /** コピー数 */
91- private int copyCount;
92-
93- /**
94- * metadata デフォルトで初期化します。
95- */
96- public static void init() {
97- try {
98- new MetadataDefaultInitializer();
99- } catch (Exception e) {
100- log.error(e, "metadata デフォルト設定の初期化に失敗しました。");
101- }
102- }
103-
104- /**
105- * コンストラクタ。
106- * @throws URISyntaxException
107- * @throws IOException
108- */
109- private MetadataDefaultInitializer() throws URISyntaxException, IOException {
110-
111- File eclipseHomeParent = Pleiades.getEclipseHome().getParentFile();
112- ECLIPSE_HOME_PARENT = (eclipseHomeParent != null)
113- ? eclipseHomeParent.getPath().replace("\\", "/")
114- : null;
115- if (ECLIPSE_HOME_PARENT == null) {
116- return;
117- }
118- metadataDefaultDir = new File(ECLIPSE_HOME_PARENT, ".metadata.default");
119- if (!metadataDefaultDir.exists()) {
120- return;
121- }
122- srcRootDir = new File(metadataDefaultDir, ".plugins");
123- dstRootDir = new File(new File(getWorkspace(), ".metadata"), ".plugins");
124-
125- copyMetadata(srcRootDir);
126-
127- if (copyCount > 0) {
128- log.info(".metadata.default から " + copyCount
129- + " 個のファイルをコピーしました。" + dstRootDir.getParentFile());
130- }
131- }
132-
133- /**
134- * metadata を再帰的にコピーします。
135- * @param srcDir コピー元ディレクトリー
136- * @throws IOException
137- */
138- private void copyMetadata(File srcDir) throws IOException {
139-
140- for (File src : srcDir.listFiles()) {
141-
142- if (EXCLUDES.contains(src.getName())) {
143- continue;
144- }
145- if (src.isDirectory()) {
146- copyMetadata(src); // 再帰
147- } else {
148- File dst = new File(dstRootDir, Files.relativePath(srcRootDir, src));
149- if (!dst.exists()) {
150- String s = FileUtils.readFileToString(src);
151- s = s.replace("%ECLIPSE_HOME_PARENT%", ECLIPSE_HOME_PARENT);
152- FileUtils.writeStringToFile(dst, s);
153- copyCount++;
154- }
155- }
156- }
157- }
158-
159- /**
160- * ワークスペースを取得します。
161- * @return ワークスペース
162- * @throws URISyntaxException
163- */
164- private File getWorkspace() throws URISyntaxException {
165-
166- String workspacePath = System.getProperty("osgi.instance.area");
167- if (workspacePath != null) {
168- return new File(new URI(workspacePath));
169- }
170-
171- File idePrefs = Pleiades.getResourceFile("../.settings/org.eclipse.ui.ide.prefs");
172- String value = new PropertySet(idePrefs).get("RECENT_WORKSPACES");
173- workspacePath = value.replaceFirst("\n.*", "");
174- return new File(workspacePath);
175- }
176-}
Deleted: svn:mime-type
## -1 +0,0 ##
-text/plain
\ No newline at end of property
--- trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/Metadata.java (nonexistent)
+++ trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/Metadata.java (revision 503)
@@ -0,0 +1,187 @@
1+/*
2+ * Copyright (c) 2005- Shinji Kashihara.
3+ * All rights reserved. This program are made available under
4+ * the terms of the Eclipse Public License v1.0 which accompanies
5+ * this distribution, and is available at epl-v10.html.
6+ */
7+package jp.sourceforge.mergedoc.pleiades.aspect;
8+
9+import java.io.File;
10+import java.io.IOException;
11+import java.net.URISyntaxException;
12+import java.util.Collections;
13+import java.util.LinkedList;
14+import java.util.List;
15+
16+import jp.sourceforge.mergedoc.pleiades.Pleiades;
17+import jp.sourceforge.mergedoc.pleiades.log.Logger;
18+import jp.sourceforge.mergedoc.pleiades.resource.Files;
19+import jp.sourceforge.mergedoc.pleiades.resource.PropertySet;
20+
21+import org.apache.commons.io.FileUtils;
22+
23+/**
24+ * metadata を設定するためのクラスです。
25+ * <p>
26+ * @author cypher256
27+ */
28+public class Metadata {
29+
30+ /** ロガー */
31+ private static Logger log = Logger.getLogger(Metadata.class);
32+
33+ /** 除外リスト */
34+ @SuppressWarnings("serial")
35+ private static final List<String> EXCLUDES = Collections.unmodifiableList(new LinkedList<String>() {
36+
37+ {
38+ // Ant デフォルト除外
39+ add(".*~");
40+ add("#.*#");
41+ add(".#.*");
42+ add("%.*%");
43+ add("\\._.*");
44+ add("CVS");
45+ add("\\.cvsignore");
46+ add("SCCS");
47+ add("vssver\\.scc");
48+ add("\\.svn");
49+ add("\\.DS_Store");
50+
51+ // その他 [#13834]
52+ add("\\.bzr"); // Bazaar
53+ add("\\.cdv"); // Codeville
54+ add("\\.git"); // Git
55+ add("\\.hg"); // Mercurial
56+ add("\\.pc"); // quilt
57+ add("RCS"); // RCS
58+ add("_darcs"); // darcs
59+ add("_sgbak"); // Vault/Fortress
60+
61+ // その他 [#13834] (miau)
62+ add("vssver2\\.scc"); // VSS2005
63+ add("_svn"); // SVN オプション
64+ }
65+
66+ @Override
67+ public boolean contains(Object name) {
68+ for (String pattern : this) {
69+ if (((String) name).matches(pattern)) {
70+ return true;
71+ }
72+ }
73+ return false;
74+ }
75+ });
76+
77+ /** Eclipse ホーム親ディレクトリー */
78+ private String eclipseHomeParent;
79+
80+ /** metadata コピー元ディレクトリー */
81+ private File metadataSrcDir;
82+
83+ /** metadata コピー先ディレクトリー */
84+ private File metadataDstDir;
85+
86+ /** 現在のワークスペースのエンコーディング設定 */
87+ private File currentEncodingPrefs;
88+
89+ /** コピー数 */
90+ private int copyCount;
91+
92+ /** エンコーディング設定ファイル・パス */
93+ private static final String ENCODING_PREFS_PATH =
94+ "org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs";
95+
96+ /**
97+ * コンストラクタ。
98+ */
99+ public Metadata() {
100+
101+ File eclipseHomeParentDir = Pleiades.getEclipseHome().getParentFile();
102+ if (eclipseHomeParentDir == null) {
103+ return;
104+ }
105+ eclipseHomeParent = eclipseHomeParentDir.getPath().replace("\\", "/");
106+ metadataSrcDir = new File(eclipseHomeParent, ".metadata.default/.plugins");
107+ if (!metadataSrcDir.exists()) {
108+ return;
109+ }
110+ }
111+
112+ /**
113+ * 新規ワークスペースのデフォルト・エンコーディングを取得します。
114+ * @return 新規ワークスペースでない場合は null
115+ */
116+ public String getNewWorkspaceEncoding() {
117+
118+ if (copyCount == 0) {
119+ return null;
120+ }
121+ File encodingPrefs = null;
122+ if (currentEncodingPrefs != null && currentEncodingPrefs.exists()) {
123+ encodingPrefs = currentEncodingPrefs;
124+ } else {
125+ encodingPrefs = new File(metadataSrcDir, ENCODING_PREFS_PATH);
126+ if (!encodingPrefs.exists()) {
127+ return null;
128+ }
129+ }
130+ PropertySet p = new PropertySet(encodingPrefs);
131+ return p.get("encoding");
132+ }
133+
134+ /**
135+ * 新規ワークスペースの metadata を作成します。
136+ * @param workspace ワークスペース・ロケーション
137+ * @throws URISyntaxException
138+ * @throws IOException
139+ * @return 作成した場合は true
140+ */
141+ public void createNewWorkspaceMetadata(File workspace) throws URISyntaxException, IOException {
142+
143+ if (eclipseHomeParent == null) {
144+ return;
145+ }
146+ if (!metadataSrcDir.exists()) {
147+ return;
148+ }
149+ metadataDstDir = new File(workspace, ".metadata/.plugins");
150+ currentEncodingPrefs = new File(metadataDstDir, ENCODING_PREFS_PATH);
151+ if (currentEncodingPrefs.exists()) {
152+ return;
153+ }
154+
155+ copyMetadata(metadataSrcDir);
156+
157+ log.info(".metadata.default から " + copyCount
158+ + " 個のファイルをコピーしました。" + metadataDstDir.getParentFile());
159+ }
160+
161+ /**
162+ * metadata を再帰的にコピーします。存在する場合は上書きしません。
163+ * @param srcDir コピー元ディレクトリー
164+ * @throws IOException
165+ */
166+ private void copyMetadata(File srcDir) throws IOException {
167+
168+ for (File src : srcDir.listFiles()) {
169+
170+ if (EXCLUDES.contains(src.getName())) {
171+ continue;
172+ }
173+ if (src.isDirectory()) {
174+ copyMetadata(src); // 再帰
175+ } else {
176+ File dst = new File(metadataDstDir, Files.relativePath(metadataSrcDir, src));
177+ if (!dst.exists()) {
178+
179+ String s = FileUtils.readFileToString(src);
180+ s = s.replace("%ECLIPSE_HOME_PARENT%", eclipseHomeParent);
181+ FileUtils.writeStringToFile(dst, s);
182+ copyCount++;
183+ }
184+ }
185+ }
186+ }
187+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/LauncherTransformer.java (revision 502)
+++ trunk/Pleiades/src/jp/sourceforge/mergedoc/pleiades/aspect/LauncherTransformer.java (revision 503)
@@ -11,6 +11,7 @@
1111 import java.lang.instrument.Instrumentation;
1212 import java.lang.reflect.InvocationTargetException;
1313 import java.lang.reflect.Method;
14+import java.net.URL;
1415 import java.security.ProtectionDomain;
1516 import java.util.Arrays;
1617 import java.util.LinkedList;
@@ -42,26 +43,36 @@
4243 /** ロガー */
4344 private static final Logger log = Logger.getLogger(LauncherTransformer.class);
4445
45- /** このクラス名 (static 呼び出し用) */
46+ /** このクラス名 (AOP static 呼び出し用) */
4647 private static final String CLASS_NAME = LauncherTransformer.class.getName();
47-
48+
49+ /** このクラスのインスタンス */
50+ private static LauncherTransformer thisInstance;
51+
52+ /** 変換済みクラス・キャッシュ */
53+ private static volatile TransformedClassCache transformedClassCache;
54+
4855 /** 始動時のワークスペース・ダイアログ表示有無 */
49- private static boolean showWorkspaceSelectionDialog = true;
50-
56+ private static volatile boolean showWorkspaceSelectionDialog = true;
57+
58+ /** metadata */
59+ private static Metadata metadata = new Metadata();
60+
5161 /**
5262 * 起動トランスフォーマーを構築します。
5363 */
5464 public LauncherTransformer() {
65+ thisInstance = this;
5566 load();
5667 }
57-
68+
5869 /**
5970 * プロパティーをロードします。
6071 */
61- protected void load() {
72+ private void load() {
6273
6374 long start = System.nanoTime();
64-
75+
6576 // アスペクト定義をロード
6677 // 注) 別スレッドで処理すると SAXParser でデッドロックする
6778 AspectMapping.getInstance();
@@ -73,10 +84,10 @@
7384
7485 // 翻訳除外パッケージ・プロパティーをロード
7586 ExcludePackageProperties.getInstance();
76-
87+
7788 // 正規表現翻訳プロパティーをロード
7889 RegexDictionary.getInstance();
79-
90+
8091 // 始動時のワークスペース・ダイアログ表示有無を取得
8192 File prefs = Pleiades.getResourceFile("../.settings/org.eclipse.ui.ide.prefs");
8293 if (prefs.exists()) {
@@ -85,7 +96,7 @@
8596 }
8697 }
8798 });
88-
99+
89100 Analyses.end(LauncherTransformer.class, "load", start);
90101 }
91102
@@ -101,11 +112,17 @@
101112 throws CannotCompileException, NotFoundException, IOException {
102113
103114 long start = System.nanoTime();
104-
115+
105116 try {
106- //-------------------------------------------------
117+ if (!className.startsWith("org.eclipse.")) {
118+ return null;
119+ }
120+ byte[] transformedBytecode = null;
121+
122+ //-----------------------------------------------------------
107123 // Main クラスの変換
108- //-------------------------------------------------
124+ // -> 翻訳トランスフォーマーの開始処理を追加
125+ //-----------------------------------------------------------
109126 // 3.2 以前: org.eclipse.core.launcher.Main
110127 // 3.3 以降: org.eclipse.equinox.launcher.Main
111128 if (className.endsWith(".launcher.Main")) {
@@ -115,21 +132,15 @@
115132 CtClass clazz = createCtClass(bytecode, protectionDomain);
116133 CtMethod basicRun = clazz.getMethod("basicRun", "([Ljava/lang/String;)V");
117134 basicRun.insertBefore("$1 = " + CLASS_NAME + ".startTranslationTransformer($$);");
118- // basicRun.insertAfter(CLASS_NAME + ".shutdown();", true);
135+ // basicRun.insertAfter(CLASS_NAME + ".shutdown();", true);
119136 // ↑終了しないうちに起動してしまうのを防ぐため、Workbench クラスに移動
120137
121- // スプラッシュ画像パスを変更
122- PleiadesOption agentOption = Pleiades.getPleiadesOption();
123- if (!agentOption.isDefaultSplash()) {
124- String splashLocation = getSplashLocation();
125- if (splashLocation != null) {
126- System.setProperty("osgi.splashLocation", splashLocation);
127- }
128- }
138+ // Main だけはキャッシュしない
139+ // キャッシュのロードに -clean の判定が必要だが、この時点では -clean 判定できない
129140 return clazz.toBytecode();
130-
141+
131142 } catch (NotFoundException e) {
132-
143+
133144 // Eclipse 3.3 以降、Eclipse アプリケーションとして起動した場合、
134145 // org.eclipse.core.launcher.Main は main メソッドしかなく、このクラスから
135146 // org.eclipse.equinox.launcher.Main#main が呼び出される。
@@ -140,51 +151,80 @@
140151 throw e;
141152 }
142153 }
143- //-------------------------------------------------
154+ //-----------------------------------------------------------
155+ // IDEWorkbenchAdvisor クラスの変換
156+ // -> 新規ワークスペース作成時の metadeta コピー処理を追加
157+ //-----------------------------------------------------------
158+ else if (className.equals("org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor")) {
159+
160+ // ワークスペース・ロケーションを取得
161+ StringBuilder src = new StringBuilder();
162+ src.append("org.eclipse.osgi.service.datalocation.Location loc = null;");
163+ src.append("loc = org.eclipse.core.runtime.Platform.getInstanceLocation();");
164+ src.append("java.net.URL workspace = null;");
165+ src.append("if (loc != null) workspace = loc.getURL();");
166+ src.append(CLASS_NAME + ".copyMetadata(workspace);");
167+
168+ CtClass clazz = createCtClass(bytecode, protectionDomain);
169+ clazz.getDeclaredConstructor(null).insertBefore(src.toString());
170+
171+ transformedBytecode = clazz.toBytecode();
172+ }
173+ //-----------------------------------------------------------
144174 // Workbench クラスの変換
145- //-------------------------------------------------
175+ // -> 終了時のシャットダウン処理を追加
176+ //-----------------------------------------------------------
146177 else if (className.equals("org.eclipse.ui.internal.Workbench")) {
147178
148- // metadata デフォルト初期化 (非同期実行)
149- Asyncs.execute(new Runnable(){
150- public void run() {
151- MetadataDefaultInitializer.init();
152- }
153- });
154-
155179 // 終了時の shutdown
156180 CtClass clazz = createCtClass(bytecode, protectionDomain);
157181 CtMethod shutdown = clazz.getMethod("shutdown", "()V");
158182 shutdown.insertBefore(CLASS_NAME + ".shutdown();");
159-
183+
160184 // イベントループ開始前の処理
161185 CtMethod runEventLoop = clazz.getMethod("runEventLoop",
162186 "(Lorg/eclipse/jface/window/Window$IExceptionHandler;Lorg/eclipse/swt/widgets/Display;)V");
163187 runEventLoop.insertBefore(CLASS_NAME + ".beforeEventLoop($0);");
164-
165- return clazz.toBytecode();
188+
189+ transformedBytecode = clazz.toBytecode();
166190 }
167- //-------------------------------------------------
191+ //-----------------------------------------------------------
168192 // WorkbenchWindows クラスの変換
169- //-------------------------------------------------
193+ // -> preload の場合はウィンドウを座標外に表示
194+ //-----------------------------------------------------------
170195 else if (className.equals("org.eclipse.ui.internal.WorkbenchWindow")) {
171196
172- // このトランスフォーマーをエージェントから削除
173- Pleiades.getInstrumentation().removeTransformer(this);
174-
175- // ワークベンチ復元前の処理
176197 CtClass clazz = createCtClass(bytecode, protectionDomain);
177198 CtMethod restore = clazz.getMethod("restoreState",
178199 "(Lorg/eclipse/ui/IMemento;Lorg/eclipse/ui/IPerspectiveDescriptor;)Lorg/eclipse/core/runtime/IStatus;");
179- restore.insertBefore(CLASS_NAME + ".beforeRestoreState($1);");
180-
181- return clazz.toBytecode();
200+ restore.insertBefore(CLASS_NAME + ".setWindowPosition($1);");
201+
202+ transformedBytecode = clazz.toBytecode();
182203 }
204+ //-----------------------------------------------------------
205+ // WorkspaceRoot クラスの変換
206+ // -> 新規ワークスペース作成時のエンコーディング設定を追加
207+ //-----------------------------------------------------------
208+ else if (className.equals("org.eclipse.core.internal.resources.WorkspaceRoot")) {
183209
184- return null;
185-
210+ // このトランスフォーマーをエージェントから削除
211+ Pleiades.getInstrumentation().removeTransformer(this);
212+
213+ CtClass clazz = createCtClass(bytecode, protectionDomain);
214+ CtMethod getStoredValue = clazz.getMethod("getDefaultCharset", "(Z)Ljava/lang/String;");
215+ getStoredValue.insertAfter("return " + CLASS_NAME + ".getWorkspaceEncoding($_);", true);
216+ transformedBytecode = clazz.toBytecode();
217+ }
218+
219+ // 次回起動用にキャッシュ。
220+ // このメソッドは AOP のみにし、実行時の判定処理があってはいけないことに注意。
221+ if (transformedBytecode != null && transformedClassCache != null) {
222+ transformedClassCache.putNextLaunch(className, transformedBytecode);
223+ }
224+ return transformedBytecode;
225+
186226 } finally {
187-
227+
188228 Analyses.end(LauncherTransformer.class, "transform", start);
189229 }
190230 }
@@ -192,6 +232,9 @@
192232 // ------------------------------------------------------------------------
193233 // 以下、Eclipse に埋め込んだ AOP により呼び出される public static メソッド
194234
235+ // ------------------------------------------------------------------------
236+ // 以下、Eclipse に埋め込んだ AOP により呼び出される public static メソッド
237+
195238 /**
196239 * 翻訳トランスフォーマーを開始します。
197240 * <p>
@@ -201,21 +244,29 @@
201244 public static String[] startTranslationTransformer(String... args) {
202245
203246 long start = System.nanoTime();
204-
247+
205248 try {
206- List<String> argList = new LinkedList<String>(Arrays.asList(args));
249+ // スプラッシュ画像パスを変更
250+ PleiadesOption agentOption = Pleiades.getPleiadesOption();
251+ if (!agentOption.isDefaultSplash()) {
252+ String splashLocation = getSplashLocation();
253+ if (splashLocation != null) {
254+ System.setProperty("osgi.splashLocation", splashLocation);
255+ }
256+ }
207257
208258 // 起動引数の -clean を取得
259+ List<String> argList = new LinkedList<String>(Arrays.asList(args));
209260 PleiadesOption option = Pleiades.getPleiadesOption();
210261 option.setClean(argList.contains("-clean"));
211262 log.info("Eclipse の起動を開始しました。-clean:" + option.isClean());
212-
263+
213264 // キャッシュが無い場合は強制的に -claen を指定
214265 if (!option.isClean()) {
215-
266+
216267 File excludeList = Pleiades.getResourceFile(EXCLUDE_CLASS_LIST);
217268 if (!excludeList.exists()) {
218-
269+
219270 log.info("変換除外クラス名キャッシュが存在しないため、" +
220271 "強制的に -clean モードで起動します。");
221272 argList.add("-clean");
@@ -222,10 +273,16 @@
222273 option.setClean(true);
223274 }
224275 }
225-
276+
277+ // -clean でない場合はこのトランスフォーマーをエージェントから削除
278+ // Main クラス以外は変換済みキャッシュを使用する
279+ if (!option.isClean()) {
280+ Pleiades.getInstrumentation().removeTransformer(thisInstance);
281+ }
282+
226283 // プロセス排他ロック
227284 Locks.lock();
228-
285+
229286 Asyncs.execute(new Runnable(){
230287 public void run() {
231288
@@ -232,25 +289,25 @@
232289 try {
233290 // 変換除外クラス名キャッシュをロード
234291 ExcludesClassNameCache.getInstance();
235-
292+
236293 // 変換済みクラス・キャッシュをロード
237- TransformedClassCache.getInstance();
238-
294+ transformedClassCache = TransformedClassCache.getInstance();
295+
239296 // 翻訳辞書をロード
240297 DynamicTranslationDictionary.getInstance();
241-
298+
242299 } catch (Throwable e) {
243-
300+
244301 log.fatal(e, "リソースのロードに失敗しました。");
245-
302+
246303 } finally {
247-
304+
248305 // プロセス排他ロック解除
249306 Locks.release();
250307 }
251308 }
252309 });
253-
310+
254311 // 翻訳トランスフォーマーを開始
255312 Instrumentation inst = Pleiades.getInstrumentation();
256313 inst.addTransformer(new TranslationTransformer());
@@ -262,14 +319,47 @@
262319 String msg = "翻訳トランスフォーマーの開始に失敗しました。";
263320 log.fatal(msg);
264321 throw new IllegalStateException(msg, e);
265-
322+
266323 } finally {
267-
324+
268325 Analyses.end(LauncherTransformer.class, "startTranslationTransformer", start);
269326 }
270327 }
271-
328+
329+
272330 /**
331+ * metadata をコピーします。
332+ * <p>
333+ * @param workspace ワークスペース・ロケーション
334+ * @throws Exception 例外が発生した場合
335+ */
336+ public static void copyMetadata(final URL workspace) throws Exception {
337+
338+ if (workspace == null) {
339+ log.error("ワークスペース・ロケーションを取得できませんでした。");
340+ return;
341+ }
342+ metadata.createNewWorkspaceMetadata(new File(workspace.getFile()));
343+ }
344+
345+ /**
346+ * 新規ワークスペースの Pleiades 自動設定エンコーディングを取得します。
347+ * 新規ワークスペースでない場合は引数の値をそのまま返します。
348+ * <p>
349+ * @param encoding Eclipse デフォルトのエンコーディング
350+ * @throws Exception 例外が発生した場合
351+ * @return エンコーディング
352+ */
353+ public static String getWorkspaceEncoding(String encoding) throws Exception {
354+
355+ String newWorkspaceEncoding = metadata.getNewWorkspaceEncoding();
356+ if (newWorkspaceEncoding != null) {
357+ return newWorkspaceEncoding;
358+ }
359+ return encoding;
360+ }
361+
362+ /**
273363 * Eclipse イベントループ開始前の処理です。
274364 * <p>
275365 * @param workbench org.eclipse.ui.internal.Workbench インスタンス
@@ -276,7 +366,7 @@
276366 * @throws Exception 例外が発生した場合
277367 */
278368 public static void beforeEventLoop(final Object workbench) throws Exception {
279-
369+
280370 // Eclipse 始動計測時間をログに出力
281371 long startTime = Long.valueOf(System.getProperty("eclipse.startTime"));
282372 long curTime = System.currentTimeMillis();
@@ -283,7 +373,7 @@
283373 final double startupTime = (curTime - startTime) / 1e+3;
284374 Analyses.flashLog("Eclipse 始動完了。始動時間: %.3f 秒。-clean:%s",
285375 startupTime, Pleiades.getPleiadesOption().isClean());
286-
376+
287377 // Eclipse 始動計測時間をステータスバーに出力
288378 if (!showWorkspaceSelectionDialog) {
289379 try {
@@ -299,7 +389,7 @@
299389 log.info("始動時間をステータスバーにセットできませんでした。" + e);
300390 }
301391 }
302-
392+
303393 // システム・プロパティーをログとして出力
304394 if (log.isDebugEnabled()) {
305395 Asyncs.execute(new Runnable(){
@@ -310,7 +400,7 @@
310400 }
311401 });
312402 }
313-
403+
314404 // プリロード用の自動終了
315405 if (Pleiades.getPleiadesOption().isPreload()) {
316406 try {
@@ -320,7 +410,7 @@
320410 log.error(e, "プリロード自動終了呼び出しでエラーが発生しました。");
321411 }
322412 }
323-
413+
324414 // 見た目のための GC 予約
325415 Asyncs.execute(new Runnable(){
326416 public void run() {
@@ -336,11 +426,11 @@
336426 }
337427 }
338428 });
339-
429+
340430 // 非同期ユーティリティーのシャットダウン
341431 Asyncs.shutdown();
342432 }
343-
433+
344434 /**
345435 * ワークベンチ復元前の処理です。
346436 * <p>
@@ -347,10 +437,10 @@
347437 * @param memento org.eclipse.ui.IMemento インスタンス
348438 * @throws Exception 例外が発生した場合
349439 */
350- public static void beforeRestoreState(Object memento) throws Exception {
351-
440+ public static void setWindowPosition(Object memento) throws Exception {
441+
352442 if (Pleiades.getPleiadesOption().isPreload()) {
353-
443+
354444 // プリロード起動時の表示位置に座標外の値をセット
355445 Method putInteger = memento.getClass().getMethod("putInteger", String.class, int.class);
356446 putInteger.invoke(memento, "width", 200);
@@ -357,43 +447,43 @@
357447 putInteger.invoke(memento, "x", -199);
358448 }
359449 }
360-
450+
361451 /**
362452 * 起動トランスフォーマーをシャットダウンします。
363453 */
364454 public static void shutdown() {
365-
455+
366456 new Thread("pleiades-shutdown"){
367457 public void run() {
368-
458+
369459 if (log.isDebugEnabled()) {
370460 Analyses.flashLog("Eclipse 終了。");
371461 }
372-
462+
373463 try {
374464 // プロセス排他ロック
375465 Locks.lock();
376-
466+
377467 // 変換済みクラス・キャッシュを保存
378468 TransformedClassCache.getInstance().shutdown();
379-
469+
380470 // 変換除外クラス名キャッシュを保存
381471 ExcludesClassNameCache.getInstance().shutdown();
382-
472+
383473 // 翻訳プロパティーをキャッシュとして保存
384474 DynamicTranslationDictionary.getInstance().shutdown();
385-
475+
386476 } catch (Exception e) {
387477 log.warn(e, "キャッシュの更新に失敗しました。");
388-
478+
389479 } finally {
390-
480+
391481 // プロセス排他ロック解除
392482 Locks.release();
393-
483+
394484 // 非同期ユーティリティーのシャットダウン (通常はシャットダウン済み)
395485 Asyncs.shutdown();
396-
486+
397487 // プリロード用の自動終了
398488 if (Pleiades.getPleiadesOption().isPreload()) {
399489 System.exit(0);
@@ -410,16 +500,16 @@
410500 private static String getSplashLocation() {
411501
412502 long start = System.nanoTime();
413-
503+
414504 File home = Pleiades.getEclipseHome();
415505 File eclipse = new File(home, "eclipse");
416506 File eclipseExe = new File(home, "eclipse.exe");
417-
507+
418508 // RCP の場合、Pleiades スプラッシュは使用しない
419509 if (!eclipse.exists() && !eclipseExe.exists()) {
420510 return null;
421511 }
422-
512+
423513 // Eclipse のバージョン取得
424514 String eclipseVersion = "";
425515 File pluginsFolder = new File(home, "plugins");
@@ -430,7 +520,7 @@
430520 break;
431521 }
432522 }
433-
523+
434524 // Eclipse バージョンにあった bmp ファイル・パスを取得
435525 String fileName = "splash" + eclipseVersion + ".bmp";
436526 File file = Files.getResourceFile(fileName);
@@ -438,7 +528,7 @@
438528 file = Files.getResourceFile("splash.bmp");
439529 }
440530 String splashLocation = file.getAbsolutePath().replace('\\', '/');
441-
531+
442532 Analyses.end(LauncherTransformer.class, "getSplashLocation", start);
443533 return splashLocation;
444534 }
--- trunk/Pleiades/readme/readme_pleiades_changes.txt (revision 502)
+++ trunk/Pleiades/readme/readme_pleiades_changes.txt (revision 503)
@@ -1,3 +1,8 @@
1+1.3.0.N20090316
2+
3+・ワークスペース選択ダイアログでデフォルト以外の場所を選ぶと自動設定が機能しない問題を修正
4+・GEF、Aptana の未訳分追加
5+
16 ---------------------------------------------------------------------------------------------------
27 1.3.0.I20090308
38
旧リポジトリブラウザで表示