/*
* Copyright (c) 2008-2016 Computer Network Information Center (CNIC), Chinese Academy of Sciences.
*
* This file is part of Duckling project.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package cn.vlabs.umt.services.ticket.impl;
import java.util.Date;
import org.apache.commons.lang.time.DateUtils;
import cn.vlabs.umt.common.schedule.ScheduleService;
import cn.vlabs.umt.common.util.RandomUtil;
import cn.vlabs.umt.services.ticket.InternalTicket;
import cn.vlabs.umt.services.ticket.Ticket;
import cn.vlabs.umt.services.ticket.TicketDAO;
import cn.vlabs.umt.services.ticket.TicketService;
public class TicketServiceImpl implements TicketService {
public TicketServiceImpl(int randlength, int lifetime, ScheduleService scheduler){
this.randlength=randlength;
this.lifetime=lifetime;
this.util=new RandomUtil();
this.scheduler=scheduler;
}
public void setTicketDAO(TicketDAO td){
this.td=td;
}
public void init(){
scheduler.schedule(lifetime+1, "TicketMinuteTrigger", "TicketCleanup", CleanTicketJob.class, "service", this);
}
public void destroy(){
scheduler.removeJob("TicketCleanup", "TicketMinuteTrigger");
}
public void cleanup(){
Date createTime = DateUtils.addMinutes(new Date(), -(lifetime+1));//lifetime+1分钟后,清理创建的Ticket
td.removeBefore(createTime);
}
public String generateKeys(String extra, String sessionid,String userip, int type) {
String random= util.getRandom(randlength);
InternalTicket ticket = new InternalTicket();
ticket.setCreateTime(new Date());
ticket.setExtra(extra);
ticket.setSessionid(sessionid);
ticket.setType(type);
ticket.setUserIp(userip);
ticket.setRandom(random);
long id = td.save(ticket);
String idpart = Long.toHexString(id);
return idpart+"|"+random;
}
public Ticket validate(String ticketString) {
if (ticketString==null)
{
return null;
}
int index = ticketString.indexOf('|');
if (index!=-1){
String idpart = ticketString.substring(0, index);
String random = ticketString.substring(index+1);
try{
long ticketid = Long.parseLong(idpart,16);
InternalTicket ticket = td.load(ticketid);
if (ticket!=null){
if (isValid(ticket.getCreateTime())){
if (ticket.getRandom().equals(random)){
td.remove(ticketid);
return ticket;
}
}else{
td.remove(ticketid);
}
}
}catch (NumberFormatException e){
}
}
return null;
}
private boolean isValid(Date start){
Date deadline = DateUtils.addMinutes(start, lifetime);
return start.before(deadline);
}
private RandomUtil util;
private TicketDAO td;
private int randlength;
private int lifetime;
private ScheduleService scheduler;
}