diff options
Diffstat (limited to 'core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java')
-rw-r--r-- | core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java b/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java new file mode 100644 index 0000000000..8a412c1d54 --- /dev/null +++ b/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidatorMetaData.java @@ -0,0 +1,241 @@ +/******************************************************************************* + * Copyright (c) 2001, 2006 IBM Corporation 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: + * IBM Corporation - initial API and implementation + * Jens Lukowski/Innoopract - initial renaming/restructuring + * + *******************************************************************************/ +package org.eclipse.wst.sse.ui.internal.reconcile.validator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.core.runtime.content.IContentTypeManager; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.wst.sse.ui.internal.Logger; +import org.eclipse.wst.sse.ui.internal.reconcile.ReconcileAnnotationKey; +import org.eclipse.wst.validation.internal.provisional.core.IValidator; +import org.osgi.framework.Bundle; + + +/** + * Object that holds information relevant to the creation of a validator for + * the reconciling framework. + * + * @author pavery,nitind + */ +public class ValidatorMetaData { + private String fClass = null; + private IConfigurationElement fConfigurationElement = null; + private String fId = null; + private String fScope; + + // a hash map of explicitly declared content type Ids (String) that points to lists of + // partition types (List of Strings) + // contentTypeId -> List(paritionType, paritionType, partitionType, ...) + // contentTypeId2 -> List(partitionType, partitionType, ...) + // ... + private HashMap fMatrix = null; + + public ValidatorMetaData(IConfigurationElement element, String vId, String vClass, String vScope) { + fId = vId; + fClass = vClass; + fConfigurationElement = element; + fScope = vScope; + fMatrix = new HashMap(); + } + + /** + * TODO: This exact method is also in ValidatorStrategy. Should be in a common place. + * + * @param contentTypeId + * @return + */ + private String[] calculateParentContentTypeIds(String contentTypeId) { + + Set parentTypes = new HashSet(); + + IContentTypeManager ctManager = Platform.getContentTypeManager(); + IContentType ct = ctManager.getContentType(contentTypeId); + String id = contentTypeId; + + while(ct != null && id != null) { + + parentTypes.add(id); + ct = ctManager.getContentType(id); + if(ct != null) { + IContentType baseType = ct.getBaseType(); + id = (baseType != null) ? baseType.getId() : null; + } + } + return (String[])parentTypes.toArray(new String[parentTypes.size()]); + } + + public void addContentTypeId(String contentTypeId) { + if (!fMatrix.containsKey(contentTypeId)) + fMatrix.put(contentTypeId, new ArrayList()); + } + + public void addParitionType(String contentTypeId, String partitionType) { + if (!fMatrix.containsKey(contentTypeId)) + fMatrix.put(contentTypeId, new ArrayList()); + + List partitionList = (List) fMatrix.get(contentTypeId); + partitionList.add(partitionType); + } + + /** + * @param contentType + * @return whether this validator explicitly declared that it could handle + * this content type or any of its parent content types + */ + public boolean canHandleContentType(String contentType) { + // need to iterate hierarchy + String[] contentHierarchy = calculateParentContentTypeIds(contentType); + for (int i = 0; i < contentHierarchy.length; i++) { + if(fMatrix.containsKey(contentHierarchy[i])) + return true; + } + return false; + } + + /** + * @param contentType + * @return whether this validator explicitly declared that it could handle + * this content type + */ + public boolean mustHandleContentType(String contentType) { + return fMatrix.containsKey(contentType); + } + + /** + * @param contentTypeIds + * @param partitionType + * @return whether this validator declared that it could handle this + * content type, or one of its parent content types, and partition + * type + */ + public boolean canHandlePartitionType(String contentTypeIds[], String paritionType) { + for(int i=0; i<contentTypeIds.length; i++) { + List partitions = (List) fMatrix.get(contentTypeIds[i]); + if (partitions != null) { + for (int j = 0; j < partitions.size(); j++) { + if (paritionType.equals(partitions.get(j))) + return true; + } + } + } + return false; + } + + /** + * @param element + * @param classAttribute + * @return Object + * @throws CoreException + */ + Object createExecutableExtension(final IConfigurationElement element, final String classAttribute) throws CoreException { + Object obj = null; + obj = element.createExecutableExtension(classAttribute); + return obj; + } + + /** + * Creates an extension. If the extension plugin has not been loaded a + * busy cursor will be activated during the duration of the load. + * + * @param element + * @param classAttribute + * @return Object + * @throws CoreException + */ + public Object createExtension() { + // If plugin has been loaded create extension. + // Otherwise, show busy cursor then create extension. + final IConfigurationElement element = getConfigurationElement(); + final Object[] result = new Object[1]; + String pluginId = element.getDeclaringExtension().getNamespace(); + Bundle bundle = Platform.getBundle(pluginId); + if (bundle.getState() == Bundle.ACTIVE) { + try { + return createExecutableExtension(element, "class"); //$NON-NLS-1$ + } catch (CoreException e) { + handleCreateExecutableException(result, e); + } + } else { + BusyIndicator.showWhile(null, new Runnable() { + public void run() { + try { + result[0] = createExecutableExtension(element, "class"); //$NON-NLS-1$ + } catch (Exception e) { + handleCreateExecutableException(result, e); + } + } + }); + } + return result[0]; + } + + /** + * @return a validator instance based on this ValidatorMetaData instance + */ + public IValidator createValidator() { + Object obj = null; + obj = createExtension(); + if (obj == null) { + return null; + } + return (obj instanceof IValidator) ? (IValidator) obj : null; + } + + public IConfigurationElement getConfigurationElement() { + return fConfigurationElement; + } + + public String getValidatorClass() { + return fClass; + } + + public String getValidatorId() { + return fId; + } + + /** + * @param result + * @param e + */ + void handleCreateExecutableException(Object[] result, Throwable e) { + Logger.logException(e); + e.printStackTrace(); + result[0] = null; + } + /** + * ReconcileAnnotationKey.TOTAL or ReconcileAnnotationKey.PARTIAL + * @return + */ + public int getValidatorScope() { + return fScope.equalsIgnoreCase("total") ? ReconcileAnnotationKey.TOTAL : ReconcileAnnotationKey.PARTIAL; //$NON-NLS-1$ + } + + /** + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuffer debugString = new StringBuffer("ValidatorMetaData:"); //$NON-NLS-1$ + if (fId != null) + debugString.append(" [id:" + fId + "]"); //$NON-NLS-1$ //$NON-NLS-2$ + return debugString.toString(); + } +} |