~ubuntu-branches/ubuntu/vivid/jaxb/vivid-proposed

« back to all changes in this revision

Viewing changes to runtime/src/com/sun/xml/bind/v2/runtime/reflect/opt/AccessorInjector.java

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2014-09-01 14:26:44 UTC
  • Revision ID: package-import@ubuntu.com-20140901142644-nox3y6t2unq2wxjf
Tags: upstream-2.2.5
ImportĀ upstreamĀ versionĀ 2.2.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 
3
 *
 
4
 * Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
 
5
 *
 
6
 * The contents of this file are subject to the terms of either the GNU
 
7
 * General Public License Version 2 only ("GPL") or the Common Development
 
8
 * and Distribution License("CDDL") (collectively, the "License").  You
 
9
 * may not use this file except in compliance with the License.  You can
 
10
 * obtain a copy of the License at
 
11
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 
12
 * or packager/legal/LICENSE.txt.  See the License for the specific
 
13
 * language governing permissions and limitations under the License.
 
14
 *
 
15
 * When distributing the software, include this License Header Notice in each
 
16
 * file and include the License file at packager/legal/LICENSE.txt.
 
17
 *
 
18
 * GPL Classpath Exception:
 
19
 * Oracle designates this particular file as subject to the "Classpath"
 
20
 * exception as provided by Oracle in the GPL Version 2 section of the License
 
21
 * file that accompanied this code.
 
22
 *
 
23
 * Modifications:
 
24
 * If applicable, add the following below the License Header, with the fields
 
25
 * enclosed by brackets [] replaced by your own identifying information:
 
26
 * "Portions Copyright [year] [name of copyright owner]"
 
27
 *
 
28
 * Contributor(s):
 
29
 * If you wish your version of this file to be governed by only the CDDL or
 
30
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 
31
 * elects to include this software in this distribution under the [CDDL or GPL
 
32
 * Version 2] license."  If you don't indicate a single choice of license, a
 
33
 * recipient has the option to distribute your version of this file under
 
34
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 
35
 * its licensees as provided above.  However, if you add GPL Version 2 code
 
36
 * and therefore, elected the GPL Version 2 license, then the option applies
 
37
 * only if the new code is made subject to such option by the copyright
 
38
 * holder.
 
39
 */
 
40
 
 
41
package com.sun.xml.bind.v2.runtime.reflect.opt;
 
42
 
 
43
import java.io.InputStream;
 
44
import java.util.logging.Level;
 
45
import java.util.logging.Logger;
 
46
 
 
47
import com.sun.xml.bind.Util;
 
48
import com.sun.xml.bind.v2.bytecode.ClassTailor;
 
49
 
 
50
/**
 
51
 * @author Kohsuke Kawaguchi
 
52
 */
 
53
class AccessorInjector {
 
54
 
 
55
    private static final Logger logger = Util.getClassLogger();
 
56
 
 
57
    protected static final boolean noOptimize =
 
58
        Util.getSystemProperty(ClassTailor.class.getName()+".noOptimize")!=null;
 
59
 
 
60
    static {
 
61
        if(noOptimize)
 
62
            logger.info("The optimized code generation is disabled");
 
63
    }
 
64
 
 
65
    /**
 
66
     * Loads the optimized class and returns it.
 
67
     *
 
68
     * @return null
 
69
     *      if it fails for some reason.
 
70
     */
 
71
    public static Class<?> prepare(
 
72
        Class beanClass, String templateClassName, String newClassName, String... replacements ) {
 
73
 
 
74
        if(noOptimize)
 
75
            return null;
 
76
 
 
77
        try {
 
78
            ClassLoader cl = SecureLoader.getClassClassLoader(beanClass);
 
79
            if(cl==null)    return null;    // how do I inject classes to this "null" class loader? for now, back off.
 
80
 
 
81
            Class c = null;
 
82
            synchronized (AccessorInjector.class) {
 
83
                c = Injector.find(cl,newClassName);
 
84
                if(c==null) {
 
85
                    byte[] image = tailor(templateClassName,newClassName,replacements);
 
86
    //                try {
 
87
    //                    new FileOutputStream("debug.class").write(image);
 
88
    //                } catch (IOException e) {
 
89
    //                    e.printStackTrace();
 
90
    //                }
 
91
                    if(image==null)
 
92
                        return null;
 
93
                    c = Injector.inject(cl,newClassName,image);
 
94
                }
 
95
            }
 
96
            return c;
 
97
        } catch(SecurityException e) {
 
98
            // we don't have enough permission to do this
 
99
            logger.log(Level.INFO,"Unable to create an optimized TransducedAccessor ",e);
 
100
            return null;
 
101
        }
 
102
    }
 
103
 
 
104
 
 
105
    /**
 
106
     * Customizes a class file by replacing constant pools.
 
107
     *
 
108
     * @param templateClassName
 
109
     *      The resouce that contains the template class file.
 
110
     * @param replacements
 
111
     *      A list of pair of strings that specify the substitution
 
112
     *      {@code String[]{search_0, replace_0, search_1, replace_1, ..., search_n, replace_n }
 
113
     *
 
114
     *      The search strings found in the constant pool will be replaced by the corresponding
 
115
     *      replacement string.
 
116
     */
 
117
    private static byte[] tailor( String templateClassName, String newClassName, String... replacements ) {
 
118
        InputStream resource;
 
119
        if(CLASS_LOADER!=null)
 
120
            resource = CLASS_LOADER.getResourceAsStream(templateClassName+".class");
 
121
        else
 
122
            resource = ClassLoader.getSystemResourceAsStream(templateClassName+".class");
 
123
        if(resource==null)
 
124
            return null;
 
125
 
 
126
        return ClassTailor.tailor(resource,templateClassName,newClassName,replacements);
 
127
    }
 
128
 
 
129
    private static final ClassLoader CLASS_LOADER = SecureLoader.getClassClassLoader(AccessorInjector.class);    
 
130
}