package com.taobao.easyweb.core.app.change;
import com.taobao.easyweb.core.app.App;
import com.taobao.easyweb.core.app.AppLogger;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import java.net.URL;
import java.util.*;
/**
* User: jimmey/shantong
* DateTime: 13-4-24 ����9:35
*/
public class AppChangeHolder {
private static Map<Priority, List<AppChangeListener>> listeners;
static {
listeners = new HashMap<Priority, List<AppChangeListener>>();
String file = "META-INF/services/com.taobao.easyweb.core.app.AppChangeListener";
try {
Enumeration<URL> list = AppChangeHolder.class.getClassLoader().getResources(file);
if (list != null) {
while (list.hasMoreElements()) {
URL conf = list.nextElement();
String content = IOUtils.toString(conf.openStream());
if (StringUtils.isBlank(content)) {
continue;
}
String[] classes = content.split("\r?\n");
for (String className : classes) {
try {
Class<?> clazz = AppChangeHolder.class.getClassLoader().loadClass(className);
Object obj = clazz.newInstance();
if (obj instanceof AppChangeListener) {
AppChangeListener listener = (AppChangeListener) obj;
listener.init();
Priority priority = Priority.DEFAULT;
if (clazz.isAnnotationPresent(ListenerPriority.class)) {
priority = clazz.getAnnotation(ListenerPriority.class).value();
}
List<AppChangeListener> l = listeners.get(priority);
if (l == null) {
l = new ArrayList<AppChangeListener>();
listeners.put(priority, l);
}
l.add(listener);
}
} catch (Exception e) {
AppLogger.getLogger().error("init AppChangeListener Error, Class " + className, e);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
AppLogger.getLogger().error("",e);
}
}
public static void stop(App app) {
for (Priority priority : Priority.getAll()) {
List<AppChangeListener> list = listeners.get(priority);
if (list == null || list.isEmpty()) {
continue;
}
for (AppChangeListener listener : list) {
listener.stop(app);
}
}
}
public static void remove(App app) {
for (Priority priority : Priority.getAll()) {
List<AppChangeListener> list = listeners.get(priority);
if (list == null || list.isEmpty()) {
continue;
}
for (AppChangeListener listener : list) {
listener.remove(app);
}
}
}
public static void start(App app) {
for (Priority priority : Priority.getAll()) {
List<AppChangeListener> list = listeners.get(priority);
if (list == null || list.isEmpty()) {
continue;
}
for (AppChangeListener listener : list) {
listener.start(app);
}
}
}
public static void deployError(App app) {
for (Priority priority : Priority.getAll()) {
List<AppChangeListener> list = listeners.get(priority);
if (list == null || list.isEmpty()) {
continue;
}
for (AppChangeListener listener : list) {
listener.deployError(app);
}
}
}
}