| /******************************************************************************* |
| * Copyright (c) 2001, 2010 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 |
| *******************************************************************************/ |
| package org.eclipse.wst.xsd.ui.internal.common.commands; |
| |
| import java.util.Map; |
| |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Preferences; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames; |
| import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor; |
| import org.eclipse.wst.xml.core.internal.XMLCorePlugin; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; |
| import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML; |
| import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin; |
| import org.eclipse.xsd.XSDConcreteComponent; |
| import org.eclipse.xsd.XSDSchema; |
| import org.eclipse.xsd.util.XSDConstants; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.ProcessingInstruction; |
| import org.w3c.dom.Text; |
| |
| public class BaseCommand extends Command |
| { |
| private static final String XML = "xml"; //$NON-NLS-1$ |
| |
| XSDConcreteComponent addedXSDConcreteComponent; |
| |
| public BaseCommand() |
| { |
| super(); |
| } |
| |
| public BaseCommand(String label) |
| { |
| // Commands inherit their name from the associated action. |
| // This label shows up in the undo menu and it would look ugly with the mnemonic in it. |
| // Ideally, we'd have separate strings. |
| |
| super(label.replaceFirst("&", "")); |
| } |
| |
| public XSDConcreteComponent getAddedComponent() |
| { |
| return addedXSDConcreteComponent; |
| } |
| |
| IDOMNode domNode; |
| protected void beginRecording(Object element) { |
| if (element instanceof IDOMNode) |
| { |
| domNode = (IDOMNode) element; |
| domNode.getModel().beginRecording(this, getUndoDescription()); |
| } |
| } |
| |
| protected void endRecording() |
| { |
| if (domNode != null) |
| domNode.getModel().endRecording(this); |
| } |
| |
| protected String getUndoDescription() { |
| return getLabel(); |
| } |
| |
| protected void formatChild(Element child) |
| { |
| if (child instanceof IDOMNode) |
| { |
| IDOMModel model = ((IDOMNode)child).getModel(); |
| try |
| { |
| // tell the model that we are about to make a big model change |
| model.aboutToChangeModel(); |
| |
| IStructuredFormatProcessor formatProcessor = new FormatProcessorXML(); |
| formatProcessor.formatNode(child); |
| } |
| finally |
| { |
| // tell the model that we are done with the big model change |
| model.changedModel(); |
| } |
| } |
| } |
| |
| protected static void ensureSchemaElement(XSDSchema schema) |
| { |
| Document document = schema.getDocument(); |
| |
| Element schemaElement = document.getDocumentElement(); |
| |
| if (schemaElement == null) |
| { |
| String targetNamespace = getDefaultNamespace(schema); |
| schema.setTargetNamespace(targetNamespace); |
| Map qNamePrefixToNamespaceMap = schema.getQNamePrefixToNamespaceMap(); |
| qNamePrefixToNamespaceMap.put("tns", targetNamespace); |
| if (XSDEditorPlugin.getDefault().isQualifyXMLSchemaLanguage()) |
| { |
| String prefix = XSDEditorPlugin.getDefault().getXMLSchemaPrefix(); |
| schema.setSchemaForSchemaQNamePrefix(prefix); |
| qNamePrefixToNamespaceMap.put(prefix, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); |
| } |
| else |
| { |
| qNamePrefixToNamespaceMap.put(null, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); |
| } |
| |
| schema.updateElement(); |
| ensureXMLDirective(document); |
| } |
| } |
| |
| private static void ensureXMLDirective(Document document) |
| { |
| if (hasXMLDirective(document)) |
| { |
| return; |
| } |
| |
| Node firstChild = document.getFirstChild(); |
| ProcessingInstruction xmlDeclaration = getXMLDeclaration(document); |
| document.insertBefore(xmlDeclaration, firstChild); |
| Text textNode = document.createTextNode(System.getProperty("line.separator")); |
| document.insertBefore(textNode, firstChild); |
| } |
| |
| private static boolean hasXMLDirective(Document document) |
| { |
| Node firstChild = document.getFirstChild(); |
| |
| if (firstChild == null) |
| { |
| return false; |
| } |
| |
| if (firstChild.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) |
| { |
| return false; |
| } |
| |
| ProcessingInstruction processingInstruction = (ProcessingInstruction)firstChild; |
| |
| if (!XML.equals(processingInstruction.getTarget())) |
| { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| private static ProcessingInstruction getXMLDeclaration(Document document) |
| { |
| Preferences preference = XMLCorePlugin.getDefault().getPluginPreferences(); |
| String charSet = preference.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET); |
| if (charSet == null || charSet.trim().equals("")) |
| { |
| charSet = "UTF-8"; |
| } |
| ProcessingInstruction xmlDeclaration = document.createProcessingInstruction(XML, "version=\"1.0\" encoding=\"" + charSet + "\""); |
| return xmlDeclaration; |
| } |
| |
| private static String getDefaultNamespace(XSDSchema schema) |
| { |
| String namespace = XSDEditorPlugin.getDefault().getXMLSchemaTargetNamespace(); |
| |
| if (!namespace.endsWith("/")) |
| { |
| namespace = namespace.concat("/"); |
| } |
| |
| namespace += getFileName(schema) + "/"; |
| |
| return namespace; |
| |
| } |
| |
| private static String getFileName(XSDSchema schema) |
| { |
| URI schemaURI = schema.eResource().getURI(); |
| IPath filePath = new Path(schemaURI.toString()); |
| return filePath.removeFileExtension().lastSegment().toString(); |
| } |
| } |