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