Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void handleRequest(MethodCallMessage message) throws IllegalAccessException, InvocationTargetException {
- Optional<Method> first =
- Arrays.stream(implementation.getClass().getDeclaredMethods())
- .filter(m -> m.getName().equals(message.getMethodName())).findFirst();
- if (message.getParameters().size() != message.getParametersStartingWith("arg").size()) {
- throw new RuntimeException("Parameter name format wrong");
- }
- if (!first.isPresent()) throw new RuntimeException("Couldn't find method");
- Method m = first.get();
- message.getParameters().keySet().forEach(System.out::println);
- int sizeOfMethocCallParams = (int) message.getParameters().keySet().stream()
- .map(k -> k.split("\\.")[0]).distinct().count();
- int sizeOfMethodParams = m.getParameterCount();
- if (sizeOfMethocCallParams != sizeOfMethodParams) throw new RuntimeException("Parameter count don't match");
- Object returnedObject = null;
- if (sizeOfMethodParams > 0) {
- Object[] newParameters = new Object[sizeOfMethodParams];
- for (int i = 0; i < sizeOfMethocCallParams; i++) {
- Map<String, String> parametersStartingWith = message.getParametersStartingWith("arg" + i);
- Object object = null;
- if (parametersStartingWith.size() > 1) {
- Class<?> returnType = m.getParameterTypes()[i];
- Field[] fields = returnType.getDeclaredFields();
- Object instance = null;
- try {
- System.out.println(returnType);
- instance = returnType.getDeclaredConstructor().newInstance();
- } catch (InstantiationException | NoSuchMethodException e) {
- e.printStackTrace();
- }
- for (Map.Entry<String, String> stringStringEntry : parametersStartingWith.entrySet()) {
- String paramName = stringStringEntry.getKey().split("\\.")[1];
- System.out.println(paramName);
- Arrays.stream(fields).forEach(System.out::println);
- Optional<Field> field = Arrays.stream(fields).filter(f -> f.getName().equals(paramName)).findFirst();
- if (field.isPresent()) {
- System.out.println("present");
- Field field1 = field.get();
- field1.setAccessible(true);
- field1.set(instance, parseToCorretObject(field1.getType(), stringStringEntry.getValue()));
- }
- }
- object = instance;
- } else {
- object = parseToCorretObject(m.getParameterTypes()[i], parametersStartingWith.get("arg" + i));
- }
- newParameters[i] = object;
- }
- returnedObject = m.invoke(implementation, newParameters);
- } else {
- returnedObject = m.invoke(implementation);
- System.out.println("Invoked method: " + m);
- }
- System.out.println(returnedObject);
- if (returnedObject != null) {
- MethodCallMessage methodCallMessage = new MethodCallMessage(messageManager.getMyAddress(), "result");
- if (parameterTypes.contains(returnedObject.getClass())) {
- methodCallMessage.setParameter("result", returnedObject.toString());
- } else {
- Field[] declaredFields = returnedObject.getClass().getDeclaredFields();
- for (Field field : declaredFields) {
- field.setAccessible(true);
- methodCallMessage.setParameter("result." + field.getName(), field.get(returnedObject).toString());
- }
- }
- messageManager.send(methodCallMessage, message.getOriginator());
- } else {
- sendEmptyReply(message.getOriginator());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement