Skip to content
Snippets Groups Projects
Select Git revision
  • labcomm2014
  • labcomm2006
  • master default
  • python_sig_hash
  • typedefs
  • anders.blomdell
  • typeref
  • pragma
  • compiler-refactoring
  • labcomm2013
  • v2014.6
  • v2015.0
  • v2014.5
  • v2014.4
  • v2006.0
  • v2014.3
  • v2014.2
  • v2014.1
  • v2014.0
  • v2013.0
20 results

DecoderRegistry.java

Blame
  • DecoderRegistry.java 3.51 KiB
    package se.lth.control.labcomm2006;
    
    import java.io.IOException;
    import java.util.HashMap;
    
    public class DecoderRegistry {
    
      public static class Entry {
        
        private SampleDispatcher dispatcher;
        private SampleHandler handler;
        private int index;
        private String name;
        private byte[] signature;
    
        public Entry(SampleDispatcher dispatcher,
    		 SampleHandler handler) {
          this.dispatcher = dispatcher;
          this.name = dispatcher.getName();
          this.signature = dispatcher.getSignature();
          this.handler = handler;
        }
    
        public Entry(int index, String name, byte[] signature) {
          this.index = index;
          this.name = name;
          this.signature = signature;
        }
    
        public SampleDispatcher getDispatcher() {
          return dispatcher;
        }
    
        public void setDispatcher(SampleDispatcher dispatcher) {
          this.dispatcher = dispatcher;
        }
    
        public SampleHandler getHandler() {
          return handler;
        }
    
        public void setHandler(SampleHandler handler) {
          this.handler = handler;
        }
    
        public String getName() {
          return name;
        }
    
        public int getIndex() {
          return index;
        }
    
        public void setIndex(int index) throws IOException {
          if (this.index != 0 && this.index != index) {
    	throw new IOException("Index mismatch " + 
    			      this.index + " != " + index);
          }
          this.index = index;
        }
    
        public boolean matchName(String name) {
          return this.name.equals(name);
        }
    
        public boolean matchSignature(byte[] signature) {
          boolean result = this.signature.length == signature.length;
          for (int i = 0 ; result && i < signature.length ; i++) {
    	result = this.signature[i] == signature[i];
          }
          return result;
        }
    
        public boolean match(String name, byte[] signature) {
          return matchName(name) && matchSignature(signature);
        }
    
        public void check(String name, byte[] signature) throws IOException {
          if (!matchName(name)) {
    	throw new IOException("Name mismatch '" + 
    			      this.name + "' != '" + name + "'");
          } 
          if (!matchSignature(signature)) {
    	throw new IOException("Signature mismatch");
          } 
        }
      }
    
      private HashMap<Class, Entry> byClass;
      private HashMap<Integer, Entry> byIndex;
    
      public DecoderRegistry() {
        byClass = new HashMap<Class, Entry>();
        byIndex = new HashMap<Integer, Entry>();
      }
    
      public synchronized void add(SampleDispatcher dispatcher,
    			       SampleHandler handler) throws IOException{
        Entry e = byClass.get(dispatcher.getSampleClass());
        if (e != null) {
          e.check(dispatcher.getName(), dispatcher.getSignature());
          e.setHandler(handler);
        } else {
          for (Entry e2 : byIndex.values()) {
    	if (e2.match(dispatcher.getName(), dispatcher.getSignature())) {
    	  e2.setDispatcher(dispatcher);
    	  e2.setHandler(handler);
    	  e = e2;
    	  break;
    	}
          }
          if (e == null) {
    	e = new Entry(dispatcher, handler);
    	byClass.put(dispatcher.getSampleClass(), e);
          }
        }
      }
    
      public synchronized void add(int index, 
    			       String name,
    			       byte[] signature) throws IOException {
        Entry e = byIndex.get(Integer.valueOf(index));
        if (e != null) {
          e.check(name, signature);
        } else {
          for (Entry e2 : byClass.values()) {
    	if (e2.match(name, signature)) {
    	  e2.setIndex(index);
    	  e = e2;
    	  break;
    	}
          }
          if (e == null) {
    	e = new Entry(index, name, signature);
          }
          byIndex.put(Integer.valueOf(index), e);
        }
      }
    
      public synchronized Entry get(int index) {
        return byIndex.get(Integer.valueOf(index));
      }
    
    }