001/**
002 * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package com.mybatisflex.core.audit;
017
018import java.net.Inet4Address;
019import java.net.InetAddress;
020import java.net.NetworkInterface;
021import java.util.Enumeration;
022
023/**
024 * 默认的审计消息创建器,用来创建带有 hostIp 的审计消息
025 */
026public class DefaultMessageFactory implements MessageFactory {
027
028    private String platform = "mybatis-flex";
029    private String hostIp = getHostIp();
030
031
032    @Override
033    public AuditMessage create() {
034        AuditMessage message = new AuditMessage();
035        message.setPlatform(platform);
036        message.setHostIp(hostIp);
037        return message;
038    }
039
040
041    private static String getHostIp() {
042        try {
043            for (Enumeration<NetworkInterface> net = NetworkInterface.getNetworkInterfaces(); net.hasMoreElements(); ) {
044                NetworkInterface networkInterface = net.nextElement();
045                if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
046                    continue;
047                }
048                for (Enumeration<InetAddress> addrs = networkInterface.getInetAddresses(); addrs.hasMoreElements(); ) {
049                    InetAddress addr = addrs.nextElement();
050                    if (addr instanceof Inet4Address) {
051                        return addr.getHostAddress();
052                    }
053                }
054            }
055        } catch (Exception e) {
056            // ignore
057        }
058        return "127.0.0.1";
059    }
060}