diff --git a/xml/impl/src/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java b/xml/impl/src/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java index 4299df21b83b..fbb4fd56d5d5 100644 --- a/xml/impl/src/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java +++ b/xml/impl/src/com/intellij/xml/actions/xmlbeans/GenerateInstanceDocumentFromSchemaAction.java @@ -39,10 +39,10 @@ import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.StringBufferInputStream; import java.util.LinkedList; import java.util.List; @@ -57,7 +57,7 @@ public class GenerateInstanceDocumentFromSchemaAction extends AnAction { e.getPresentation().setEnabled(enabled); if (ActionPlaces.isPopupPlace(e.getPlace())) { e.getPresentation().setVisible(enabled); - } + } } public void actionPerformed(AnActionEvent e) { @@ -113,12 +113,12 @@ public class GenerateInstanceDocumentFromSchemaAction extends AnAction { (XmlFile) PsiManager.getInstance(project).findFile(relativeFile), new THashMap(), new Xsd2InstanceUtils.SchemaReferenceProcessor() { - public void processSchema(String schemaFileName, String schemaContent) { + public void processSchema(String schemaFileName, byte[] schemaContent) { try { final String fullFileName = tempDir.getPath() + File.separatorChar + schemaFileName; FileUtils.saveStreamContentAsFile( fullFileName, - new StringBufferInputStream(schemaContent) + new ByteArrayInputStream(schemaContent) ); } catch (IOException e) { throw new RuntimeException(e); @@ -147,26 +147,30 @@ public class GenerateInstanceDocumentFromSchemaAction extends AnAction { final VirtualFile baseDirForCreatedInstanceDocument1 = relativeFileDir; String xmlFileName = baseDirForCreatedInstanceDocument1.getPath() + File.separatorChar + dialog.getOutputFileName(); - FileOutputStream fileOutputStream = null; + FileOutputStream fileOutputStream; try { fileOutputStream = new FileOutputStream(xmlFileName); - fileOutputStream.write(xml.getBytes()); - fileOutputStream.close(); - fileOutputStream = null; + try { + // the generated XML doesn't have any XML declaration -> utf-8 + fileOutputStream.write(xml.getBytes("utf-8")); + } + finally { + fileOutputStream.close(); + } + + final File xmlFile = new File(xmlFileName); + VirtualFile virtualFile = ApplicationManager.getApplication().runWriteAction(new Computable() { + @Nullable + public VirtualFile compute() { + return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(xmlFile); + } + }); + FileEditorManager.getInstance(project).openFile(virtualFile, true); } catch (IOException e) { - e.printStackTrace(); + Messages.showErrorDialog(project, "Could not save generated XML document: " + StringUtil.getMessage(e), XmlBundle.message("error")); } - - final File xmlFile = new File(xmlFileName); - VirtualFile virtualFile = ApplicationManager.getApplication().runWriteAction(new Computable() { - @Nullable - public VirtualFile compute() { - return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(xmlFile); - } - }); - FileEditorManager.getInstance(project).openFile(virtualFile, true); } static boolean isAcceptableFileForGenerateSchemaFromInstanceDocument(VirtualFile virtualFile) { diff --git a/xml/impl/src/com/intellij/xml/actions/xmlbeans/Xsd2InstanceUtils.java b/xml/impl/src/com/intellij/xml/actions/xmlbeans/Xsd2InstanceUtils.java index 0bb9ba882db5..c6c358eda169 100644 --- a/xml/impl/src/com/intellij/xml/actions/xmlbeans/Xsd2InstanceUtils.java +++ b/xml/impl/src/com/intellij/xml/actions/xmlbeans/Xsd2InstanceUtils.java @@ -15,6 +15,7 @@ */ package com.intellij.xml.actions.xmlbeans; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.XmlRecursiveElementVisitor; @@ -28,12 +29,14 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; import com.intellij.xml.impl.schema.XmlNSDescriptorImpl; +import com.intellij.xml.util.XmlUtil; import org.apache.xmlbeans.*; import org.apache.xmlbeans.impl.tool.CommandLine; import org.apache.xmlbeans.impl.xsd2inst.SampleXmlUtil; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.io.UnsupportedEncodingException; import java.util.*; @@ -85,7 +88,7 @@ public class Xsd2InstanceUtils { } catch (Exception e) { - throw new IllegalArgumentException("Can not load schema file: " + schemaFiles[i] + ": "); + throw new IllegalArgumentException("Can not load schema file: " + schemaFiles[i] + ": " + e.getLocalizedMessage()); } } @@ -145,7 +148,7 @@ public class Xsd2InstanceUtils { return null; } - + public static List addVariantsFromRootTag(XmlTag rootTag) { PsiMetaData metaData = rootTag.getMetaData(); if (metaData instanceof XmlNSDescriptorImpl) { @@ -217,11 +220,26 @@ public class Xsd2InstanceUtils { } }); - schemaReferenceProcessor.processSchema(fileName, result.toString()); + final VirtualFile virtualFile = file.getVirtualFile(); + final String content = result.toString(); + + byte[] bytes; + if (virtualFile != null) { + bytes = content.getBytes(virtualFile.getCharset()); + } else { + try { + final String charsetName = XmlUtil.extractXmlEncodingFromProlog(content.getBytes()); + bytes = charsetName != null ? content.getBytes(charsetName) : content.getBytes(); + } catch (UnsupportedEncodingException e) { + bytes = content.getBytes(); + } + } + + schemaReferenceProcessor.processSchema(fileName, bytes); return fileName; } public interface SchemaReferenceProcessor { - void processSchema(String schemaFileName, String schemaContent); + void processSchema(String schemaFileName, byte[] schemaContent); } }