Context.java 12.7 KB
Newer Older
caixiangyi's avatar
caixiangyi 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
package com.x.program.center;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;

import org.apache.openjpa.enhance.PCRegistry;
import org.quartz.CronScheduleBuilder;
import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;

import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.annotation.CheckPersistType;
import com.x.base.core.project.AbstractContext;
import com.x.base.core.project.Applications;
R
fix  
roo00 已提交
37
import com.x.base.core.project.annotation.Module;
caixiangyi's avatar
caixiangyi 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.StorageMappings;
import com.x.base.core.project.jaxrs.WrapClearCacheRequest;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.organization.OrganizationDefinition;
import com.x.base.core.project.queue.AbstractQueue;
import com.x.base.core.project.schedule.JobReportListener;
import com.x.base.core.project.schedule.SchedulerFactoryProperties;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.tools.SslTools;
import com.x.base.core.project.tools.StringTools;
import com.x.organization.core.entity.Role;
import com.x.organization.core.entity.Role_;

public class Context extends AbstractContext {

	private static Logger logger = LoggerFactory.getLogger(Context.class);

R
roo00 已提交
57 58 59 60
	public Applications applications() throws Exception {
		return applications;
	}

caixiangyi's avatar
caixiangyi 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
	/* 应用的磁盘路径 */
	private volatile String path;

	public String path() {
		return this.path;
	}

	/* 上下文 */
	private volatile String servletContextName;

	public String servletContextName() {
		return this.servletContextName;
	}

	/* 上下文根 */
	private volatile ServletContext servletContext;

	public ServletContext servletContext() {
		return this.servletContext;
	}

	/* 随机令牌 */
	private volatile String token;

	public String token() {
		return this.token;
	}

R
roo00 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102
	/* contextPath */
	private volatile String contextPath;

	public String contextPath() {
		return this.contextPath;
	}

	/* name */
	private volatile String name;

	public String name() {
		return this.name;
	}

R
fix  
roo00 已提交
103 104
	public StorageMappings storageMappings() throws Exception {
		return Config.storageMappings();
caixiangyi's avatar
caixiangyi 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
	}

	/* 是否已经初始化完成 */
	private volatile boolean initialized;

	public boolean initialized() {
		return this.initialized;
	}

	/* 应用的权重 */
	private volatile Integer weight;

	public Integer weight() {
		return this.weight;
	}

	private Boolean sslEnable;

	public Boolean sslEnable() {
		return this.sslEnable;
	}

	/* 清除缓存指定队列 */
	private AbstractQueue<WrapClearCacheRequest> clearCacheRequestQueue;

	public AbstractQueue<WrapClearCacheRequest> clearCacheRequestQueue() {
		return this.clearCacheRequestQueue;
	}

	/* quartz 调度器 */
	private Scheduler scheduler;

	/* 队列 */
	private List<AbstractQueue<?>> queues;

	private Context() throws Exception {
		SslTools.ignoreSsl();
		this.applications = new Applications();
		this.token = UUID.randomUUID().toString();
		this.queues = new ArrayList<AbstractQueue<?>>();
		this.scheduler = new StdSchedulerFactory(SchedulerFactoryProperties.concrete()).getScheduler();
		this.scheduler.getListenerManager().addJobListener(new JobReportListener(), EverythingMatcher.allJobs());
		this.scheduler.start();
	}

	public static Context concrete(ServletContextEvent servletContextEvent) throws Exception {
		ServletContext servletContext = servletContextEvent.getServletContext();
		Context context = new Context();
R
roo00 已提交
153 154
		context.contextPath = servletContext.getContextPath();
		context.clazz = Class.forName(servletContext.getInitParameter(INITPARAMETER_PORJECT));
R
fix  
roo00 已提交
155
		context.module = context.clazz.getAnnotation(Module.class);
NoSubject's avatar
NoSubject 已提交
156
		context.name = context.module.name();
caixiangyi's avatar
caixiangyi 已提交
157 158 159
		context.path = servletContext.getRealPath("");
		context.servletContext = servletContext;
		context.servletContextName = servletContext.getServletContextName();
R
roo00 已提交
160
		context.clazz = Class.forName(servletContextEvent.getServletContext().getInitParameter(INITPARAMETER_PORJECT));
caixiangyi's avatar
caixiangyi 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
		context.initDatas();
		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
			context.checkDefaultRole(emc);
		}
		servletContext.setAttribute(context.getClass().getName(), context);
		return context;
	}

	public <T extends Job> void scheduleLocal(Class<T> cls, String cron) throws Exception {
		JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(cls.getName(), clazz.getName())
				.withDescription(Config.node()).build();
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(cls.getName(), clazz.getName())
				.withDescription("scheduleLocal").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
		scheduler.scheduleJob(jobDetail, trigger);
	}

	public <T extends Job> void scheduleLocal(Class<T> cls, Trigger existTrigger) throws Exception {
		JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(cls.getName(), clazz.getName())
				.withDescription(Config.node()).build();
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(cls.getName(), clazz.getName())
				.withDescription("scheduleLocal").withSchedule(existTrigger.getScheduleBuilder()).build();
		scheduler.scheduleJob(jobDetail, trigger);
	}

	public <T extends Job> void scheduleLocal(Class<T> cls, Integer delay, Integer interval) throws Exception {
		JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(cls.getName(), clazz.getName())
				.withDescription(Config.node()).build();
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(cls.getName(), clazz.getName())
				.withDescription("scheduleLocal").startAt(DateBuilder.futureDate(delay, IntervalUnit.SECOND))
				.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(interval).repeatForever())
				.build();
		scheduler.scheduleJob(jobDetail, trigger);
	}

	public <T extends Job> void scheduleLocal(Class<T> cls) throws Exception {
		/* 需要单独生成一个独立任务,保证group和预约的任务不重复 */
		String group = StringTools.uniqueToken();
		JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(cls.getName(), group).withDescription(Config.node())
				.build();
		/* 经过测试0代表不重复,进运行一次 */
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(cls.getName(), group)
				.withDescription("scheduleLocal")
				.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(0))
				.build();
		scheduler.scheduleJob(jobDetail, trigger);
	}

	public void startQueue(AbstractQueue<?> queue) {
		queues.add(queue);
		queue.start();
	}

	private void initDatas() throws Exception {
R
fix  
roo00 已提交
214 215
		logger.print("{} loading datas, entity size:{}.", this.clazz.getName(), this.module.containerEntities().length);
		EntityManagerContainerFactory.init(path, ListTools.toList(this.module.containerEntities()));
caixiangyi's avatar
caixiangyi 已提交
216 217 218 219 220 221 222 223
	}

	private void checkDefaultRole(EntityManagerContainer emc) throws Exception {
		List<String> roles = ListTools.toList(OrganizationDefinition.Manager, OrganizationDefinition.AttendanceManager,
				OrganizationDefinition.OrganizationManager, OrganizationDefinition.PersonManager,
				OrganizationDefinition.GroupManager, OrganizationDefinition.UnitManager,
				OrganizationDefinition.RoleManager, OrganizationDefinition.ProcessPlatformManager,
				OrganizationDefinition.ProcessPlatformCreator, OrganizationDefinition.MeetingManager,
L
luojing 已提交
224
				OrganizationDefinition.PortalManager, OrganizationDefinition.BBSManager,OrganizationDefinition.TeamWorkManager,
caixiangyi's avatar
caixiangyi 已提交
225
				OrganizationDefinition.CMSManager, OrganizationDefinition.OKRManager, OrganizationDefinition.CRMManager,
R
roo00 已提交
226
				OrganizationDefinition.QueryManager, OrganizationDefinition.MessageManager,
R
roo00 已提交
227
				OrganizationDefinition.SearchPrivilege, OrganizationDefinition.HotPictureManager);
caixiangyi's avatar
caixiangyi 已提交
228 229 230 231 232 233 234 235 236 237 238 239
		roles = roles.stream().sorted(Comparator.comparing(String::toString)).collect(Collectors.toList());
		for (String str : roles) {
			EntityManager em = emc.get(Role.class);
			CriteriaBuilder cb = em.getCriteriaBuilder();
			CriteriaQuery<String> cq = cb.createQuery(String.class);
			Root<Role> root = cq.from(Role.class);
			Predicate p = cb.equal(root.get(Role_.name), str);
			cq.select(root.get(Role_.id)).where(p);
			List<String> list = em.createQuery(cq).setMaxResults(1).getResultList();
			if (list.isEmpty()) {
				Role o = new Role();
				o.setName(str);
R
roo00 已提交
240 241
				o.setUnique(str + OrganizationDefinition.RoleDefinitionSuffix);
				o.setDescription(getDescriptionWithName(str));
caixiangyi's avatar
caixiangyi 已提交
242 243 244 245 246 247 248
				emc.beginTransaction(Role.class);
				emc.persist(o, CheckPersistType.all);
				emc.commit();
			}
		}
	}

R
fix  
roo00 已提交
249
	/**
R
roo00 已提交
250 251 252 253 254 255 256
	 * , OrganizationDefinition., OrganizationDefinition., OrganizationDefinition.,
	 * OrganizationDefinition., OrganizationDefinition., OrganizationDefinition.,
	 * OrganizationDefinition., OrganizationDefinition., OrganizationDefinition.,
	 * OrganizationDefinition., OrganizationDefinition., OrganizationDefinition.,
	 * OrganizationDefinition., ., OrganizationDefinition., OrganizationDefinition.,
	 * OrganizationDefinition.
	 * 
R
fix  
roo00 已提交
257 258 259 260
	 * @param str
	 * @return
	 */
	private String getDescriptionWithName(String str) {
R
roo00 已提交
261
		if (OrganizationDefinition.Manager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
262
			return OrganizationDefinition.Manager_discription;
R
roo00 已提交
263
		} else if (OrganizationDefinition.AttendanceManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
264
			return OrganizationDefinition.AttendanceManager_discription;
R
roo00 已提交
265
		} else if (OrganizationDefinition.OrganizationManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
266
			return OrganizationDefinition.OrganizationManager_discription;
R
roo00 已提交
267
		} else if (OrganizationDefinition.PersonManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
268
			return OrganizationDefinition.PersonManager_discription;
R
roo00 已提交
269
		} else if (OrganizationDefinition.GroupManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
270
			return OrganizationDefinition.GroupManager_discription;
R
roo00 已提交
271
		} else if (OrganizationDefinition.UnitManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
272
			return OrganizationDefinition.UnitManager_discription;
R
roo00 已提交
273
		} else if (OrganizationDefinition.RoleManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
274
			return OrganizationDefinition.RoleManager_discription;
R
roo00 已提交
275
		} else if (OrganizationDefinition.ProcessPlatformManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
276
			return OrganizationDefinition.ProcessPlatformManager_discription;
R
roo00 已提交
277
		} else if (OrganizationDefinition.ProcessPlatformCreator.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
278
			return OrganizationDefinition.ProcessPlatformCreator_discription;
R
roo00 已提交
279
		} else if (OrganizationDefinition.MeetingManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
280
			return OrganizationDefinition.MeetingManager_discription;
R
roo00 已提交
281
		} else if (OrganizationDefinition.MeetingViewer.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
282
			return OrganizationDefinition.MeetingViewer_discription;
R
roo00 已提交
283
		} else if (OrganizationDefinition.PortalManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
284
			return OrganizationDefinition.PortalManager_discription;
R
roo00 已提交
285
		} else if (OrganizationDefinition.BBSManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
286
			return OrganizationDefinition.BBSManager_discription;
R
roo00 已提交
287
		} else if (OrganizationDefinition.CMSManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
288
			return OrganizationDefinition.CMSManager_discription;
R
roo00 已提交
289
		} else if (OrganizationDefinition.OKRManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
290
			return OrganizationDefinition.OKRManager_discription;
R
roo00 已提交
291
		} else if (OrganizationDefinition.CRMManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
292
			return OrganizationDefinition.CRMManager_discription;
L
luojing 已提交
293 294 295
		}else if (OrganizationDefinition.TeamWorkManager.equalsIgnoreCase(str)) {
			return OrganizationDefinition.TeamWorkManager_discription;
		}else if (OrganizationDefinition.QueryManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
296
			return OrganizationDefinition.QueryManager_discription;
R
roo00 已提交
297
		} else if (OrganizationDefinition.MessageManager.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
298
			return OrganizationDefinition.MessageManager_discription;
R
roo00 已提交
299
		} else if (OrganizationDefinition.SearchPrivilege.equalsIgnoreCase(str)) {
R
fix  
roo00 已提交
300 301 302 303 304
			return OrganizationDefinition.SearchPrivilege_discription;
		}
		return "";
	}

caixiangyi's avatar
caixiangyi 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318
	public void destrory(ServletContextEvent servletContextEvent) {
		try {
			queues.stream().forEach(p -> {
				p.stop();
			});
			this.scheduler.shutdown();
			EntityManagerContainerFactory.close();
			PCRegistry.deRegister(JpaObject.class.getClassLoader());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}