blob: ba3b137253a5e680efb4c4a4ed679f460ba5a6c4 [file] [log] [blame]
/*
* Copyright (c) 2010, 2012 JBoss, Inc. and others
* 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
*/
package org.eclipse.bpel.ui.properties;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//import org.eclipse.bpel.model.Import;
import org.eclipse.bpel.model.Process;
import org.eclipse.bpel.model.util.BPELConstants;
import org.eclipse.bpel.model.util.BPELUtils;
import org.eclipse.bpel.model.util.ImportResolver;
import org.eclipse.bpel.model.util.ImportResolverRegistry;
import org.eclipse.bpel.ui.details.providers.AbstractContentProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.wst.wsdl.Definition;
//import org.eclipse.wst.wsdl.Import;
import org.eclipse.wst.wsdl.util.WSDLConstants;
/*
* Content provider for the NamespacesPrefixesSection table in the Namespaces Property Tab.
* Input is the BPEL Activity or Process object currently selected in the editor canvas.
* The provider collects all of the namespaces in scope for the input EObject and tries
* to correlate them with imported artifacts. The result, a list of NamespacePrefixesElement,
* is displayed in the table Namespaces Property Tab.
*
* @see https://jira.jboss.org/browse/JBIDE-6765
* @author Bob Brodt
* @date Aug 13, 2010
*/
public class NamespacePrefixesProvider extends AbstractContentProvider {
/**
* @see org.eclipse.bpel.ui.details.providers.AbstractContentProvider#collectElements(java.lang.Object, java.util.List)
*/
@Override
public void collectElements(Object input, List<Object> list) {
List<NamespacePrefixElement> elements = new ArrayList<NamespacePrefixElement>();
// build the list of elements
// find the process for this BPEL model object
Process process = null;
if (input instanceof EObject)
{
EObject context = (EObject)input;
process = BPELUtils.getProcess(input);
// walk up the BPEL activity ancestry starting at the input element
// and collect all in-scope namespace info
while (context!=null)
{
// https://jira.jboss.org/browse/JBIDE-6917
try
{
Map<String, String> map = BPELUtils.getNamespaceMap(context);
for (Map.Entry<String,String> e : map.entrySet())
{
String ns = e.getValue().toString();
NamespacePrefixElement elem = new NamespacePrefixElement((String)e.getKey(), ns, context,null);
elements.add(elem);
if( BPELConstants.NAMESPACE_2007.equals(ns) ||
process.getTargetNamespace().equals(ns))
{
elem.location = process.eResource().getURI().lastSegment();
}
}
}
catch (Exception e)
{
// ignore namespace map in extension activity eObjects ... for now
}
context = context.eContainer();
}
}
// get the list of imports from the Process and try to correlate
// the namespaces to the imported artifact in which it's defined
List<Object> imports = new ArrayList<Object>();
if ( process!=null )
{
for (org.eclipse.bpel.model.Import imp : process.getImports())
{
imports.add(imp);
if ( imp.getImportType().equals(WSDLConstants.WSDL_NAMESPACE_URI) )
{
// yikes! don't load WSDLs from WS sites - this takes forever!
if (!imp.getLocation().startsWith("http://") && !imp.getLocation().startsWith("https://"))
{
ImportResolver r = ImportResolverRegistry.INSTANCE.getResolvers(imp.getImportType())[0];
// https://jira.jboss.org/browse/JBIDE-6917
List<Object> rl = r.resolve(imp, ImportResolver.RESOLVE_DEFINITION);
if (rl.size()>0)
{
Definition wsdl = (Definition) rl.get(0);
recurseImports(wsdl.getImports(), imports, elements);
}
}
}
}
}
// now match up the namespaces from the imports to the local namespace maps in elements
for (Object o : imports)
{
String namespace = "";
String location = "";
if (o instanceof org.eclipse.wst.wsdl.Import)
{
location = ((org.eclipse.wst.wsdl.Import)o).getLocationURI();
namespace = ((org.eclipse.wst.wsdl.Import)o).getNamespaceURI();
}
else if (o instanceof org.eclipse.bpel.model.Import)
{
location = ((org.eclipse.bpel.model.Import)o).getLocation();
namespace = ((org.eclipse.bpel.model.Import)o).getNamespace();
}
else
continue;
boolean found = false;
for (NamespacePrefixElement elem : elements)
{
if (namespace.equals(elem.namespace))
{
if (elem.location==null)
elem.location = location;
found = true;
}
}
if (!found)
{
// here's a namespace that wasn't found in any BPEL activity scope
// let's add it to our list with an empty ns prefix and context.
elements.add(new NamespacePrefixElement("", namespace, null, location));
}
}
list.addAll(elements);
// sort list alphabetically on prefix name
Collections.sort(list,new Comparator<Object>()
{
public int compare(Object o1, Object o2) {
return ((NamespacePrefixElement)o1).prefix.compareTo(((NamespacePrefixElement)o2).prefix);
}
});
}
@SuppressWarnings("unchecked")
private void recurseImports(@SuppressWarnings("rawtypes") Map m, List<Object> imports, List<NamespacePrefixElement>elements)
{
@SuppressWarnings("rawtypes")
Iterator iter=m.entrySet().iterator();
while(iter.hasNext())
{
@SuppressWarnings("rawtypes")
Map.Entry e = (Entry) iter.next();
ArrayList<org.eclipse.wst.wsdl.Import> v = (ArrayList<org.eclipse.wst.wsdl.Import>)e.getValue();
for (org.eclipse.wst.wsdl.Import wsdlImp : v)
{
boolean foundNew = true;
for (Object o : imports)
{
if (o instanceof org.eclipse.wst.wsdl.Import)
{
Definition wsdl = ((org.eclipse.wst.wsdl.Import)o).getEDefinition();
if ( ((org.eclipse.wst.wsdl.Import)o).getLocationURI().equals(wsdlImp.getLocationURI()) )
foundNew = false;
Object ns = wsdl.getNamespaces().entrySet();
System.out.println("ns="+ns);
}
else if (o instanceof org.eclipse.bpel.model.Import)
{
if ( ((org.eclipse.bpel.model.Import)o).getLocation().equals(wsdlImp.getLocationURI()) )
foundNew = false;
}
}
if (foundNew)
imports.add(wsdlImp);
if (!wsdlImp.getLocationURI().startsWith("http://"))
{
if (wsdlImp.getDefinition()!=null)
{
// let's see if this WSDL defines a namespace for which we're missing a location
for (NamespacePrefixElement elem : elements)
{
if (elem.location==null)
{
Map<Object,Object> ns = wsdlImp.getDefinition().getNamespaces();
for (Map.Entry<Object,Object> ens : ns.entrySet())
{
if (ens.getValue().equals(elem.namespace))
{
elem.location = wsdlImp.getLocationURI();
break;
}
}
}
}
recurseImports(wsdlImp.getDefinition().getImports(), imports, elements);
}
}
}
}
}
}