blob: 5c95615eaeabca2ee1af9c9feb4a4a25d7bb6959 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
*/
package org.eclipse.jem.internal.beaninfo.core;
import java.io.FileNotFoundException;
import org.eclipse.core.resources.IResourceStatus;
import org.eclipse.core.runtime.*;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.osgi.framework.Bundle;
import org.eclipse.jem.internal.beaninfo.core.BeaninfoPlugin.IContributorOverrideRunnable;
import org.eclipse.jem.internal.proxy.core.IConfigurationContributionInfo;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.util.plugin.JEMUtilPlugin;
/**
* A default implementation of IBeanInfoContributor for users to subclass. Default does nothing.
* <p>
* But this does supply several very useful utility methods.
*
* @since 1.0.0
*/
public class BeanInfoContributorAdapter implements IBeanInfoContributor {
/**
* An empty array of BeaninfoEntry. Available for subclasses to return if they
* decide there is nothing to return.
*/
public static final BeaninfoEntry[] EMPTY_BEANINFO_ENTRIES = new BeaninfoEntry[0];
/**
* Return true if the given fragment is part of the package. Used by subclasses to determine
* if a override associated with a given fragment should be used for the package.
* <p>
* In other words, <code>org.eclipse</code> as a fragment and and <code>org.eclipse.core</code> as
* a packagePath will answer true, but if you swapped them it will answer false.
*
* @param fragment
* @param packagePath
* @return <code>true</code> if the given fragment is a leading part of the package.
*
* @since 1.0.0
*/
protected boolean isFragment(IPath fragment, IPath packagePath) {
return fragment.isPrefixOf(packagePath);
}
/**
* Return the unmatched portion of the package path from a fragment. Used by subclasses
* to get the part of the package path that is after the fragment. This is then used to
* append to the path from the override to get the full path to override files for this
* package.
* <p>
* This will return the part of the packagePath that is not matched by the fragment.
* <p>
* Note: It is important that the fragment and packagePath have first been tested through
* isFragment. Otherwise an invalid result will be returned.
*
* @param fragment
* @param packagePath
* @return the part of the package path not matched.
*
* @see BeanInfoContributorAdapter#isFragment(IPath, IPath)
* @since 1.0.0
*/
protected String getUnmatchedPath(IPath fragment, IPath packagePath) {
return fragment.removeFirstSegments(packagePath.segmentCount()).toString();
}
/**
* Subclasses can use this helper method to get the override resource from the given (plugin) bundle.
*
* @param bundle the bundle to use.
* @param relativePath path of file relative to the plugin.
* @param resource set to load into.
* @param runnable the runnable that is being used for the override. It is used to determine if resource already used once.
* @return the resource or <code>null</code> if couldn't be loaded or if it was already used once.
*
* @since 1.0.0
*/
protected Resource loadOverrideResource(Bundle bundle, String relativePath, ResourceSet rset, BeaninfoPlugin.IContributorOverrideRunnable runnable) {
URI uri = URI.createURI(JEMUtilPlugin.PLATFORM_PROTOCOL+":/"+JEMUtilPlugin.PLATFORM_PLUGIN+'/'+bundle.getSymbolicName()+'/'+relativePath); //$NON-NLS-1$
if (runnable.resourceContributed(uri))
return null; // Already contributed once.
Resource result = null;
try {
result = rset.getResource(uri, true);
} catch (WrappedException e) {
// FileNotFoundException is ok
if (!(e.exception() instanceof FileNotFoundException)) {
if (e.exception() instanceof CoreException
&& ((CoreException) e.exception()).getStatus().getCode() == IResourceStatus.RESOURCE_NOT_FOUND) {
// This is ok. Means uri_mapping not set so couldn't find in Workspace, also ok.
} else {
BeaninfoPlugin.getPlugin().getLogger().log(new Status(IStatus.WARNING, BeaninfoPlugin.PI_BEANINFO_PLUGINID, 0, "Error loading file\"" + uri + "\"", e.exception())); //$NON-NLS-1$ //$NON-NLS-2$
}
}
// In case it happened after creating resource but during load. Need to get rid of it in the finally.
result = null;
Resource res = rset.getResource(uri, false);
if (res != null)
rset.getResources().remove(res);
} catch (Exception e) {
// Couldn't load it for some reason.
BeaninfoPlugin.getPlugin().getLogger().log(new Status(IStatus.WARNING, BeaninfoPlugin.PI_BEANINFO_PLUGINID, 0, "Error loading file\"" + uri + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
// In case it happened after creating resource but during load. Need to get rid of it in the finally.
result = null;
Resource res = rset.getResource(uri, false);
if (res != null)
rset.getResources().remove(res);
};
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.beaninfo.core.IBeanInfoContributor#getBeanInfoEntryContributions(org.eclipse.jem.internal.proxy.core.IConfigurationContributionInfo)
*/
public BeaninfoEntry[] getBeanInfoEntryContributions(IConfigurationContributionInfo info) {
return EMPTY_BEANINFO_ENTRIES;
}
/*
* (non-Javadoc)
* @see org.eclipse.jem.internal.beaninfo.core.IBeanInfoContributor#runOverrides(org.eclipse.core.runtime.IPath, java.lang.String, org.eclipse.jem.java.JavaClass, org.eclipse.emf.ecore.resource.ResourceSet, org.eclipse.jem.internal.beaninfo.core.BeaninfoPlugin.IContributorOverrideRunnable)
*/
public void runOverrides(IPath packagePath, String className, JavaClass javaClass, ResourceSet rset, IContributorOverrideRunnable runnable) {
// Default is do nothing
}
}