blob: bbf7415ef6e9335bda72b0eff0dab0a8d84d42bf [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 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));
}
}