| /** |
| * Copyright (c) 2009-2010 Thales Corporate Services S.A.S. |
| * 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-v2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Thales Corporate Services S.A.S - initial API and implementation |
| */ |
| package org.eclipse.egf.model.helper; |
| |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.egf.common.helper.ClassHelper; |
| import org.eclipse.egf.common.loader.IClassLoader; |
| import org.eclipse.egf.core.fcore.IPlatformFcore; |
| import org.eclipse.egf.core.fcore.IPlatformFcoreProvider; |
| import org.eclipse.egf.core.platform.loader.BundleClassLoaderFactory; |
| import org.eclipse.egf.core.platform.loader.IBundleClassLoader; |
| import org.eclipse.egf.core.preferences.IEGFModelConstants; |
| import org.eclipse.egf.model.EGFModelPlugin; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.pde.core.plugin.IPluginModelBase; |
| |
| /** |
| * @author Xavier Maysonnave |
| * |
| * TODO: runtime support should be added in that case use the bundle rather than a bundleclassloader |
| * |
| */ |
| public class ValidationHelper { |
| |
| private ValidationHelper() { |
| // Prevent Instantiation |
| } |
| |
| @SuppressWarnings("unchecked") |
| protected static IClassLoader getLoader(IPluginModelBase model, EObject eObject, Map<Object, Object> context) { |
| if (eObject == null) { |
| return null; |
| } |
| Resource resource = eObject.eResource(); |
| IPlatformFcore fcore = null; |
| IClassLoader loader = null; |
| // Locate an fcore |
| if (resource != null && resource instanceof IPlatformFcoreProvider) { |
| fcore = ((IPlatformFcoreProvider) resource).getIPlatformFcore(); |
| } |
| // Retrieve Class Loader Map if any |
| Map<IPluginModelBase, IClassLoader> loaders = (Map<IPluginModelBase, IClassLoader>) context.get(IBundleClassLoader.BUNDLE_CLASS_LOADER_MAP); |
| // Use loaders |
| if (loaders != null && fcore != null) { |
| loader = loaders.get(fcore.getPluginModelBase()); |
| if (loader == null) { |
| try { |
| loader = BundleClassLoaderFactory.getBundleClassLoader(fcore.getPluginModelBase(), eObject.getClass().getClassLoader()); |
| if (loader != null) { |
| loaders.put(fcore.getPluginModelBase(), loader); |
| } |
| } catch (CoreException ce) { |
| EGFModelPlugin.getPlugin().logError(ce); |
| return null; |
| } |
| } |
| } else { |
| // Locate the default class loader |
| loader = (IBundleClassLoader) context.get(IBundleClassLoader.DEFAULT_BUNDLE_CLASS_LOADER); |
| if (loader == null && fcore != null) { |
| // Build a default class loader |
| try { |
| loader = BundleClassLoaderFactory.getBundleClassLoader(fcore.getPluginModelBase(), eObject.getClass().getClassLoader()); |
| if (loaders != null && loader != null) { |
| loaders.put(fcore.getPluginModelBase(), loader); |
| } |
| } catch (CoreException ce) { |
| EGFModelPlugin.getPlugin().logError(ce); |
| return null; |
| } |
| } else { |
| // TODO this should be enhanced with memory support, eg: IBundleClassLoader.BUNDLE_CLASS_LOADER_MAP |
| if (fcore == null) { |
| throw new UnsupportedOperationException(); |
| } |
| } |
| } |
| if (loader == null) { |
| try { |
| loader = BundleClassLoaderFactory.getBundleClassLoader(fcore.getPluginModelBase(), eObject.getClass().getClassLoader()); |
| if (loaders != null && loader != null) { |
| loaders.put(fcore.getPluginModelBase(), loader); |
| } |
| } catch (CoreException ce) { |
| EGFModelPlugin.getPlugin().logError(ce); |
| return null; |
| } |
| } |
| return loader; |
| } |
| |
| public static boolean isLoadableClass(EObject eObject, String value, Map<Object, Object> context) { |
| |
| if (context != null && context.get(IEGFModelConstants.VALIDATE_TYPES) == Boolean.FALSE) { |
| return true; |
| } |
| if (eObject == null || eObject.eResource() == null || eObject.eResource() instanceof IPlatformFcoreProvider == false || value == null || value.trim().length() == 0) { |
| return true; |
| } |
| |
| // Retrieve fcore |
| IPlatformFcore fcore = ((IPlatformFcoreProvider) eObject.eResource()).getIPlatformFcore(); |
| // IClassLoader if any |
| IClassLoader loader = null; |
| if (fcore != null) { |
| loader = getLoader(fcore.getPluginModelBase(), eObject, context); |
| } |
| // Load Class |
| Class<?> clazz = null; |
| // Runtime or memory |
| if (fcore == null || fcore.isRuntime()) { |
| try { |
| // Runtime |
| if (fcore == null) { |
| clazz = Class.forName(value.trim()); |
| } else { |
| if (loader != null) { |
| clazz = loader.loadClass(value.trim()); |
| } |
| if (clazz == null && fcore.getBundle() != null) { |
| clazz = fcore.getBundle().loadClass(value.trim()); |
| } |
| } |
| } catch (Throwable t) { |
| // Nothing to do |
| } |
| } |
| // Target or Workspace |
| else { |
| try { |
| if (loader != null) { |
| clazz = loader.loadClass(value.trim()); |
| } |
| if (clazz == null && fcore.getBundle() != null) { |
| clazz = fcore.getBundle().loadClass(value.trim()); |
| } |
| } catch (Throwable t) { |
| // Nothing to do |
| } |
| } |
| if (clazz == null) { |
| return false; |
| } |
| return true; |
| } |
| |
| public static boolean isValidClass(EObject eObject, Class<?> type, String value, Map<Object, Object> context) { |
| if (context != null && context.get(IEGFModelConstants.VALIDATE_TYPES) == Boolean.FALSE) { |
| return true; |
| } |
| if (eObject == null || eObject.eResource() == null || eObject.eResource() instanceof IPlatformFcoreProvider == false || value == null || value.trim().length() == 0) { |
| return true; |
| } |
| // Retrieve fcore |
| IPlatformFcore fcore = ((IPlatformFcoreProvider) eObject.eResource()).getIPlatformFcore(); |
| // IClassLoader if any |
| IClassLoader loader = null; |
| if (fcore != null) { |
| loader = getLoader(fcore.getPluginModelBase(), eObject, context); |
| } |
| // Load Class |
| Class<?> clazz = null; |
| // Runtime or memory |
| if (fcore == null || fcore.isRuntime()) { |
| try { |
| // Runtime |
| if (fcore == null) { |
| clazz = Class.forName(value.trim()); |
| } else { |
| if (loader != null) { |
| clazz = loader.loadClass(value.trim()); |
| } |
| if (clazz == null && fcore.getBundle() != null) { |
| clazz = fcore.getBundle().loadClass(value.trim()); |
| } |
| } |
| if (clazz == null) { |
| return false; |
| } |
| // Valid Value |
| if (ClassHelper.isSubClass(clazz, type) == false) { |
| return false; |
| } |
| } catch (Throwable t) { |
| // Nothing to do |
| } |
| } |
| // Target or Workspace |
| else { |
| try { |
| if (loader != null) { |
| clazz = loader.loadClass(value.trim()); |
| } |
| if (clazz == null && fcore.getBundle() != null) { |
| clazz = fcore.getBundle().loadClass(value.trim()); |
| } |
| if (clazz == null) { |
| return false; |
| } |
| // Valid Value |
| if (ClassHelper.isSubClass(clazz, type) == false) { |
| return false; |
| } |
| } catch (Throwable t) { |
| // Nothing to do |
| } |
| if (clazz == null) { |
| return false; |
| } |
| } |
| if (clazz == null) { |
| return false; |
| } |
| return true; |
| } |
| |
| } |