Tue, 09 Apr 2013 14:51:13 +0100
8010393: Update JAX-WS RI to 2.2.9-b12941
Reviewed-by: alanb, erikj
Contributed-by: miroslav.kos@oracle.com, martin.grebac@oracle.com
1 /*
2 * Copyright (c) 1997, 2011, 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 */
26 package com.sun.xml.internal.bind.v2.runtime.reflect.opt;
28 import java.io.InputStream;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
32 import com.sun.xml.internal.bind.Util;
33 import com.sun.xml.internal.bind.v2.bytecode.ClassTailor;
35 /**
36 * @author Kohsuke Kawaguchi
37 */
38 class AccessorInjector {
40 private static final Logger logger = Util.getClassLogger();
42 protected static final boolean noOptimize =
43 Util.getSystemProperty(ClassTailor.class.getName()+".noOptimize")!=null;
45 static {
46 if(noOptimize)
47 logger.info("The optimized code generation is disabled");
48 }
50 /**
51 * Loads the optimized class and returns it.
52 *
53 * @return null
54 * if it fails for some reason.
55 */
56 public static Class<?> prepare(
57 Class beanClass, String templateClassName, String newClassName, String... replacements ) {
59 if(noOptimize)
60 return null;
62 try {
63 ClassLoader cl = SecureLoader.getClassClassLoader(beanClass);
64 if(cl==null) return null; // how do I inject classes to this "null" class loader? for now, back off.
66 Class c = null;
67 synchronized (AccessorInjector.class) {
68 c = Injector.find(cl,newClassName);
69 if(c==null) {
70 byte[] image = tailor(templateClassName,newClassName,replacements);
71 // try {
72 // new FileOutputStream("debug.class").write(image);
73 // } catch (IOException e) {
74 // e.printStackTrace();
75 // }
76 if(image==null)
77 return null;
78 c = Injector.inject(cl,newClassName,image);
79 }
80 }
81 return c;
82 } catch(SecurityException e) {
83 // we don't have enough permission to do this
84 logger.log(Level.INFO,"Unable to create an optimized TransducedAccessor ",e);
85 return null;
86 }
87 }
90 /**
91 * Customizes a class file by replacing constant pools.
92 *
93 * @param templateClassName
94 * The resource that contains the template class file.
95 * @param replacements
96 * A list of pair of strings that specify the substitution
97 * {@code String[]{search_0, replace_0, search_1, replace_1, ..., search_n, replace_n }
98 *
99 * The search strings found in the constant pool will be replaced by the corresponding
100 * replacement string.
101 */
102 private static byte[] tailor( String templateClassName, String newClassName, String... replacements ) {
103 InputStream resource;
104 if(CLASS_LOADER!=null)
105 resource = CLASS_LOADER.getResourceAsStream(templateClassName+".class");
106 else
107 resource = ClassLoader.getSystemResourceAsStream(templateClassName+".class");
108 if(resource==null)
109 return null;
111 return ClassTailor.tailor(resource,templateClassName,newClassName,replacements);
112 }
114 private static final ClassLoader CLASS_LOADER = SecureLoader.getClassClassLoader(AccessorInjector.class);
115 }