blob: d2e92510010e0699cda38e39f42131bb215a73e8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Oracle Corporation.
* 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:
* Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.common.metadata.internal;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
/**
* Implementation of a {@link IDomainSourceModelType} descriptor.
* Responsible for producing instances of {@link IDomainSourceModelType}.
* Also responsible for creating the {@link IMetaDataTranslator} descriptors from the
* <code>com.eclipse.jst.jsf.common.domainSourceModelTypeTranslators</code> ext-pt
*/
public class DomainSourceModelTypeDescriptor {
private static final String TRANSLATORS_EXTENSION_POINT_ID = "domainSourceModelTypeTranslators"; //$NON-NLS-1$
private static final String STANDARD_FILE_NULL_TRANSLATOR = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataFilesTranslator"; //$NON-NLS-1$
private String domain = "DEFAULT"; //$NON-NLS-1$
private String domainSourceModelTypeId;
private String locatorClassName = "org.eclipse.jst.jsf.common.metadata.internal.StandardMetaDataLocator"; //$NON-NLS-1$
private Set translatorDescriptors;
private String bundleId = JSFCommonPlugin.PLUGIN_ID;
private int ordinal;
/**
* Constructor
* @param domain
* @param domainSourceModelTypeId
* @param locatorClassName
* @param bundleId
* @param ordinal
*/
public DomainSourceModelTypeDescriptor(String domain, String domainSourceModelTypeId, String locatorClassName, String bundleId, int ordinal){
this.domain = domain;
this.locatorClassName = locatorClassName;
this.domainSourceModelTypeId = domainSourceModelTypeId;
this.bundleId = bundleId;
this.ordinal = ordinal;
init();
}
/**
* Default model type descriptor that will load only standard metadata files
*/
public DomainSourceModelTypeDescriptor(){
// getTranslatorDescriptors();
//createTranslatorInstances() will add the standard null translator
}
private synchronized void init() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, TRANSLATORS_EXTENSION_POINT_ID );
if (point != null) {
IConfigurationElement[] elements = point.getConfigurationElements();
for (int i = 0; i < elements.length; i++) {
IConfigurationElement element = elements[i];
String srcHdlrId = element.getAttribute("domainSourceModelTypeId"); //$NON-NLS-1$
if (srcHdlrId.equals(domainSourceModelTypeId))
addTranslatorDescriptor(element);
}
}
}
private void addTranslatorDescriptor(IConfigurationElement element) {
String translator = element.getAttribute("translatorClass"); //$NON-NLS-1$
DomainSourceModelTranslatorDescriptor d = new DomainSourceModelTranslatorDescriptor(translator, element.getContributor().getName());
getTranslatorDescriptors().add(d);
}
private Set getTranslatorDescriptors(){
if (translatorDescriptors == null){
translatorDescriptors = new HashSet();
}
return translatorDescriptors;
}
/**
* @return domain
*/
public String getDomain() {
return domain;
}
/**
* @return new instance of the {@link IDomainSourceModelType}
*/
public IDomainSourceModelType getInstance(){
return new DomainSourceModelTypeImpl();
}
/**
* Internal class implementing {@link IDomainSourceModelType}
*/
class DomainSourceModelTypeImpl implements IDomainSourceModelType{
private Set translators;
private IMetaDataLocator locator;
DomainSourceModelTypeImpl(){
// restrict construction to package scope
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getDomain()
*/
public String getDomain() {
return domain;
}
/**
* @return value of ordinal defined by the ext-pt used for ordering source types for a domain
*/
public int getOrdinal(){
return ordinal;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getLocator()
*/
public IMetaDataLocator getLocator(IProject project) {
if (locator == null){
locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId, project);
}
return locator;
}
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getTranslators()
*/
public Set getTranslators() {
if (translators == null){
translators = createTranslatorInstances();
}
return translators;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString(){
StringBuffer buf = new StringBuffer("DomainSourceModelTypeImpl"); //$NON-NLS-1$
buf.append("(domain = "); //$NON-NLS-1$
buf.append(getDomain());
buf.append(", locator = "); //$NON-NLS-1$
buf.append(locator != null ? locator.toString() : "null"); //$NON-NLS-1$
buf.append(")"); //$NON-NLS-1$
return buf.toString();
}
private Set createTranslatorInstances() {
translators = new HashSet<IMetaDataTranslator>();
if (getTranslatorDescriptors().size() == 0){// for TagLibDomain, we are adding null translator via extension (as of 7/16/07)
//would get here if a domain and source type was defined without a domain translator. Should not happen, but
//add Null Translator for now....
//we could/should raise exception.
//Developers should add a STANDARD_FILE_NULL_TRANSLATOR if using standard metadata format.
Class klass = JSFCommonPlugin.loadClass(STANDARD_FILE_NULL_TRANSLATOR, JSFCommonPlugin.PLUGIN_ID);
try {
translators.add(klass.newInstance());
return translators;
} catch (InstantiationException e) {
// TODO: other error handling?
JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)"); //$NON-NLS-1$
} catch (IllegalAccessException e) {
// TODO: other error handling?
JSFCommonPlugin.log(e, "Error in createTranslatorInstances(STANDARD_FILE_NULL_TRANSLATOR)"); //$NON-NLS-1$
}
}
Iterator <DomainSourceModelTranslatorDescriptor>it = getTranslatorDescriptors().iterator();
while (it.hasNext()){
final DomainSourceModelTranslatorDescriptor d = it.next();
final Class klass = JSFCommonPlugin.loadClass(d.getTranslator(), d.getBundleId());
try {
translators.add(klass.newInstance());
} catch (InstantiationException e) {
// TODO: other error handling?
JSFCommonPlugin.log(e, "Error in createTranslatorInstances"); //$NON-NLS-1$
} catch (IllegalAccessException e) {
// TODO: other error handling?
JSFCommonPlugin.log(e, "Error in createTranslatorInstances"); //$NON-NLS-1$
}
}
return translators;
}
}
/**
* Internal class implementing a descriptor for DomainSourceModelTranslators
*/
static class DomainSourceModelTranslatorDescriptor {
private final String _translator;
private final String _bundleId;
/**
* Constructor
* @param translator
* @param bundleId
*/
public DomainSourceModelTranslatorDescriptor(final String translator, final String bundleId) {
this._translator = translator;
this._bundleId = bundleId;
}
String getTranslator(){
return _translator;
}
String getBundleId(){
return _bundleId;
}
}
}