src/share/jaxws_classes/com/sun/xml/internal/ws/assembler/MetroTubelineAssembler.java

Thu, 12 Oct 2017 19:44:07 +0800

author
aoqi
date
Thu, 12 Oct 2017 19:44:07 +0800
changeset 760
e530533619ec
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.xml.internal.ws.assembler;
aoqi@0 27
aoqi@0 28 import com.sun.istack.internal.NotNull;
aoqi@0 29 import com.sun.istack.internal.logging.Logger;
aoqi@0 30 import com.sun.xml.internal.ws.api.BindingID;
aoqi@0 31 import com.sun.xml.internal.ws.api.pipe.ClientTubeAssemblerContext;
aoqi@0 32 import com.sun.xml.internal.ws.api.pipe.ServerTubeAssemblerContext;
aoqi@0 33 import com.sun.xml.internal.ws.api.pipe.Tube;
aoqi@0 34 import com.sun.xml.internal.ws.api.pipe.TubelineAssembler;
aoqi@0 35 import com.sun.xml.internal.ws.assembler.dev.TubelineAssemblyDecorator;
aoqi@0 36 import com.sun.xml.internal.ws.dump.LoggingDumpTube;
aoqi@0 37 import com.sun.xml.internal.ws.resources.TubelineassemblyMessages;
aoqi@0 38 import com.sun.xml.internal.ws.util.ServiceFinder;
aoqi@0 39
aoqi@0 40 import java.util.Collection;
aoqi@0 41 import java.util.logging.Level;
aoqi@0 42
aoqi@0 43 /**
aoqi@0 44 * TODO: Write some description here ...
aoqi@0 45 *
aoqi@0 46 * @author Miroslav Kos (miroslav.kos at oracle.com)
aoqi@0 47 */
aoqi@0 48 public class MetroTubelineAssembler implements TubelineAssembler {
aoqi@0 49
aoqi@0 50 private static final String COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE = "com.sun.metro.soap.dump";
aoqi@0 51 public static final MetroConfigNameImpl JAXWS_TUBES_CONFIG_NAMES = new MetroConfigNameImpl("jaxws-tubes-default.xml", "jaxws-tubes.xml");
aoqi@0 52
aoqi@0 53 private static enum Side {
aoqi@0 54
aoqi@0 55 Client("client"),
aoqi@0 56 Endpoint("endpoint");
aoqi@0 57 private final String name;
aoqi@0 58
aoqi@0 59 private Side(String name) {
aoqi@0 60 this.name = name;
aoqi@0 61 }
aoqi@0 62
aoqi@0 63 @Override
aoqi@0 64 public String toString() {
aoqi@0 65 return name;
aoqi@0 66 }
aoqi@0 67 }
aoqi@0 68
aoqi@0 69 private static class MessageDumpingInfo {
aoqi@0 70
aoqi@0 71 final boolean dumpBefore;
aoqi@0 72 final boolean dumpAfter;
aoqi@0 73 final Level logLevel;
aoqi@0 74
aoqi@0 75 MessageDumpingInfo(boolean dumpBefore, boolean dumpAfter, Level logLevel) {
aoqi@0 76 this.dumpBefore = dumpBefore;
aoqi@0 77 this.dumpAfter = dumpAfter;
aoqi@0 78 this.logLevel = logLevel;
aoqi@0 79 }
aoqi@0 80 }
aoqi@0 81
aoqi@0 82 private static final Logger LOGGER = Logger.getLogger(MetroTubelineAssembler.class);
aoqi@0 83 private final BindingID bindingId;
aoqi@0 84 private final TubelineAssemblyController tubelineAssemblyController;
aoqi@0 85
aoqi@0 86 public MetroTubelineAssembler(final BindingID bindingId, MetroConfigName metroConfigName) {
aoqi@0 87 this.bindingId = bindingId;
aoqi@0 88 this.tubelineAssemblyController = new TubelineAssemblyController(metroConfigName);
aoqi@0 89 }
aoqi@0 90
aoqi@0 91 TubelineAssemblyController getTubelineAssemblyController() {
aoqi@0 92 return tubelineAssemblyController;
aoqi@0 93 }
aoqi@0 94
aoqi@0 95 @NotNull
aoqi@0 96 public Tube createClient(@NotNull ClientTubeAssemblerContext jaxwsContext) {
aoqi@0 97 if (LOGGER.isLoggable(Level.FINER)) {
aoqi@0 98 LOGGER.finer("Assembling client-side tubeline for WS endpoint: " + jaxwsContext.getAddress().getURI().toString());
aoqi@0 99 }
aoqi@0 100
aoqi@0 101 DefaultClientTubelineAssemblyContext context = createClientContext(jaxwsContext);
aoqi@0 102
aoqi@0 103 Collection<TubeCreator> tubeCreators = tubelineAssemblyController.getTubeCreators(context);
aoqi@0 104
aoqi@0 105 for (TubeCreator tubeCreator : tubeCreators) {
aoqi@0 106 tubeCreator.updateContext(context);
aoqi@0 107 }
aoqi@0 108
aoqi@0 109 TubelineAssemblyDecorator decorator = TubelineAssemblyDecorator.composite(
aoqi@0 110 ServiceFinder.find(TubelineAssemblyDecorator.class, context.getContainer()));
aoqi@0 111
aoqi@0 112 boolean first = true;
aoqi@0 113 for (TubeCreator tubeCreator : tubeCreators) {
aoqi@0 114 final MessageDumpingInfo msgDumpInfo = setupMessageDumping(tubeCreator.getMessageDumpPropertyBase(), Side.Client);
aoqi@0 115
aoqi@0 116 final Tube oldTubelineHead = context.getTubelineHead();
aoqi@0 117 LoggingDumpTube afterDumpTube = null;
aoqi@0 118 if (msgDumpInfo.dumpAfter) {
aoqi@0 119 afterDumpTube = new LoggingDumpTube(msgDumpInfo.logLevel, LoggingDumpTube.Position.After, context.getTubelineHead());
aoqi@0 120 context.setTubelineHead(afterDumpTube);
aoqi@0 121 }
aoqi@0 122
aoqi@0 123 if (!context.setTubelineHead(decorator.decorateClient(tubeCreator.createTube(context), context))) { // no new tube has been created
aoqi@0 124 if (afterDumpTube != null) {
aoqi@0 125 context.setTubelineHead(oldTubelineHead); // removing possible "after" message dumping tube
aoqi@0 126 }
aoqi@0 127 } else {
aoqi@0 128 final String loggedTubeName = context.getTubelineHead().getClass().getName();
aoqi@0 129 if (afterDumpTube != null) {
aoqi@0 130 afterDumpTube.setLoggedTubeName(loggedTubeName);
aoqi@0 131 }
aoqi@0 132
aoqi@0 133 if (msgDumpInfo.dumpBefore) {
aoqi@0 134 final LoggingDumpTube beforeDumpTube = new LoggingDumpTube(msgDumpInfo.logLevel, LoggingDumpTube.Position.Before, context.getTubelineHead());
aoqi@0 135 beforeDumpTube.setLoggedTubeName(loggedTubeName);
aoqi@0 136 context.setTubelineHead(beforeDumpTube);
aoqi@0 137 }
aoqi@0 138 }
aoqi@0 139
aoqi@0 140 if (first) {
aoqi@0 141 context.setTubelineHead(decorator.decorateClientTail(context.getTubelineHead(), context));
aoqi@0 142 first = false;
aoqi@0 143 }
aoqi@0 144 }
aoqi@0 145
aoqi@0 146 return decorator.decorateClientHead(context.getTubelineHead(), context);
aoqi@0 147 }
aoqi@0 148
aoqi@0 149 @NotNull
aoqi@0 150 public Tube createServer(@NotNull ServerTubeAssemblerContext jaxwsContext) {
aoqi@0 151 if (LOGGER.isLoggable(Level.FINER)) {
aoqi@0 152 LOGGER.finer("Assembling endpoint tubeline for WS endpoint: " + jaxwsContext.getEndpoint().getServiceName() + "::" + jaxwsContext.getEndpoint().getPortName());
aoqi@0 153 }
aoqi@0 154
aoqi@0 155 DefaultServerTubelineAssemblyContext context = createServerContext(jaxwsContext);
aoqi@0 156
aoqi@0 157 // FIXME endpoint URI for provider case
aoqi@0 158 Collection<TubeCreator> tubeCreators = tubelineAssemblyController.getTubeCreators(context);
aoqi@0 159 for (TubeCreator tubeCreator : tubeCreators) {
aoqi@0 160 tubeCreator.updateContext(context);
aoqi@0 161 }
aoqi@0 162
aoqi@0 163 TubelineAssemblyDecorator decorator = TubelineAssemblyDecorator.composite(
aoqi@0 164 ServiceFinder.find(TubelineAssemblyDecorator.class, context.getEndpoint().getContainer()));
aoqi@0 165
aoqi@0 166 boolean first = true;
aoqi@0 167 for (TubeCreator tubeCreator : tubeCreators) {
aoqi@0 168 final MessageDumpingInfo msgDumpInfo = setupMessageDumping(tubeCreator.getMessageDumpPropertyBase(), Side.Endpoint);
aoqi@0 169
aoqi@0 170 final Tube oldTubelineHead = context.getTubelineHead();
aoqi@0 171 LoggingDumpTube afterDumpTube = null;
aoqi@0 172 if (msgDumpInfo.dumpAfter) {
aoqi@0 173 afterDumpTube = new LoggingDumpTube(msgDumpInfo.logLevel, LoggingDumpTube.Position.After, context.getTubelineHead());
aoqi@0 174 context.setTubelineHead(afterDumpTube);
aoqi@0 175 }
aoqi@0 176
aoqi@0 177 if (!context.setTubelineHead(decorator.decorateServer(tubeCreator.createTube(context), context))) { // no new tube has been created
aoqi@0 178 if (afterDumpTube != null) {
aoqi@0 179 context.setTubelineHead(oldTubelineHead); // removing possible "after" message dumping tube
aoqi@0 180 }
aoqi@0 181 } else {
aoqi@0 182 final String loggedTubeName = context.getTubelineHead().getClass().getName();
aoqi@0 183 if (afterDumpTube != null) {
aoqi@0 184 afterDumpTube.setLoggedTubeName(loggedTubeName);
aoqi@0 185 }
aoqi@0 186
aoqi@0 187 if (msgDumpInfo.dumpBefore) {
aoqi@0 188 final LoggingDumpTube beforeDumpTube = new LoggingDumpTube(msgDumpInfo.logLevel, LoggingDumpTube.Position.Before, context.getTubelineHead());
aoqi@0 189 beforeDumpTube.setLoggedTubeName(loggedTubeName);
aoqi@0 190 context.setTubelineHead(beforeDumpTube);
aoqi@0 191 }
aoqi@0 192 }
aoqi@0 193
aoqi@0 194 if (first) {
aoqi@0 195 context.setTubelineHead(decorator.decorateServerTail(context.getTubelineHead(), context));
aoqi@0 196 first = false;
aoqi@0 197 }
aoqi@0 198 }
aoqi@0 199
aoqi@0 200 return decorator.decorateServerHead(context.getTubelineHead(), context);
aoqi@0 201 }
aoqi@0 202
aoqi@0 203 private MessageDumpingInfo setupMessageDumping(String msgDumpSystemPropertyBase, Side side) {
aoqi@0 204 boolean dumpBefore = false;
aoqi@0 205 boolean dumpAfter = false;
aoqi@0 206 Level logLevel = Level.INFO;
aoqi@0 207
aoqi@0 208 // checking common properties
aoqi@0 209 Boolean value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE);
aoqi@0 210 if (value != null) {
aoqi@0 211 dumpBefore = value.booleanValue();
aoqi@0 212 dumpAfter = value.booleanValue();
aoqi@0 213 }
aoqi@0 214
aoqi@0 215 value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + ".before");
aoqi@0 216 dumpBefore = (value != null) ? value.booleanValue() : dumpBefore;
aoqi@0 217
aoqi@0 218 value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + ".after");
aoqi@0 219 dumpAfter = (value != null) ? value.booleanValue() : dumpAfter;
aoqi@0 220
aoqi@0 221 Level levelValue = getLevelValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + ".level");
aoqi@0 222 if (levelValue != null) {
aoqi@0 223 logLevel = levelValue;
aoqi@0 224 }
aoqi@0 225
aoqi@0 226 // narrowing to proper communication side on common properties
aoqi@0 227 value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + "." + side.toString());
aoqi@0 228 if (value != null) {
aoqi@0 229 dumpBefore = value.booleanValue();
aoqi@0 230 dumpAfter = value.booleanValue();
aoqi@0 231 }
aoqi@0 232
aoqi@0 233 value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + "." + side.toString() + ".before");
aoqi@0 234 dumpBefore = (value != null) ? value.booleanValue() : dumpBefore;
aoqi@0 235
aoqi@0 236 value = getBooleanValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + "." + side.toString() + ".after");
aoqi@0 237 dumpAfter = (value != null) ? value.booleanValue() : dumpAfter;
aoqi@0 238
aoqi@0 239 levelValue = getLevelValue(COMMON_MESSAGE_DUMP_SYSTEM_PROPERTY_BASE + "." + side.toString() + ".level");
aoqi@0 240 if (levelValue != null) {
aoqi@0 241 logLevel = levelValue;
aoqi@0 242 }
aoqi@0 243
aoqi@0 244
aoqi@0 245 // checking general tube-specific properties
aoqi@0 246 value = getBooleanValue(msgDumpSystemPropertyBase);
aoqi@0 247 if (value != null) {
aoqi@0 248 dumpBefore = value.booleanValue();
aoqi@0 249 dumpAfter = value.booleanValue();
aoqi@0 250 }
aoqi@0 251
aoqi@0 252 value = getBooleanValue(msgDumpSystemPropertyBase + ".before");
aoqi@0 253 dumpBefore = (value != null) ? value.booleanValue() : dumpBefore;
aoqi@0 254
aoqi@0 255 value = getBooleanValue(msgDumpSystemPropertyBase + ".after");
aoqi@0 256 dumpAfter = (value != null) ? value.booleanValue() : dumpAfter;
aoqi@0 257
aoqi@0 258 levelValue = getLevelValue(msgDumpSystemPropertyBase + ".level");
aoqi@0 259 if (levelValue != null) {
aoqi@0 260 logLevel = levelValue;
aoqi@0 261 }
aoqi@0 262
aoqi@0 263 // narrowing to proper communication side on tube-specific properties
aoqi@0 264 msgDumpSystemPropertyBase += "." + side.toString();
aoqi@0 265
aoqi@0 266 value = getBooleanValue(msgDumpSystemPropertyBase);
aoqi@0 267 if (value != null) {
aoqi@0 268 dumpBefore = value.booleanValue();
aoqi@0 269 dumpAfter = value.booleanValue();
aoqi@0 270 }
aoqi@0 271
aoqi@0 272 value = getBooleanValue(msgDumpSystemPropertyBase + ".before");
aoqi@0 273 dumpBefore = (value != null) ? value.booleanValue() : dumpBefore;
aoqi@0 274
aoqi@0 275 value = getBooleanValue(msgDumpSystemPropertyBase + ".after");
aoqi@0 276 dumpAfter = (value != null) ? value.booleanValue() : dumpAfter;
aoqi@0 277
aoqi@0 278 levelValue = getLevelValue(msgDumpSystemPropertyBase + ".level");
aoqi@0 279 if (levelValue != null) {
aoqi@0 280 logLevel = levelValue;
aoqi@0 281 }
aoqi@0 282
aoqi@0 283 return new MessageDumpingInfo(dumpBefore, dumpAfter, logLevel);
aoqi@0 284 }
aoqi@0 285
aoqi@0 286 private Boolean getBooleanValue(String propertyName) {
aoqi@0 287 Boolean retVal = null;
aoqi@0 288
aoqi@0 289 String stringValue = System.getProperty(propertyName);
aoqi@0 290 if (stringValue != null) {
aoqi@0 291 retVal = Boolean.valueOf(stringValue);
aoqi@0 292 LOGGER.fine(TubelineassemblyMessages.MASM_0018_MSG_LOGGING_SYSTEM_PROPERTY_SET_TO_VALUE(propertyName, retVal));
aoqi@0 293 }
aoqi@0 294
aoqi@0 295 return retVal;
aoqi@0 296 }
aoqi@0 297
aoqi@0 298 private Level getLevelValue(String propertyName) {
aoqi@0 299 Level retVal = null;
aoqi@0 300
aoqi@0 301 String stringValue = System.getProperty(propertyName);
aoqi@0 302 if (stringValue != null) {
aoqi@0 303 // if value is not null => property is set, we will try to override the default logging level
aoqi@0 304 LOGGER.fine(TubelineassemblyMessages.MASM_0018_MSG_LOGGING_SYSTEM_PROPERTY_SET_TO_VALUE(propertyName, stringValue));
aoqi@0 305 try {
aoqi@0 306 retVal = Level.parse(stringValue);
aoqi@0 307 } catch (IllegalArgumentException ex) {
aoqi@0 308 LOGGER.warning(TubelineassemblyMessages.MASM_0019_MSG_LOGGING_SYSTEM_PROPERTY_ILLEGAL_VALUE(propertyName, stringValue), ex);
aoqi@0 309 }
aoqi@0 310 }
aoqi@0 311
aoqi@0 312 return retVal;
aoqi@0 313 }
aoqi@0 314
aoqi@0 315 // Extension point to change Tubeline Assembly behaviour: override if necessary ...
aoqi@0 316 protected DefaultServerTubelineAssemblyContext createServerContext(ServerTubeAssemblerContext jaxwsContext) {
aoqi@0 317 return new DefaultServerTubelineAssemblyContext(jaxwsContext);
aoqi@0 318 }
aoqi@0 319
aoqi@0 320 // Extension point to change Tubeline Assembly behaviour: override if necessary ...
aoqi@0 321 protected DefaultClientTubelineAssemblyContext createClientContext(ClientTubeAssemblerContext jaxwsContext) {
aoqi@0 322 return new DefaultClientTubelineAssemblyContext(jaxwsContext);
aoqi@0 323 }
aoqi@0 324
aoqi@0 325 }

mercurial