попробую изложить суть задачи
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 только параметр фильтра. Можно ли как то упростить данный код?
Упростить используя рефлекшн можно, например, так:
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
столкнулся с проблемой в использовании API сторонней библиотеки TimeseriesДля инициализации объекта требуется параметр с типом double
У меня написана программа на SeleniumПри ее запуске обрабатывается параллельно 6 сайтов с помощью многопоточности Java