/* * GlslVocabularyManager.java * * Created on 12. Februar 2006, 03:37 * */ package net.java.nboglpack.glsleditor; import java.io.InputStream; import java.util.AbstractSet; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import net.java.nboglpack.glsleditor.dataobject.GlslFragmentShaderDataLoader; import net.java.nboglpack.glsleditor.dataobject.GlslGeometryShaderDataLoader; import net.java.nboglpack.glsleditor.dataobject.GlslVertexShaderDataLoader; import net.java.nboglpack.glsleditor.vocabulary.GLSLElementDescriptor; import net.java.nboglpack.glsleditor.vocabulary.GLSLVocabulary; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; /** * * @author mhenze * @author Michael Bien */ public class GlslVocabularyManager { private static final ErrorManager LOGGER = ErrorManager.getDefault().getInstance(GlslVocabularyManager.class.getName()); private static final HashMap<String, GlslVocabularyManager> instances = new HashMap<String, GlslVocabularyManager>(); private static GLSLVocabulary vocabulary = null; private final String mimetype; private final Set<String> keySet; private final Map<String, GLSLElementDescriptor[]> vocabularyExtention; /** Creates a new instance of GlslVocabularyManager */ private GlslVocabularyManager(String mimetype) { if( !mimetype.equals(GlslFragmentShaderDataLoader.REQUIRED_MIME) && !mimetype.equals(GlslVertexShaderDataLoader.REQUIRED_MIME) && !mimetype.equals(GlslGeometryShaderDataLoader.REQUIRED_MIME)) { throw new IllegalArgumentException(mimetype+" is no GLSL mime type"); } this.mimetype = mimetype; if(vocabulary == null) loadVocabulary(); if(mimetype.equals(GlslFragmentShaderDataLoader.REQUIRED_MIME)) { vocabularyExtention = vocabulary.fragmentShaderVocabulary; }else if(mimetype.equals(GlslVertexShaderDataLoader.REQUIRED_MIME)) { vocabularyExtention = vocabulary.vertexShaderVocabulary; }else { vocabularyExtention = vocabulary.geometryShaderVocabulary; } // merges two views keySet = new AbstractSet<String>() { private final Set<String> mainSet = vocabulary.mainVocabulary.keySet(); private final Set<String> extSet = vocabularyExtention.keySet(); public Iterator<String> iterator() { return new Iterator<String>(){ Iterator<String> mainIt = mainSet.iterator(); Iterator<String> extIt = extSet.iterator(); public boolean hasNext() { return mainIt.hasNext() || extIt.hasNext(); } public String next() { if(mainIt.hasNext()) return mainIt.next(); else return extIt.next(); } public void remove() { throw new UnsupportedOperationException("Not supported yet."); } }; } public int size() { return mainSet.size()+extSet.size(); } }; } public static GlslVocabularyManager getInstance(String mimetype) { GlslVocabularyManager instance = instances.get(mimetype); if(instance == null) { instance = new GlslVocabularyManager(mimetype); instances.put(mimetype,instance); } return instance; } private void loadVocabulary() { FileObject vocabularyfile = FileUtil.getConfigFile("Editors/"+mimetype+"/vocabulary.xml"); if (vocabularyfile != null) { InputStream is = null; try { is = vocabularyfile.getInputStream(); // workaround; nb does not allow usage of jdk's jaxb implementation // => we have to provide JAXB as library wrapper module and load it via module classloader JAXBContext jc = JAXBContext.newInstance("net.java.nboglpack.glsleditor.vocabulary", this.getClass().getClassLoader()); Unmarshaller unmarshaller = jc.createUnmarshaller(); vocabulary = (GLSLVocabulary)unmarshaller.unmarshal(is); } catch (Exception ex) { // create empty vocab vocabulary = new GLSLVocabulary(); LOGGER.notify(ex); } finally { if(is != null) { try { is.close(); } catch (Exception e) { LOGGER.notify(e); } } } } } public Set getKeys() { return keySet; } public GLSLElementDescriptor[] getDesc(String key) { GLSLElementDescriptor[] desc = vocabulary.mainVocabulary.get(key); if(desc == null) desc = vocabularyExtention.get(key); return desc; } }