Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/libval/EclipseLinkUserLibraryValidator.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/libval/EclipseLinkUserLibraryValidator.java122
1 files changed, 122 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/libval/EclipseLinkUserLibraryValidator.java b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/libval/EclipseLinkUserLibraryValidator.java
new file mode 100644
index 0000000000..ba0859952f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/libval/EclipseLinkUserLibraryValidator.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle. 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:
+ * Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.eclipselink.core.internal.libval;
+
+import java.util.HashSet;
+import java.util.Set;
+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.core.internal.libprov.JpaUserLibraryProviderInstallOperationConfig;
+import org.eclipse.jpt.core.internal.libprov.JptLibraryProviderInstallOperationConfig;
+import org.eclipse.jpt.core.libval.LibraryValidator;
+import org.eclipse.jpt.core.platform.JpaPlatformDescription;
+import org.eclipse.jpt.eclipselink.core.internal.JptEclipseLinkCoreMessages;
+import org.eclipse.jpt.eclipselink.core.internal.JptEclipseLinkCorePlugin;
+import org.eclipse.jpt.eclipselink.core.platform.EclipseLinkPlatform;
+import org.eclipse.jpt.utility.internal.StringTools;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.osgi.framework.Version;
+
+/**
+ * Library validator for EclipseLink user libraries.
+ *
+ * In order to validate that the correct eclipselink.jar is present in the user library, the version
+ * class which appears in standard EclipseLink libraries will be examined and compared against the
+ * union of calculated version ranges, depending on the platform specified in the config.
+ */
+public class EclipseLinkUserLibraryValidator
+ implements LibraryValidator {
+
+ private final static String VERSION_CLASS_PATH = "org/eclipse/persistence/Version.class";
+
+ private final static String VERSION_FIELD_NAME = "version";
+
+
+ public IStatus validate(JptLibraryProviderInstallOperationConfig config) {
+ JpaUserLibraryProviderInstallOperationConfig jpaConfig
+ = (JpaUserLibraryProviderInstallOperationConfig) config;
+ JpaPlatformDescription platform = jpaConfig.getJpaPlatform();
+ Set<VersionRange> versionRanges = new HashSet<VersionRange>();
+ if (EclipseLinkPlatform.VERSION_1_0.equals(platform)) {
+ versionRanges.add(new VersionRange("[1.0, 3.0)"));
+ }
+ else if (EclipseLinkPlatform.VERSION_1_1.equals(platform)) {
+ versionRanges.add(new VersionRange("[1.1, 3.0)"));
+ }
+ else if (EclipseLinkPlatform.VERSION_1_2.equals(platform)) {
+ versionRanges.add(new VersionRange("[1.2, 3.0)"));
+ }
+ else if (EclipseLinkPlatform.VERSION_2_0.equals(platform)) {
+ versionRanges.add(new VersionRange("[2.0, 3.0)"));
+ }
+ else if (EclipseLinkPlatform.VERSION_2_1.equals(platform)) {
+ versionRanges.add(new VersionRange("[2.1, 3.0)"));
+ }
+ return validate(jpaConfig, versionRanges);
+ }
+
+ protected IStatus validate(
+ JpaUserLibraryProviderInstallOperationConfig config, Set<VersionRange> versionRanges) {
+
+ Version version = null;
+ for (IClasspathEntry cpe : config.resolve()) {
+ String versionString = null;
+ if (cpe.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+ IClassFileReader classReader =
+ ToolFactory.createDefaultClassFileReader(
+ cpe.getPath().toFile().getAbsolutePath(), VERSION_CLASS_PATH, IClassFileReader.FIELD_INFOS);
+ if (classReader != null) {
+ for (IFieldInfo field : classReader.getFieldInfos()) {
+ if (StringTools.stringsAreEqual(field.getName(), VERSION_FIELD_NAME.toCharArray())) {
+ try {
+ versionString = field.getConstantValueAttribute().getConstantValue().getStringValue();
+ }
+ catch (Exception e) {
+ // potentially a bit could go wrong with that last line, but if any
+ // assumptions aren't met, there's no value
+ }
+ break;
+ }
+ }
+ }
+ if (versionString != null) {
+ if (version != null) {
+ return new Status(
+ IStatus.ERROR, JptEclipseLinkCorePlugin.PLUGIN_ID,
+ JptEclipseLinkCoreMessages.EclipseLinkLibraryValidator_multipleEclipseLinkVersions);
+ }
+ else {
+ version = new Version(versionString);
+ }
+ }
+ }
+ }
+
+ if (version == null) {
+ return new Status(
+ IStatus.ERROR, JptEclipseLinkCorePlugin.PLUGIN_ID,
+ JptEclipseLinkCoreMessages.EclipseLinkLibraryValidator_noEclipseLinkVersion);
+ }
+
+ for (VersionRange versionRange : versionRanges) {
+ if (! versionRange.isIncluded(version)) {
+ return new Status(
+ IStatus.ERROR, JptEclipseLinkCorePlugin.PLUGIN_ID,
+ JptEclipseLinkCoreMessages.EclipseLinkLibraryValidator_improperEclipseLinkVersion);
+ }
+ }
+
+ return Status.OK_STATUS;
+ }
+}

Back to the top