/* * Copyright 2012 LinkedIn Corp. * * 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 azkaban.scheduler; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import azkaban.utils.JSONUtils; /** * TODO: This needs to be fleshed out and made into a proper singleton. */ public class ScheduleStatisticManager { public static final int STAT_NUMBERS = 10; private static HashMap<Integer, Object> cacheLock = new HashMap<Integer, Object>(); private static File cacheDirectory; public static void invalidateCache(int scheduleId, File cacheDir) { setCacheFolder(cacheDir); // This should be silent and not fail try { Object lock = getLock(scheduleId); synchronized (lock) { getCacheFile(scheduleId).delete(); } unLock(scheduleId); } catch (Exception e) { } } public static void saveCache(int scheduleId, Map<String, Object> data) { Object lock = getLock(scheduleId); try { synchronized (lock) { File cache = getCacheFile(scheduleId); cache.createNewFile(); OutputStream output = new FileOutputStream(cache); try { JSONUtils.toJSON(data, output, false); } finally { output.close(); } } } catch (Exception e) { e.printStackTrace(); } unLock(scheduleId); } public static Map<String, Object> loadCache(int scheduleId) { Object lock = getLock(scheduleId); try { synchronized (lock) { File cache = getCacheFile(scheduleId); if (cache.exists() && cache.isFile()) { Object dataObj = JSONUtils.parseJSONFromFile(cache); if (dataObj instanceof Map<?, ?>) { @SuppressWarnings("unchecked") Map<String, Object> data = (Map<String, Object>) dataObj; return data; } } } } catch (Exception e) { e.printStackTrace(); } unLock(scheduleId); return null; } public static File getCacheDirectory() { return cacheDirectory; } private static File getCacheFile(int scheduleId) { cacheDirectory.mkdirs(); File file = new File(cacheDirectory, scheduleId + ".cache"); return file; } private static Object getLock(int scheduleId) { Object lock = null; synchronized (cacheLock) { lock = cacheLock.get(scheduleId); if (lock == null) { lock = new Object(); cacheLock.put(scheduleId, lock); } } return lock; } private static void unLock(int scheduleId) { synchronized (cacheLock) { cacheLock.remove(scheduleId); } } public static void setCacheFolder(File cacheDir) { if (cacheDirectory == null) { cacheDirectory = new File(cacheDir, "schedule-statistics"); } } }