/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package net.neilcsmith.praxis.live.pxr.templates; import java.io.CharConversionException; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import net.neilcsmith.praxis.core.ComponentFactory.MetaData; import net.neilcsmith.praxis.core.ComponentType; import net.neilcsmith.praxis.core.Root; import net.neilcsmith.praxis.live.components.api.Components; import net.neilcsmith.praxis.live.core.api.DynamicFileSystem; import org.netbeans.spi.project.ui.PrivilegedTemplates; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileSystem; import org.openide.filesystems.FileUtil; import org.openide.filesystems.XMLFileSystem; import org.openide.util.Exceptions; import org.openide.xml.XMLUtil; import org.xml.sax.SAXException; /** * * @author Neil C Smith */ class TemplateFiles { private final static Logger LOG = Logger.getLogger(TemplateFiles.class.getName()); private final static Map<String, String> display = new HashMap<String, String>(); static { display.put("root:audio", "Audio Patch"); display.put("root:video", "Video Patch"); display.put("root:midi", "MIDI Bindings"); display.put("root:gui", "Control Panel (GUI)"); display.put("root:tinkerforge", "TinkerForge Patch"); display.put("root:osc", "OSC Bindings"); display.put("root:data", "Generic Data Patch"); } private final static String templateFolder = "Templates/Praxis/"; private final static TemplateFiles INSTANCE = new TemplateFiles(); private final FileSystem memoryFS; private final FileSystem layer; private final List<String> privileged; private TemplateFiles() { memoryFS = FileUtil.createMemoryFileSystem(); privileged = new ArrayList<String>(); layer = init(); if (layer != null) { DynamicFileSystem.getDefault().mount(layer); } } private FileSystem init() { StringBuilder sb = new StringBuilder(); buildLayerPrefix(sb); ComponentType[] types = Components.getRootComponentTypes(); for (ComponentType type : types) { String filename = fileName(type); buildTemplateFile(sb, type, filename); MetaData<? extends Root> data = Components.getRootMetaData(type); if (data != null && !data.isTest() && !data.isDeprecated()) { privileged.add(templateFolder + filename); } } buildLayerSuffix(sb); LOG.log(Level.FINE, "Created Templates dynamic layer\n{0}", sb); FileObject memLayer = writeLayer(sb); if (memLayer != null) { try { return new XMLFileSystem(memLayer.toURL()); } catch (SAXException ex) { Exceptions.printStackTrace(ex); } } LOG.warning("Unable to create dynamic templates"); return null; } private FileObject writeLayer(StringBuilder sb) { OutputStreamWriter writer = null; FileObject file = null; try { file = memoryFS.getRoot().createData("layer.xml"); writer = new OutputStreamWriter(file.getOutputStream(), "UTF-8"); writer.append(sb); } catch (Exception ex) { Exceptions.printStackTrace(ex); } finally { if (writer != null) { try { writer.close(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } } } return file; } private void buildLayerPrefix(StringBuilder sb) { sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); sb.append("<!DOCTYPE filesystem PUBLIC \"-//NetBeans//DTD Filesystem 1.2//EN\" \"http://www.netbeans.org/dtds/filesystem-1_2.dtd\">\n"); sb.append("<filesystem>\n"); sb.append("<folder name=\"Templates\">\n"); sb.append("<folder name=\"Praxis\">\n"); } private void buildTemplateFile(StringBuilder sb, ComponentType type, String filename) { sb.append("<file name=\"").append(filename).append("\">\n"); sb.append("<attr name=\"displayName\" stringvalue=\"") .append(displayName(type)).append("\"/>\n"); sb.append("<attr name=\"instantiatingIterator\" newvalue=\"net.neilcsmith.praxis.live.pxr.wizard.PXRWizardIterator\"/>\n"); sb.append("<attr name=\"template\" boolvalue=\"true\"/>\n"); sb.append("<attr name=\"templateWizardURL\" urlvalue=\"nbresloc:/net/neilcsmith/praxis/live/pxr/resources/PXRinfo.html\"/>\n"); sb.append("<attr name=\"rootType\" stringvalue=\"").append(type).append("\"/>\n"); sb.append("</file>\n"); } private void buildLayerSuffix(StringBuilder sb) { sb.append("</folder>\n"); // Templates sb.append("</folder>\n"); // Praxis sb.append("</filesystem>"); } private String fileName(ComponentType type) { String str = type.toString(); int idx = str.lastIndexOf(':'); if (idx > -1) { str = str.substring(idx + 1); } return str + ".pxr"; } private String displayName(ComponentType type) { String str = display.get(type.toString()); if (str != null) { try { return XMLUtil.toAttributeValue(str); } catch (CharConversionException ex) { Exceptions.printStackTrace(ex); } } return type.toString(); } PrivilegedTemplates getPrivilegedTemplates() { return new Privileged(privileged.toArray(new String[privileged.size()])); } private static class Privileged implements PrivilegedTemplates { private String[] templates; private Privileged(String[] templates) { this.templates = templates; } @Override public String[] getPrivilegedTemplates() { return templates; } } static TemplateFiles getDefault() { return INSTANCE; } }