001: /*
002: * $Id: BodyOnLoadHandler.java 5385 2006-04-15 14:41:18 +0000 (Sat, 15 Apr 2006)
003: * jdonnerstag $ $Revision: 461653 $ $Date: 2006-04-15 14:41:18 +0000 (Sat, 15 Apr
004: * 2006) $
005: *
006: * ==============================================================================
007: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
008: * use this file except in compliance with the License. You may obtain a copy of
009: * the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
015: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
016: * License for the specific language governing permissions and limitations under
017: * the License.
018: */
019: package wicket.markup.parser.filter;
020:
021: import java.text.ParseException;
022: import java.util.Iterator;
023: import java.util.Map;
024:
025: import wicket.Application;
026: import wicket.markup.ComponentTag;
027: import wicket.markup.Markup;
028: import wicket.markup.MarkupElement;
029: import wicket.markup.parser.AbstractMarkupFilter;
030: import wicket.util.value.ValueMap;
031:
032: /**
033: * This is a markup inline filter. It determines the Wicket namespace name from
034: * the markup Examples are xmlns:wicket or
035: * xmlns:wicket="http://wicket.sourceforge.net".
036: *
037: * @see wicket.markup.MarkupParser
038: * @author Juergen Donnerstag
039: */
040: public final class WicketNamespaceHandler extends AbstractMarkupFilter {
041: /** Wicket URI */
042: private static final String WICKET_URI = "http://wicket.sourceforge.net";
043:
044: /** The markup created by reading the markup file */
045: private final Markup markup;
046:
047: /**
048: * namespace prefix: e.g. <html
049: * xmlns:wicket="http://wicket.sourceforge.net">
050: */
051: private static final String XMLNS = "xmlns:";
052:
053: /**
054: * Construct.
055: *
056: * @param markup
057: * The markup created by reading the markup file
058: */
059: public WicketNamespaceHandler(final Markup markup) {
060: this .markup = markup;
061: }
062:
063: /**
064: * Get the next tag from the next MarkupFilter in the chain and search for
065: * Wicket specific tags.
066: *
067: * @see wicket.markup.parser.IMarkupFilter#nextTag()
068: * @return The next tag from markup to be processed. If null, no more tags
069: * are available
070: */
071: public MarkupElement nextTag() throws ParseException {
072: // Get the next tag from the markup.
073: // If null, no more tags are available
074: final ComponentTag tag = nextComponentTag();
075: if (tag == null) {
076: return tag;
077: }
078:
079: if (tag.isOpen() && "html".equals(tag.getName().toLowerCase())) {
080: final String namespace = determineWicketNamespace(tag);
081: if (namespace != null) {
082: markup.setWicketNamespace(namespace);
083: }
084: }
085:
086: return tag;
087: }
088:
089: /**
090: * Determine wicket namespace from xmlns:wicket or
091: * xmlns:wicket="http://wicket.sourceforge.net"
092: *
093: * @param tag
094: * @return Wicket namespace
095: */
096: private String determineWicketNamespace(final ComponentTag tag) {
097: // For all tags attributes
098: final ValueMap attributes = tag.getAttributes();
099: final Iterator it = attributes.entrySet().iterator();
100: while (it.hasNext()) {
101: final Map.Entry entry = (Map.Entry) it.next();
102:
103: // Find attributes with namespace "xmlns"
104: final String attributeName = (String) entry.getKey();
105: if (attributeName.startsWith(XMLNS)) {
106: final String xmlnsUrl = (String) entry.getValue();
107:
108: // If Wicket relevant ...
109: if ((xmlnsUrl == null)
110: || (xmlnsUrl.trim().length() == 0)
111: || xmlnsUrl.startsWith(WICKET_URI)) {
112: // Set the Wicket namespace for wicket tags (e.g.
113: // <eicket:panel>) and attributes (e.g. wicket:id)
114: final String namespace = attributeName
115: .substring(XMLNS.length());
116: if (Application.get().getMarkupSettings()
117: .getStripWicketTags()) {
118: attributes.remove(attributeName);
119:
120: // Make sure the parser knows it has been changed
121: tag.setModified(true);
122: }
123:
124: return namespace;
125: }
126: }
127: }
128:
129: return null;
130: }
131: }
|