com.sun.tools.xjc.reader.dtd.bindinfo.BIContent Maven / Gradle / Ivy
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.tools.xjc.reader.dtd.bindinfo;
import java.util.ArrayList;
import com.sun.codemodel.JClass;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.generator.bean.field.FieldRenderer;
import org.w3c.dom.Element;
/**
* Particles in the <content> declaration in the binding file.
*
*/
public class BIContent
{
/**
* Wraps a given particle.
*
*
* This object should be created through
* the {@link #create(Element, BIElement)} method.
*/
private BIContent( Element e, BIElement _parent ) {
this.element = e;
this.parent = _parent;
this.opts = parent.parent.model.options;
}
/** The particle element which this object is wrapping. */
protected final Element element;
/** The parent object.*/
protected final BIElement parent;
private final Options opts;
/**
* Gets the realization of this particle, if any.
*
* @return
* null if the "collection" attribute was not specified.
*/
public final FieldRenderer getRealization() {
String v = DOMUtil.getAttribute(element,"collection");
if(v==null) return null;
v = v.trim();
if(v.equals("array")) return opts.getFieldRendererFactory().getArray();
if(v.equals("list"))
return opts.getFieldRendererFactory().getList(
parent.parent.codeModel.ref(ArrayList.class));
// the correctness of the attribute value must be
// checked by the validator.
throw new InternalError("unexpected collection value: "+v);
}
/**
* Gets the property name of this particle.
*
* @return
* always a non-null, valid string.
*/
public final String getPropertyName() {
String r = DOMUtil.getAttribute(element,"property");
// in case of , @property is optional and
// defaults to @name.
// in all other cases, @property is mandatory.
if(r!=null) return r;
return DOMUtil.getAttribute(element,"name");
}
/**
* Gets the type of this property, if any.
*
* <element-ref> particle doesn't have the type.
*
* @return
* null if none is specified.
*/
public final JClass getType() {
try {
String type = DOMUtil.getAttribute(element,"supertype");
if(type==null) return null;
// TODO: does this attribute defaults to the current package?
int idx = type.lastIndexOf('.');
if(idx<0) return parent.parent.codeModel.ref(type);
else return parent.parent.getTargetPackage().ref(type);
} catch( ClassNotFoundException e ) {
// TODO: better error handling
throw new NoClassDefFoundError(e.getMessage());
}
}
/**
* Creates an appropriate subclass of BIContent
* by sniffing the tag name.
*
* This method should be only called by the BIElement class.
*/
static BIContent create( Element e, BIElement _parent ) {
return new BIContent(e,_parent);
}
}