All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mugui.base.client.net.baghandle.NetHandle Maven / Gradle / Ivy

There is a newer version: 0.0.8
Show newest version
package com.mugui.base.client.net.baghandle;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSONObject;
import com.mugui.Mugui;
import com.mugui.base.base.ApplicationContext;
import com.mugui.base.base.Autowired;
import com.mugui.base.base.Component;
import com.mugui.base.client.net.bagsend.NetCall;
import com.mugui.base.client.net.bagsend.WSUtil;
import com.mugui.base.client.net.base.Cache;
import com.mugui.base.client.net.base.Filter;
import com.mugui.base.client.net.base.Listener;
import com.mugui.base.client.net.base.ModelInterface;
import com.mugui.base.client.net.bean.Message;
import com.mugui.base.client.net.bean.NetBag;
import com.mugui.base.client.net.cache.CacheModel;
import com.mugui.base.client.net.classutil.DataSave;
import com.mugui.base.client.net.filter.FilterModel;
import com.mugui.base.client.net.listener.ListenerModel;
import com.mugui.base.util.Other;

import cn.hutool.cache.impl.TimedCache;

@Component
public class NetHandle {

	@Autowired
	private NetBagModuleManager ModuleMessage = null;
	private final byte[] lock = new byte[0];

	public String httpHandle(NetBag bag, NetCall netCall) {
		if (System.getProperties().get("system_lock") == null) {
			synchronized (lock) {
				while (System.getProperties().get("system_lock") == null) {
					System.out.println("等待!!!!!!!!");
					Other.sleep(200);
				}
			}
		}

		NetBag tempbag;
		try {
			netBagLocal.set(bag);
			tempbag = resolveNetBag(bag, netCall);
			netBagLocal.remove();
			if (tempbag == null)
				throw new RuntimeException(bag + "");
			tempbag.setRet_data(null);
			tempbag.setHost(null);
			tempbag.setPort(null);
			tempbag.setFrom_host(null);
			tempbag.setFrom_port(null);
			tempbag.setTimestamp(null).setServer_type(null);
			return tempbag.toString();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public String WsHandle(NetBag bag) {
		if (System.getProperties().get("system_lock") == null) {
			synchronized (lock) {
				while (System.getProperties().get("system_lock") == null) {
					System.out.println("等待!!!!!!!!");
					Other.sleep(200);
				}
			}
		}
		try {
			bag.setType(NetBag.TYPE_WS);
			netBagLocal.set(bag);
			bag = resolveNetBag(bag, WSUtil.getWsNetCall(bag.getFunc()));
			netBagLocal.remove();
			if(bag==null) {
				return null;
			}

			bag.setRet_data(null);
			bag.setHost(null);
			bag.setPort(0);
			bag.setFrom_host(null);
			bag.setFrom_port(0);
			bag.setTimestamp(null).setServer_type(null);
			return bag.toString();
			
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return null;
	}

	private static final TimedCache HASH_MAP_CACHE = new TimedCache<>(60000 * 60 * 2);
	static {
		HASH_MAP_CACHE.schedulePrune(60000);
	}

	public static final ThreadLocal netBagLocal = new ThreadLocal<>();

	/**
	 * 解析NetBag 到相应的处理位置
	 *
	 * @throws Exception
	 */
	public NetBag resolveNetBag(NetBag bag, NetCall netCall) throws Exception {
		init();
		if (bag == null) {
			bag = new NetBag();
		}
		if (StringUtils.isBlank(bag.getFunc()) || bag.getFunc().split("[.]").length < 2
				|| StringUtils.isBlank(bag.getHash())) {
			bag.setCode(503);
			bag.setData(Message.error("参数错误"));
			return bag;
		}

		String server_name = bag.getServer_type();
		if (server_name == null) {

			if (StringUtils.isBlank("")) {
				server_name = "default";
			}
			bag.setServer_type(server_name);
		}
		String key = bag.getSession() + ":" + bag.getHash();
		synchronized (HASH_MAP_CACHE) {
			byte[] bs = HASH_MAP_CACHE.get(key, false);
			if (bs != null) {
				bag.setCode(503);
				bag.setData(Message.error("消息回环"));
				return bag;
			}
			HASH_MAP_CACHE.put(key, new byte[0]);

		}

		// 分布式消息
		NetBag handleAddForward = handleAddForward(bag);
		if (handleAddForward != null) {
			handleAddForward.setRet_data(null);
			return handleAddForward;
		}
		// 过滤器
		NetBag handleAddFilter = handleAddFilter(bag);
		if (handleAddFilter != null) {
			handleAddFilter.setRet_data(null);
			return handleAddFilter;
		}
		Message data = null;
		try {
			NetBag handleAddCache = handleAddCache(bag);
			if (handleAddCache != null) {
				return handleAddCache;
			}

			if (netCall != null && netCall.isCall()) {
				if (!(bag.getData() instanceof JSONObject)) {
					bag.setRet_data(null);
					return bag;
				}
				Message message = Message.newBean(Message.class, bag.getData());
				NetCall.Call son = netCall.getSon();
				if (son != null) {
					if (message.getType() == Message.SUCCESS) {
						message = son.ok(message);
					} else {
						message = son.err(message);
					}
				}
				NetCall.Call main = netCall.getMain();
				if (main != null) {
//					MessageRunnable messageRunnable = new MessageRunnable(main, message);
////					handler.post(messageRunnable);
//					message = messageRunnable.call();
					if (message.getType() == Message.SUCCESS) {
						message = main.ok(message);
					} else {
						message = main.err(message);
					}
				}
				data = message;
			} else {
				ModelInterface modelInterface = ModuleMessage
						.get(bag.getFunc().substring(0, bag.getFunc().lastIndexOf(".")));
				if (modelInterface == null) {
					modelInterface = ModuleMessage.get(bag.getFunc());
				}
				if (modelInterface == null) {
					bag.setCode(503);
					bag.setData(Message.error("参数错误"));
					return bag;
				}
				data = (Message) modelInterface.invokeFunction("runFunc", bag);
			}
			saveCache(data, bag);
			bag.setCode(200);
			bag.setData(data);
			return bag;
		} catch (Exception e) {
			e.printStackTrace();

			bag.setCode(503);
			bag.setData(Message.error("数据传输错误"));
			return bag;
		} finally {
			handleAddListener(bag, data);
		}
	}

	private class MessageRunnable implements Runnable {
		NetCall.Call main;
		Message message;

		public MessageRunnable(NetCall.Call main, Message message) {
			this.main = main;
			this.message = message;
		}

		@Override
		public void run() {
			if (message.getType() == Message.SUCCESS) {
				ret_msg = main.ok(message);
			} else {
				ret_msg = main.err(message);
			}
			synchronized (this) {
				this.notifyAll();
			}
		}

		Message ret_msg = null;

		public Message call() {
			if (ret_msg == null) {
				synchronized (this) {
					try {
						if (ret_msg == null) {
							this.wait();
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			return ret_msg;
		}
	}

	Mugui object = null;

	private NetBagModuleManager manager = null;
	private ApplicationContext applicationContext = null;
//	private Handler handler = null;

	public void init() {
		if (applicationContext == null)
			applicationContext = (ApplicationContext) DataSave.context;
		if (applicationContext != null) {
			manager = applicationContext.getBean(NetBagModuleManager.class);
		}
//		if (handler == null) {
//			handler = new Handler(DataSave.app.getApplicationContext().getMainLooper());
//		}
		if (manager == null) {
			throw new RuntimeException("启动错误:" + NetBagModuleManager.class + " 未初始化");
		}
	}

	private static final String MATCH_STR = "[a-z A-Z 0-9 . _]*";

	private boolean handleFilterModel(String string, FilterModel filterModel) {
		Filter filter = filterModel.getClass().getAnnotation(Filter.class);
		String values[] = filter.value();
		boolean b = filter.type() == Filter.POSITIVE ? false : true;
		for (String value : values) {
			boolean bool = string.matches(value.replaceAll("[*]", MATCH_STR));
			switch (filter.type()) {
			case Filter.POSITIVE:
				if (bool) {
					return true;
				}
				break;
			case Filter.REVERSE:
				if (bool) {
					return false;
				}
				break;
			}
		}
		return b;
	}

	private boolean handleListenerModel(String string, ListenerModel listenerModel) {
		Listener listener = listenerModel.getClass().getAnnotation(Listener.class);
		String values[] = listener.value();
		boolean b = listener.type() == Listener.POSITIVE ? false : true;
		for (String value : values) {
			boolean bool = string.matches(value.replaceAll("[*]", MATCH_STR));
			switch (listener.type()) {
			case Listener.POSITIVE:
				if (bool) {
					return true;
				}
				break;
			case Listener.REVERSE:
				if (bool) {
					return false;
				}
				break;
			}
		}
		return b;
	}

	private boolean handleCacheModel(String string, CacheModel cacheModel) {
		Cache listener = cacheModel.getClass().getAnnotation(Cache.class);
		String values[] = listener.value();
		boolean b = listener.type() == Cache.POSITIVE ? false : true;
		for (String value : values) {
			boolean bool = string.matches(value.replaceAll("[*]", MATCH_STR));
			switch (listener.type()) {
			case Cache.POSITIVE:
				if (bool) {
					return true;
				}
				break;
			case Cache.REVERSE:
				if (bool) {
					return false;
				}
				break;
			}
		}
		return b;
	}

	private HashMap> filterMap = new HashMap<>();
	private HashMap> listenerMap = new HashMap<>();
	private HashMap> cacheMap = new HashMap<>();

	/**
	 * 消息结果监听器
	 *
	 * @param bag
	 * @param data
	 * @auther 木鬼
	 */
	private void handleAddListener(NetBag bag, Message data) {
		List listenerModels = null;
		if ((listenerModels = listenerMap.get(bag.getFunc())) == null) {
			synchronized (listenerMap) {
				if ((listenerModels = listenerMap.get(bag.getFunc())) == null) {
					listenerMap.put(bag.getFunc(), listenerModels = new LinkedList<>());
					if (manager.getListenerMessage() != null) {
						Iterator> iterator = manager.getListenerMessage().entrySet()
								.iterator();
						while (iterator.hasNext()) {
							Map.Entry entry = iterator.next();
							String string = bag.getFunc();
							boolean bool = handleListenerModel(string, entry.getValue());
							if (bool) {
								listenerModels.add(entry.getValue());
							}
						}
						Collections.sort(listenerModels, new Comparator() {
							@Override
							public int compare(ListenerModel o1, ListenerModel o2) {
								Listener filter1 = o1.getClass().getAnnotation(Listener.class);
								Listener filter2 = o2.getClass().getAnnotation(Listener.class);
								return filter1.weight() - filter2.weight();
							}
						});
					}
				}
			}
		}
		for (ListenerModel model : listenerModels) {
			try {

				model.listener((Message) data, bag);
			} catch (Exception e) {
				e.printStackTrace();

			}
		}
	}

	private void saveCache(Message data, NetBag bag) {
		List cacheModels = cacheLocal.get();
		for (CacheModel model : cacheModels) {
			try {

				model.save(data, bag);
			} catch (Exception e) {
				e.printStackTrace();

			}
		}
		cacheLocal.remove();
	}

	private ThreadLocal> cacheLocal = new ThreadLocal<>();

	/**
	 * 缓存区
	 *
	 * @param bag
	 * @return
	 * @auther 木鬼
	 */
	private NetBag handleAddCache(NetBag bag) {
		List cacheModels = null;
		if ((cacheModels = cacheMap.get(bag.getFunc())) == null) {
			synchronized (cacheMap) {
				if ((cacheModels = cacheMap.get(bag.getFunc())) == null) {
					cacheMap.put(bag.getFunc(), cacheModels = new LinkedList<>());
					if (manager.getCacheMessage() != null) {
						Iterator> iterator = manager.getCacheMessage().entrySet()
								.iterator();
						while (iterator.hasNext()) {
							Map.Entry entry = iterator.next();
							String string = bag.getFunc();
							boolean bool = handleCacheModel(string, entry.getValue());
							if (bool) {
								cacheModels.add(entry.getValue());
							}
						}
					}
				}
			}
		}
		cacheLocal.set(cacheModels);
		for (CacheModel model : cacheModels) {
			try {
				if (model.load(bag) == null) {
					return bag;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return null;
	}

	/**
	 * 处理过滤器
	 *
	 * @param bag
	 * @return
	 * @auther 木鬼
	 */

	private NetBag handleAddFilter(NetBag bag) {
		List filterModels = null;
		if ((filterModels = filterMap.get(bag.getFunc())) == null) {
			synchronized (filterMap) {
				if ((filterModels = filterMap.get(bag.getFunc())) == null) {
					filterMap.put(bag.getFunc(), filterModels = new LinkedList<>());
					if (manager.getFilterMessage() != null) {
						Iterator> iterator = manager.getFilterMessage().entrySet()
								.iterator();
						while (iterator.hasNext()) {
							Map.Entry entry = iterator.next();
							String string = bag.getFunc();
							boolean bool = handleFilterModel(string, entry.getValue());
							if (bool) {
								filterModels.add(entry.getValue());
							}
						}
						Collections.sort(filterModels, new Comparator() {
							@Override
							public int compare(FilterModel o1, FilterModel o2) {
								Filter filter1 = o1.getClass().getAnnotation(Filter.class);
								Filter filter2 = o2.getClass().getAnnotation(Filter.class);
								return filter2.weight() - filter1.weight();
							}
						});
					}
				}
			}

		}

		for (FilterModel model : filterModels) {
			try {
				if (model.filter(bag) == null) {
					return bag;
				}
			} catch (Exception e) {
				e.printStackTrace();

			}

		}
		return null;
	}

	private NetBag handleAddForward(NetBag bag) {

		String func[] = bag.getFunc().split("[.]");
		if (bag.getFunc().startsWith("&forward.insert.")) {
			Message message = null;
			try {
				message = (Message) object.invokeFunction(func[func.length - 1], bag);
			} catch (Exception e) {
				message.setDate(e.getMessage());
			}
			bag.setCode(200);
			bag.setData(message);
			return bag;
		}
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy