diff --git a/openide.loaders/apichanges.xml b/openide.loaders/apichanges.xml --- a/openide.loaders/apichanges.xml +++ b/openide.loaders/apichanges.xml @@ -106,6 +106,23 @@ is the proper place. + + + Templates may ${project.encoding} property + + + + + +

+ Templates may use the ${project.encoding} property in their + bodies to be substituted to the encoding of the project which owns + the file being created. +

+
+ +
+ XMLDataObject no longer enforces text/xml as document mimetype diff --git a/openide.loaders/arch.xml b/openide.loaders/arch.xml --- a/openide.loaders/arch.xml +++ b/openide.loaders/arch.xml @@ -165,6 +165,7 @@ made subject to such option by the copyr
  • contains String representing the current day like 23. 3. 2007
  • contains String the current time like 17:18:30
  • contains String the file encoding of the template instance
  • +
  • contains String the encoding of the project which owns the file that is being created
  • diff --git a/openide.loaders/manifest.mf b/openide.loaders/manifest.mf --- a/openide.loaders/manifest.mf +++ b/openide.loaders/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 Manifest-Version: 1.0 OpenIDE-Module: org.openide.loaders -OpenIDE-Module-Specification-Version: 6.9 +OpenIDE-Module-Specification-Version: 6.10 OpenIDE-Module-Localizing-Bundle: org/openide/loaders/Bundle.properties OpenIDE-Module-Recommends: org.netbeans.modules.templates.v1_0 AutoUpdate-Essential-Module: true diff --git a/templates/manifest.mf b/templates/manifest.mf --- a/templates/manifest.mf +++ b/templates/manifest.mf @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.templates OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/templates/Bundle.properties -OpenIDE-Module-Specification-Version: 1.2 +OpenIDE-Module-Specification-Version: 1.3 OpenIDE-Module-Provides: org.netbeans.modules.templates.v1_0 AutoUpdate-Show-In-Client: false diff --git a/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java b/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java --- a/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java +++ b/templates/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateHandler.java @@ -37,6 +37,7 @@ import java.io.Reader; import java.io.Reader; import java.io.Writer; import java.nio.charset.Charset; +import java.util.Collections; import java.util.Map; import java.util.logging.Logger; import javax.script.Bindings; @@ -62,6 +63,7 @@ public class ScriptingCreateFromTemplate private static final Logger LOG = Logger.getLogger(ScriptingCreateFromTemplateHandler.class.getName()); private static final String ENCODING_PROPERTY_NAME = "encoding"; //NOI18N + private static final String PROJECT_PROPERTY_NAME = "project"; //NOI18N protected boolean accept(FileObject orig) { return engine(orig) != null; @@ -80,8 +82,18 @@ public class ScriptingCreateFromTemplate Bindings bind = eng.getContext().getBindings(ScriptContext.ENGINE_SCOPE); bind.putAll(values); - if(!values.containsKey(ENCODING_PROPERTY_NAME)) { + if (!bind.containsKey(ENCODING_PROPERTY_NAME)) { bind.put(ENCODING_PROPERTY_NAME, targetEnc.name()); + } + Object props = bind.get(PROJECT_PROPERTY_NAME); + if (props == null) { + bind.put(PROJECT_PROPERTY_NAME, Collections.singletonMap(ENCODING_PROPERTY_NAME, targetEnc.name())); + } else if (props instanceof Map) { + @SuppressWarnings("unchecked") + Map propMap = (Map) props; + if (!propMap.containsKey(ENCODING_PROPERTY_NAME)) { + propMap.put(ENCODING_PROPERTY_NAME, targetEnc.name()); + } } Writer w = null; diff --git a/templates/test/unit/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateTest.java b/templates/test/unit/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateTest.java --- a/templates/test/unit/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateTest.java +++ b/templates/test/unit/src/org/netbeans/modules/templates/ScriptingCreateFromTemplateTest.java @@ -34,7 +34,6 @@ import java.io.IOException; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; -import java.util.Collections; import java.util.Collections; import java.util.Map; import javax.swing.text.DefaultEditorKit; @@ -94,6 +93,35 @@ public class ScriptingCreateFromTemplate Charset targetEnc = FileEncodingQuery.getEncoding(instFO); assertNotNull("Template encoding is null", targetEnc); assertEquals("Encoding in template doesn't match", targetEnc.name(), readFile(instFO)); + } + + public void testCreateFromTemplateProjectEndcodingProperty() throws Exception { + FileObject root = FileUtil.createMemoryFileSystem().getRoot(); + FileObject fo = FileUtil.createData(root, "simpleObject.txt"); + OutputStream os = fo.getOutputStream(); + os.write("${project.encoding}".getBytes()); + os.close(); + fo.setAttribute ("template", Boolean.TRUE); + fo.setAttribute("javax.script.ScriptEngine", "freemarker"); + + DataObject obj = DataObject.find(fo); + DataFolder folder = DataFolder.findFolder(FileUtil.createFolder(root, "target")); + + Map parameters = Collections.singletonMap("project", Collections.singletonMap("encoding", "some-encoding")); + DataObject inst = obj.createFromTemplate(folder, "complex", parameters); + + FileObject instFO = inst.getPrimaryFile(); + + assertEquals("Encoding in template doesn't match", "some-encoding", readFile(instFO)); + + parameters = Collections.emptyMap(); + inst = obj.createFromTemplate(folder, "another", parameters); + + instFO = inst.getPrimaryFile(); + + Charset targetEnc = FileEncodingQuery.getEncoding(instFO); + assertNotNull("Template encoding is null", targetEnc); + assertEquals("Wrong value provided for project.encoding", targetEnc, readFile(instFO)); } //fix for this test was rolled back because of issue #120865