001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.visualweb.insync.faces;
042:
043: import java.beans.BeanInfo;
044:
045: import org.w3c.dom.Element;
046:
047: import com.sun.rave.designtime.DesignBean;
048:
049: /**
050: * Concrete bean that is persisted entirely in markup source and not Java.
051: */
052: public class HtmlBean extends MarkupBean {
053:
054: // XXX This is very suspicious and error prone, to use the strings to compare classes.
055: // public static final String PACKAGE = "org.netbeans.modules.visualweb.xhtml.";
056: public static final String PACKAGE = org.netbeans.modules.visualweb.xhtml.Html.class
057: .getPackage().getName()
058: + "."; // NOI18N
059: public static final int PACKAGE_LEN = PACKAGE.length();
060:
061: public static final String JSP_PAGE_CLASSBASE = PACKAGE + "Jsp_";
062: public static final int JSP_PAGE_CLASSBASE_LEN = JSP_PAGE_CLASSBASE
063: .length();
064:
065: public static final String JSF_CORE_CLASSBASE = PACKAGE + "F_";
066: public static final int JSF_CORE_CLASSBASE_LEN = JSF_CORE_CLASSBASE
067: .length();
068:
069: //--------------------------------------------------------------------------------- Construction
070:
071: /**
072: * Construct a bean bound to existing field & accessor methods, and page element
073: */
074: HtmlBean(FacesPageUnit unit, BeanInfo beanInfo, String tag,
075: Element element) {
076: super (unit, beanInfo, tag, element);
077: }
078:
079: /**
080: * Construct a new bean, creating the underlying field and accessor methods and using given page
081: * element
082: */
083: HtmlBean(FacesPageUnit unit, BeanInfo beanInfo, String tag,
084: MarkupBean parent, Element element) {
085: super (unit, beanInfo, tag, parent, element);
086: }
087:
088: /**
089: * Return true if the BeanInto describes one of our beans
090: */
091: public static final boolean isHtmlBean(BeanInfo bi) {
092: return bi.getBeanDescriptor().getBeanClass().getName()
093: .startsWith(PACKAGE);
094: }
095:
096: /**
097: * Return the classname for a bean described by a source element iff it is our bean
098: */
099: public static final String getBeanClassname(Element e) {
100: String ns = e.getNamespaceURI();
101: String tag = e.getLocalName();
102: String cname = classtailFromTag(tag);
103:
104: if (ns != null) {
105: if (ns.equals(FacesPageUnit.URI_JSP_PAGE))
106: return PACKAGE + "Jsp_" + cname; // JSP tag, use fake bean
107: if (ns.equals(FacesPageUnit.URI_JSF_CORE))
108: return PACKAGE + "F_" + cname; // Faces core, use fake bean
109: } else
110: return PACKAGE + cname; // HTML, use fake bean
111:
112: return null; // not an HTML or other fake bean
113: }
114:
115: /**
116: * @param tag
117: * @return
118: */
119: static String classtailFromTag(String tag) {
120: StringBuffer sb = new StringBuffer(tag);
121: int len = sb.length();
122: boolean first = true;
123: for (int i = 0; i < len; i++) {
124: char ch = sb.charAt(i);
125: if (ch == '.') {
126: sb.setCharAt(i, '_');
127: first = true;
128: } else if (first && Character.isJavaIdentifierStart(ch)) {
129: sb.setCharAt(i, Character.toUpperCase(ch));
130: first = false;
131: }
132: }
133: return sb.toString();
134: }
135:
136: /**
137: * @param cname
138: * @return
139: */
140: static String tagFromClasstail(String cname) {
141: StringBuffer sb = new StringBuffer(cname);
142: int len = sb.length();
143: boolean first = true;
144: for (int i = 0; i < len; i++) {
145: char ch = sb.charAt(i);
146: if (ch == '_') {
147: sb.setCharAt(i, '.');
148: first = true;
149: } else if (first && Character.isJavaIdentifierStart(ch)) {
150: sb.setCharAt(i, Character.toLowerCase(ch));
151: first = false;
152: }
153: }
154: return sb.toString();
155: }
156:
157: /**
158: * Return the taglib URI for a bean described by a BeanInfo iff it is our bean
159: */
160: public static final String getBeanTaglibUri(BeanInfo bi) {
161: String cname = bi.getBeanDescriptor().getBeanClass().getName();
162: if (cname.startsWith(JSP_PAGE_CLASSBASE))
163: return FacesPageUnit.URI_JSP_PAGE;
164: if (cname.startsWith(JSF_CORE_CLASSBASE))
165: return FacesPageUnit.URI_JSF_CORE;
166: return null; // html
167: }
168:
169: /**
170: * Return the taglib prefix for a bean described by a BeanInfo iff it is our bean
171: */
172: public static final String getBeanTaglibPrefix(BeanInfo bi) {
173: String cname = bi.getBeanDescriptor().getBeanClass().getName();
174: if (cname.startsWith(JSP_PAGE_CLASSBASE))
175: return "jsp";
176: if (cname.startsWith(JSF_CORE_CLASSBASE))
177: return "f";
178: return null; // html
179: }
180:
181: /**
182: * Return the tag for a bean described by a BeanInfo iff it is our bean
183: */
184: public static final String getBeanTagName(BeanInfo bi) {
185: String cname = bi.getBeanDescriptor().getBeanClass().getName();
186: if (cname.startsWith(JSP_PAGE_CLASSBASE))
187: return tagFromClasstail(cname
188: .substring(JSP_PAGE_CLASSBASE_LEN));
189: if (cname.startsWith(JSF_CORE_CLASSBASE))
190: return tagFromClasstail(cname
191: .substring(JSF_CORE_CLASSBASE_LEN));
192: return tagFromClasstail(cname.substring(PACKAGE_LEN));
193: }
194:
195: /*
196: * @see org.netbeans.modules.visualweb.insync.beans.Bean#canSetName()
197: */
198: public boolean canSetName() {
199: return false;
200: }
201:
202: /*
203: * @see org.netbeans.modules.visualweb.insync.beans.Bean#setName(java.lang.String, boolean, com.sun.rave.designtime.DesignBean)
204: */
205: public String setName(String name, boolean autoNumber,
206: DesignBean liveBean) {
207: return null;
208: }
209: }
|