blob: 9ace16449b784c5ea1351160352a7dd1c5c67f67 [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.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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;
import org.eclipse.jst.jsf.common.metadata.internal.DomainSourceModelTypeDescriptor.DomainSourceModelTypeImpl;
/**
* Registry of Domain Source Types loaded from domainSourceModelTypes ext-pt.
*/
public class DomainSourceTypesRegistry{
private static final String EXTENSION_POINT_ID = "domainSourceModelTypes";
private static DomainSourceTypesRegistry INSTANCE;
private Map/*<String, List/*<DomainSourceModelTypeDescriptor>>*/ domainSourceTypeDescriptors;
private Map/*<String, List/*<IDomainSourceModelType>*/ domainSourceTypes;
private DomainSourceTypesRegistry(){
init();
}
/**
* @return singleton instance of DomainSourceTypesRegistry
*/
public synchronized static DomainSourceTypesRegistry getInstance() {
if (INSTANCE == null){
INSTANCE = new DomainSourceTypesRegistry();
}
return INSTANCE;
}
/**
* @param domain identifier
* @return list of <code>IDomainSourceModelType</code> sorted in descending order by ordinal
*/
public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
if (getDomainSourceTypes().containsKey(domain))
return (List)getDomainSourceTypes().get(domain);
List/*<DomainSourceModelTypeDescriptor>*/ list = getDomainSourceModelDescriptors(domain);
List/*<IDomainSourceModelType>*/ types = new ArrayList/*<IDomainSourceModelType>*/();
for(Iterator/*<DomainSourceModelTypeDescriptor>*/ it=list.iterator();it.hasNext();){
DomainSourceModelTypeDescriptor d = (DomainSourceModelTypeDescriptor)it.next();
types.add(d.getInstance());
}
//default sort descending by ordinal
Collections.sort(types, new Comparator(){
public int compare(Object o1, Object o2) {
DomainSourceModelTypeImpl desc1 = (DomainSourceModelTypeImpl)o1;
DomainSourceModelTypeImpl desc2 = (DomainSourceModelTypeImpl)o2;
if (desc1.getOrdinal() == desc2.getOrdinal())
return 0;
if (desc1.getOrdinal() > desc2.getOrdinal())
return -1;
return 1;
}
});
getDomainSourceTypes().put(domain, types);
return types;
}
private List getDomainSourceModelDescriptors(String domain) {
List ret = (List)getDescriptors().get(domain);
if (ret != null && ret.size()>0)
return ret;
return getDefaultSourceModelDescriptor();
}
private List getDefaultSourceModelDescriptor() {
List ret = new ArrayList();
DomainSourceModelTypeDescriptor desc = new DomainSourceModelTypeDescriptor();
ret.add(desc);
return ret;
}
private synchronized void init() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint point = extensionRegistry.getExtensionPoint(JSFCommonPlugin.PLUGIN_ID, EXTENSION_POINT_ID );
if (point != null) {
IConfigurationElement[] elements = point.getConfigurationElements();
for (int i = 0; i < elements.length; i++) {
IConfigurationElement element = elements[i];
addDomainSourceTypeDescriptor(element);
}
}
}
private void addDomainSourceTypeDescriptor(IConfigurationElement element) {
String domainId = element.getAttribute("domainId");
String srcHdlrId = element.getAttribute("domainSourceModelTypeId");
String locator = element.getAttribute("locator");
String ordinalStr = element.getAttribute("ordinal");
int ordinal = 1;
if (ordinalStr!=null && !ordinalStr.equals("")){
ordinal = Integer.parseInt(ordinalStr);
}
DomainSourceModelTypeDescriptor d = new DomainSourceModelTypeDescriptor(domainId, srcHdlrId, locator, element.getContributor().getName(), ordinal);
List/*<DomainSourceTypeDescriptor>*/ descs = (List)getDescriptors().get(domainId);
if (descs == null){
descs = new ArrayList/*<DomainSourceTypeDescriptor>*/();
getDescriptors().put(domainId, descs);
}
descs.add(d);
}
private Map/*<String, List/*<DomainSourceTypeDescriptor>>*/ getDescriptors() {
if (domainSourceTypeDescriptors == null){
domainSourceTypeDescriptors = new HashMap/*<String, List/*<DomainSourceTypeDescriptor>>*/();
}
return domainSourceTypeDescriptors;
}
private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
if (domainSourceTypes == null){
domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
}
return domainSourceTypes;
}
}