blob: 4cabc5567c8d81310f6163fa896b22b9ca0bb4e2 [file] [log] [blame]
/*
* Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// - rbarkhouse - 08 February 2012 - 2.3.3 - Initial implementation
package org.eclipse.persistence.internal.oxm.record;
import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Method;
import org.eclipse.persistence.exceptions.XMLMarshalException;
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
import org.eclipse.persistence.internal.oxm.CharacterEscapeHandler;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
/**
* INTERNAL:
* <p>
* This class provides an implementation of CharacterEscapeHandler that wraps
* a CharacterEscapeHandler from the Sun JAXB Implementation.
* </p>
*/
public class CharacterEscapeHandlerWrapper implements CharacterEscapeHandler {
private final static String ESCAPE_METHOD_NAME = "escape";
private final static Class<?>[] PARAMS = new Class<?>[] {
CoreClassConstants.APCHAR, CoreClassConstants.PINT, CoreClassConstants.PINT, CoreClassConstants.PBOOLEAN, Writer.class };
private final Object handler;
private final Method escapeMethod;
public CharacterEscapeHandlerWrapper(Object sunHandler) {
this.handler = sunHandler;
Class<?> handlerClass = sunHandler.getClass();
try {
this.escapeMethod = PrivilegedAccessHelper.getMethod(handlerClass, ESCAPE_METHOD_NAME, PARAMS, false);
} catch (Exception ex) {
throw XMLMarshalException.errorProcessingCharacterEscapeHandler(ESCAPE_METHOD_NAME, sunHandler, ex);
}
}
@Override
public void escape(char[] buffer, int start, int length, boolean isAttributeValue, Writer out) throws IOException {
try {
Object[] params = new Object[] { buffer, start, length, isAttributeValue, out };
PrivilegedAccessHelper.invokeMethod(this.escapeMethod, this.handler, params);
} catch (Exception ex) {
throw XMLMarshalException.errorInvokingCharacterEscapeHandler(ESCAPE_METHOD_NAME, this.handler, ex);
}
}
public Object getHandler() {
return this.handler;
}
}