/* * Copyright 2006 Thierry Guerin * * 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.exolab.castor.xml.wls8; import java.lang.reflect.Method; /** * "Weblogic's refactored Xerces"-specific OutputFormat instance. Uses reflection to * get the class and methods to avoid having dependencies towards Weblogic when Castor * is not used in a Weblogic server. * * @author Thierry Guerin */ public class WeblogicXercesOutputFormat extends WeblogicXercesImplementation implements org.exolab.castor.xml.OutputFormat { private static Class outputFormatClass; private static Method setDoctype; private static Method setEncoding; private static Method setIndenting; private static Method setMethod; private static Method setOmitDocumentType; private static Method setOmitXMLDeclaration; private static Method setPreserveSpace; // the actual Weblogic implementation instance private Object outputFormat; static { // use reflection to get the methods // get the class String wlsOutputFormatClassFqcn = "weblogic.apache.xml.serialize.OutputFormat"; try { outputFormatClass = Class.forName(wlsOutputFormatClassFqcn); } catch (ClassNotFoundException e) { handleStaticInitException("Could find class " + wlsOutputFormatClassFqcn, e); } // get the methods // setDoctype Class[] parameterTwoStrings = {String.class, String.class}; setDoctype = getMethod(outputFormatClass, "setDoctype", parameterTwoStrings); // setEncoding Class[] parameterOneString = {String.class}; setEncoding = getMethod(outputFormatClass, "setEncoding", parameterOneString); // setIndenting Class[] parameterBoolean = {boolean.class}; setIndenting = getMethod(outputFormatClass, "setIndenting", parameterBoolean); // setMethod setMethod = getMethod(outputFormatClass, "setMethod", parameterOneString); // setOmitDocumentType setOmitDocumentType = getMethod(outputFormatClass, "setOmitDocumentType", parameterBoolean); // setOmitXMLDeclaration setOmitXMLDeclaration = getMethod(outputFormatClass, "setOmitXMLDeclaration", parameterBoolean); // setPreserveSpace setPreserveSpace = getMethod(outputFormatClass, "setPreserveSpace", parameterBoolean); } /** * Creates an instance of this class. */ public WeblogicXercesOutputFormat() { try { outputFormat = outputFormatClass.newInstance(); } catch (InstantiationException e) { throw new RuntimeException(e.toString()); // java 1.3, can't wrap using the 1.4 constructor } catch (IllegalAccessException e) { throw new RuntimeException(e.toString()); // java 1.3, can't wrap using the 1.4 constructor } } /** * @inheritDoc */ public void setMethod(String method) { Object[] params = {method}; invoke(setMethod, params); } /** * @inheritDoc */ public void setIndenting(boolean indent) { // wrap boolean primitive in a Boolean object because the invoke method does the following: // Individual parameters are automatically unwrapped to match primitive formal parameters. Boolean[] params = {Boolean.valueOf(indent)}; invoke(setIndenting, params); } /** * @inheritDoc */ public void setPreserveSpace(boolean preserveSpace) { Boolean[] params = {new Boolean(preserveSpace)}; invoke(setPreserveSpace, params); } /** * @inheritDoc */ public Object getFormat() { return outputFormat; } /** * @inheritDoc */ public void setDoctype (String type1, String type2) { Object[] params = {type1, type2}; invoke(setDoctype, params); } /** * @inheritDoc */ public void setOmitXMLDeclaration(boolean omitXMLDeclaration) { Boolean[] params = {Boolean.valueOf(omitXMLDeclaration)}; invoke(setOmitXMLDeclaration, params); } /** * @inheritDoc */ public void setOmitDocumentType(boolean omitDocumentType) { Boolean[] params = {Boolean.valueOf(omitDocumentType)}; invoke(setOmitDocumentType, params); } /** * @inheritDoc */ public void setEncoding(String encoding) { String[] params = {encoding}; invoke(setEncoding, params); } private Object invoke(Method method, Object[] params) { return invoke(outputFormat, method, params); } }