blob: 10b24cd5500622b2fd6a2d2cbe4d7becc2e603ce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.common.eclipselink.core.internal.libval;
import java.util.Arrays;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.util.IClassFileReader;
import org.eclipse.jdt.core.util.IFieldInfo;
import org.eclipse.jpt.common.eclipselink.core.JptCommonEclipseLinkCoreMessages;
import org.eclipse.jpt.common.eclipselink.core.internal.plugin.JptCommonEclipseLinkCorePlugin;
import org.eclipse.jst.common.project.facet.core.libprov.user.UserLibraryProviderInstallOperationConfig;
import org.eclipse.osgi.service.resolver.VersionRange;
import org.osgi.framework.Version;
/**
* EclipseLink
* {@link org.eclipse.jpt.common.core.libval.LibraryValidator} utility methods.
*/
public class EclipseLinkLibraryValidatorTools {
/**
* Validate that there is a one and only one occurrence of EclipseLink
* on the specified config's library classpath and that its version
* is within the specified version range.
*/
public static IStatus validateEclipseLinkVersion(UserLibraryProviderInstallOperationConfig config, VersionRange versionRange) {
return validateEclipseLinkVersion(config.resolve(), versionRange);
}
private static IStatus validateEclipseLinkVersion(Iterable<IClasspathEntry> libraryEntries, VersionRange versionRange) {
Version version = null;
for (IClasspathEntry libraryEntry : libraryEntries) {
if (libraryEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
String versionString = null;
IClassFileReader classReader = buildClassFileReader(libraryEntry);
if (classReader != null) {
for (IFieldInfo field : classReader.getFieldInfos()) {
if (Arrays.equals(field.getName(), VERSION_FIELD_NAME_CHAR_ARRAY)) {
try {
versionString = field.getConstantValueAttribute().getConstantValue().getStringValue();
} catch (RuntimeException ex) {
// assume the field has no value
}
break;
}
}
}
if (versionString != null) {
if (version != null) {
return buildErrorStatus(JptCommonEclipseLinkCoreMessages.ECLIPSELINK_LIBRARY_VALIDATOR__MULTIPLE_ECLIPSELINK_VERSIONS);
}
version = new Version(versionString);
}
}
}
if (version == null) {
return buildErrorStatus(JptCommonEclipseLinkCoreMessages.ECLIPSELINK_LIBRARY_VALIDATOR__NO_ECLIPSELINK_VERSION);
}
if ( ! versionRange.isIncluded(version)) {
return buildErrorStatus(JptCommonEclipseLinkCoreMessages.ECLIPSELINK_LIBRARY_VALIDATOR__IMPROPER_ECLIPSELINK_VERSION);
}
return Status.OK_STATUS;
}
private final static String VERSION_FIELD_NAME = "version"; //$NON-NLS-1$
private final static char[] VERSION_FIELD_NAME_CHAR_ARRAY = VERSION_FIELD_NAME.toCharArray();
private static IClassFileReader buildClassFileReader(IClasspathEntry entry) {
return ToolFactory.createDefaultClassFileReader(entry.getPath().toFile().getAbsolutePath(), VERSION_CLASS_PATH, IClassFileReader.FIELD_INFOS);
}
private final static String VERSION_CLASS_PATH = "org/eclipse/persistence/Version.class"; //$NON-NLS-1$
private static IStatus buildErrorStatus(String message) {
return JptCommonEclipseLinkCorePlugin.instance().buildErrorStatus(message);
}
}