/******************************************************************************* * Copyright (c) 2001, 2006 IBM Corporation 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 * * Contributors: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.xml.ui.internal.nsedit; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.wst.xml.core.internal.XMLCorePlugin; import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog; import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry; import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog; import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo; public class CommonAddNamespacesDialog extends Dialog { protected CommonAddNamespacesControl addNamespacesControl; protected List existingNamespaces; protected List namespaceInfoList; protected Button okButton; protected HashMap preferredPrefixTable = new HashMap(); protected IPath resourceLocation; protected String title; public CommonAddNamespacesDialog(Shell parentShell, String title, IPath resourceLocation, List existingNamespaces) { super(parentShell); this.resourceLocation = resourceLocation; setShellStyle(getShellStyle() | SWT.RESIZE); this.title = title; this.existingNamespaces = existingNamespaces; preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/", "wsdl"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/soap/", "soap"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/http/", "http"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://schemas.xmlsoap.org/wsdl/mime/", "mime"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://schemas.xmlsoap.org/soap/encoding/", "soapenc"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://schemas.xmlsoap.org/soap/envelope/", "soapenv"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://www.w3.org/2001/XMLSchema-instance", "xsi"); //$NON-NLS-1$ //$NON-NLS-2$ preferredPrefixTable.put("http://www.w3.org/2001/XMLSchema", "xsd"); //$NON-NLS-1$ //$NON-NLS-2$ } protected void addBuiltInNamespaces(List list) { String xsiNamespace = "http://www.w3.org/2001/XMLSchema-instance"; //$NON-NLS-1$ String xsdNamespace = "http://www.w3.org/2001/XMLSchema"; //$NON-NLS-1$ if (!isAlreadyDeclared(xsiNamespace)) { list.add(new NamespaceInfo("http://www.w3.org/2001/XMLSchema-instance", "xsi", null)); //$NON-NLS-1$ //$NON-NLS-2$ } if (!isAlreadyDeclared(xsdNamespace)) { list.add(new NamespaceInfo("http://www.w3.org/2001/XMLSchema", "xsd", null)); //$NON-NLS-1$ //$NON-NLS-2$ } } protected void addCatalogMapToList(ICatalog catalog, List list) { ICatalogEntry[] entries = catalog.getCatalogEntries(); for (int i = 0; i < entries.length; i++) { ICatalogEntry entry = entries[i]; if ((entry.getEntryType() == ICatalogEntry.ENTRY_TYPE_PUBLIC) && entry.getURI().endsWith(".xsd")) { //$NON-NLS-1$ if (!isAlreadyDeclared(entry.getKey())) { NamespaceInfo namespaceInfo = new NamespaceInfo(entry.getKey(), "xx", null); //$NON-NLS-1$ list.add(namespaceInfo); } } } } protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { namespaceInfoList = addNamespacesControl.getNamespaceInfoList(); } super.buttonPressed(buttonId); } public void computeAddablePrefixes(List addableList, List exisitingList) { HashMap map = new HashMap(); for (Iterator i = exisitingList.iterator(); i.hasNext();) { NamespaceInfo info = (NamespaceInfo) i.next(); if (info.prefix != null) { map.put(info.prefix, info); } } for (Iterator i = addableList.iterator(); i.hasNext();) { NamespaceInfo info = (NamespaceInfo) i.next(); if (info.uri != null) { String prefix = (String) preferredPrefixTable.get(info.uri); info.prefix = getUniquePrefix(map, prefix, info.uri); map.put(info.prefix, info); } } } public int createAndOpen() { create(); getShell().setText(title); Rectangle r = getShell().getBounds(); getShell().setBounds(r.x + 80, r.y + 80, r.width, r.height); setBlockOnOpen(true); return open(); } protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } protected Control createContents(Composite parent) { Control control = super.createContents(parent); return control; } protected Control createDialogArea(Composite parent) { Composite dialogArea = (Composite) super.createDialogArea(parent); addNamespacesControl = new CommonAddNamespacesControl(dialogArea, SWT.NONE, resourceLocation); List list = new ArrayList(); addBuiltInNamespaces(list); ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog(); INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs(); for (int i = 0; i < nextCatalogs.length; i++) { INextCatalog catalog = nextCatalogs[i]; ICatalog referencedCatalog = catalog.getReferencedCatalog(); if (referencedCatalog != null) { if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) { ICatalog userCatalog = referencedCatalog; addCatalogMapToList(userCatalog, list); } else if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) { ICatalog systemCatalog = referencedCatalog; addCatalogMapToList(systemCatalog, list); } } } computeAddablePrefixes(list, existingNamespaces); addNamespacesControl.setNamespaceInfoList(list); return dialogArea; } public List getNamespaceInfoList() { return namespaceInfoList; } protected String getPreferredPrefix(String namespaceURI) { return (String) preferredPrefixTable.get(namespaceURI); } private String getUniquePrefix(HashMap prefixMap, String prefix, String uri) { if (prefix == null) { int lastIndex = uri.lastIndexOf('/'); if (lastIndex == uri.length() - 1) { uri = uri.substring(0, lastIndex); lastIndex = uri.lastIndexOf('/'); } prefix = uri.substring(lastIndex + 1); if ((prefix.length() > 20) || (prefix.indexOf(':') != -1)) { prefix = null; } } if (prefix == null) { prefix = "p"; //$NON-NLS-1$ } if (prefixMap.get(prefix) != null) { String base = prefix; for (int count = 0; prefixMap.get(prefix) != null; count++) { prefix = base + count; } } return prefix; } protected boolean isAlreadyDeclared(String namespaceURI) { boolean result = false; for (Iterator i = existingNamespaces.iterator(); i.hasNext();) { NamespaceInfo namespaceInfo = (NamespaceInfo) i.next(); if (namespaceURI.equals(namespaceInfo.uri)) { result = true; break; } } return result; } }