blob: e5980521166d826875aef11c2f90287839e6d9d1 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed 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.xmlbeans.impl.config;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.type.PrimitiveType;
import org.apache.xmlbeans.PrePostExtension;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
public class PrePostExtensionImpl implements PrePostExtension {
private static final String[] PARAMTYPES_STRING = {
"int", "org.apache.xmlbeans.XmlObject", "javax.xml.namespace.QName", "boolean", "int"
};
private static final String SIGNATURE = "(" + String.join(", ", PARAMTYPES_STRING) + ")";
private NameSet _xbeanSet;
private ClassOrInterfaceDeclaration _delegateToClass;
private String _delegateToClassName;
private MethodDeclaration _preSet;
private MethodDeclaration _postSet;
static PrePostExtensionImpl newInstance(Parser loader, NameSet xbeanSet, Extensionconfig.PrePostSet prePostXO)
{
if (prePostXO==null)
return null;
PrePostExtensionImpl result = new PrePostExtensionImpl();
result._xbeanSet = xbeanSet;
result._delegateToClassName = prePostXO.getStaticHandler();
result._delegateToClass = InterfaceExtensionImpl.validateClass(loader, result._delegateToClassName, prePostXO);
if ( result._delegateToClass==null ) // no HandlerClass
{
BindingConfigImpl.warning("Handler class '" + prePostXO.getStaticHandler() + "' not found on classpath, skip validation.", prePostXO);
return result;
}
if (!result.lookAfterPreAndPost(loader, prePostXO))
return null;
return result;
}
private boolean lookAfterPreAndPost(Parser loader, XmlObject loc) {
assert (_delegateToClass!=null) : "Delegate to class handler expected.";
boolean valid = true;
_preSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "preSet", PARAMTYPES_STRING);
// _preSet==null is ok
if (_preSet!=null && !_preSet.getType().equals(PrimitiveType.booleanType())) {
// just emit an warning and don't remember as a preSet
BindingConfigImpl.warning("Method '" + _delegateToClass.getNameAsString() +
".preSet" + SIGNATURE + "' " +
"should return boolean to be considered for a preSet handler.", loc);
_preSet = null;
}
_postSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "postSet", PARAMTYPES_STRING);
// _postSet==null is ok
if (_preSet==null && _postSet==null)
{
BindingConfigImpl.error("prePostSet handler specified '" + _delegateToClass.getNameAsString() +
"' but no preSet" + SIGNATURE + " or postSet" + SIGNATURE + " methods found.", loc);
valid = false;
}
return valid;
}
// public methods
public NameSet getNameSet()
{
return _xbeanSet;
}
public boolean contains(String fullJavaName)
{
return _xbeanSet.contains(fullJavaName);
}
public boolean hasPreCall()
{
return _preSet!=null;
}
public boolean hasPostCall()
{
return _postSet!=null;
}
public String getStaticHandler()
{
return _delegateToClassName;
}
/**
* Returns the name of the handler in a form that can be put in a java source.
*/
public String getHandlerNameForJavaSource() {
return (_delegateToClass == null) ? null : _delegateToClass.getNameAsString();
}
boolean hasNameSetIntersection(PrePostExtensionImpl ext)
{
return !NameSet.EMPTY.equals(_xbeanSet.intersect(ext._xbeanSet));
}
}