/*
* Copyright 2015 Evgeny Dolganov (evgenij.dolganov@gmail.com).
*
* 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 och.comp.chats.history;
import static och.comp.chats.ChatsAccService.*;
import static och.comp.chats.common.StoreOps.*;
import static och.util.DateUtil.*;
import static och.util.Util.*;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import och.util.DateUtil;
import och.util.FileUtil;
import och.util.ZipUtil;
import org.apache.commons.logging.Log;
public class LogsArchiveImpl implements LogsArchive {
public static final String LOGS_ARC_FILE_PREFIX = "logs_arc_";
public static final String ARC_EXT = ".zip";
public static final long ARCH_SCAN_PERIOD = 1000*60*60*24;
public static final String YYYY_MM = "yyyy-MM";
public static final int MONTH_BACK = 2;
Log log = getLog(getClass());
@Override
public Date tryCreateArcsIfNeed(File root, String accId, Date lastScanned){
Date now = new Date();
if(lastScanned != null
&& (now.getTime() - lastScanned.getTime()) <= ARCH_SCAN_PERIOD){
return lastScanned;
}
try {
File accDir = new File(root, getAccountDirName(accId));
String[] names = accDir.list();
if(isEmpty(names)) return now;
SimpleDateFormat yearMonthFormat = new SimpleDateFormat(YYYY_MM);
Date curMonth = monthStart(now);
Date needArcMonth = addMonths(curMonth, -MONTH_BACK);
Date needArcDate = dateEnd(monthEnd(needArcMonth));
long needArcTime = needArcDate.getTime();
//dirs to arc
HashMap<String, List<String>> toArcs = new HashMap<>();
for (String name : names) {
Date date = parseDate(name);
if(date == null) continue;
if(date.getTime() > needArcTime) continue;
String arcId = LOGS_ARC_FILE_PREFIX + yearMonthFormat.format(date) + ARC_EXT;
putToListMap(toArcs, arcId, name);
}
//create arcs
for (Entry<String, List<String>> entry : toArcs.entrySet()) {
String arcName = entry.getKey();
List<String> dirs = entry.getValue();
createArc(accDir, arcName, dirs);
}
}catch (Throwable t) {
log.error("can't create chat archives: "+t);
}
return now;
}
private static void createArc(File accDir, String arcName, List<String> dirs) throws IOException {
File zipFile = new File(accDir, arcName);
if(zipFile.exists()){
zipFile.renameTo(new File(accDir, zipFile.getName()+"-"+System.currentTimeMillis()+".BAK"));
zipFile.delete();
}
List<File> files = new ArrayList<>();
for(String name : dirs) files.add(new File(accDir, name));
ZipUtil.zipFiles(files, zipFile);
//remove files
for(File file : files) FileUtil.deleteDirRecursive(file);
}
public static Date parseDate(String name) {
try {
if( ! name.startsWith(LOGS_DIR_PREFIX)) return null;
String dateStr = name.substring(LOGS_DIR_PREFIX.length());
return DateUtil.parseDate(dateStr, YYYY_MM_DD);
}catch (Exception e) {
return null;
}
}
}