1
2
3
4
5 package xjavadoc;
6
7 import java.util.HashMap;
8 import java.util.Map;
9 import java.util.StringTokenizer;
10
11 /***
12 * Creates XTag instances.
13 *
14 * @author Aslak Hellesøy
15 * @created 10. februar 2002
16 */
17 public final class XTagFactory
18 {
19
20 /***
21 * Maps tag name to XTag class.
22 */
23 private final Map _tagClasses = new HashMap();
24 private boolean _isValidating = false;
25
26 public XTagFactory() {
27
28
29 setIgnoredTags( "author,deprecated,exception,param,return,see,serial,serialData,serialField,since,throws,version" );
30 }
31
32 public boolean isValidating()
33 {
34 return _isValidating;
35 }
36
37 public void setValidating( boolean isValidating )
38 {
39 _isValidating = isValidating;
40 }
41
42 /***
43 * Set the name of the tags that shouldn't be validated against.
44 *
45 * @param tags
46 */
47 public void setIgnoredTags( String tags )
48 {
49 StringTokenizer st = new StringTokenizer( tags, "," );
50
51 while( st.hasMoreTokens() )
52 {
53 registerTagClass( st.nextToken(), DefaultXTag.class );
54 }
55 }
56
57 /***
58 * Creates a new XTag. If a special tag class has been previously registeres,
59 * an instance of the corresponding class will be returned. This allows for
60 * special tag implementations.
61 *
62 * @param tagName name of the tag, without the '@'
63 * @param text content of the tag. Will be parsed into
64 * attributes.
65 * @param doc
66 * @param lineNumber
67 * @return an instance of XTag
68 * @exception UnknownTagException
69 * @throws TagValidationException if validation is activated and an unknown
70 * tag was encountered.
71 */
72 public XTag createTag( String tagName, String text, XDoc doc, int lineNumber ) throws UnknownTagException
73 {
74 tagName = XDoc.dotted( tagName );
75
76
77 Class tagClass = ( Class ) _tagClasses.get( tagName );
78 DefaultXTag tag;
79
80 if( tagClass != null )
81 {
82 try
83 {
84 tag = ( DefaultXTag ) tagClass.newInstance();
85 }
86 catch( InstantiationException e )
87 {
88 e.printStackTrace();
89 throw new IllegalStateException( e.getMessage() );
90 }
91 catch( IllegalAccessException e )
92 {
93 e.printStackTrace();
94 throw new IllegalStateException( e.getMessage() );
95 }
96 }
97 else
98 {
99 tag = new DefaultXTag();
100 }
101 tag.init( tagName, text, doc, lineNumber );
102
103
104 if( _isValidating && ( tagClass == null ) )
105 {
106 throw new UnknownTagException( tag );
107 }
108 return tag;
109 }
110
111 public void registerTagClass( String tagName, Class tagClass )
112 {
113 Class old = (Class) _tagClasses.get( XDoc.dotted(tagName) );
114 if( old != null ) {
115 throw new IllegalStateException( "The tag @" + XDoc.dotted(tagName) +
116 " has already been mapped to " + old.getName() +
117 ". Can't reregister it to " + tagClass.getName());
118 }
119 _tagClasses.put( XDoc.dotted( tagName ), tagClass );
120 }
121 }