| /******************************************************************************* |
| * 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; |
| } |
| |
| } |