「Javaプログラミング能力認定試験課題プログラムのリファクタリングレポート」に触発されて

ryoasai さんの「Javaプログラミング能力認定試験課題プログラムのリファクタリングレポート」に触発されたので、
Java の勉強がてら、同様なプログラムを作成してみる。

Step 12 その4 (ファイル I/O)

こまごまと修正してみた。

ファイル I/O クラス
class Repository<T extends EntityBase> {
    private Map<String, T> entityMap;
    private List<T> entityList;

    public void select(String fileName, boolean readDeleteRec, String searchStr, Class<T> entityClass) {
        FileReader fr = null;
        BufferedReader br = null;

        try {
            entityMap = new LinkedHashMap<String, T >();
            entityList = new ArrayList<T>();

            fr = new FileReader(fileName);
            br = new BufferedReader(fr);

            String inputStr;
            while ((inputStr = br.readLine()) != null) {
                if (!readDeleteRec && !inputStr.endsWith("\t")) continue;

                T entity;
                try {
                    entity = entityClass.newInstance();
                } catch (Exception e) {
                    e.printStackTrace();
                    break;
                }

                entity.fromArray(inputStr.split( "\t"));
                if (!isMatch(entity, searchStr)) continue;

                entityMap.put(entity.getID(), entity);
                entityList.add(entity);
            }
            br.close();
            br = null;

        } catch (IOException e) { //面倒だがException全体をcatchしない方がよい。
            e.printStackTrace();
        } finally {
            // finallyブロックで後処理
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public Map<String, T> getMap() {
        return entityMap;
    }

    public List<T> getList() {
        return entityList;
    }

    public String keySetToString() {
        StringBuffer sb = new StringBuffer();

        for (String key : entityMap.keySet()) {
            sb.append(key);
            sb.append(", ");
        }

        String s = sb.toString();
        return s.substring(0, s.length() - 2);
    }

    public T seek(String id) {
        return entityMap.get(id);
    }

    protected boolean isMatch(T entity, String searchStr) {
        return true;
    }

    public boolean update(String fileName, T entityNew, Class<T> entityClass) {
        select(fileName, true, "", entityClass);

        FileWriter outFile = null;
        BufferedWriter outBuffer = null;

        try {
            outFile = new FileWriter(fileName.replace("txt","tmp"));
            outBuffer = new BufferedWriter(outFile);

            for (T entity: entityList) {
                if (entity.getID().equals(entityNew.getID()))
                    outBuffer.write(entityNew.toString());
                else
                    outBuffer.write(entity.toString());
            }

            outBuffer.flush();
            outBuffer.close();
            outBuffer = null;

            File textFile = new File(fileName);
            File tempFile = new File(fileName.replace("txt","tmp"));
            textFile.delete();
            tempFile.renameTo(textFile);

        } catch (IOException e) { //面倒だがException全体をcatchしない方がよい。
            e.printStackTrace();
            return false;
        } finally {
            // finallyブロックで後処理
            if (outBuffer != null) {
                try {
                    outBuffer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return true;
    }
}

人材マスタ の レコード一覧 (氏名で検索)

class JinzaiRepositoryByName extends Repository {
    @Override
    protected boolean isMatch(EntityBase entity, String searchStr) {
        return (entity.getName().indexOf(searchStr) >= 0);
    }
}

人材マスタ の レコード一覧 (業種で検索)

class JinzaiRepositoryByGyoshu extends Repository {
    @Override
    protected boolean isMatch(EntityBase entity, String searchStr) {
        return (((Jinzai)entity).getGyoshuID().equals(searchStr));
    }
}

稼働状況マスタ の レコード一覧

class KadouRepository extends Repository {
    @Override
    protected boolean isMatch(EntityBase entity, String searchStr) {
        return (((Kadou)entity).getJinzaiID().equals(searchStr));
    }
}