diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java')
-rw-r--r-- | jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java | 387 |
1 files changed, 0 insertions, 387 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java deleted file mode 100644 index af1ca6a5c..000000000 --- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java +++ /dev/null @@ -1,387 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 Oracle Corporation. - * 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: - * Cameron Bateman/Oracle - initial API and implementation - * - ********************************************************************************/ -package org.eclipse.jst.jsf.designtime.internal.symbols; - -import java.io.IOException; -import java.io.InputStream; -import java.util.AbstractMap; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jst.jsf.common.internal.resource.EventResult; -import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener; -import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener; -import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent; -import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType; -import org.eclipse.jst.jsf.context.symbol.internal.impl.IMapSourceInfo; -import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; -import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil; - -class ResourceBundleMapSource extends AbstractMap implements IMapSourceInfo -{ - private static final String PROPERTY_QUALIFIER = - "org.eclipse.jst.jsf.designtime.internal.jsp"; //$NON-NLS-1$ - private static final String SESSION_PROPERTY_NAME_PROJECT = - "ResourceBundleMapSource"; //$NON-NLS-1$ - private static final QualifiedName SESSION_PROPERTY_KEY_PROJECT = - new QualifiedName(PROPERTY_QUALIFIER, SESSION_PROPERTY_NAME_PROJECT); - private static final Object STATIC_LOCK = new Object(); - - private static IFile getCachedBundleFile(final IProject project, final String baseName) - { - if (project != null) - { - final Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(project); - - if (bundleFileCache != null) - { - final BundleFileCacheInfo info = bundleFileCache.get(baseName); - if (info != null) - { - return info.getFile(); - } - } - } - - return null; - } - - private static class BundleFileCacheInfo - { - private final IFile _file; - private final Map<Object,CachedDataItem> _cachedData; - public BundleFileCacheInfo(final IFile file) - { - super(); - _file = file; - _cachedData = - Collections.synchronizedMap(new HashMap<Object, CachedDataItem>()); - } - public IFile getFile() - { - return _file; - } - public Object getCachedData(final Object key) - { - CachedDataItem item = _cachedData.get(key); - - if (item != null) - { - return item.getData(); - } - return null; - } - - public Object putCachedData(final Object key, final Object value, final long timestamp) - { - CachedDataItem item = new CachedDataItem(value, timestamp); - CachedDataItem oldItem = _cachedData.put(key, item); - if (oldItem != null) - { - return oldItem.getData(); - } - return null; - } - - public boolean hasChanged(final Object key, final long timestamp) - { - CachedDataItem item = _cachedData.get(key); - if (item != null) - { - return item.getTimestamp() != timestamp; - } - return false; - } - - private static class CachedDataItem - { - private final Object _data; - private final long _timestamp; - public CachedDataItem(Object data, long timestamp) - { - super(); - _data = data; - _timestamp = timestamp; - } - public final Object getData() - { - return _data; - } - public final long getTimestamp() - { - return _timestamp; - } - } - } - - private static Map<String, BundleFileCacheInfo> getBundleFileCache(final IProject project) - { - synchronized(STATIC_LOCK) - { - Map<String, BundleFileCacheInfo> bundleFileCache = null; - - try - { - bundleFileCache = - (Map<String, BundleFileCacheInfo>) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT); - - if (bundleFileCache == null) - { - bundleFileCache = new HashMap<String, BundleFileCacheInfo>(); - final LifecycleListener listener = new LifecycleListener(project, ResourcesPlugin.getWorkspace()); - listener.addListener(new IResourceLifecycleListener() - { - public EventResult acceptEvent(final ResourceLifecycleEvent event) - { - EventResult result = EventResult.getDefaultEventResult(); - - if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE) - { - try - { - //Bug 283764: this listener may be called more than once - check project not already inaccessible - if (project.isAccessible()) - { - final Map<String, BundleFileCacheInfo> bundleCache = - (Map<String, BundleFileCacheInfo>) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT); - //This listener may be called more than once - check session property not already nulled - if (bundleCache != null) - { - bundleCache.clear(); - project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, null); - } - } - } - catch (final CoreException ce) - { - JSFCorePlugin.log("Error clearing bundle file cache", ce); //$NON-NLS-1$ - } - result = EventResult.getDisposeAfterEventResult(); - } - - return result; - } - } - ); - - project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, bundleFileCache); - } - } - catch (final CoreException ce) - { - JSFCorePlugin.log("Error creating bundle file cache", ce); //$NON-NLS-1$ - } - - return bundleFileCache; - } - } - - private static IFile createCachedBundleFile(final IProject project, - final String resourcePathStr) - throws IOException, CoreException - { - final IStorage storage = - LoadBundleUtil.getLoadBundleResource(project, resourcePathStr); - - IFile bundleRes = null; - - if (storage != null - && storage.getAdapter(IFile.class) != null) - { - bundleRes = (IFile) storage.getAdapter(IFile.class); - // if file is removed, clear the bundle from the store. - final LifecycleListener listener = new LifecycleListener(bundleRes, ResourcesPlugin.getWorkspace()); - listener.addListener(new IResourceLifecycleListener() - { - public EventResult acceptEvent(final ResourceLifecycleEvent event) - { - EventResult result = EventResult.getDefaultEventResult(); - - if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE) - { - Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(project); - bundleFileCache.remove(resourcePathStr); - result = EventResult.getDisposeAfterEventResult(); - } - return result; - } - } - ); - - getBundleFileCache(project).put(resourcePathStr, new BundleFileCacheInfo(bundleRes)); - return bundleRes; - } - - throw new IOException("Bundle "+resourcePathStr+" not found in classpath for project: "+project.getName()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - private Properties _resourceBundle; // = null; set on first access or changes - private final IFile _bundleFile; // the resource - private final String _resourcePathStr; // the key used in the file cache - // as returned by IResource.getModificationStamp() - // the last time _resourceBundle was loaded - private long _lastModificationStamp; - - ResourceBundleMapSource(final IProject context, - final String resourcePathStr) - throws IOException, JavaModelException, CoreException - { - IFile cachedBundleFile = getCachedBundleFile(context, resourcePathStr); - - if (cachedBundleFile == null) - { - cachedBundleFile = createCachedBundleFile(context, resourcePathStr); - } - - _bundleFile = cachedBundleFile; - _resourcePathStr = resourcePathStr; - } - - private void checkAndRefreshBundle() - { - if (_bundleFile.isAccessible()) - { - if (_resourceBundle == null // doesn't exist yet - // exists but ws is out of sync - || !_bundleFile.isSynchronized(IResource.DEPTH_ZERO) - // exists but user has changed in workspace - || _bundleFile.getModificationStamp() - != _lastModificationStamp) - { - InputStream bundleStream = null; - try - { - // force refresh if out of sync - bundleStream = _bundleFile.getContents(true); - _resourceBundle = new Properties(); - _resourceBundle.load(bundleStream); - _lastModificationStamp = _bundleFile.getModificationStamp(); - } - catch (final CoreException ce) - { - JSFCorePlugin.log("Error refreshing bundle", ce); //$NON-NLS-1$ - } - catch (final IOException ioe) - { - JSFCorePlugin.log("Error refreshing bundle", ioe); //$NON-NLS-1$ - } - finally - { - if (bundleStream != null) - { - try - { - bundleStream.close(); - } - catch (final IOException ioe) - { - JSFCorePlugin.log("Error closing bundle", ioe); //$NON-NLS-1$ - } - } - } - } - } - else - { - // bundle no longer exists so remove it - final Map<String, BundleFileCacheInfo> bundleFileCache = getBundleFileCache(_bundleFile.getProject()); - - if (bundleFileCache != null && - bundleFileCache.containsKey(_resourcePathStr)) - { - bundleFileCache.remove(_resourcePathStr); - } - // in either case, clear the bundle entry - if (_resourceBundle != null) - { - _resourceBundle.clear(); - _resourceBundle = null; - } - } - } - - @Override - public Set entrySet() - { - checkAndRefreshBundle(); - - if (_resourceBundle == null) - { - return Collections.EMPTY_SET; - } - return _resourceBundle.entrySet(); - } - - /** - * @param key - * @return the value - * @see java.util.AbstractMap#get(java.lang.Object) - * @overrride to optimize for the fact that we are doing a hash get - */ - // - @Override - public Object get(final Object key) - { - checkAndRefreshBundle(); - - if (_resourceBundle == null) - { - return null; - } - return _resourceBundle.get(key); - } - - public final boolean hasChanged(final Object key) - { - final BundleFileCacheInfo cache = getBundleFileCache( - _bundleFile.getProject()).get(_resourcePathStr); - if (cache != null) - { - return cache.hasChanged(key, _bundleFile.getModificationStamp()); - } - // return true since if there is nothing cached, the caller will want - // to react. - return true; - } - - public Object getCachedValue(final Object key) - { - final BundleFileCacheInfo cache = getBundleFileCache( - _bundleFile.getProject()).get(_resourcePathStr); - if (cache != null) - { - return cache.getCachedData(key); - } - return null; - } - - public void putCachedValue(final Object key, final Object value) - { - final BundleFileCacheInfo cache = getBundleFileCache( - _bundleFile.getProject()).get(_resourcePathStr); - if (cache != null) - { - cache.putCachedData(key, value, _lastModificationStamp); - } - } -}
\ No newline at end of file |