Index: openide/templates/nbproject/project.xml =================================================================== RCS file: /shared/data/ccvs/repository/openide/templates/nbproject/project.xml,v retrieving revision 1.2 diff -u -r1.2 project.xml --- openide/templates/nbproject/project.xml 7 Feb 2007 10:02:50 -0000 1.2 +++ openide/templates/nbproject/project.xml 21 Mar 2007 16:39:54 -0000 @@ -15,6 +15,15 @@ + org.netbeans.modules.queries + + + + 1 + 1.10 + + + org.openide.dialogs @@ -68,6 +77,14 @@ unit org.netbeans.libs.freemarker + + + + org.openide.text + + + + org.openide.windows Index: openide/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java,v retrieving revision 1.2 diff -u -r1.2 ScriptingCreateFromTemplateHandler.java --- openide/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java 7 Feb 2007 10:02:51 -0000 1.2 +++ openide/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java 21 Mar 2007 16:39:54 -0000 @@ -25,6 +25,7 @@ import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; +import java.nio.charset.Charset; import java.util.Map; import java.util.logging.Logger; import javax.script.Bindings; @@ -33,6 +34,7 @@ import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.text.PlainDocument; +import org.netbeans.api.queries.FileEncodingQuery; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.CreateFromTemplateHandler; @@ -65,11 +67,13 @@ String nameUniq = FileUtil.findFreeFileName(f, name, template.getExt()); FileObject output = FileUtil.createData(f, nameUniq + '.' + template.getExt()); - + Charset targetEnc = FileEncodingQuery.getEncoding(output); + Charset sourceEnc = FileEncodingQuery.getEncoding(template); + Writer w = null; Reader is = null; try { - w = new OutputStreamWriter(output.getOutputStream()); + w = new OutputStreamWriter(output.getOutputStream(), targetEnc); IndentEngine format = IndentEngine.find(template.getMIMEType()); if (format != null) { @@ -83,7 +87,7 @@ //eng.getContext().setBindings(bind, ScriptContext.ENGINE_SCOPE); eng.getContext().setAttribute(FileObject.class.getName(), template, ScriptContext.ENGINE_SCOPE); eng.getContext().setAttribute(ScriptEngine.FILENAME, template.getNameExt(), ScriptContext.ENGINE_SCOPE); - is = new InputStreamReader(template.getInputStream()); + is = new InputStreamReader(template.getInputStream(), sourceEnc); eng.eval(is); }catch (ScriptException ex) { IOException io = new IOException(ex.getMessage()); Index: openide/templates/test/unit/src/org/netbeans/modules/templates/SCFTHandlerTest.java =================================================================== RCS file: /shared/data/ccvs/repository/openide/templates/test/unit/src/org/netbeans/modules/templates/SCFTHandlerTest.java,v retrieving revision 1.3 diff -u -r1.3 SCFTHandlerTest.java --- openide/templates/test/unit/src/org/netbeans/modules/templates/SCFTHandlerTest.java 20 Mar 2007 16:01:16 -0000 1.3 +++ openide/templates/test/unit/src/org/netbeans/modules/templates/SCFTHandlerTest.java 21 Mar 2007 16:39:54 -0000 @@ -21,19 +21,27 @@ package org.netbeans.modules.templates; import java.awt.Dialog; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStream; +import java.nio.CharBuffer; +import java.nio.charset.Charset; import java.util.Collections; import java.util.Enumeration; import java.util.Map; import javax.swing.JDialog; import org.netbeans.junit.MockServices; import org.netbeans.junit.NbTestCase; +import org.netbeans.spi.queries.FileEncodingQueryImplementation; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; +import org.openide.filesystems.FileSystem; import org.openide.filesystems.FileUtil; +import org.openide.filesystems.Repository; import org.openide.loaders.DataFolder; import org.openide.loaders.DataLoader; import org.openide.loaders.DataLoaderPool; @@ -43,12 +51,17 @@ import org.openide.loaders.MultiDataObject; import org.openide.loaders.MultiFileLoader; import org.openide.util.Enumerations; +import org.openide.util.Exceptions; /** * * @author Jaroslav Tulach */ public class SCFTHandlerTest extends NbTestCase { + static { + // confuse the system a bit, if your system runs with UTF-8 default locale... + //System.setProperty("file.encoding", "cp1252"); + } public SCFTHandlerTest(String testName) { super(testName); @@ -59,7 +72,7 @@ } protected void setUp() throws Exception { - MockServices.setServices(DD.class, Pool.class); + MockServices.setServices(DD.class, Pool.class, FEQI.class); } protected void tearDown() throws Exception { @@ -161,6 +174,54 @@ assertEquals("Fully read", arr.length, len); return new String(arr); } + + private static String readChars(FileObject fo, Charset set) throws IOException { + CharBuffer arr = CharBuffer.allocate((int)fo.getSize() * 2); + BufferedReader r = new BufferedReader(new InputStreamReader(fo.getInputStream(), set)); + while (r.read(arr) != -1) { + // again + } + r.close(); + + arr.flip(); + return arr.toString(); + } + + public void testUTF8() throws Exception { + FileObject root = Repository.getDefault().getDefaultFileSystem().getRoot(); + FileObject xmldir = FileUtil.createFolder(root, "xml"); + FileObject xml = FileUtil.createData(xmldir, "class.txt"); + OutputStream os = xml.getOutputStream(); + FileUtil.copy(getClass().getResourceAsStream("utf8.xml"), os); + xml.setAttribute("javax.script.ScriptEngine", "freemarker"); + os.close(); + + DataObject obj = DataObject.find(xml); + + + FileObject target = FileUtil.createFolder(FileUtil.createMemoryFileSystem().getRoot(), "dir"); + DataFolder folder = DataFolder.findFolder(FileUtil.createFolder(target, "target")); + + + + Charset set = Charset.forName("iso-8859-2"); + FEQI.fs = target.getFileSystem(); + FEQI.result = set; + + + Map parameters = Collections.singletonMap("title", "Nazdar"); + DataObject n = obj.createFromTemplate(folder, "complex", parameters); + + assertEquals("Created in right place", folder, n.getFolder()); + assertEquals("Created with right name", "complex.txt", n.getName()); + + + String read = readChars(n.getPrimaryFile(), set); + + String exp = readChars(xml, Charset.forName("utf-8")); + assertEquals(exp, read); + + } public static final class DD extends DialogDisplayer { public Object notify(NotifyDescriptor descriptor) { @@ -187,6 +248,22 @@ } }; */ + } + } + + public static final class FEQI extends FileEncodingQueryImplementation { + public static FileSystem fs; + public static Charset result; + + public Charset getEncoding(FileObject f) { + try { + if (f.getFileSystem() == fs) { + return result; + } + return null; + } catch (FileStateInvalidException ex) { + return null; + } } } Index: openide/templates/test/unit/src/org/netbeans/modules/templates/utf8.xml =================================================================== RCS file: openide/templates/test/unit/src/org/netbeans/modules/templates/utf8.xml diff -N openide/templates/test/unit/src/org/netbeans/modules/templates/utf8.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openide/templates/test/unit/src/org/netbeans/modules/templates/utf8.xml 21 Mar 2007 16:39:54 -0000 @@ -0,0 +1,4 @@ + + + Žluťoučký kůň skákal přes čtvero mezí. + Index: projects/queries/apichanges.xml =================================================================== RCS file: /shared/data/ccvs/repository/projects/queries/apichanges.xml,v retrieving revision 1.8 diff -u -r1.8 apichanges.xml --- projects/queries/apichanges.xml 21 Mar 2007 01:17:18 -0000 1.8 +++ projects/queries/apichanges.xml 21 Mar 2007 16:39:54 -0000 @@ -81,6 +81,25 @@ + + + Default Encoding of System File System is always UTF-8 + + + + + + +

+ Whenever someone queries for encoding of a file object on default + file system (e.g. the one that is provided by layers), it will get + UTF-8 as the default encoding and not the system one. As a result + all resources on layers should be in UTF-8 encoding. +

+
+ + +
Added support for obtaining encoding of files Index: projects/queries/manifest.mf =================================================================== RCS file: /shared/data/ccvs/repository/projects/queries/manifest.mf,v retrieving revision 1.12 diff -u -r1.12 manifest.mf --- projects/queries/manifest.mf 14 Mar 2007 14:34:05 -0000 1.12 +++ projects/queries/manifest.mf 21 Mar 2007 16:39:54 -0000 @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.queries/1 -OpenIDE-Module-Specification-Version: 1.9 +OpenIDE-Module-Specification-Version: 1.10 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/queries/Bundle.properties Index: projects/queries/src/org/netbeans/api/queries/FileEncodingQuery.java =================================================================== RCS file: /shared/data/ccvs/repository/projects/queries/src/org/netbeans/api/queries/FileEncodingQuery.java,v retrieving revision 1.2 diff -u -r1.2 FileEncodingQuery.java --- projects/queries/src/org/netbeans/api/queries/FileEncodingQuery.java 17 Mar 2007 14:44:20 -0000 1.2 +++ projects/queries/src/org/netbeans/api/queries/FileEncodingQuery.java 21 Mar 2007 16:39:54 -0000 @@ -33,6 +33,7 @@ import org.netbeans.modules.queries.UnknownEncoding; import org.netbeans.spi.queries.FileEncodingQueryImplementation; import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileStateInvalidException; import org.openide.util.Lookup; import org.openide.util.NbPreferences; @@ -71,7 +72,15 @@ delegates.add(encoding); } } - delegates.add(Charset.defaultCharset()); + try { + if (file.getFileSystem().isDefault()) { + delegates.add(Charset.forName(UTF_8)); + } else { + delegates.add(Charset.defaultCharset()); + } + } catch (FileStateInvalidException ex) { + delegates.add(Charset.defaultCharset()); + } return new ProxyCharset (delegates); } Index: projects/queries/test/unit/src/org/netbeans/api/queries/FileEncodingQueryTest.java =================================================================== RCS file: /shared/data/ccvs/repository/projects/queries/test/unit/src/org/netbeans/api/queries/FileEncodingQueryTest.java,v retrieving revision 1.2 diff -u -r1.2 FileEncodingQueryTest.java --- projects/queries/test/unit/src/org/netbeans/api/queries/FileEncodingQueryTest.java 17 Mar 2007 14:44:21 -0000 1.2 +++ projects/queries/test/unit/src/org/netbeans/api/queries/FileEncodingQueryTest.java 21 Mar 2007 16:39:54 -0000 @@ -60,12 +60,17 @@ import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.filesystems.Repository; /** * * @author Tomas Zezula */ public class FileEncodingQueryTest extends NbTestCase { + static { + // confuse the system a bit, if your system runs with UTF-8 default locale... + //System.setProperty("file.encoding", "cp1252"); + } private final String expectedEncoding; private final File file; @@ -181,6 +186,12 @@ out.close(); assertEquals(testString, new String(outbs.toByteArray())); + } + + public void testDefaultEncodingOnSFSIsUTF8() throws IOException { + FileObject fo = FileUtil.createData(Repository.getDefault().getDefaultFileSystem().getRoot(), "some.file"); + Charset enc = FileEncodingQuery.getEncoding(fo); + assertEquals("utf-8", enc.toString()); } private void performTest(File templ, String expectedEncoding) throws Exception {