javadoc: error – The code being documented uses modules

Java 11を使ってmvn javadoc:javadocとしたときに

[ERROR] Exit code: 1 - javadoc: error - The code being documented uses modules but the packages defined in https://docs.oracle.com/javase/8/docs/api/ are in the unnamed module.

とか

[ERROR] Exit code: 1 - javadoc: エラー - ドキュメント化しようとしているコードではモジュールが使用されていますが、https://docs.oracle.com/javase/8/docs/api/で定義されているパッケージは名前のないモジュールのものです。

のようなエラーが出るときには、JavaDocの参照するJavaのソースコードのバージョンの問題なので、pom.xmlのjavadocプラグインで、sourceを次のようにして押しておく

      <plugin>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
          <docencoding>UTF-8</docencoding>
          <charset>UTF-8</charset>
          <source>8</source>
        </configuration>
      </plugin>

FessのAzure AD対応

Fess 12.6からAzure ADの認証に対応する予定。対応するためにadal4jを利用したので、OpenID Connectによる認証になる。これに合わせて、SSOまわりの実装をいろいろと変更したので、12.5に入れるには大きな変更になったので、12.6にいれることにした。

実装するにあたり、active-directory-java-webapp-openidconnectというサンプルプロジェクトを参考にしながら作ったのだけど、このサンプルが所々にゴミが残っていたり、コピペ的に作ると痛い目を見る感じだったので、読み解きつつ、リファクタリングして、Fessには取り込んでおいた。

ということで、Azure PortalでAzure ADにアプリ登録をして、system.propertiesに以下を記述することで、Fessでhttp://localhost:8080/sso/にアクセスすると、Azure ADに認証に行ってFessでログイン状態にすることができるようになる。

sso.type=aad
aad.tenant=<tenant_name>.onmicrosoft.com
aad.client.id=...
aad.client.secret=...

sso.typeは以前のバージョンではfess_config.propertiesで設定していたけど、system.propertiesに移すことで、設定がオンラインで変更可能になった。

TikaのLanguageDetector

Tikaには文字列を渡すと、その言語を渡してくれる機能がある。使うためにはまずpom.xmlに以下の依存関係を追加する。

                <dependency>
                        <groupId>org.apache.tika</groupId>
                        <artifactId>tika-langdetect</artifactId>
                        <version>1.20</version>
                </dependency>

あとは、LanguageDetectorを生成して利用する。

import java.io.IOException;

import org.apache.tika.langdetect.OptimaizeLangDetector;
import org.apache.tika.language.detect.LanguageDetector;
import org.apache.tika.language.detect.LanguageResult;

public class LanguageDetectorExample {

    public String detectLanguage(String text) throws IOException {
        LanguageDetector detector = new OptimaizeLangDetector().loadModels();
        LanguageResult result = detector.detect(text);
        return result.getLanguage();
    }
}

上記はTikaにあるexampleコードだが、OptimaizeLangDetectorをnewして、loadModels()でLanguageDetectorを取得する。あとはLanguageDetectorに言語判定したいテキストを渡せば言語情報が返ってくる。

まぁ、とはいえ、そこそこ判定が外れる気もする…。

_sourceからデータを消しておく

クエリー時に_sourceに含めないという設定もあるけど、インデックス時に_sourceに入れないでおくという方法もある。Fess 13ではこの機能を使ってハイブリットな言語用インデックスで検索する予定ではある。

で、使うためにはElasticsearchのサイトにもあるような感じで

$ curl -X PUT "localhost:9200/fess" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc": {
"_source": {
"excludes": [
"content_*",
"title_*"
]
}
}
}
}
'

のようにすれば、title_〜とcontent_〜のプロパティは_sourceに保存されなくなる。

でも、Fessではcontent_lengthは除外したくないので、

$ curl -X PUT "localhost:9200/fess" -H 'Content-Type: application/json' -d'
{
"mappings": {
"_doc": {
"_source": {
"includes": [
"content_length"
],
"excludes": [
"content_*",
"title_*"
]
}
}
}
}
'

としたところ、全部が消えることになり、期待する動きとは違っていた…。つまり、includes > excludesの順に処理するっぽい。というわけで、Fessではexcludesにワイルドカードを使わずに明示して対応した。