1 package com
.intellij
.xml
.actions
.xmlbeans
;
3 import com
.intellij
.javaee
.ExternalResourceManager
;
4 import com
.intellij
.openapi
.actionSystem
.AnAction
;
5 import com
.intellij
.openapi
.actionSystem
.AnActionEvent
;
6 import com
.intellij
.openapi
.actionSystem
.DataKeys
;
7 import com
.intellij
.openapi
.application
.ApplicationManager
;
8 import com
.intellij
.openapi
.fileEditor
.FileDocumentManager
;
9 import com
.intellij
.openapi
.fileEditor
.FileEditorManager
;
10 import com
.intellij
.openapi
.project
.Project
;
11 import com
.intellij
.openapi
.ui
.Messages
;
12 import com
.intellij
.openapi
.util
.Computable
;
13 import com
.intellij
.openapi
.vfs
.LocalFileSystem
;
14 import com
.intellij
.openapi
.vfs
.VfsUtil
;
15 import com
.intellij
.openapi
.vfs
.VirtualFile
;
16 import com
.intellij
.psi
.PsiManager
;
17 import com
.intellij
.psi
.xml
.XmlFile
;
18 import com
.intellij
.xml
.XmlBundle
;
19 import gnu
.trove
.THashMap
;
20 import org
.jetbrains
.annotations
.NonNls
;
21 import org
.jetbrains
.annotations
.Nullable
;
24 import java
.io
.FileOutputStream
;
25 import java
.io
.IOException
;
26 import java
.io
.StringBufferInputStream
;
27 import java
.util
.LinkedList
;
28 import java
.util
.List
;
31 * @author Konstantin Bulenkov
33 public class GenerateInstanceDocumentFromSchemaAction
extends AnAction
{
35 public void update(AnActionEvent e
) {
36 final VirtualFile file
= DataKeys
.VIRTUAL_FILE
.getData(e
.getDataContext());
37 final boolean enabled
= isAcceptableFile(file
);
38 e
.getPresentation().setEnabled(enabled
);
39 e
.getPresentation().setVisible(enabled
);
42 public void actionPerformed(AnActionEvent e
) {
43 final Project project
= DataKeys
.PROJECT
.getData(e
.getDataContext());
44 final VirtualFile file
= DataKeys
.VIRTUAL_FILE
.getData(e
.getDataContext());
46 final GenerateInstanceDocumentFromSchemaDialog dialog
= new GenerateInstanceDocumentFromSchemaDialog(project
, file
);
47 dialog
.setOkAction(new Runnable() {
49 doAction(project
, dialog
);
56 private void doAction(final Project project
, final GenerateInstanceDocumentFromSchemaDialog dialog
) {
57 FileDocumentManager
.getInstance().saveAllDocuments();
59 @NonNls List
<String
> parameters
= new LinkedList
<String
>();
61 final String url
= dialog
.getUrl().getText();
62 final VirtualFile relativeFile
= VfsUtil
.findRelativeFile(ExternalResourceManager
.getInstance().getResourceLocation(url
), null);
63 VirtualFile relativeFileDir
;
64 if (relativeFile
== null) {
65 Messages
.showErrorDialog(project
, XmlBundle
.message("file.doesnt.exist", url
), XmlBundle
.message("error"));
68 relativeFileDir
= relativeFile
.getParent();
70 if (relativeFileDir
== null) {
71 Messages
.showErrorDialog(project
, XmlBundle
.message("file.doesnt.exist", url
), XmlBundle
.message("error"));
75 if (!dialog
.enableRestrictionCheck()) {
76 parameters
.add("-nopvr");
79 if (!dialog
.enableUniquenessCheck()) {
80 parameters
.add("-noupa");
87 final File tempDir
= File
.createTempFile("xsd2inst","");
91 pathToUse
= tempDir
.getPath() + File
.separatorChar
+ Xsd2InstanceUtils
.processAndSaveAllSchemas(
92 (XmlFile
) PsiManager
.getInstance(project
).findFile(relativeFile
),
93 new THashMap
<String
, String
>(),
94 new Xsd2InstanceUtils
.SchemaReferenceProcessor() {
95 public void processSchema(String schemaFileName
, String schemaContent
) {
97 final String fullFileName
= tempDir
.getPath() + File
.separatorChar
+ schemaFileName
;
98 FileUtils
.saveStreamContentAsFile(
100 new StringBufferInputStream(schemaContent
)
102 } catch (IOException e
) {
103 throw new RuntimeException(e
);
108 } catch (IOException e
) {
112 parameters
.add(pathToUse
);
114 parameters
.add("-name");
115 parameters
.add(dialog
.getElementName());
117 String xml
= Xsd2InstanceUtils
.generate(parameters
.toArray(new String
[parameters
.size()]));
120 final VirtualFile baseDirForCreatedInstanceDocument1
= relativeFileDir
;
121 String xmlFileName
= baseDirForCreatedInstanceDocument1
.getPath() + File
.separatorChar
+ dialog
.getOutputFileName();
122 FileOutputStream fileOutputStream
= null;
125 fileOutputStream
= new FileOutputStream(xmlFileName
);
126 fileOutputStream
.write(xml
.getBytes());
127 fileOutputStream
.close();
128 fileOutputStream
= null;
130 catch (IOException e
) {
134 final File xmlFile
= new File(xmlFileName
);
135 VirtualFile virtualFile
= ApplicationManager
.getApplication().runWriteAction(new Computable
<VirtualFile
>() {
137 public VirtualFile
compute() {
138 return LocalFileSystem
.getInstance().refreshAndFindFileByIoFile(xmlFile
);
141 FileEditorManager
.getInstance(project
).openFile(virtualFile
, true);
144 static boolean isAcceptableFileForGenerateSchemaFromInstanceDocument(VirtualFile virtualFile
) {
145 return virtualFile
!= null && "xsd".equalsIgnoreCase(virtualFile
.getExtension());
148 public static boolean isAcceptableFile(VirtualFile file
) {
149 return isAcceptableFileForGenerateSchemaFromInstanceDocument(file
);