| package org.eclipse.dltk.core.caching; |
| |
| import java.io.BufferedOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipOutputStream; |
| |
| import org.eclipse.dltk.compiler.util.Util; |
| import org.eclipse.dltk.core.caching.cache.CacheEntry; |
| import org.eclipse.dltk.core.caching.cache.CacheEntryAttribute; |
| import org.eclipse.dltk.core.caching.cache.CacheFactory; |
| import org.eclipse.dltk.core.caching.cache.CacheIndex; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; |
| |
| /** |
| * Class designed to build archive index files. |
| */ |
| public class ArchiveCacheIndexBuilder { |
| private ZipOutputStream zip; |
| private CacheIndex index = CacheFactory.eINSTANCE.createCacheIndex(); |
| private long version; |
| |
| public ArchiveCacheIndexBuilder(OutputStream stream, long version) |
| throws IOException { |
| zip = new ZipOutputStream(new BufferedOutputStream(stream, 8096)); |
| this.version = version; |
| } |
| |
| public void addEntry(String fileName, long timeStamp, String attribute, |
| InputStream value) throws IOException { |
| CacheEntry entry = getEntry(fileName, timeStamp); |
| EList<CacheEntryAttribute> attributes = entry.getAttributes(); |
| String location = generateLocation(fileName, attribute); |
| CacheEntryAttribute attr = CacheFactory.eINSTANCE |
| .createCacheEntryAttribute(); |
| attr.setName(attribute); |
| attr.setLocation(location); |
| attributes.add(attr); |
| ZipEntry zipEntry = new ZipEntry(location); |
| zip.putNextEntry(zipEntry); |
| Util.copy(value, zip); |
| zip.closeEntry(); |
| } |
| |
| public void done() throws IOException { |
| // Write .index file. |
| Resource res = new XMIResourceImpl(); |
| res.getContents().add(index); |
| ZipEntry entry = new ZipEntry(".index"); |
| zip.putNextEntry(entry); |
| res.save(zip, null); |
| zip.closeEntry(); |
| zip.close(); |
| } |
| |
| private String generateLocation(String path, String attribute) { |
| return "_" + path + "_" + attribute; |
| } |
| |
| private CacheEntry getEntry(String path, long timeStamp) { |
| EList<CacheEntry> entries = index.getEntries(); |
| for (CacheEntry cacheEntry : entries) { |
| if (cacheEntry.getPath().equals(path)) { |
| return cacheEntry; |
| } |
| } |
| CacheEntry entry = CacheFactory.eINSTANCE.createCacheEntry(); |
| entry.setLastAccessTime(version); |
| entry.setPath(path); |
| entry.setTimestamp(timeStamp); |
| index.getEntries().add(entry); |
| return entry; |
| } |
| } |