/*
* 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;
import org.eclipse.core.runtime.IStatus;
import org.osgi.framework.Bundle;
/**
*
*
* @since 8.0
*/
public class ExtensionDescriptorImpl implements ExtensionDescriptor {
protected static final ExtensionDescriptor[] EMPTY_ARRAY = new ExtensionDescriptor[0];
protected Object id;
protected DescriptorClassLoader extensionClassLoader;
// ==================================================================================
// C O N S T R U C T O R S
// ==================================================================================
public ExtensionDescriptorImpl( final Object id,
final String className,
final Bundle bundle ) {
if (id == null) {
throw new IllegalArgumentException(ModelerCore.Util.getString("ExtensionDescriptorImpl.The_ID_reference_may_not_be_null_1")); //$NON-NLS-1$
}
this.id = id;
if (className != null && bundle != null) {
this.extensionClassLoader = new DescriptorClassLoader(className, bundle);
}
}
// ==================================================================================
// P U B L I C M E T H O D S
// ==================================================================================
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getId()
*/
@Override
public Object getId() {
return this.id;
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getClassName()
* @since 4.3
*/
@Override
public String getClassName() {
return (this.extensionClassLoader != null ? this.extensionClassLoader.getClassName() : null);
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getExtensionClass()
*/
@Override
public Class getExtensionClass() {
return (this.extensionClassLoader != null ? this.extensionClassLoader.getLoadedClass() : null);
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getExtensionClassInstance()
*/
@Override
public Object getExtensionClassInstance() {
return (this.extensionClassLoader != null ? this.extensionClassLoader.getClassInstance() : null);
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getNewExtensionClassInstance()
*/
@Override
public Object getNewExtensionClassInstance() {
return (this.extensionClassLoader != null ? this.extensionClassLoader.getNewClassInstance() : null);
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getChildren()
*/
@Override
public ExtensionDescriptor[] getChildren() {
return EMPTY_ARRAY;
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#isMultiDescriptor()
*/
@Override
public boolean isMultiDescriptor() {
return false;
}
/**
* @see org.teiid.designer.core.ExtensionDescriptor#getChildDescriptor(java.lang.Object)
*/
@Override
public ExtensionDescriptor getChildDescriptor(final Object id) {
return null;
}
// /**
// * @see java.lang.Object#equals(java.lang.Object)
// * @since 4.3
// */
// public boolean equals(Object obj) {
// if (!(obj instanceof MetamodelRootClassDescriptorImpl)) {
// return false;
// }
// ExtensionDescriptorImpl that = (ExtensionDescriptorImpl)obj;
// boolean equalIds = (this.id == null
// ? that.id == null
// : this.id.equals(that.id));
// boolean equalExtensionLoaders = (this.extensionClassLoader == null
// ? that.extensionClassLoader == null
// : this.extensionClassLoader.equals(that.extensionClassLoader));
// if (equalIds && equalExtensionLoaders) {
// return true;
// }
// return super.equals(obj);
// }
// ==================================================================================
// I N N E R C L A S S
// ==================================================================================
private class DescriptorClassLoader {
private final String className;
private final Bundle bundle;
private boolean loadClassFailure;
private boolean newInstanceFailure;
private Class loadedClass;
private Object classInstance;
public DescriptorClassLoader( final String className,
final Bundle bundle ) {
if (className == null) {
throw new IllegalArgumentException(ModelerCore.Util.getString("ExtensionDescriptorImpl.The_class_name_string_may_not_be_null_1")); //$NON-NLS-1$
}
if (className.length() == 0) {
throw new IllegalArgumentException(ModelerCore.Util.getString("ExtensionDescriptorImpl.The_class_name_string_may_not_be_zero_length_3")); //$NON-NLS-1$
}
if (bundle == null) {
throw new IllegalArgumentException(
ModelerCore.Util.getString("ExtensionDescriptorImpl.The_bundle_reference_may_not_be_null_2")); //$NON-NLS-1$
}
this.className = className;
this.bundle = bundle;
this.loadClassFailure = false;
this.newInstanceFailure = false;
this.loadedClass = null;
this.classInstance = null;
}
public String getClassName() {
return this.className;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof DescriptorClassLoader)) {
return false;
}
DescriptorClassLoader that = (DescriptorClassLoader)obj;
if (this.className.equals(that.className) && this.bundle.equals(that.bundle)) {
return true;
}
return super.equals(obj);
}
/**
* Return the loaded class associated with this instance
* @return Class
*/
public Class getLoadedClass() {
if (!loadClassFailure && loadedClass == null) {
try {
loadedClass = bundle.loadClass(className);
loadClassFailure = false;
} catch (ClassNotFoundException e) {
ModelerCore.Util.log(IStatus.ERROR,
ModelerCore.Util.getString("ExtensionDescriptorImpl.Unable_to_load_class_using_bundle_4", className, bundle)); //$NON-NLS-1$
loadedClass = null;
loadClassFailure = true;
}
}
return loadedClass;
}
/**
* Get instance of the class
* @return Object
*/
public Object getClassInstance() {
if (!newInstanceFailure && classInstance == null && getLoadedClass() != null) {
try {
classInstance = getLoadedClass().newInstance();
newInstanceFailure = false;
} catch (InstantiationException e) {
ModelerCore.Util.log(IStatus.ERROR,e,ModelerCore.Util.getString("ExtensionDescriptorImpl.Creating_an_instance_of_5",loadedClass,e.getMessage())); //$NON-NLS-1$
classInstance = null;
newInstanceFailure = true;
} catch (IllegalAccessException e) {
ModelerCore.Util.log(IStatus.ERROR,e,ModelerCore.Util.getString("ExtensionDescriptorImpl.Creating_an_instance_of_6",loadedClass,e.getMessage())); //$NON-NLS-1$
classInstance = null;
newInstanceFailure = true;
}
}
return classInstance;
}
/**
* Get instance of the class
* @return Object
*/
public Object getNewClassInstance() {
Object newClassInstance = null;
if (!newInstanceFailure && getLoadedClass() != null) {
try {
newClassInstance = getLoadedClass().newInstance();
newInstanceFailure = false;
} catch (InstantiationException e) {
ModelerCore.Util.log(IStatus.ERROR,e,ModelerCore.Util.getString("ExtensionDescriptorImpl.Creating_an_instance_of_5",loadedClass,e.getMessage())); //$NON-NLS-1$
newInstanceFailure = true;
} catch (IllegalAccessException e) {
ModelerCore.Util.log(IStatus.ERROR,e,ModelerCore.Util.getString("ExtensionDescriptorImpl.Creating_an_instance_of_6",loadedClass,e.getMessage())); //$NON-NLS-1$
newInstanceFailure = true;
}
}
return newClassInstance;
}
@Override
public String toString() {
final Object[] params = new Object[] {className, bundle, new Boolean(loadedClass != null)};
return ModelerCore.Util.getString(ModelerCore.Util.getString("ExtensionDescriptorImpl.ExtensionDescriptor___className,_bundle,_isLoaded_7", params)); //$NON-NLS-1$
}
}
}