use of org.eclipse.wst.xsd.ui.internal.nsedit.TargetNamespaceChangeHandler in project webtools.sourceediting by eclipse.
the class UpdateNamespaceInformationCommand method execute.
public void execute() {
ensureSchemaElement(xsdSchema);
Element element = xsdSchema.getElement();
try {
// DocumentImpl doc = (DocumentImpl) element.getOwnerDocument();
String modelTargetNamespace = xsdSchema.getTargetNamespace();
String oldNamespace = xsdSchema.getTargetNamespace();
TypesHelper helper = new TypesHelper(xsdSchema);
String oldPrefix = helper.getPrefix(element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
if (modelTargetNamespace == null) {
// $NON-NLS-1$
modelTargetNamespace = "";
}
String targetNamespace = newTargetNamespace.trim();
String prefix = newPrefix.trim();
if (!validatePrefix(prefix) || !validateTargetNamespace(targetNamespace)) {
return;
}
if (prefix.length() > 0 && targetNamespace.length() == 0) {
// can't have blank targetnamespace and yet specify a prefix
return;
}
// doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_TARGETNAMESPACE_CHANGE")); //$NON-NLS-1$
beginRecording(element);
String xsdForXSDPrefix = xsdSchema.getSchemaForSchemaQNamePrefix();
Map map = xsdSchema.getQNamePrefixToNamespaceMap();
// for schema for schema
if (prefix.length() == 0) {
// and update ALL nodes with this prefix
if (xsdForXSDPrefix == null || (xsdForXSDPrefix != null && xsdForXSDPrefix.trim().length() == 0)) {
// get preference prefix
xsdForXSDPrefix = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
// get a unique prefix by checking what's in the map
xsdForXSDPrefix = getUniqueSchemaForSchemaPrefix(xsdForXSDPrefix, map);
// $NON-NLS-1$
element.setAttribute("xmlns:" + xsdForXSDPrefix, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
updateAllNodes(element, xsdForXSDPrefix);
// remove the old xmlns attribute for the schema for schema
if (// $NON-NLS-1$
element.hasAttribute("xmlns") && // $NON-NLS-1$
element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001)) {
// $NON-NLS-1$
element.removeAttribute("xmlns");
}
}
}
if (targetNamespace.length() > 0 || (targetNamespace.length() == 0 && prefix.length() == 0)) {
// clean up the old prefix for this schema
if (oldPrefix != null && oldPrefix.length() > 0) {
// $NON-NLS-1$
element.removeAttribute("xmlns:" + oldPrefix);
// element.setAttribute("xmlns:" + prefix, targetNamespace);
// java.util.Map prefixToNameSpaceMap =
// xsdSchema.getQNamePrefixToNamespaceMap();
// prefixToNameSpaceMap.remove(oldPrefix);
} else // if no prefix
{
if (// $NON-NLS-1$
element.hasAttribute("xmlns")) {
if (// $NON-NLS-1$
!element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001)) {
// $NON-NLS-1$
element.removeAttribute("xmlns");
}
}
}
}
if (targetNamespace.length() > 0) {
if (!modelTargetNamespace.equals(targetNamespace)) {
element.setAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE, targetNamespace);
}
// now set the new xmlns:prefix attribute
if (prefix.length() > 0) {
// $NON-NLS-1$
element.setAttribute("xmlns:" + prefix, targetNamespace);
} else {
// $NON-NLS-1$
element.setAttribute("xmlns", targetNamespace);
}
// set the targetNamespace attribute
} else // else targetNamespace is blank
{
if (prefix.length() == 0) {
element.removeAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
}
}
// do our own referential integrity
TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, oldNamespace, targetNamespace);
targetNamespaceChangeHandler.resolve();
updateElement(xsdSchema);
// doc.getModel().endRecording(this);
} finally {
endRecording();
}
}
use of org.eclipse.wst.xsd.ui.internal.nsedit.TargetNamespaceChangeHandler in project webtools.sourceediting by eclipse.
the class XSDEditNamespacesAction method run.
public void run() {
if (element != null) {
Shell shell = XMLCommonResources.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
String targetNamespace = null;
if (xsdSchema != null) {
targetNamespace = xsdSchema.getTargetNamespace();
}
XSDEditSchemaInfoDialog dialog = new XSDEditSchemaInfoDialog(shell, new Path(resourceLocation), targetNamespace);
List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(element);
List oldNamespaceInfoList = NamespaceInfo.cloneNamespaceInfoList(namespaceInfoList);
// update the document in response to these changes
for (Iterator i = namespaceInfoList.iterator(); i.hasNext(); ) {
NamespaceInfo info = (NamespaceInfo) i.next();
NamespaceInfo oldCopy = new NamespaceInfo(info);
// $NON-NLS-1$
info.setProperty("oldCopy", oldCopy);
}
dialog.setNamespaceInfoList(namespaceInfoList);
dialog.create();
dialog.getShell().setSize(500, 400);
// $NON-NLS-1$
dialog.getShell().setText(XMLCommonResources.getInstance().getString("_UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE"));
dialog.setBlockOnOpen(true);
dialog.open();
// $NON-NLS-1$
String xsdPrefix = null;
String origXSDPrefix = xsdSchema.getSchemaForSchemaQNamePrefix();
String newTNSPrefix = "";
if (dialog.getReturnCode() == Window.OK) {
Element xsdSchemaElement = xsdSchema.getElement();
DocumentImpl doc = (DocumentImpl) xsdSchemaElement.getOwnerDocument();
List newInfoList = dialog.getNamespaceInfoList();
// see if we need to rename any prefixes
Map prefixMapping = createPrefixMapping(oldNamespaceInfoList, namespaceInfoList);
String origTNSPrefix = null;
Map origPrefixMap = xsdSchema.getQNamePrefixToNamespaceMap();
for (Iterator iter = origPrefixMap.keySet().iterator(); iter.hasNext(); ) {
String key = (String) iter.next();
String ns = (String) origPrefixMap.get(key);
if ((targetNamespace == null && ns == null) || targetNamespace != null && targetNamespace.equals(ns)) {
origTNSPrefix = key;
break;
}
}
Map map2 = new Hashtable();
for (Iterator iter = newInfoList.iterator(); iter.hasNext(); ) {
NamespaceInfo ni = (NamespaceInfo) iter.next();
String pref = ni.prefix;
String uri = ni.uri;
if (pref == null)
// $NON-NLS-1$
pref = "";
if (uri == null)
// $NON-NLS-1$
uri = "";
if (XSDConstants.isSchemaForSchemaNamespace(uri)) {
xsdPrefix = pref;
}
if (uri.equals(dialog.getTargetNamespace())) {
newTNSPrefix = pref;
}
map2.put(pref, uri);
}
if (map2.size() > 0) {
try {
doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"));
boolean targetNamespaceChanged = (targetNamespace != null && !targetNamespace.equals(dialog.getTargetNamespace()) || targetNamespace == null && dialog.getTargetNamespace() != null);
boolean tnsPrefixChanged = !newTNSPrefix.equals(origTNSPrefix);
boolean xsdPrefixChanged = (!(origXSDPrefix == null && xsdPrefix.equals("")) || (origXSDPrefix != null && !origXSDPrefix.equals(xsdPrefix)));
xsdSchema.setIncrementalUpdate(false);
// First handle the prefix change for the target namespace
if (tnsPrefixChanged) {
prefixMapping.remove(origTNSPrefix);
UpdateNamespaceInformationCommand command = new UpdateNamespaceInformationCommand(Messages._UI_ACTION_NAMESPACE_INFORMATION_CHANGE, xsdSchema, newTNSPrefix, targetNamespace);
command.execute();
xsdSchema.update();
}
// Second, handle the target namespace change
if (targetNamespaceChanged) {
// set the targetNamespace attribute
xsdSchema.setTargetNamespace(dialog.getTargetNamespace());
TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, targetNamespace, dialog.getTargetNamespace());
targetNamespaceChangeHandler.resolve();
}
if (prefixMapping.size() > 0) {
for (Iterator iter = prefixMapping.keySet().iterator(); iter.hasNext(); ) {
String oldPrefix = (String) iter.next();
String newPrefix = (String) prefixMapping.get(oldPrefix);
// Now update any references to this old prefix in the schema
// with the value of the new prefix
String ns = (String) origPrefixMap.get(oldPrefix);
// $NON-NLS-1$
SchemaPrefixChangeHandler spch = new SchemaPrefixChangeHandler(xsdSchema, newPrefix, ns != null ? ns : "");
spch.resolve();
}
}
namespaceInfoManager.removeNamespaceInfo(element);
namespaceInfoManager.addNamespaceInfo(element, newInfoList, false);
// Third, handle the schema for schema prefix change
if (xsdPrefixChanged) {
if (xsdPrefix != null && xsdPrefix.length() == 0) {
xsdSchema.setSchemaForSchemaQNamePrefix(null);
} else {
xsdSchema.setSchemaForSchemaQNamePrefix(xsdPrefix);
}
namespaceInfoManager.removeNamespaceInfo(element);
namespaceInfoManager.addNamespaceInfo(element, newInfoList, false);
xsdSchema.setIncrementalUpdate(true);
// Now change the references to any schema types/components ie. string --> xs:string
SchemaPrefixChangeHandler spch = new SchemaPrefixChangeHandler(xsdSchema, xsdPrefix);
spch.resolve();
// Change the prefix for all schema components
updateAllNodes(element, xsdPrefix);
// $NON-NLS-1$
prefixMapping.remove(origXSDPrefix != null ? origXSDPrefix : "");
}
xsdSchema.setIncrementalUpdate(true);
} catch (Exception e) {
} finally {
xsdSchema.update();
doc.getModel().endRecording(this);
}
}
}
}
}
use of org.eclipse.wst.xsd.ui.internal.nsedit.TargetNamespaceChangeHandler in project webtools.sourceediting by eclipse.
the class XSDSchemaSection method doHandleEvent.
public void doHandleEvent(Event event) {
// $NON-NLS-1$
errorText.setText("");
String prefixValue = prefixText.getText();
String tnsValue = targetNamespaceText.getText();
Element element = xsdSchema.getElement();
TypesHelper helper = new TypesHelper(xsdSchema);
String currentPrefix = helper.getPrefix(element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
String currentNamespace = xsdSchema.getTargetNamespace();
if (tnsValue.trim().length() == 0) {
if (prefixValue.trim().length() > 0) {
// $NON-NLS-1$
errorText.setText(XSDEditorPlugin.getXSDString("_ERROR_TARGET_NAMESPACE_AND_PREFIX"));
int length = errorText.getText().length();
red = new Color(null, 255, 0, 0);
StyleRange style = new StyleRange(0, length, red, targetNamespaceText.getBackground());
errorText.setStyleRange(style);
return;
}
}
if (event.widget == prefixText) {
// widget loses focus.
if (prefixValue.equals(currentPrefix))
return;
updateNamespaceInfo(prefixValue, tnsValue);
} else if (event.widget == targetNamespaceText) {
// widget loses focus.
if (tnsValue.equals(currentNamespace))
return;
DOMNamespaceInfoManager namespaceInfoManager = new DOMNamespaceInfoManager();
List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(xsdSchema.getElement());
Element xsdSchemaElement = xsdSchema.getElement();
DocumentImpl doc = (DocumentImpl) xsdSchemaElement.getOwnerDocument();
try {
doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"));
if (// remove the targetNamespace attribute
tnsValue.trim().length() == 0) {
xsdSchemaElement.removeAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
return;
}
// Now replace the namespace for the xmlns entry
for (Iterator i = namespaceInfoList.iterator(); i.hasNext(); ) {
NamespaceInfo info = (NamespaceInfo) i.next();
if (info.uri.equals(currentNamespace)) {
info.uri = tnsValue;
}
}
xsdSchema.setIncrementalUpdate(false);
// set the new xmlns entries
namespaceInfoManager.removeNamespaceInfo(element);
namespaceInfoManager.addNamespaceInfo(element, namespaceInfoList, false);
xsdSchema.setIncrementalUpdate(true);
// set the targetNamespace attribute
xsdSchema.setTargetNamespace(tnsValue);
TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, currentNamespace, tnsValue);
targetNamespaceChangeHandler.resolve();
} catch (Exception e) {
} finally {
try {
xsdSchema.update();
} finally {
doc.getModel().endRecording(this);
}
}
}
}
Aggregations