0

Javaを使用してDiameterURI(以下の説明)を検証するための簡単な方法があるかどうか疑問に思っていますか?

Note, a Diameter URI must have one of the forms:

aaa://FQDN[:PORT][;transport=TRANS][;protocol=PROT]
aaas://FQDN[:PORT][;transport=TRANS][;protocol=PROT]

The FQDN (mandatory) has to be replaced with the fully qualified host name (or IP), the PORT (optional, default is 3868) with the port number, TRANS (optional) with the transport protocol (can be TCP or SCTP) and PROT (optional) with diameter.

Some examples of the acceptable forms are:

aaa://server.com
aaa://127.0.0.1
aaa://server.com:1234
aaas://server.com:1234;transport=tcp
aaas://[::1]
aaas://[::1]:1234
aaas://[::1]:1234;transport=tcp;protocol=diameter

Note, as shown above, if using an IPv6 address, the address must be placed in box brackets, whereas the port number (if specified), with its colon separator, should be outside of the brackets.

正規表現を使用してこれを行うのは非常に面倒で理解しにくいと思います。また、正規表現を使用しない他の例も同様に見苦しいです(https://code.google.com/p/cipango/など)。 source / browser / trunk / cipango-diameter / src / main / java / org / cipango / diamond / util / AAAUri.java?r = 763)。

それで、これを行うためのより良い方法があるかどうか疑問に思っていました。たとえば、いくつかのルール(上記のDiameter URIのルールなど)を取り、それを検証するためにいくつかの入力に適用するURIバリデーターライブラリのようなものがありますか?

Google Guavaライブラリも調べて、役立つものがあるかどうかを確認しましたが、手元にあるものは何も見つかりませんでした。

どうもありがとう!

4

1 に答える 1

2

URIクラスは十分ではなく、実際には有効なDiameter URIの例外が作成されるため、これはそれほど簡単な作業ではありません。

正規表現だと思います。ここに行く方法ですが、複雑なため、ヘルパークラスに配置した方がよい場合があります。あなたがリンクしたコードがあまり良く見えなかったことに同意します-あなたはもっとうまくやることができます!:)

次のコード例を見てください。ここでは、何が起こっているかを「文書化」する方法として、正規表現を個々の部分に分解しています。

完全なものではなく、例に準拠するように作成されています。特にIP6タイプのアドレスは作業が必要です。さらに、検証でより多くの情報を提供したい場合があります。なぜ失敗したのか。

しかし、少なくともそれは始まりであり、リンクしたコードよりもかなり優れていると思います。非常に多くのコードのように見えるかもしれませんが、ほとんどは実際には出力ステートメントとテストです... :)さらに、各部分は分解されてフィールド変数として保持されるため、各部分にアクセスするための単純なゲッターを作成できます(それがあなたにとって重要である場合)。

import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DiameterUri {

    private String diameterUri;
    private String protocol;
    private String host;
    private String port;
    private String[] params;

    public DiameterUri(String diameterUri) throws URISyntaxException {
        this.diameterUri = diameterUri;
        validate();
        System.out.println(diameterUri);
        System.out.println("  protocol=" + protocol);
        System.out.println("  host=" + host);
        System.out.println("  port=" + port);
        System.out.println("  params=" + Arrays.toString(params));
    }

    private void validate() throws URISyntaxException {
        String protocol = "(aaa|aaas)://";              // protocol- required
        String ip4 = "[A-Za-z0-9.]+";                   // ip4 address - part of "host"
        String ip6 = "\\[::1\\]";                       // ip6 address - part of "host"
        String host = "(" + ip4 + "|" + ip6 + ")";      // host - required
        String port = "(:\\d+)?";                       // port - optional (one occurrence)
        String params = "((;[a-zA-Z0-9]+=[a-zA-Z0-9]+)*)"; // params - optional (multiple occurrences)
        String regEx = protocol + host + port + params;
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(diameterUri);
        if (matcher.matches()) {
            this.protocol = matcher.group(1);
            this.host = matcher.group(2);
            this.port = matcher.group(3) == null ? null : matcher.group(3).substring(1);
            String paramsFromUri = matcher.group(4);
            if (paramsFromUri != null && paramsFromUri.length() > 0) {
                this.params = paramsFromUri.substring(1).split(";");
            } else {
                this.params = new String[0];
            }
        } else {
            throw new URISyntaxException(diameterUri, "invalid");
        }
    }

    public static void main(String[] args) throws URISyntaxException {
        new DiameterUri("aaa://server.com");
        new DiameterUri("aaa://127.0.0.1");
        new DiameterUri("aaa://server.com:1234");
        new DiameterUri("aaas://server.com:1234;transport=tcp");
        new DiameterUri("aaas://[::1]");
        new DiameterUri("aaas://[::1]:1234");
        new DiameterUri("aaas://[::1]:1234;transport=tcp;protocol=diameter");
        try {
            new DiameterUri("127.0.0.1");
            throw new RuntimeException("Expected URISyntaxException");
        } catch (URISyntaxException ignore) {}
    }

}
于 2013-03-24T20:35:37.757 に答える