Поиск метода по запросу

233
10 февраля 2019, 05:20

попробую изложить суть задачи

class Log
{
    String ip;
    String user;
    Date date;
    Event event;
    String number;
    Status status;}

Имеется соответствующий класс Log, все поля класса имеют геттеры. Необходимо реализовать метод который Получает запрос String с параметром:

get field1 for field2 = "value1"

Где: field1 - одно из полей: ip, user, date, event или status; field2 - одно из полей: ip, user, date, event или status; value1 - значение поля field2. Алгоритм обработки запроса следующий: просматриваем записи в логе, если поле field2 имеет значение value1, то добавляем поле field1 в множество, которое затем будет возвращено методом execute. Так вот я реализовал метод используя switch-case

public Set<Object> execute(String query) {
if (Log.testhelper(query))
                if (Log.testhelper(query))
            {
                String[]values=query.split(" = ");
                String value1=values[1].replace("\"","");
                String[]fields=values[0].split(" ");
                String field1=fields[1];
                String field2=fields[3];
                switch (field1)
                {
                    case "ip":
                    {
                        if (field2.equals("ip"))
                        {return logList.stream()
                                .filter(log -> log.getIp().equals(value1))
                                .map(log -> log.getIp())
                                .collect(Collectors.toSet());}
                        if (field2.equals("user"))
                        {return logList.stream()
                        .filter(log -> log.getUser().equals(value1))
                        .map(log -> log.getIp())
                        .collect(Collectors.toSet());}
                        if (field2.equals("date"))
                        {Date vdate=null;
                            try {
                                vdate=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(value1);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            Date finalVdate = vdate;
                            return logList.stream()
                                .filter(log -> log.getDate().equals(finalVdate))
                                .map(log -> log.getIp())
                                .collect(Collectors.toSet());}
                        if (field2.equals("event"))
                        {Event event=null;
                            if (value1.equals("LOGIN"))event=Event.LOGIN;
                            if (value1.equals("DOWNLOAD_PLUGIN"))event=Event.DOWNLOAD_PLUGIN;
                            if (value1.equals("WRITE_MESSAGE"))event=Event.WRITE_MESSAGE;
                            if (value1.equals("SOLVE_TASK"))event=Event.SOLVE_TASK;
                            if (value1.equals("DONE_TASK"))event=Event.DONE_TASK;
                            Event finalEvent = event;
                            return logList.stream()
                                .filter(log -> log.getEvent().equals(finalEvent))
                                .map(log -> log.getIp())
                                .collect(Collectors.toSet());}
                        if (field2.equals("status"))
                        {Status status=null;
                            if (value1.equals("OK"))status=Status.OK;
                            if (value1.equals("FAILED"))status=Status.FAILED;
                            if (value1.equals("ERROR"))status=Status.ERROR;
                            Status finalStatus = status;
                            return logList.stream()
                                .filter(log -> log.getStatus().equals(finalStatus))
                                .map(log -> log.getIp())
                                .collect(Collectors.toSet());}
                    }
                    case "user":
                    {
                        if (field2.equals("ip"))
                        {return logList.stream()
                                .filter(log -> log.getIp().equals(value1))
                                .map(log -> log.getUser())
                                .collect(Collectors.toSet());}
                        if (field2.equals("user"))
                        {return logList.stream()
                                .filter(log -> log.getUser().equals(value1))
                                .map(log -> log.getUser())
                                .collect(Collectors.toSet());}
                        if (field2.equals("date"))
                        {Date vdate=null;
                            try {
                                vdate=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(value1);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            Date finalVdate = vdate;
                            return logList.stream()
                                    .filter(log -> log.getDate().equals(finalVdate))
                                    .map(log -> log.getUser())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("event"))
                        {Event event=null;
                            if (value1.equals("LOGIN"))event=Event.LOGIN;
                            if (value1.equals("DOWNLOAD_PLUGIN"))event=Event.DOWNLOAD_PLUGIN;
                            if (value1.equals("WRITE_MESSAGE"))event=Event.WRITE_MESSAGE;
                            if (value1.equals("SOLVE_TASK"))event=Event.SOLVE_TASK;
                            if (value1.equals("DONE_TASK"))event=Event.DONE_TASK;
                            Event finalEvent = event;
                            return logList.stream()
                                    .filter(log -> log.getEvent().equals(finalEvent))
                                    .map(log -> log.getUser())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("status"))
                        {Status status=null;
                            if (value1.equals("OK"))status=Status.OK;
                            if (value1.equals("FAILED"))status=Status.FAILED;
                            if (value1.equals("ERROR"))status=Status.ERROR;
                            Status finalStatus = status;
                            return logList.stream()
                                    .filter(log -> log.getStatus().equals(finalStatus))
                                    .map(log -> log.getUser())
                                    .collect(Collectors.toSet());}
                    }
                    case "date":
                    {
                        if (field2.equals("ip"))
                        {return logList.stream()
                                .filter(log -> log.getIp().equals(value1))
                                .map(log -> log.getDate())
                                .collect(Collectors.toSet());}
                        if (field2.equals("user"))
                        {return logList.stream()
                                .filter(log -> log.getUser().equals(value1))
                                .map(log -> log.getDate())
                                .collect(Collectors.toSet());}
                        if (field2.equals("date"))
                        {Date vdate=null;
                            try {
                                vdate=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(value1);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            Date finalVdate = vdate;
                            return logList.stream()
                                    .filter(log -> log.getDate().equals(finalVdate))
                                    .map(log -> log.getDate())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("event"))
                        {Event event=null;
                            if (value1.equals("LOGIN"))event=Event.LOGIN;
                            if (value1.equals("DOWNLOAD_PLUGIN"))event=Event.DOWNLOAD_PLUGIN;
                            if (value1.equals("WRITE_MESSAGE"))event=Event.WRITE_MESSAGE;
                            if (value1.equals("SOLVE_TASK"))event=Event.SOLVE_TASK;
                            if (value1.equals("DONE_TASK"))event=Event.DONE_TASK;
                            Event finalEvent = event;
                            return logList.stream()
                                    .filter(log -> log.getEvent().equals(finalEvent))
                                    .map(log -> log.getDate())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("status"))
                        {Status status=null;
                            if (value1.equals("OK"))status=Status.OK;
                            if (value1.equals("FAILED"))status=Status.FAILED;
                            if (value1.equals("ERROR"))status=Status.ERROR;
                            Status finalStatus = status;
                            return logList.stream()
                                    .filter(log -> log.getStatus().equals(finalStatus))
                                    .map(log -> log.getDate())
                                    .collect(Collectors.toSet());}
                    }
                    case "event":
                    {
                        if (field2.equals("ip"))
                        {return logList.stream()
                                .filter(log -> log.getIp().equals(value1))
                                .map(log -> log.getEvent())
                                .collect(Collectors.toSet());}
                        if (field2.equals("user"))
                        {return logList.stream()
                                .filter(log -> log.getUser().equals(value1))
                                .map(log -> log.getEvent())
                                .collect(Collectors.toSet());}
                        if (field2.equals("date"))
                        {Date vdate=null;
                            try {
                                vdate=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(value1);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            Date finalVdate = vdate;
                            return logList.stream()
                                    .filter(log -> log.getDate().equals(finalVdate))
                                    .map(log -> log.getEvent())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("event"))
                        {Event event=null;
                            if (value1.equals("LOGIN"))event=Event.LOGIN;
                            if (value1.equals("DOWNLOAD_PLUGIN"))event=Event.DOWNLOAD_PLUGIN;
                            if (value1.equals("WRITE_MESSAGE"))event=Event.WRITE_MESSAGE;
                            if (value1.equals("SOLVE_TASK"))event=Event.SOLVE_TASK;
                            if (value1.equals("DONE_TASK"))event=Event.DONE_TASK;
                            Event finalEvent = event;
                            return logList.stream()
                                    .filter(log -> log.getEvent().equals(finalEvent))
                                    .map(log -> log.getEvent())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("status"))
                        {Status status=null;
                            if (value1.equals("OK"))status=Status.OK;
                            if (value1.equals("FAILED"))status=Status.FAILED;
                            if (value1.equals("ERROR"))status=Status.ERROR;
                            Status finalStatus = status;
                            return logList.stream()
                                    .filter(log -> log.getStatus().equals(finalStatus))
                                    .map(log -> log.getEvent())
                                    .collect(Collectors.toSet());}
                    }
                    case "status":
                    {
                        if (field2.equals("ip"))
                        {return logList.stream()
                                .filter(log -> log.getIp().equals(value1))
                                .map(log -> log.getStatus())
                                .collect(Collectors.toSet());}
                        if (field2.equals("user"))
                        {return logList.stream()
                                .filter(log -> log.getUser().equals(value1))
                                .map(log -> log.getStatus())
                                .collect(Collectors.toSet());}
                        if (field2.equals("date"))
                        {Date vdate=null;
                            try {
                                vdate=new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").parse(value1);
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            Date finalVdate = vdate;
                            return logList.stream()
                                    .filter(log -> log.getDate().equals(finalVdate))
                                    .map(log -> log.getStatus())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("event"))
                        {Event event=null;
                            if (value1.equals("LOGIN"))event=Event.LOGIN;
                            if (value1.equals("DOWNLOAD_PLUGIN"))event=Event.DOWNLOAD_PLUGIN;
                            if (value1.equals("WRITE_MESSAGE"))event=Event.WRITE_MESSAGE;
                            if (value1.equals("SOLVE_TASK"))event=Event.SOLVE_TASK;
                            if (value1.equals("DONE_TASK"))event=Event.DONE_TASK;
                            Event finalEvent = event;
                            return logList.stream()
                                    .filter(log -> log.getEvent().equals(finalEvent))
                                    .map(log -> log.getStatus())
                                    .collect(Collectors.toSet());}
                        if (field2.equals("status"))
                        {Status status=null;
                            if (value1.equals("OK"))status=Status.OK;
                            if (value1.equals("FAILED"))status=Status.FAILED;
                            if (value1.equals("ERROR"))status=Status.ERROR;
                            Status finalStatus = status;
                            return logList.stream()
                                    .filter(log -> log.getStatus().equals(finalStatus))
                                    .map(log -> log.getStatus())
                                    .collect(Collectors.toSet());}
                    }
                }
            }

Но по сути от значения field1 зависит строка .map(log -> log.getStatus()) так же как от field2 только параметр фильтра. Можно ли как то упростить данный код?

Answer 1

Упростить используя рефлекшн можно, например, так:

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class So {
  public static void main(String[] args) throws ParseException, IllegalAccessException {
    String field1 = "ip";
    String field2 = "name";
    String value2 = "username";
    Log log = new Log("127.0.0.1", "username", "#1", Event.LOGIN);
    Object o = filterAndGetValue(log, "ip", "user", "username");
    System.out.println(o);

  }
  static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

  static Object filterAndGetValue(Log log, String field1String, String field2String, String value2) throws IllegalAccessException, ParseException {
    Field field1 = null;
    Field field2 = null;
    for (Field field : Log.class.getDeclaredFields()) {
      field.setAccessible(true);
      if (field.getName().equals(field1String)) {
        field1 = field;
      }
      if (field.getName().equals(field2String)) {
        field2 = field;
      }
    }
    if (field1 == null || field2 == null) {
      throw new IllegalArgumentException("No such fields");
    }
    Object actualValue = null;
    Class<?> type = field2.getType();
    if (type.equals(String.class)) {
      actualValue = value2;
    } else if (type.equals(Date.class)) {
      actualValue = simpleDateFormat.parse(value2);
    } else if (type.equals(Event.class)) {
      actualValue = Event.valueOf(value2);
    }

    if (actualValue == null) {
      throw new UnsupportedOperationException(String.format("Search through fields of type %s is not supported", type.getSimpleName()));
    }
    if (field2.get(log).equals(actualValue)) {
      return field1.get(log);
    } else {
      return null;
    }
  }
  enum Event {
    LOGIN;
  }
  static class Log {
    private String ip;
    private String user;
    private String number;
    private Event event;
    public Log(String ip, String user, String number, Event event) {
      this.ip = ip;
      this.user = user;
      this.number = number;
      this.event = event;
    }
  }
}

Так же можно использовать FieldUtils из ApacheCommons или ReflectionUtils из Spring

READ ALSO
API яндекс карт rest controller

API яндекс карт rest controller

Всем приветЕсть такая задача

166
Что означает double&hellip; в java

Что означает double… в java

столкнулся с проблемой в использовании API сторонней библиотеки TimeseriesДля инициализации объекта требуется параметр с типом double

167
Как ускорить работу программы на Selenium?

Как ускорить работу программы на Selenium?

У меня написана программа на SeleniumПри ее запуске обрабатывается параллельно 6 сайтов с помощью многопоточности Java

167