// ========================================================================
// Copyright (C) zeroth Project Team. All rights reserved.
// GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
// http://www.gnu.org/licenses/agpl-3.0.txt
// ========================================================================
package zeroth.framework.standard.app;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import net.sf.json.JSONObject;
import zeroth.framework.standard.shared.StandardRuntimeException;
/**
* ゲートウェイサービスのユーティリティ
* @author nilcy
*/
public final class GatewayUtil {
/** ロガー */
private static final Logger LOG = Logger.getGlobal();
/** 非公開コンストラクタ */
private GatewayUtil() {
}
/**
* ボディオブジェクトのJSONエンコード
* @param <T> ボディオブジェクト型
* @param body ボディオブジェクト
* @return JSONエンコードしたボディオブジェクト
*/
public static <T> String encode(final T body) {
return JSONObject.fromObject(body).toString();
}
/**
* ボディオブジェクトのJSONデコード
* @param <T> ボディオブジェクト型
* @param body ボディオブジェクト
* @param beanClass JSONデコード変換先クラス
* @return JSONデコード変換オブジェクト
*/
public static <T> T decode(final String body, final Class<T> beanClass) {
final JSONObject jsonObject = JSONObject.fromObject(body);
return (T) JSONObject.toBean(jsonObject, beanClass);
}
/**
* XMLマーシャル
* @param model ゲートウェイオブジェクト
* @return XMLマーシャルした文字列
*/
public static String marshal(final GatewayModel model) {
try {
final JAXBContext context = JAXBContext.newInstance(GatewayModel.class);
final JAXBElement<GatewayModel> element = new JAXBElement<>(new QName("submit"),
GatewayModel.class, model);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// marshaller.marshal(element, System.out);
final StringWriter writer = new StringWriter();
marshaller.marshal(element, writer);
return writer.toString();
} catch (final JAXBException e) {
throw new StandardRuntimeException(e);
}
}
/**
* サービスプロキシの取得
* @param <T> エンドポイントI/F型
* @param wsdlLocation WSDLロケーション
* @param namespaceURI ネームスペースURI
* @param localPart ローカルパート
* @param iface エンドポイントI/F
* @return サービスプロキシ
*/
public static <T> T getProxy(final String wsdlLocation, final String namespaceURI,
final String localPart, final Class<T> iface) {
try {
final URL wsdlURL = new URL(wsdlLocation);
final QName serviceName = new QName(namespaceURI, localPart);
final Service service = Service.create(wsdlURL, serviceName);
return service.getPort(iface);
} catch (final MalformedURLException e) {
throw new StandardRuntimeException(e);
}
}
/**
* サービスプロキシの取得
* @param <T> エンドポイントI/F型
* @param iface エンドポイントI/F
* @return サービスプロキシ
*/
public static <T> T getProxy(final Class<T> iface) {
try {
final String baseName = iface.getPackage().getName() + ".soap";
final ResourceBundle bundle = ResourceBundle.getBundle(baseName);
final String wsdlLocation = bundle.getString("WsdlLocation");
final String namespaceURI = bundle.getString("NamespaceURI");
final String localPart = bundle.getString("LocalPart");
LOG.info(MessageFormat.format("wsdlLocation={0}, namespaceURI={1}, localPart={2}",
wsdlLocation, namespaceURI, localPart));
return getProxy(wsdlLocation, namespaceURI, localPart, iface);
} catch (final MissingResourceException e) {
throw new StandardRuntimeException(e);
}
}
}