OSDN Git Service

キャラクターデータの初回インボード時に必ず失敗していた問題の修正 master
authorseraphy <seraphy@users.osdn.me>
Sun, 31 Mar 2019 13:54:56 +0000 (22:54 +0900)
committerseraphy <seraphy@users.osdn.me>
Sun, 31 Mar 2019 14:14:57 +0000 (23:14 +0900)
src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java
src/main/java/charactermanaj/model/io/CharacterDataIniReader.java
src/main/java/charactermanaj/ui/ImportWizardDialog.java
src/main/java/charactermanaj/ui/ProfileListManager.java

index ce0b8c8..f58b266 100644 (file)
@@ -100,7 +100,7 @@ public class CharacterDataDefaultProvider {
                                        cd = prov.loadPredefinedCharacterData(reskey);
                                        cache = new SoftReference<CharacterData>(cd);
                                }
-                               return cd;
+                               return cd.duplicateBasicInfo();
 
                        } catch (IOException ex) {
                                throw new RuntimeException(
index 0ac5b16..dc2ba4a 100644 (file)
@@ -19,7 +19,7 @@ import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterData
 
 /**
  * character.iniファイルを読み込むためのクラス.
- * 
+ *
  * @author seraphy
  */
 public class CharacterDataIniReader {
@@ -33,7 +33,7 @@ public class CharacterDataIniReader {
        /**
         * character.iniファイルから、キャラクター定義を生成します.<br>
         * docBaseは設定されていないため、戻り値に設定する必要があります.<br>
-        * 
+        *
         * @param is
         *            character.iniの入力ストリーム
         * @param version
index 6fe34b6..334c880 100644 (file)
@@ -145,7 +145,7 @@ public class ImportWizardDialog extends JDialog {
         * 現在表示中もしくは選択中のプロファイル.<br>
         * 新規の場合はnull
         */
-       protected CharacterData current;
+       private final CharacterData targetCd;
 
 
        private CardLayout mainPanelLayout;
@@ -179,7 +179,14 @@ public class ImportWizardDialog extends JDialog {
         */
        public ImportWizardDialog(JFrame parent, CharacterData current) {
                super(parent, true);
-               initComponent(parent, current);
+               this.targetCd = current;
+               if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) {
+                       throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません");
+               }
+               if (targetCd != null && !targetCd.isValid()) {
+                       throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません");
+               }
+               initComponent();
        }
 
        /**
@@ -192,7 +199,25 @@ public class ImportWizardDialog extends JDialog {
         */
        public ImportWizardDialog(JDialog parent, CharacterData current) {
                super(parent, true);
-               initComponent(parent, current);
+               this.targetCd = current;
+               if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) {
+                       throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません");
+               }
+               if (targetCd != null && !targetCd.isValid()) {
+                       throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません");
+               }
+               initComponent();
+       }
+
+       /**
+        * インポート先のキャラクターデータを返す。新規の場合はnull
+        * @return インポート先、新規の場合はnull
+        */
+       public CharacterData getTargetCharacterData() {
+               if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) {
+                       throw new IllegalStateException("ファイルベース以外のキャラクターデータにインポートできません: " + targetCd);
+               }
+               return targetCd;
        }
 
        /**
@@ -210,14 +235,8 @@ public class ImportWizardDialog extends JDialog {
        /**
         * ウィザードダイアログのコンポーネントを初期化します.<br>
         * currentがnullの場合は新規インポート、そうでない場合は更新インポートとります。
-        *
-        * @param parent
-        *            親コンテナ
-        * @param current
-        *            インポート対象プロファイル、新規の場合はnull
         */
-       private void initComponent(Component parent, CharacterData current) {
-               this.current = current;
+       private void initComponent() {
 
                setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
@@ -231,7 +250,7 @@ public class ImportWizardDialog extends JDialog {
                                .getLocalizedProperties(STRINGS_RESOURCE);
 
                // タイトル
-               if (current == null) {
+               if (targetCd == null) {
                        setTitle(strings.getProperty("title.new"));
                } else {
                        setTitle(strings.getProperty("title.update"));
@@ -397,7 +416,7 @@ public class ImportWizardDialog extends JDialog {
                // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する
                dim = scaleSupport.manualScaled(dim);
                setSize(dim);
-               setLocationRelativeTo(parent);
+               setLocationRelativeTo(getParent());
 
                mainPanelLayout.first(mainPanel);
                updateBtnPanelState();
@@ -486,13 +505,13 @@ public class ImportWizardDialog extends JDialog {
                        int exitCode;
                        CharacterData importedCharacterData;
                        try {
-                               if (current == null) {
+                               if (targetCd == null) {
                                        // 新規作成
                                        importedCharacterData = createNewProfile();
                                        exitCode = EXIT_PROFILE_CREATED;
                                } else {
                                        // 更新
-                                       importedCharacterData = updateProfile();
+                                       importedCharacterData = updateProfile(targetCd.duplicateBasicInfo());
                                        exitCode = EXIT_PROFILE_UPDATED;
                                }
                        } finally {
@@ -604,15 +623,9 @@ public class ImportWizardDialog extends JDialog {
         * @throws IOException
         *             失敗
         */
-       protected CharacterData updateProfile() throws IOException {
-               if (current == null || !current.isValid()) {
-                       throw new IllegalStateException("current profile is not valid. :" + current);
-               }
-
+       protected CharacterData updateProfile(CharacterData characterData) throws IOException {
                CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
 
-               CharacterData characterData = current.duplicateBasicInfo(); // 現在のもの。(インポートしたものではない)
-
                boolean imported = false;
                boolean modCharacterDef = false;
                boolean modFavories = false;
@@ -673,7 +686,7 @@ public class ImportWizardDialog extends JDialog {
                // キャラクター定義の更新
                if (modCharacterDef) {
                        persist.updateProfile(characterData); // キャラクター定義の構造に変化なし
-                       current.setDescription(characterData.getDescription());
+                       targetCd.setDescription(characterData.getDescription()); // 現在保持しているCdの説明文は更新しておく(念のため)
                }
                // お気に入りの更新
                if (modFavories) {
@@ -1172,7 +1185,7 @@ class ImportFileSelectPanel extends ImportWizardCardPanel {
                }
 
                try {
-                       parent.importModel.openImportSource(importArchive, parent.current);
+                       parent.importModel.openImportSource(importArchive, parent.getTargetCharacterData());
 
                        // ワーカースレッドでアーカイブの読み込みを行う.
                        Worker<Void> worker = new Worker<Void>() {
@@ -1635,7 +1648,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
                                .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE);
 
                // 呼び出しもと情報
-               CharacterData current = parent.current;
+               CharacterData current = parent.getTargetCharacterData();
 
                // キャラクター定義情報
                CharacterData cd = parent.importModel.getCharacterData();
@@ -1818,7 +1831,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
        @Override
        public boolean isReadyFinish() {
                if (!isImportPartsImages() && !isImportPreset()) {
-                       if ((parent != null && parent.current == null)
+                       if ((parent != null && parent.getTargetCharacterData() == null)
                                        || isImportSampleImage()) {
                                // 新規プロファイル作成か、サンプルイメージの更新のみで
                                // イメージもパーツセットもいらなければ、ただちに作成可能.
@@ -2123,13 +2136,14 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
 
                // インポート対象のプロファイルサイズ
                CharacterData characterData;
-               if (parent.current == null) {
+               if (parent.getTargetCharacterData() == null) {
                        // 新規インポート
                        characterData = parent.importModel.getCharacterData();
                } else {
                        // 更新インポート
-                       characterData = parent.current;
+                       characterData = parent.getTargetCharacterData();
                }
+
                int profileWidth = 0;
                int profileHeight = 0;
                if (characterData != null) {
@@ -2155,7 +2169,7 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                actSort.setEnabled(enabled);
                actSortByTimestamp.setEnabled(enabled);
 
-               CharacterData currentProfile = parent.current;
+               CharacterData currentProfile = parent.getTargetCharacterData();
                Collection<PartsImageContent> partsImageContents = parent.importModel.getPartsImageContents();
                PartsManageData partsManageData = parent.importModel.getPartsManageData();
                partsTableModel.initModel(partsImageContents, partsManageData, currentProfile);
@@ -2169,11 +2183,10 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                        }
                }
 
-               String defaultPartsSetId;
-               CharacterData presetImportTarget;
-               boolean selectAllPreset;
-               if (parent.current == null) {
-                       presetImportTarget = null;
+               final String defaultPartsSetId;
+               final CharacterData presetImportTarget = parent.getTargetCharacterData();
+               final boolean selectAllPreset;
+               if (presetImportTarget == null) { // 新規の場合
                        CharacterData cd = parent.importModel.getCharacterData();
                        if (cd != null) {
                                defaultPartsSetId = cd.getDefaultPartsSetId();
@@ -2182,9 +2195,8 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                        }
                        selectAllPreset = true; // 新規プロファイルの場合はプリセットをインポートする
                } else {
-                       presetImportTarget = parent.current;
                        defaultPartsSetId = null; // 既存の場合はデフォルトのパーツセットであるかは表示する必要ないのでnullにする.
-                       selectAllPreset = (parent.current.getPartsCount() == 0); // パーツが空の場合はプリセットをインポートする
+                       selectAllPreset = (presetImportTarget.getPartsCount() == 0); // パーツが空の場合はプリセットをインポートする
                }
 
                parent.importPresetSelectPanel.initModel(partsSets, defaultPartsSetId, presetImportTarget, selectAllPreset);
index fd762bb..f568eba 100644 (file)
@@ -379,7 +379,7 @@ public final class ProfileListManager {
                        logger.info("オープンできるプロファイルがないため、新規プロファイルを作成します。");
                        try {
                                CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();
-                               characterData = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3);
+                               characterData = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3).duplicateBasicInfo();
                                Map<CustomLayerOrderKey, List<CustomLayerOrder>> customLayerPatterns =
                                                defProv.createDefaultCustomLayerOrderMap(characterData, DefaultCharacterDataVersion.V3);
                                persistent.createProfile(characterData, customLayerPatterns);