/*******************************************************************************
* Copyright (c) 2009, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.dltk.internal.core.index.sql.h2;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.dltk.core.index.sql.Container;
import org.eclipse.dltk.core.index.sql.File;
/**
* This is a cache layer between H2 database and model access
*
* @author michael
*/
public class H2Cache {
private static final ILock containerLock = Job.getJobManager().newLock();
private static final Map<Integer, Container> containerById = new HashMap<>();
private static final ILock fileLock = Job.getJobManager().newLock();
private static final Map<Integer, Map<Integer, File>> filesByContainer = new HashMap<>();
public static void addContainer(Container container) {
containerLock.acquire();
try {
int containerId = container.getId();
containerById.put(containerId, container);
} finally {
containerLock.release();
}
}
public static void addFile(File file) {
fileLock.acquire();
try {
int containerId = file.getContainerId();
Map<Integer, File> files = filesByContainer.get(containerId);
if (files == null) {
files = new HashMap<>();
filesByContainer.put(containerId, files);
}
files.put(file.getId(), file);
} finally {
fileLock.release();
}
}
public static void deleteContainerById(int id) {
containerLock.acquire();
try {
containerById.remove(id);
deleteFilesByContainerId(id);
} finally {
containerLock.release();
}
}
public static void deleteContainerByPath(String path) {
containerLock.acquire();
try {
Container container = selectContainerByPath(path);
if (container != null) {
deleteContainerById(container.getId());
}
} finally {
containerLock.release();
}
}
public static void deleteFileByContainerIdAndPath(int containerId,
String path) {
fileLock.acquire();
try {
File file = selectFileByContainerIdAndPath(containerId, path);
if (file != null) {
deleteFileById(file.getId());
}
} finally {
fileLock.release();
}
}
public static void deleteFileById(int id) {
fileLock.acquire();
try {
Iterator<Map<Integer, File>> i = filesByContainer.values()
.iterator();
while (i.hasNext()) {
i.next().remove(id);
}
} finally {
fileLock.release();
}
}
public static void deleteFilesByContainerId(int id) {
fileLock.acquire();
try {
filesByContainer.remove(id);
} finally {
fileLock.release();
}
}
public static Container selectContainerById(int id) {
containerLock.acquire();
try {
return containerById.get(id);
} finally {
containerLock.release();
}
}
public static Container selectContainerByPath(String path) {
containerLock.acquire();
try {
Iterator<Container> i = containerById.values().iterator();
while (i.hasNext()) {
Container container = i.next();
if (container.getPath().equals(path)) {
return container;
}
}
return null;
} finally {
containerLock.release();
}
}
public static File selectFileByContainerIdAndPath(int containerId,
String path) {
fileLock.acquire();
try {
Map<Integer, File> files = filesByContainer.get(containerId);
if (files != null) {
Iterator<File> i = files.values().iterator();
while (i.hasNext()) {
File file = i.next();
if (file.getPath().equals(path)) {
return file;
}
}
}
} finally {
fileLock.release();
}
return null;
}
public static File selectFileById(int id) {
fileLock.acquire();
try {
Iterator<Map<Integer, File>> i = filesByContainer.values()
.iterator();
while (i.hasNext()) {
File file = i.next().get(id);
if (file != null) {
return file;
}
}
return null;
} finally {
fileLock.release();
}
}
/**
*
* @deprecated Use {@link #selectFilesByContainerIdAsArray(int)}
*/
@Deprecated
public static Collection<File> selectFilesByContainerId(int id) {
fileLock.acquire();
try {
Map<Integer, File> files = filesByContainer.get(id);
if (files != null) {
return files.values();
}
return Collections.emptyList();
} finally {
fileLock.release();
}
}
public static File[] selectFilesByContainerIdAsArray(int id) {
fileLock.acquire();
try {
Map<Integer, File> files = filesByContainer.get(id);
if (files != null) {
return files.values().toArray(new File[files.values().size()]);
}
return null;
} finally {
fileLock.release();
}
}
}