blob: 6f9a8bc1910728e73a68a3721adb361a3efcb450 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010-2019 Mia-Software 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
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software) - initial API and implementation
* Nicolas Bros (Mia-Software) - Bug 339991 - don't use internal APIs in org.eclipse.modisco.facet.util.core.internal.BuildPropertiesUtils
* Laurent Pichierri (Soft-Maint) - Bug 371204 - Compatibility with Helios
* Gregoire Dupe (Mia-Software) - Bug 371204 - Compatibility with Helios
* Gregoire Dupe (Mia-Software) - Bug 417789 - org.eclipse.modisco.facet.util.core should not so much dependencies
*******************************************************************************/
package org.eclipse.modisco.facet.util.pde.core.internal;
import java.io.ByteArrayInputStream;
import java.lang.reflect.Method;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.modisco.facet.util.core.Logger;
import org.eclipse.modisco.facet.util.pde.core.internal.exception.PdeCoreUtilsRuntimeException;
import org.eclipse.pde.core.IEditableModel;
import org.eclipse.pde.core.build.IBuild;
import org.eclipse.pde.core.build.IBuildEntry;
import org.eclipse.pde.core.build.IBuildModel;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
public final class BuildPropertiesUtils {
// This class has been copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.BuildPropertiesUtils
private BuildPropertiesUtils() {
// utilities class
}
/**
* Get the build model of an Eclipse plug-in
*
* @param model
* a plug-in's PDE model
* @return a build model or <code>null</code> if the build.properties file
* does not exist
* @throws CoreException
*/
public static IBuildModel getBuildModel(final IPluginModelBase model) throws CoreException {
final IProject project = model.getUnderlyingResource().getProject();
final IPluginModelBase pluginModelBase = PluginRegistry.findModel(project);
//Here we use a reflexive call to be able to build against an Helios platform.
//This method will build with Helios, but will fail at runtime.
//We do not have a better solution. Otherwise we would have to use an internal API.
//We prefer some loose of functionality with Helios that to use internal API.
IBuildModel buildModel = null;
try {
final Class<? extends IPluginModelBase> class1 = pluginModelBase.getClass();
final Method method = class1.getMethod("getBuildModel"); //$NON-NLS-1$
if (method != null) {
buildModel = (IBuildModel) method.invoke(pluginModelBase);
}
} catch (Exception e) {
Logger.logError(e, Activator.getDefault());
}
return buildModel;
}
/**
* @param project
* the project for which to get a build model top level object
* @return a build model top level object or <code>null</code> if the
* build.properties file does not exist
* @throws CoreException
*/
public static IBuild getBuild(final IProject project) throws CoreException {
IBuild result = null;
final IPluginModelBase pluginModel = PluginRegistry.findModel(project);
if (pluginModel != null) {
final IBuildModel buildModel = getBuildModel(pluginModel);
if (buildModel != null) {
result = buildModel.getBuild();
}
}
return result;
}
/**
* @param elementFile
* the file whose presence in the build.properties is being
* tested
* @return whether the file is in the build.properties (<code>false</code>
* if the build.properties file does not exist)
* @throws CoreException
*/
public static boolean isInBuild(final IFile elementFile) throws CoreException {
final IProject project = elementFile.getProject();
final IPath filePath = elementFile.getFullPath().removeFirstSegments(1);
final IBuild build = getBuild(project);
boolean result = false;
if (build != null) {
final IBuildEntry entry = build.getEntry(IBuildEntry.BIN_INCLUDES);
if (entry != null) {
final String[] tokens = entry.getTokens();
for (String token : tokens) {
final IPath path = new Path(token);
// if "abc/" is included, then "abc/def/" is too
if (path.isPrefixOf(filePath)) {
result = true;
}
}
}
}
return result;
}
public static void addToBuild(final IFile elementFile) throws CoreException {
final IProject project = elementFile.getProject();
if (isInBuild(elementFile)) {
return;
}
final IPath filePath = elementFile.getFullPath().removeFirstSegments(1);
final IPluginModelBase pluginModel = PluginRegistry.findModel(project);
final IFile buildProperties = elementFile.getProject().getFile("build.properties"); //$NON-NLS-1$
if (!buildProperties.exists()) {
buildProperties.create(new ByteArrayInputStream(new byte[0]), true,
new NullProgressMonitor());
}
final IBuildModel buildModel = getBuildModel(pluginModel);
if (buildModel == null) {
throw new PdeCoreUtilsRuntimeException("Couldn't get build model"); //$NON-NLS-1$
}
final IBuild build = buildModel.getBuild();
IBuildEntry entry = build.getEntry(IBuildEntry.BIN_INCLUDES);
// if entry "bin.includes" does not exist, then create it
if (entry == null) {
entry = buildModel.getFactory().createEntry(IBuildEntry.BIN_INCLUDES);
build.add(entry);
}
entry.addToken(filePath.toPortableString());
((IEditableModel) buildModel).save();
}
}