Skip to content

Commit

Permalink
Merge pull request #63 from igapyon/tiga
Browse files Browse the repository at this point in the history
リファクタリング
  • Loading branch information
igapyon authored Mar 17, 2021
2 parents d16b7d5 + 7d01546 commit e78deff
Show file tree
Hide file tree
Showing 26 changed files with 289 additions and 146 deletions.
Binary file removed .DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
.DS_Store
8 changes: 1 addition & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,12 @@ http://localhost:8080/odata4.svc/ODataAppInfos

# 作業メモ

## 更新内容

- ODataの自動テストを組み込んだ。

## TODO

- Container や Entity のローカル情報体を観察していると、これは CsdlEntitySet などとほぼ一致することに気がつき始めた。extends でカスタムクラスを作成する方向性を考察開始。
- IDについてPrimaryKeyで動作するようにする。データベース項目名も可変にしたい。ただし当面は単一項目でユニークと期待。
- PreparedStatementの入力の型対応に先立ち、引数の型バリエーションを追加。特に日付・日時絡みは調整が必要な見込み。
- PreparedStatementの入力の型対応の追加.
- 実行時エラーを調整すること。現在 IllegalArgumentExceptionでそのまま500になったうえにエラー内容が見えてしまう。ODataApplicationException に対応することが第一案.
- 対応しない命令の場合、適切に例外で異常停止。ODataApplicationExceptionの利用を想定。
- 認証の実験。
- 実験的に全文検索である `$search` をサポートしたものの、もう少し詳しいところが調べられていない。また全文検索で有効なのはアルファベットのみ。h2 database でここを深掘りしても不毛か?
- ($search対応の後続となるため、しばらく対応できない) TODO Null の対応。
- ($search対応の後続となるため、しばらく対応できない) TODO Null (nullable) の対応。現在はコメントアウト.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</parent>
<groupId>jp.oiyokan</groupId>
<artifactId>oiyokan</artifactId>
<version>0.20210317.2</version>
<version>0.20210318.1</version>
<name>oiyokan</name>
<description>Simple OData v4 server.</description>
<properties>
Expand Down
Binary file removed src/.DS_Store
Binary file not shown.
Binary file removed src/main/.DS_Store
Binary file not shown.
Binary file removed src/main/java/.DS_Store
Binary file not shown.
Binary file removed src/main/java/jp/.DS_Store
Binary file not shown.
15 changes: 14 additions & 1 deletion src/main/java/jp/oiyokan/OiyokanConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,22 @@
*/
package jp.oiyokan;

/**
* Oiyokan の定数.
*/
public class OiyokanConstants {
/**
* Oiyokanのバージョン番号
*/
public static final String VERSION = "20210317b";
public static final String VERSION = "20210318a";

/**
* OData v4 からはじまるトレースを出力するかどうか。
*/
public static final boolean IS_TRACE_ODATA_V4 = true;

/**
* 名前.
*/
public static final String NAME = "Oiyokan";
}
40 changes: 37 additions & 3 deletions src/main/java/jp/oiyokan/OiyokanCsdlEntityContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,15 @@
package jp.oiyokan;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityContainer;
import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;

import jp.oiyokan.basic.BasicJdbcEntityTypeBuilder;

/**
* CsdlEntityContainer の Iyokan 拡張
Expand All @@ -28,13 +33,18 @@ public class OiyokanCsdlEntityContainer extends CsdlEntityContainer {
/**
* ネームスペース名. CsdlEntityContainer の上位の概念をここで記述。
*/
private String namespace = "Igapyon.Simple";
private String namespace = "Oiyokan";

/**
* コンテナ名. CsdlEntityContainer の名前そのもの.
*/
private String containerName = "Container";

/**
* CsdlEntityTypeをすでに取得済みであればそれをキャッシュから返却する場合に利用.
*/
private Map<String, CsdlEntityType> cachedCsdlEntityTypeMap = new HashMap<>();

/**
* このコンテナをビルドし、紐づくエンティティセットをここで生成. このクラスの利用者は、機能呼び出し前にこのメソッドを呼ぶこと.
*
Expand All @@ -49,9 +59,9 @@ public void ensureBuild() {
if (getEntitySets().size() == 0) {
// EntitySet の初期セットを実施。
getEntitySets().add(new OiyokanCsdlEntitySet(this, "ODataAppInfos", "ODataAppInfo",
OiyokanCsdlEntitySet.DatabaseType.H2, "ODataAppInfos", null));
OiyokanCsdlEntitySet.DatabaseType.H2, "ODataAppInfos", "ODataAppInfos"));
getEntitySets().add(new OiyokanCsdlEntitySet(this, "MyProducts", "MyProduct",
OiyokanCsdlEntitySet.DatabaseType.H2, "MyProducts", null));
OiyokanCsdlEntitySet.DatabaseType.H2, "MyProducts", "MyProducts"));
}
}

Expand Down Expand Up @@ -115,4 +125,28 @@ public OiyokanCsdlEntitySet getEntitySetByEntityNameFqnIyo(FullQualifiedName ent

return null;
}

/**
* 指定の型名の CsdlEntityType を取得
*
* @param entityTypeName 型名.
* @return 指定の型名の CsdlEntityType.
*/
public CsdlEntityType getEntityType(FullQualifiedName entityTypeName) {
if (getEntitySetByEntityNameFqnIyo(entityTypeName) == null) {
return null;
}

// CsdlEntityTypeをすでに取得済みであればそれをキャッシュから返却する場合に利用.
if (cachedCsdlEntityTypeMap.get(entityTypeName.getFullQualifiedNameAsString()) != null) {
return cachedCsdlEntityTypeMap.get(entityTypeName.getFullQualifiedNameAsString());
}

BasicJdbcEntityTypeBuilder entityTypeBuilder = new BasicJdbcEntityTypeBuilder(
getEntitySetByEntityNameFqnIyo(entityTypeName));
// キャッシュに記憶.
CsdlEntityType newEntityType = entityTypeBuilder.getEntityType();
cachedCsdlEntityTypeMap.put(entityTypeName.getFullQualifiedNameAsString(), newEntityType);
return newEntityType;
}
}
61 changes: 30 additions & 31 deletions src/main/java/jp/oiyokan/OiyokanCsdlEntitySet.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
import org.apache.olingo.commons.api.edm.provider.CsdlEntitySet;
import org.apache.olingo.commons.api.edm.provider.CsdlEntityType;

import jp.oiyokan.basic.BasicJdbcEntityTypeBuilder;

/**
* CsdlEntitySet の Iyokan 拡張
*/
public class OiyokanCsdlEntitySet extends CsdlEntitySet {
/**
* Databaseの型の列挙.
*/
public enum DatabaseType {
/** h2 database */
H2
};

Expand All @@ -36,16 +38,31 @@ public enum DatabaseType {

private DatabaseType dbType = DatabaseType.H2;

/**
* データベース型を取得.
*
* @return データベースの型.
*/
public DatabaseType getDatabaseType() {
return dbType;
}

private CsdlEntityType entityType = null;

/**
* CsdlEntityType を設定.
*
* @param entityType CsdlEntityTypeインスタンス.
*/
public void setEntityType(CsdlEntityType entityType) {
this.entityType = entityType;
}

/**
* CsdlEntityType を取得。
*
* @return CsdlEntityTypeインスタンス.
*/
public CsdlEntityType getEntityType() {
return entityType;
}
Expand All @@ -60,40 +77,33 @@ public CsdlEntityType getEntityType() {
/**
* データベース上のテーブル名.
*/
private String dbTableName = null;
private String dbTableNameLocal = null;

/**
* データベース上のテーブル名.
*/
private String dbTableNameTarget = null;

/**
* EntityType生成ツール.
*/
private BasicJdbcEntityTypeBuilder entityTypeBuilder = null;

/**
* エンティティ情報.
*
* @param containerInfo コンテナ情報.
* @param entitySetName MyProducts 相当.
* @param entityName MyProduct 相当.
* @param dbType データベースタイプ.
* @param dbTableName データベース上のテーブル名.
* @param dbTableNameTarget ターゲットのデータベース上のテーブル名. 通常は null指定.
* @param dbTableNameLocal ローカルのデータベース上のテーブル名.
* @param dbTableNameTarget ターゲットのデータベース上のテーブル名. 通常は dbTableNameLocalと一致.
*/
public OiyokanCsdlEntitySet(OiyokanCsdlEntityContainer containerInfo, String entitySetName, String entityName,
DatabaseType dbType, String dbTableName, String dbTableNameTarget) {
DatabaseType dbType, String dbTableNameLocal, String dbTableNameTarget) {
this.csdlEntityContainer = containerInfo;
this.entityName = entityName;
this.dbType = dbType;
this.dbTableName = dbTableName;
this.dbTableNameLocal = dbTableNameLocal;
this.dbTableNameTarget = dbTableNameTarget;

this.setName(entitySetName);
this.setType(new FullQualifiedName(containerInfo.getNamespaceIyo(), entityName));

this.entityTypeBuilder = new BasicJdbcEntityTypeBuilder(this);
}

/**
Expand All @@ -115,31 +125,20 @@ public FullQualifiedName getEntityNameFqnIyo() {
}

/**
* 独自に追加した項目
* ローカル上のテーブル名
*
* @return DBテーブル名。
* @return ローカルのDBテーブル名.
*/
public String getDbTableNameIyo() {
return dbTableName;
public String getDbTableNameLocalIyo() {
return dbTableNameLocal;
}

/**
* 独自に追加した項目
* ターゲット上のテーブル名.
*
* @return ターゲットのDBテーブル名。指定がある場合は実データ取得の際にはこちらを利用.
* @return ターゲットのDBテーブル名.
*/
public String getDbTableNameTargetIyo() {
return dbTableNameTarget;
}

//////////////////////////////////

/**
* EntityType生成ツールを取得.
*
* @return EntityType生成ツール.
*/
public BasicJdbcEntityTypeBuilder getEdmBuilder() {
return entityTypeBuilder;
}
}
Loading

0 comments on commit e78deff

Please sign in to comment.