Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: javax/ide/net/spi/VFSHook.java


1   package javax.ide.net.spi;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   import java.util.logging.Level;
6   
7   import javax.ide.extension.ElementContext;
8   import javax.ide.extension.ElementEndContext;
9   import javax.ide.extension.ElementName;
10  import javax.ide.extension.ElementStartContext;
11  import javax.ide.extension.ElementVisitor;
12  import javax.ide.extension.ExtensionHook;
13  import javax.ide.extension.MetaClassVisitor;
14  import javax.ide.util.MetaClass;
15  
16  /**
17   * The virtual file system hook.
18   */
19  public final class VFSHook extends ExtensionHook
20  {
21    public static final ElementName ELEMENT = new ElementName( 
22      ExtensionHook.MANIFEST_XMLNS, "vfs-hook"
23    );
24    
25    private static final ElementName SCHEME = new ElementName(
26      ExtensionHook.MANIFEST_XMLNS, "scheme"
27    );
28    private static final ElementName HELPER = new ElementName(
29      ExtensionHook.MANIFEST_XMLNS, "helper"
30    );
31    private static final ElementName HELPER_CLASS = new ElementName(
32      ExtensionHook.MANIFEST_XMLNS, "helper-class"
33    );
34    private static final String CURRENT_HOLDER = "currentHolder";
35    
36    private final ElementVisitor _helperVisitor = new HelperVisitor();
37    private final ElementVisitor _schemeVisitor = new SchemeVisitor();
38    private final ElementVisitor _helperClassVisitor = new HelperClassVisitor();
39    
40    private Map _helperMetaClassesByScheme = new HashMap();
41    
42    public void start( ElementStartContext context )
43    {
44      context.registerChildVisitor( HELPER, _helperVisitor );
45    }
46      
47    private final class HelperVisitor extends ElementVisitor
48    {
49      public void start( ElementStartContext context )
50      {
51        context.getScopeData().put( CURRENT_HOLDER, new Holder() );
52        
53        context.registerChildVisitor( SCHEME, _schemeVisitor );
54        context.registerChildVisitor( HELPER_CLASS, _helperClassVisitor );
55      }
56      
57      public void end( ElementEndContext context )
58      {
59        Holder holder = (Holder) context.getScopeData().get( CURRENT_HOLDER );
60        
61        if ( holder.scheme == null )
62        {
63          log(context, Level.SEVERE, "Missing required element 'scheme'.");
64          return;
65        }
66        if ( holder.metaClass == null )
67        {
68          log( context, Level.SEVERE, "Missing required element 'helper-class'." );
69          return;
70        }
71        
72        if ( _helperMetaClassesByScheme.containsKey( holder.scheme ) )
73        {
74          log( context, Level.WARNING, 
75            "Multiple virtual file system helpers for scheme '"+holder.scheme+"'. "+
76            holder.metaClass.getClassName()+" takes precedence." );
77        }
78        
79        _helperMetaClassesByScheme.put( holder.scheme, holder.metaClass );
80      }
81      
82    }
83  
84    private final class SchemeVisitor extends ElementVisitor
85    {
86      public void end( ElementEndContext context )
87      {
88        if ( context.getText() != null )
89        {
90          String scheme = context.getText().trim();
91          Holder holder = (Holder) context.getScopeData().get( CURRENT_HOLDER );
92          holder.scheme = scheme;
93        }
94      }
95    }
96    
97    private final class HelperClassVisitor extends MetaClassVisitor
98    {
99      protected void metaClass( ElementContext context, MetaClass clz )
100     {
101       Holder holder = (Holder) context.getScopeData().get( CURRENT_HOLDER );
102       holder.metaClass = clz;
103     }
104   }
105   
106   
107   private final class Holder
108   {
109     private String scheme;
110     private MetaClass metaClass;
111   }
112 }