On 21.06.2016 22:51, Mandy Chung wrote:
On Jun 21, 2016, at 10:39 AM, Daniel Fuchs <daniel.fu...@oracle.com> wrote:

Hi,

Please find below a somewhat trivial patch for

8150173: JAXBContext.newInstance causes PrivilegedActionException
         when createContext's declared in absract class extended
         by discovered JAXB implementation
https://bugs.openjdk.java.net/browse/JDK-8150173

Patch:
http://cr.openjdk.java.net/~dfuchs/webrev_8150173/webrev.00

This is an oversight that was introduced with JDK-8145104.

The issue is simply that newInstance() must be invoked on
the concrete class, not on the class that defines the
createContext method.
Thanks for taking this one on.

  234             if (JAXBContextFactory.class.isAssignableFrom(declaringClass)

The spec says that implementation class of JAXBContextFactory must also 
implement no-arg constructor.
Line 234 seems to be even harmful for the following case:

public class FactoryBase {public JAXBContext createContext(Class<?>[] classesToBeBound, Map<String, ?> properties) throws JAXBException {...}public JAXBContext createContext(String contextPath, ClassLoader classLoader, Map<String, ?> properties) throws JAXBException {...}}public class Factory extends FactoryBase implements JAXBContextFactory { }Please also see attached minimal testcase.

Georgiy

So I think this line is not needed.  Instead instantiateProviderIfNecessary 
should simply take the implClass parameter (the Method parameter doesn’t seem 
to be needed).

  245             throw new 
JAXBException(Messages.format(Messages.COULD_NOT_INSTANTIATE, declaringClass, 
e), e);

Since you are on this file, it looks to me that it should use e.getCause() 
instead of e.

Mandy


/*
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
 */

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBContextFactory;
import javax.xml.bind.JAXBException;
import java.util.Map;

/**
 * @author Georgiy Rakov
 */
public class Test9 {
    private static JAXBContext tmp;

    public static class FactoryBase {
        public JAXBContext createContext(Class<?>[] classesToBeBound, 
Map<String, ?> properties) throws JAXBException {
            return tmp;
        }

        public JAXBContext createContext(String contextPath, ClassLoader 
classLoader, Map<String, ?> properties)
                throws JAXBException {
            return tmp;
        }
    }

    public static class Factory extends FactoryBase implements 
JAXBContextFactory {
    }

    public static void main(String[] args) throws JAXBException {
        tmp = JAXBContext.newInstance(Test9.class);
        System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY, "Test9$Factory");
        JAXBContext.newInstance(Test9.class);
    }
}

Reply via email to