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

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

Step 16 その10 (ファイル 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, Matcher matcher, 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 (!matcher.isMatch(entity)) 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);
    }

    public String getNewID() {
        int maxId = 0;

        for (T entity : entityList) {
            int id = 0;
            try {
                id = Integer.parseInt(entity.getID()); 
                if (maxId < id)
                    maxId = id;
            } catch (Exception e) {
            }
        }

        return Integer.toString(++maxId);
    }

    // データ 追加・変更・削除 処理
    public boolean update(String fileName, T entityNew, Matcher matcher) {
        FileWriter outFile = null;
        BufferedWriter outBuffer = null;

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

            boolean isFind = false;
            for (T entity: entityList) {
                if (matcher.isMatch(entity)) {
                    outBuffer.write(entityNew.toString());
                    isFind = true;
                } else {
                    outBuffer.write(entity.toString());
                }
            }
            if (!isFind)
                outBuffer.write(entityNew.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;
    }
}

検索用 Base Class

class Matcher {
    protected EntityBase entity1;

    Matcher(EntityBase entity1) {
        this.entity1 = entity1;
    }

    public boolean isMatch(EntityBase entity2) {
        return true;
    }
}

人材マスタ 氏名で検索

class JinzaiMatcherByName extends Matcher {
    JinzaiMatcherByName(EntityBase entity1) {
        super(entity1);
    }

    @Override
    public boolean isMatch(EntityBase entity2) {
        return (entity2.getName().indexOf(entity1.getName()) >= 0);
    }
}

人材マスタ 業種で検索

class JinzaiMatcherByGyoshu extends Matcher {
    JinzaiMatcherByGyoshu(EntityBase entity1) {
        super(entity1);
    }

    @Override
    public boolean isMatch(EntityBase entity2) {
        return (((Jinzai)entity1).getGyoshuID().equals(((Jinzai)entity2).getGyoshuID()));
    }
}

人材マスタ 人材IDで検索

class JinzaiMatcher extends Matcher {
    JinzaiMatcher(EntityBase entity1) {
        super(entity1);
    }

    @Override
    public boolean isMatch(EntityBase entity2) {
        return (((Jinzai)entity1).getID().equals(((Jinzai)entity2).getID()));
    }
}

稼働状況マスタ 人材ID・稼動状況番号で検索

class KadouMatcher extends Matcher {
    KadouMatcher(EntityBase entity1) {
        super(entity1);
    }

    @Override
    public boolean isMatch(EntityBase entity2) {
        return (((Kadou)entity1).getJinzaiID().equals(((Kadou)entity2).getJinzaiID()) && ((Kadou)entity1).getID().equals(((Kadou)entity2).getID()));
    }
}

稼働状況マスタ 人材IDで検索

class KadouMatcherByJinzai extends Matcher {
    KadouMatcherByJinzai(EntityBase entity1) {
        super(entity1);
    }

    @Override
    public boolean isMatch(EntityBase entity2) {
        return (((Kadou)entity1).getJinzaiID().equals(((Kadou)entity2).getJinzaiID()));
    }
}