xsd2xml and xml2xsd functionality
[fedora-idea.git] / xml / impl / src / com / intellij / xml / actions / xmlbeans / GenerateInstanceDocumentFromSchemaAction.java
blobace5c610530adc11982ca3483d2931548a87605c
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;
23 import java.io.File;
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;
30 /**
31 * @author Konstantin Bulenkov
33 public class GenerateInstanceDocumentFromSchemaAction extends AnAction {
34 @Override
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() {
48 public void run() {
49 doAction(project, dialog);
51 });
53 dialog.show();
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"));
66 return;
67 } else {
68 relativeFileDir = relativeFile.getParent();
70 if (relativeFileDir == null) {
71 Messages.showErrorDialog(project, XmlBundle.message("file.doesnt.exist", url), XmlBundle.message("error"));
72 return;
75 if (!dialog.enableRestrictionCheck()) {
76 parameters.add("-nopvr");
79 if (!dialog.enableUniquenessCheck()) {
80 parameters.add("-noupa");
84 String pathToUse;
86 try {
87 final File tempDir = File.createTempFile("xsd2inst","");
88 tempDir.delete();
89 tempDir.mkdir();
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) {
96 try {
97 final String fullFileName = tempDir.getPath() + File.separatorChar + schemaFileName;
98 FileUtils.saveStreamContentAsFile(
99 fullFileName,
100 new StringBufferInputStream(schemaContent)
102 } catch (IOException e) {
103 throw new RuntimeException(e);
108 } catch (IOException e) {
109 return;
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;
124 try {
125 fileOutputStream = new FileOutputStream(xmlFileName);
126 fileOutputStream.write(xml.getBytes());
127 fileOutputStream.close();
128 fileOutputStream = null;
130 catch (IOException e) {
131 e.printStackTrace();
134 final File xmlFile = new File(xmlFileName);
135 VirtualFile virtualFile = ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() {
136 @Nullable
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);