blob: 4ecc890b534cffe07408ded5d47b512f085a1a87 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.xjc.javadoc;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDocComment;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JType;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.model.CPropertyInfo;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.tools.xjc.outline.FieldOutline;
import com.sun.xml.xsom.XSAttributeUse;
import com.sun.xml.xsom.XSComponent;
import com.sun.xml.xsom.XSParticle;
public class PropertyJavadoc {
private JCodeModel codeModel;
private Options options;
private ClassOutline classOutline;
private FieldOutline fieldOutline;
public PropertyJavadoc(JCodeModel codeModel, Options options, ClassOutline classOutline,
FieldOutline fieldOutline) {
this.codeModel = codeModel;
this.options = options;
this.classOutline = classOutline;
this.fieldOutline = fieldOutline;
}
public void addJavadocs() {
CPropertyInfo propertyInfo = fieldOutline.getPropertyInfo();
if (propertyInfo == null) {
return;
}
if (propertyInfo.javadoc.length() > 0) {
return; // JAXB binding customization overwrites xsd:documentation
}
XSComponent component = getDocumentedComponent(propertyInfo);
String documentation = XSComponentHelper.getDocumentation(component);
if (documentation == null || "".equals(documentation.trim())) {
return;
}
setJavadoc(documentation.trim());
}
private XSComponent getDocumentedComponent(CPropertyInfo propertyInfo) {
XSComponent schemaComponent = propertyInfo.getSchemaComponent();
if (schemaComponent instanceof XSParticle) {
return ((XSParticle)schemaComponent).getTerm();
} else if (schemaComponent instanceof XSAttributeUse) {
return ((XSAttributeUse)schemaComponent).getDecl();
} else {
return null;
}
}
private void setJavadoc(String documentation) {
setJavadocToField(documentation);
setJavadocToGetter(documentation);
setSeeTagToSetter();
}
private void setJavadocToField(String documentation) {
JFieldVar fieldVar = classOutline.implClass.fields().get(fieldOutline.getPropertyInfo()
.getName(false));
if (fieldVar == null) {
return;
}
fieldVar.javadoc().append(documentation);
}
private void setJavadocToGetter(String documentation) {
String getterMethod = getGetterMethod();
JMethod getter = MethodHelper.findMethod(classOutline, getterMethod);
JDocComment javadoc = getter.javadoc();
if (javadoc.size() != 0) {
documentation = "\n<p>\n" + documentation;
}
javadoc.add(javadoc.size(), documentation); // add comment as last
// non-tag element
}
private void setSeeTagToSetter() {
JMethod setterMethod = MethodHelper.findMethod(classOutline, "set"
+ fieldOutline.getPropertyInfo()
.getName(true));
if (setterMethod == null) {
return;
}
setterMethod.javadoc().addXdoclet("see #" + getGetterMethod() + "()");
}
private String getGetterMethod() {
JType type = fieldOutline.getRawType();
if (options.enableIntrospection) {
return ((type.isPrimitive() && type.boxify().getPrimitiveType() == codeModel.BOOLEAN)
? "is" : "get") + fieldOutline.getPropertyInfo().getName(true);
}
return (type.boxify().getPrimitiveType() == codeModel.BOOLEAN ? "is" : "get")
+ fieldOutline.getPropertyInfo().getName(true);
}
}