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 }