001 /** 002 * 003 * Copyright 2004 Protique Ltd 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.codehaus.activesoap.policy.addressing; 019 020 import org.codehaus.activesoap.MessageExchange; 021 import org.codehaus.activesoap.handler.stax.AnyElementMarshaler; 022 import org.codehaus.activesoap.handler.stax.ElementContent; 023 import org.codehaus.activesoap.handler.stax.StaxHelper; 024 025 import javax.xml.namespace.QName; 026 import javax.xml.stream.XMLStreamException; 027 import javax.xml.stream.XMLStreamWriter; 028 import java.util.HashMap; 029 import java.util.Map; 030 031 /** 032 * The current WS-Address context for the current invocation context. 033 * 034 * @version $Revision: 1.5 $ 035 */ 036 public class AddressingContext implements ElementContent { 037 public final static QName FaultTo_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "FaultTo", "wsa"); 038 public final static QName Action_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "Action", "wsa"); 039 public final static QName From_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "From", "wsa"); 040 public final static QName Recipient_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "Recipient", "wsa"); 041 public final static QName To_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "To", "wsa"); 042 public final static QName ReplyTo_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "ReplyTo", "wsa"); 043 public final static QName MessageID_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "MessageID", "wsa"); 044 public final static QName RelatesTo_QNAME = new QName("http://schemas.xmlsoap.org/ws/2003/03/addressing", "RelatesTo", "wsa"); 045 046 private static final String CONTEXT_KEY = AddressingContext.class.getName(); 047 private static final ThreadLocal threadLocal = new ThreadLocal(); 048 049 private AttributedURI messageID; 050 private Relationship relatesTo; 051 private AttributedURI to; 052 private AttributedURI action; 053 private EndpointReferenceType from; 054 private EndpointReferenceType replyTo; 055 private EndpointReferenceType faultTo; 056 private EndpointReferenceType recipient; 057 private Map properties = new HashMap(); 058 059 /** 060 * Returns the current WS-Addressing context of the current thread. 061 * 062 * @return the current addressing context or null if the current thread has not yet registered a thread local addressing context. 063 */ 064 public static AddressingContext getContext() { 065 return (AddressingContext) threadLocal.get(); 066 } 067 068 /** 069 * Returns the current WS-Addressing context of this message exchange, 070 * lazily creating one if none is created yet 071 */ 072 public static AddressingContext getContext(MessageExchange exchange) { 073 AddressingContext context = (AddressingContext) exchange.getProperty(CONTEXT_KEY); 074 if (context == null) { 075 context = new AddressingContext(); 076 setContext(exchange, context); 077 } 078 return context; 079 } 080 081 public static void setContext(MessageExchange exchange, AddressingContext context) { 082 exchange.setProperty(CONTEXT_KEY, context); 083 threadLocal.set(exchange); 084 } 085 086 public AttributedURI getMessageID() { 087 return messageID; 088 } 089 090 public void setMessageID(AttributedURI messageID) { 091 this.messageID = messageID; 092 } 093 094 public Relationship getRelatesTo() { 095 return relatesTo; 096 } 097 098 public void setRelatesTo(Relationship relatesTo) { 099 this.relatesTo = relatesTo; 100 } 101 102 public AttributedURI getTo() { 103 return to; 104 } 105 106 public void setTo(AttributedURI to) { 107 this.to = to; 108 } 109 110 public AttributedURI getAction() { 111 return action; 112 } 113 114 public void setAction(AttributedURI action) { 115 this.action = action; 116 } 117 118 public EndpointReferenceType getFrom() { 119 return from; 120 } 121 122 public void setFrom(EndpointReferenceType from) { 123 this.from = from; 124 } 125 126 public EndpointReferenceType getReplyTo() { 127 return replyTo; 128 } 129 130 public void setReplyTo(EndpointReferenceType replyTo) { 131 this.replyTo = replyTo; 132 } 133 134 public EndpointReferenceType getFaultTo() { 135 return faultTo; 136 } 137 138 public void setFaultTo(EndpointReferenceType faultTo) { 139 this.faultTo = faultTo; 140 } 141 142 public EndpointReferenceType getRecipient() { 143 return recipient; 144 } 145 146 public void setRecipient(EndpointReferenceType recipient) { 147 this.recipient = recipient; 148 } 149 150 public void addProperty(QName name, Object value) { 151 properties.put(name, value); 152 } 153 154 public Map getProperties() { 155 return properties; 156 } 157 158 public void setProperties(Map properties) { 159 this.properties = properties; 160 } 161 162 public void writeContent(AnyElementMarshaler marshaler, XMLStreamWriter out) throws XMLStreamException { 163 StaxHelper.writeElement(MessageID_QNAME, messageID, marshaler, out); 164 StaxHelper.writeElement(RelatesTo_QNAME, relatesTo, marshaler, out); 165 StaxHelper.writeElement(To_QNAME, to, marshaler, out); 166 StaxHelper.writeElement(Action_QNAME, action, marshaler, out); 167 StaxHelper.writeElement(From_QNAME, from, marshaler, out); 168 StaxHelper.writeElement(ReplyTo_QNAME, replyTo, marshaler, out); 169 StaxHelper.writeElement(FaultTo_QNAME, faultTo, marshaler, out); 170 StaxHelper.writeElement(Recipient_QNAME, recipient, marshaler, out); 171 } 172 }