org.apache.xmlbeans.impl.config.PrePostExtensionImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of commons-xmlbeans Show documentation
Show all versions of commons-xmlbeans Show documentation
The Apache Commons Codec package contains simple encoder and decoders for
various formats such as Base64 and Hexadecimal. In addition to these
widely used encoders and decoders, the codec package also maintains a
collection of phonetic encoding utilities.
The newest version!
/* 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 org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.PrePostExtension;
import org.apache.xmlbeans.impl.jam.JamClassLoader;
import org.apache.xmlbeans.impl.jam.JClass;
import org.apache.xmlbeans.impl.jam.JMethod;
import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
public class PrePostExtensionImpl implements PrePostExtension
{
private static JClass[] PARAMTYPES_PREPOST = null; //new JClass[]{int.class, XmlObject.class, QName.class, boolean.class, int.class};
private static final String[] PARAMTYPES_STRING = new String[] {"int", "org.apache.xmlbeans.XmlObject",
"javax.xml.namespace.QName", "boolean", "int"};
private static final String SIGNATURE;
static
{
String sig = "(";
for (int i = 0; i < PARAMTYPES_STRING.length; i++)
{
String t = PARAMTYPES_STRING[i];
if (i!=0)
sig += ", ";
sig += t;
}
SIGNATURE = sig + ")";
}
private NameSet _xbeanSet;
private JClass _delegateToClass;
private String _delegateToClassName;
private JMethod _preSet;
private JMethod _postSet;
static PrePostExtensionImpl newInstance(JamClassLoader jamLoader, 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(jamLoader, 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(jamLoader, prePostXO))
return null;
return result;
}
private boolean lookAfterPreAndPost(JamClassLoader jamLoader, XmlObject loc)
{
assert _delegateToClass!=null : "Delegate to class handler expected.";
boolean valid = true;
initParamPrePost(jamLoader);
_preSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "preSet", PARAMTYPES_PREPOST);
if (_preSet==null)
{} // not available is ok, _preSet will be null
if (_preSet!=null && !_preSet.getReturnType().equals(jamLoader.loadClass("boolean")))
{
// just emit an warning and don't remember as a preSet
BindingConfigImpl.warning("Method '" + _delegateToClass.getSimpleName() +
".preSet" + SIGNATURE + "' " +
"should return boolean to be considered for a preSet handler.", loc);
_preSet = null;
}
_postSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "postSet", PARAMTYPES_PREPOST);
if (_postSet==null)
{} // not available is ok, _postSet will be null
if (_preSet==null && _postSet==null)
{
BindingConfigImpl.error("prePostSet handler specified '" + _delegateToClass.getSimpleName() +
"' but no preSet" + SIGNATURE + " or " +
"postSet" + SIGNATURE + " methods found.", loc);
valid = false;
}
return valid;
}
private void initParamPrePost(JamClassLoader jamLoader)
{
if (PARAMTYPES_PREPOST==null)
{
PARAMTYPES_PREPOST = new JClass[PARAMTYPES_STRING.length];
for (int i = 0; i < PARAMTYPES_PREPOST.length; i++)
{
PARAMTYPES_PREPOST[i] = jamLoader.loadClass(PARAMTYPES_STRING[i]);
if (PARAMTYPES_PREPOST[i]==null)
{
throw new IllegalStateException("JAM should have access to the following types " + SIGNATURE);
}
}
}
}
// 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()
{
// used only in validation
if (_delegateToClass==null)
return null;
return InterfaceExtensionImpl.emitType(_delegateToClass);
}
boolean hasNameSetIntersection(PrePostExtensionImpl ext)
{
return !NameSet.EMPTY.equals(_xbeanSet.intersect(ext._xbeanSet));
}
}