/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.swt.graphics.Image;
import org.eclipse.xsd.util.XSDConstants;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
import org.eclipse.wst.sse.sieditor.ui.Activator;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IImportedTypesNode;
import org.eclipse.wst.sse.sieditor.ui.v2.factory.TreeNodeMapper;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
public class ImportedTypesNode extends AbstractXsdTreeNode implements IImportedTypesNode {
public ImportedTypesNode(final IModelObject modelObject, final ITreeNode parent, final TreeNodeMapper nodeMapper) {
this(modelObject, nodeMapper);
}
public ImportedTypesNode(final IModelObject modelObject, final TreeNodeMapper nodeMapper) {
super(modelObject, null, nodeMapper, ITreeNode.CATEGORY_STATIC_ROOT);
}
@Override
public Object[] getChildren() {
final Set<ISchema> referedSchemasSet = new HashSet<ISchema>();
final List<ISchema> containedSchemas = getContainedSchemas();
for (final ISchema schema : containedSchemas) {
final Collection<ISchema> allReferredSchemas = schema.getAllReferredSchemas();
for (final ISchema referredSchema : allReferredSchemas) {
// exclude built-in types schema
if (!XSDConstants.isSchemaForSchemaNamespace(referredSchema.getNamespace())) {
referedSchemasSet.add(referredSchema);
}
}
}
referedSchemasSet.removeAll(containedSchemas);
referedSchemasSet.addAll(getWSDLImportedSchemas());
final List<ITreeNode> nodes = new ArrayList<ITreeNode>();
for (final ISchema referredSchema : referedSchemasSet) {
final List<ITreeNode> treeNodes = getNodeMapper().getTreeNode(referredSchema, getCategories(), this);
final ITreeNode treeNode = treeNodes.isEmpty() ? null : treeNodes.get(0);
if (treeNode instanceof ImportedSchemaNode) {
nodes.add(treeNode);
} else {
final ImportedSchemaNode schemaNode = new ImportedSchemaNode(referredSchema, this, getNodeMapper());
getNodeMapper().addToNodeMap(referredSchema, schemaNode);
nodes.add(schemaNode);
}
}
return nodes.toArray();
}
/**
* {@link ImportedXsdTypesNode} overrides this method to provide it's single
* root schema
*
* @return
*/
protected List<ISchema> getContainedSchemas() {
return ((IDescription) getModelObject()).getContainedSchemas();
}
private List<ISchema> getWSDLImportedSchemas() {
List<ISchema> importedSchemas = new ArrayList<ISchema>();
if (getModelObject() instanceof IDescription) {
final IDescription description = (IDescription) getModelObject();
importedSchemas = description.getAllVisibleSchemas();
importedSchemas.removeAll(description.getContainedSchemas());
final Iterator<ISchema> iterator = importedSchemas.iterator();
while (iterator.hasNext()) {
final ISchema schema = iterator.next();
if (XSDConstants.isSchemaForSchemaNamespace(schema.getNamespace())) {
iterator.remove();
}
}
}
return importedSchemas;
}
@Override
public Image getImage() {
return getImageRegistry().get(Activator.NODE_IMPORTED_TYPES);
}
}