/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core.container; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.osgi.framework.Bundle; import org.teiid.core.designer.ModelerCoreException; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; /** * ResourceDescriptorImpl * * @since 8.0 */ public class ResourceDescriptorImpl implements ResourceDescriptor { private Bundle factoryBundle; private String factoryClassName; private final String uniqueID; private final List protocols; private final List extensions; public ResourceDescriptorImpl( final String uniqueID ) { CoreArgCheck.isNotNull(uniqueID); CoreArgCheck.isNotZeroLength(uniqueID); this.uniqueID = uniqueID; this.protocols = new ArrayList(); this.extensions = new ArrayList(); } /** * Return the unique identifier of the resource type. * * @return the unique identifier */ @Override public String getUniqueIdentifier() { return uniqueID; } /** * @return */ @Override public List getExtensions() { return extensions; } /** * @return */ @Override public List getProtocols() { return protocols; } /** * @see ResourceDescriptor#getResourceFactory() */ @Override public Resource.Factory getResourceFactory() throws ModelerCoreException { try { final Class factoryClass = this.factoryBundle.loadClass(this.factoryClassName); return (Resource.Factory)factoryClass.newInstance(); } catch (ClassNotFoundException e) { final Object[] params = new Object[] {this.factoryClassName, this.factoryBundle}; throw new ModelerCoreException(e, ModelerCore.Util.getString("ResourceDescriptorImpl.Unable_to_load_class_using_bundle", //$NON-NLS-1$ params)); } catch (InstantiationException e) { final Object[] params = new Object[] {this.factoryClassName, this.factoryBundle}; throw new ModelerCoreException( e, ModelerCore.Util.getString("ResourceDescriptorImpl.Unable_to_instantiate_class_using_bundle", //$NON-NLS-1$ params)); } catch (IllegalAccessException e) { final Object[] params = new Object[] {this.factoryClassName, this.factoryBundle}; throw new ModelerCoreException( e, ModelerCore.Util.getString("ResourceDescriptorImpl.Unable_to_instantiate_and_access_class_using_bundle", //$NON-NLS-1$ params)); } } public void setResourceFactoryClass( final String className ) { this.setResourceFactoryClass(className, null); } public void setResourceFactoryClass( final String className, final Bundle bundle ) { if (className == null) { CoreArgCheck.isNotNull(className, ModelerCore.Util.getString("ResourceDescriptorImpl.The_class_name_string_may_not_be_null")); //$NON-NLS-1$ } if (bundle != null) { this.factoryBundle = bundle; } this.factoryClassName = className; } protected String getResourceFactoryClassName() { return this.factoryClassName; } public static void register( final ResourceDescriptor resourceDescriptor, final ResourceSet resourceSet ) throws ModelerCoreException { final List protocols = resourceDescriptor.getProtocols(); final List fileExtensions = resourceDescriptor.getExtensions(); final String factoryExtensionID = resourceDescriptor.getUniqueIdentifier(); if (protocols.size() != 0 || fileExtensions.size() != 0) { try { final Resource.Factory factory = resourceDescriptor.getResourceFactory(); // may throw exception final String factoryClassName = factory.getClass().getName(); // Get references to useful things ... final Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry(); final Map extensionToFactoryMap = registry.getExtensionToFactoryMap(); final Map protocolToFactoryMap = registry.getProtocolToFactoryMap(); // Add the factory for each of the protocols ... final Iterator iter = protocols.iterator(); while (iter.hasNext()) { final String protocol = (String)iter.next(); if (ModelerCore.DEBUG) { ModelerCore.Util.log(IStatus.INFO, ModelerCore.Util.getString("ResourceDescriptorImpl.DEBUG.Registering_resource_factory_for_URI_protocol", factoryClassName, protocol)); //$NON-NLS-1$ } final Object prevFactory = protocolToFactoryMap.put(protocol, factory); if (prevFactory != null && prevFactory.getClass() != factory.getClass()) { ModelerCore.Util.log(IStatus.WARNING, ModelerCore.Util.getString("ResourceDescriptorImpl.Replaced_resource_factory_for_URI_protocol", prevFactory.getClass().getName(), factoryClassName, protocol)); //$NON-NLS-1$ } } // Add the factory for each of the extensions ... final Iterator iter2 = fileExtensions.iterator(); while (iter2.hasNext()) { final String fileExtension = (String)iter2.next(); if (ModelerCore.DEBUG) { ModelerCore.Util.log(IStatus.INFO, ModelerCore.Util.getString("ResourceDescriptorImpl.DEBUG.Registering_resource_factory_for_URI_extension", factoryClassName, fileExtension)); //$NON-NLS-1$ } final Object prevFactory = extensionToFactoryMap.put(fileExtension, factory); if (prevFactory != null && prevFactory.getClass() != factory.getClass()) { ModelerCore.Util.log(IStatus.WARNING, ModelerCore.Util.getString("ResourceDescriptorImpl.Replaced_resource_factory_for_URI_extension", prevFactory.getClass().getName(), factoryClassName, fileExtension)); //$NON-NLS-1$ } } } catch (CoreException e) { final String msg = ModelerCore.Util.getString("ResourceDescriptorImpl.Error_while_loading_resource_factory_extension", factoryExtensionID); //$NON-NLS-1$ throw new ModelerCoreException(msg); } } } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals( Object obj ) { final ResourceDescriptorImpl that = (ResourceDescriptorImpl)obj; if (!this.uniqueID.equals(that.uniqueID)) { return false; } if (!this.factoryClassName.equals(that.factoryClassName)) { return false; } if (!this.protocols.containsAll(that.protocols) || !that.protocols.containsAll(this.protocols)) { return false; } if (!this.extensions.containsAll(that.extensions) || !that.extensions.containsAll(this.extensions)) { return false; } if (!this.factoryBundle.equals(that.factoryBundle)) { return false; } return true; } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return this.uniqueID.hashCode(); } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { final StringBuffer sb = new StringBuffer(); sb.append("ResourceDescriptor "); //$NON-NLS-1$ sb.append(this.uniqueID); sb.append(" protocols=["); //$NON-NLS-1$ boolean first = true; for (Iterator iter = this.protocols.iterator(); iter.hasNext();) { if (!first) { sb.append(','); } sb.append(iter.next()); first = false; } sb.append("], extensions=["); //$NON-NLS-1$ first = true; for (Iterator iter = this.extensions.iterator(); iter.hasNext();) { if (!first) { sb.append(','); } sb.append(iter.next()); first = false; } sb.append(']'); return sb.toString(); } }