blob: db2e5bdac174515154103e1eab33cf2a84a6a85f [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.royale.swc;
import java.io.File;
import java.io.IOException;
import org.apache.royale.compiler.caches.IAssetTagCache;
import org.apache.royale.compiler.caches.ICSSDocumentCache;
import org.apache.royale.compiler.caches.IFileScopeCache;
import org.apache.royale.compiler.caches.ISWFCache;
import org.apache.royale.compiler.internal.caches.AssetTagCache;
import org.apache.royale.compiler.internal.caches.CSSDocumentCache;
import org.apache.royale.compiler.internal.caches.CacheStoreKeyBase;
import org.apache.royale.compiler.internal.caches.ConcurrentCacheStoreBase;
import org.apache.royale.compiler.internal.caches.FileScopeCache;
import org.apache.royale.compiler.internal.caches.SWFCache;
import org.apache.royale.compiler.workspaces.IWorkspace;
import org.apache.royale.swc.io.SWCReader;
/**
* This is a cached implementation for {@link ISWCManager} based on
* {@link ConcurrentCacheStoreBase}.
*/
public class SWCManager extends ConcurrentCacheStoreBase<ISWC> implements ISWCManager
{
/**
* Key class for SWC cache.
*/
public static class SWCCacheKey extends CacheStoreKeyBase
{
private final File file;
public SWCCacheKey(final File file)
{
assert file != null : "SWC file can't be null.";
this.file = file;
}
@Override
public String generateKey()
{
try
{
return file.getCanonicalPath();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
}
/**
* Initialize the {@code SWCManager}.
*/
public SWCManager(IWorkspace workspace)
{
swfCache = new SWFCache(this);
fileScopeCache = new FileScopeCache(this);
assetTagCache = new AssetTagCache(this);
cssDocumentCache = new CSSDocumentCache();
this.workspace = workspace;
}
private final SWFCache swfCache;
private final FileScopeCache fileScopeCache;
private final AssetTagCache assetTagCache;
private final CSSDocumentCache cssDocumentCache;
private final IWorkspace workspace;
/**
* @return the swcCache
*/
@Override
public ISWFCache getSWFCache()
{
return swfCache;
}
/**
* @return the fileScopeCache
*/
@Override
public IFileScopeCache getFileScopeCache()
{
return fileScopeCache;
}
/**
* @return the assetTagCache
*/
@Override
public IAssetTagCache getAssetTagCache()
{
return assetTagCache;
}
public IWorkspace getWorkspace()
{
return workspace;
}
@Override
protected ISWC createEntryValue(CacheStoreKeyBase key)
{
if (key instanceof SWCCacheKey)
{
final SWCCacheKey cacheKey = (SWCCacheKey)key;
final SWCReader reader = new SWCReader(cacheKey.file, workspace.getASDocDelegate().getPackageDitaParser());
final ISWC swc = reader.getSWC();
assert swc != null : "Expect a SWC model object.";
return swc;
}
else
{
throw new IllegalArgumentException("Expected a SWCCacheKey.");
}
}
@Override
public ISWC get(File file)
{
final ISWC result = this.get(new SWCCacheKey(file));
return result;
}
@Override
public void remove(File file)
{
ISWC removedSWC = this.remove(new SWCCacheKey(file));
if (removedSWC == null)
return;
for (ISWCLibrary lib : removedSWC.getLibraries())
{
String librarySWFPath = lib.getPath();
for (ISWCScript script : lib.getScripts())
{
fileScopeCache.remove(FileScopeCache.createKey(removedSWC, librarySWFPath, script));
for (String scriptDefQName : script.getDefinitions())
assetTagCache.remove(AssetTagCache.createKey(removedSWC, librarySWFPath, script, scriptDefQName));
}
swfCache.remove(SWFCache.createKey(removedSWC, lib.getPath()));
}
for (String defaultsCSSFileName : CSSDocumentCache.ALL_DEFAULTS_CSS_FILENAMES)
cssDocumentCache.remove(CSSDocumentCache.createKey(removedSWC, defaultsCSSFileName));
for (String fileInSWC : removedSWC.getFiles().keySet())
swfCache.remove(SWFCache.createKey(removedSWC, fileInSWC));
}
@Override
public ICSSDocumentCache getCSSDocumentCache()
{
return cssDocumentCache;
}
}