| /** |
| * Copyright (c) 2009 Anyware Technologies and others. |
| * 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: |
| * Anyware Technologies - initial API and implementation |
| * |
| * $Id: ValidatingEContentAdapter.java,v 1.11 2009/09/22 14:54:31 bcabe Exp $ |
| */ |
| package org.eclipse.pde.emfforms.internal.validation; |
| |
| import java.util.*; |
| import org.eclipse.core.databinding.DataBindingContext; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.emf.common.util.DiagnosticChain; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.util.Diagnostician; |
| import org.eclipse.emf.ecore.util.EContentAdapter; |
| import org.eclipse.emf.edit.provider.IItemLabelProvider; |
| import org.eclipse.emf.transaction.NotificationFilter; |
| import org.eclipse.pde.emfforms.editor.EmfFormEditor; |
| import org.eclipse.pde.emfforms.editor.ValidatingService; |
| import org.eclipse.pde.emfforms.internal.Activator; |
| import org.eclipse.ui.forms.IMessageManager; |
| import org.eclipse.ui.forms.editor.IFormPage; |
| import org.osgi.framework.*; |
| |
| public class ValidatingEContentAdapter extends EContentAdapter { |
| private EmfFormEditor<?> _formEditor; |
| private DataBindingContext _dataBindingContext; |
| private Diagnostician _diagnostician; |
| |
| private ValidatingService validatingService; |
| |
| public ValidatingEContentAdapter(EmfFormEditor<?> formEditor) { |
| _formEditor = formEditor; |
| _dataBindingContext = formEditor.getDataBindingContext(); |
| |
| // if SCR is not present, we want to register the Eclipse 3.4 validator manually ... |
| forceValidatingService34Registration(); |
| |
| // Subclass the default Diagnostician to customize the String |
| // representation of each validated EObject |
| _diagnostician = new Diagnostician() { |
| @Override |
| public String getObjectLabel(EObject eObject) { |
| if (!eObject.eIsProxy()) { |
| IItemLabelProvider itemLabelProvider = (IItemLabelProvider) _formEditor.getAdapterFactory().adapt(eObject, IItemLabelProvider.class); |
| if (itemLabelProvider != null) { |
| return itemLabelProvider.getText(eObject); |
| } |
| } |
| |
| return super.getObjectLabel(eObject); |
| } |
| |
| protected boolean doValidateContents(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) { |
| |
| Resource eContainerResource = eObject.eResource(); |
| List<EObject> eContents = eObject.eContents(); |
| if (!eContents.isEmpty()) { |
| boolean result = true; |
| for (Iterator<EObject> i = eContents.iterator(); i.hasNext() && (result || diagnostics != null);) { |
| EObject child = i.next(); |
| // in case of cross resource containment, |
| // avoid to validate a child which are not in the container resource |
| Resource eChildResource = child.eResource(); |
| if (eContainerResource != null && eChildResource == eContainerResource) { |
| result &= validate(child, diagnostics, context); |
| } |
| } |
| return result; |
| } |
| return true; |
| } |
| }; |
| } |
| |
| private void forceValidatingService34Registration() { |
| if (getValidatorService() == null) { |
| BundleContext context = Activator.getDefault().getBundle().getBundleContext(); |
| Properties serviceProperties = new Properties(); |
| serviceProperties.put(Constants.SERVICE_RANKING, 10); |
| context.registerService(ValidatingService.class.getName(), new ValidatingService34(), serviceProperties); |
| } |
| } |
| |
| @Override |
| public void notifyChanged(Notification notification) { |
| super.notifyChanged(notification); |
| if (!NotificationFilter.READ.matches(notification)) { |
| validate(); |
| } |
| } |
| |
| public void validate() { |
| IFormPage activePageInstance = _formEditor.getActivePageInstance(); |
| if (_formEditor.getActivePageInstance() == null) { |
| return; |
| } |
| |
| IMessageManager messageManager = activePageInstance.getManagedForm().getMessageManager(); |
| messageManager.removeAllMessages(); |
| messageManager.setAutoUpdate(false); |
| |
| Diagnostic diagnostics = validate(_formEditor.getCurrentEObject()); |
| |
| for (Diagnostic diagnostic : diagnostics.getChildren()) { |
| getValidatorService().analyzeDiagnostic(_dataBindingContext, diagnostic, messageManager); |
| } |
| |
| messageManager.update(); |
| } |
| |
| public Diagnostic validate(EObject obj) { |
| return _diagnostician.validate(obj); |
| } |
| |
| private ValidatingService getValidatorService() { |
| BundleContext context = Activator.getDefault().getBundle().getBundleContext(); |
| if (validatingService == null) { |
| ServiceReference validatingServiceRef = context.getServiceReference(ValidatingService.class.getName()); |
| if (validatingServiceRef != null) |
| validatingService = (ValidatingService) context.getService(validatingServiceRef); |
| } |
| return validatingService; |
| } |
| |
| } |