1/* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.xml.internal.ws.policy.subject; 27 28import com.sun.xml.internal.ws.policy.privateutil.LocalizationMessages; 29import com.sun.xml.internal.ws.policy.privateutil.PolicyLogger; 30import javax.xml.namespace.QName; 31 32/** 33 * Provides objects for use as WSDL 1.0/1.1 policy subjects. 34 * 35 * An instance of this class may represent a wsdl:binding element or a wsdl:binding/operation 36 * element or a wsdl:binding/operation/message element. 37 * 38 * @author Fabian Ritzmann 39 */ 40public class WsdlBindingSubject { 41 42 /** 43 * For message subjects, this needs to be set to one of the values INPUT, OUTPUT 44 * or FAULT. Any other subject has the message type NO_MESSAGE. 45 */ 46 public enum WsdlMessageType { 47 NO_MESSAGE, 48 INPUT, 49 OUTPUT, 50 FAULT 51 } 52 53 /** 54 * Identifies the scope to which this subject belongs. See WS-PolicyAttachment 55 * for an explanation on WSDL scopes. 56 * 57 * The SERVICE scope is not actually used and only listed here for completeness 58 * sake. 59 */ 60 public enum WsdlNameScope { 61 SERVICE, 62 ENDPOINT, 63 OPERATION, 64 MESSAGE 65 } 66 67 private static final PolicyLogger LOGGER = PolicyLogger.getLogger(WsdlBindingSubject.class); 68 69 private final QName name; 70 private final WsdlMessageType messageType; 71 private final WsdlNameScope nameScope; 72 private final WsdlBindingSubject parent; 73 74 WsdlBindingSubject(final QName name, final WsdlNameScope scope, final WsdlBindingSubject parent) { 75 this(name, WsdlMessageType.NO_MESSAGE, scope, parent); 76 } 77 78 WsdlBindingSubject(final QName name, final WsdlMessageType messageType, final WsdlNameScope scope, final WsdlBindingSubject parent) { 79 this.name = name; 80 this.messageType = messageType; 81 this.nameScope = scope; 82 this.parent = parent; 83 } 84 85 public static WsdlBindingSubject createBindingSubject(QName bindingName) { 86 return new WsdlBindingSubject(bindingName, WsdlNameScope.ENDPOINT, null); 87 } 88 89 public static WsdlBindingSubject createBindingOperationSubject(QName bindingName, QName operationName) { 90 final WsdlBindingSubject bindingSubject = createBindingSubject(bindingName); 91 return new WsdlBindingSubject(operationName, WsdlNameScope.OPERATION, bindingSubject); 92 } 93 94 public static WsdlBindingSubject createBindingMessageSubject(QName bindingName, QName operationName, QName messageName, WsdlMessageType messageType) { 95 if (messageType == null) { 96 throw LOGGER.logSevereException(new IllegalArgumentException(LocalizationMessages.WSP_0083_MESSAGE_TYPE_NULL())); 97 } 98 if (messageType == WsdlMessageType.NO_MESSAGE) { 99 throw LOGGER.logSevereException(new IllegalArgumentException(LocalizationMessages.WSP_0084_MESSAGE_TYPE_NO_MESSAGE())); 100 } 101 if ((messageType == WsdlMessageType.FAULT) && (messageName == null)) { 102 throw LOGGER.logSevereException(new IllegalArgumentException(LocalizationMessages.WSP_0085_MESSAGE_FAULT_NO_NAME())); 103 } 104 final WsdlBindingSubject operationSubject = createBindingOperationSubject(bindingName, operationName); 105 return new WsdlBindingSubject(messageName, messageType, WsdlNameScope.MESSAGE, operationSubject); 106 } 107 108 public QName getName() { 109 return this.name; 110 } 111 112 public WsdlMessageType getMessageType() { 113 return this.messageType; 114 } 115 116 public WsdlBindingSubject getParent() { 117 return this.parent; 118 } 119 120 public boolean isBindingSubject() { 121 if (this.nameScope == WsdlNameScope.ENDPOINT) { 122 return this.parent == null; 123 } 124 else { 125 return false; 126 } 127 } 128 129 public boolean isBindingOperationSubject() { 130 if (this.nameScope == WsdlNameScope.OPERATION) { 131 if (this.parent != null) { 132 return this.parent.isBindingSubject(); 133 } 134 } 135 return false; 136 } 137 138 public boolean isBindingMessageSubject() { 139 if (this.nameScope == WsdlNameScope.MESSAGE) { 140 if (this.parent != null) { 141 return this.parent.isBindingOperationSubject(); 142 } 143 } 144 return false; 145 } 146 147 @Override 148 public boolean equals(final Object that) { 149 if (this == that) { 150 return true; 151 } 152 153 if (that == null || !(that instanceof WsdlBindingSubject)) { 154 return false; 155 } 156 157 final WsdlBindingSubject thatSubject = (WsdlBindingSubject) that; 158 boolean isEqual = true; 159 160 isEqual = isEqual && ((this.name == null) ? thatSubject.name == null : this.name.equals(thatSubject.name)); 161 isEqual = isEqual && this.messageType.equals(thatSubject.messageType); 162 isEqual = isEqual && this.nameScope.equals(thatSubject.nameScope); 163 isEqual = isEqual && ((this.parent == null) ? thatSubject.parent == null : this.parent.equals(thatSubject.parent)); 164 165 return isEqual; 166 } 167 168 @Override 169 public int hashCode() { 170 int result = 23; 171 172 result = 31 * result + ((this.name == null) ? 0 : this.name.hashCode()); 173 result = 31 * result + this.messageType.hashCode(); 174 result = 31 * result + this.nameScope.hashCode(); 175 result = 31 * result + ((this.parent == null) ? 0 : this.parent.hashCode()); 176 177 return result; 178 } 179 180 @Override 181 public String toString() { 182 final StringBuilder result = new StringBuilder("WsdlBindingSubject["); 183 result.append(this.name).append(", ").append(this.messageType); 184 result.append(", ").append(this.nameScope).append(", ").append(this.parent); 185 return result.append("]").toString(); 186 } 187 188} 189