001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.oozie.client.event.jms; 019 020 import java.io.IOException; 021 import java.io.InputStream; 022 import java.util.Properties; 023 024 import javax.jms.JMSException; 025 import javax.jms.Message; 026 import javax.jms.TextMessage; 027 028 import org.apache.oozie.client.event.message.EventMessage; 029 030 /** 031 * Client utility to convert JMS message to EventMessage object 032 */ 033 public class JMSMessagingUtils { 034 private static final String DESERIALIZER_PROP = "oozie.msg.deserializer."; 035 private static MessageDeserializer deserializer; 036 private static Properties jmsDeserializerInfo; 037 private static final String CLIENT_PROPERTIES = "oozie_client.properties"; 038 039 static { 040 InputStream is = JMSMessagingUtils.class.getClassLoader().getResourceAsStream(CLIENT_PROPERTIES); 041 if (is == null) { 042 System.out.println("Using default JSON Deserializer"); 043 deserializer = new JSONMessageDeserializer(); 044 } 045 else { 046 jmsDeserializerInfo = new Properties(); 047 try { 048 jmsDeserializerInfo.load(is); 049 is.close(); 050 } 051 catch (IOException ioe) { 052 throw new RuntimeException("I/O error occured for " + CLIENT_PROPERTIES, ioe); 053 } 054 } 055 056 } 057 058 /** 059 * Constructs the EventMessage object from JMS message 060 * 061 * @param <T> 062 * @param msg the JMS message 063 * @return the EventMessage 064 * @throws IOException 065 * @throws JMSException 066 */ 067 public static <T extends EventMessage> T getEventMessage(Message msg) throws IOException, JMSException { 068 if (msg == null) { 069 throw new IllegalArgumentException("Could not extract EventMessage as JMS message is null"); 070 } 071 if (deserializer == null) { 072 String msgFormat = msg.getStringProperty(JMSHeaderConstants.MESSAGE_FORMAT); 073 deserializer = getDeserializer(msgFormat); 074 } 075 return deserializer.getEventMessage(msg); 076 } 077 078 private static MessageDeserializer getDeserializer(String msgFormat) throws IOException { 079 String deserializerString = (String) jmsDeserializerInfo.get(DESERIALIZER_PROP + msgFormat); 080 if (deserializerString == null) { 081 return new JSONMessageDeserializer(); 082 } 083 else { 084 try { 085 MessageDeserializer msgDeserializer = (MessageDeserializer) Class.forName(deserializerString) 086 .newInstance(); 087 return msgDeserializer; 088 } 089 catch (Exception cnfe) { 090 throw new IllegalArgumentException("Could not access class " + deserializerString, cnfe); 091 } 092 093 } 094 } 095 }