Hi Patrick, Works for me.
Craig On Sep 24, 2007, at 3:34 PM, Patrick Linskey wrote:
Seems fair enough to me. We could simplify this by making J2DoPriv5Helper extend J2DoPrivHelper, in which case developers can stick with a single class within a given module. -Patrick On 9/24/07, Albert Lee <[EMAIL PROTECTED]> wrote:2) If we put the new 1.5 functions in lib-5, then we need a differentclasse.g. J2DoPriv15Helper.java. This makes an unnatural feel of using theJ2DoPrivHelper.How is that unnatural?What I mean is if J2DoPrivHelper is split to 2 classes, developers will need to call J2DoPrivHelper.getXXXAction() or J2DoPriv5Helper.getXXXAction()depends on if the action is 1.5 specific. Albert Lee. On 9/24/07, Patrick Linskey <[EMAIL PROTECTED]> wrote:1) To avoid "module explosion", you suggested to put it in e.g. kernel-5 instead of a new lib-5. We can use that approach but now we are limitingtheusage of the new methods in kernel and/or other modules that hasdependency/access to kernel-5 module. From design perspective, it makes sense to have the 1.5 J2DoPrivHelp functions in lib(-5), that can bepotentially accessed from ANY other modules.Agreed. In practice, this isn't that big of a problem, since ithappens that all Java 5 modules have a dependency on kernel-5. Eitherapproach is fine with me.2) If we put the new 1.5 functions in lib-5, then we need a differentclasse.g. J2DoPriv15Helper.java. This makes an unnatural feel of using theJ2DoPrivHelper.How is that unnatural?3) Is there still a need to support 1.4 at all? Is the benefit ofsupporting1.4 justify the source module complexity?At least one downstream product (Kodo) still supports deploying against1.4. -Patrick On 9/24/07, Albert Lee <[EMAIL PROTECTED]> wrote:Patrick,Thanks for spotting the 1.4 compile scenario which I am still new andignorance on this topic. Now that I understand the problem, I have a few observations andquestions:1) To avoid "module explosion", you suggested to put it in e.g. kernel-5 instead of a new lib-5. We can use that approach but now we are limitingtheusage of the new methods in kernel and/or other modules that hasdependency/access to kernel-5 module. From design perspective, it makes sense to have the 1.5 J2DoPrivHelp functions in lib(-5), that can bepotentially accessed from ANY other modules.2) If we put the new 1.5 functions in lib-5, then we need a differentclasse.g. J2DoPriv15Helper.java. This makes an unnatural feel of using theJ2DoPrivHelper. 3) Is there still a need to support 1.4 at all? Is the benefit ofsupporting1.4 justify the source module complexity? Thanks, Albert Lee. On 9/23/07, Patrick Linskey <[EMAIL PROTECTED]> wrote:Hi, This change (and r577877, the port of this to the 1.0.x branch) contains Java 5 code. So, it should be in the a new class in a 1.5-capable module (either a new openjpa-lib-5 dir, or maybe the openjpa-kernel-5 module, to save on module explosion). FYI, you can run a compile that detects these types of problems by running 'mvn compile -Djava14.jar=/path/to/jdk1.4/rt.jar', oralternately, by submitting your changes through the TeamCity installthat I wrote about earlier. You can see these types of problems as they occur by monitoring that same TeamCity install.I could set things up so that key build failures were emailed out to[email protected] from the TeamCity install. -Patrick On 9/18/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:Author: kwsutter Date: Tue Sep 18 12:44:06 2007 New Revision: 577029 URL: http://svn.apache.org/viewvc?rev=577029&view=rev Log: OPENJPA-369. Committed Albert's changes for the Java 2 Securityupdatesopenjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ datacache/DataCacheScheduler.javafor the Solaris platform.Modified:openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/ util/J2DoPrivHelper.javaopenjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/ openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.javaopenjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceMetaDataParser.javaopenjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.javaopenjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataDefaults.javaopenjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataFactory.javaopenjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ datacache/DataCacheScheduler.javaModified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/ main/java/org/apache/openjpa/datacache/DataCacheScheduler.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ datacache/DataCacheScheduler.java---openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ datacache/DataCacheScheduler.java(original)+++Tue Sep 18 12:44:06 2007@@ -99,10 +99,9 @@ _caches.put(cache, schedule); _stop = false; if (_thread == null) { - _thread = (Thread) AccessController- .doPrivileged(J2DoPrivHelper.newThreadAction (this,_loc.get(- "scheduler-name").getMessage())); - _thread.setDaemon(true); + _thread = (Thread) AccessController.doPrivileged(J2DoPrivHelper+ .newDaemonThreadAction(this,_loc.get("scheduler-name")openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/ util/J2DoPrivHelper.java+ .getMessage())); _thread.start(); if (_log.isTraceEnabled()) _log.trace(_loc.get("scheduler-start",_thread.getName()));Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/ java/org/apache/openjpa/lib/util/J2DoPrivHelper.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/ util/J2DoPrivHelper.java---openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/ util/J2DoPrivHelper.java(original)+++Tue Sep 18 12:44:06 2007@@ -24,6 +24,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.AccessibleObject; +import java.lang.reflect.AnnotatedElement; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.ServerSocket; @@ -48,6 +49,9 @@ * methods: * <ul> * <li>AccessibleObject.setAccessible + * <li>AnnotatedElement.getAnnotations + * <li>AnnotatedElement.getDeclaredAnnotations + * <li>AnnotatedElement.isAnnotationPresent * <li>Class.forName * <li>Class.getClassLoader * <li>Class.getDeclaredField @@ -325,6 +329,60 @@ } /** + * Return a PrivilegeAction object forAnnotatedElement.getAnnotations().+ * + * Requires security policy: + * 'permission java.lang.RuntimePermission"accessDeclaredMembers";'+ * + * @return Annotation[] + */ + public static final PrivilegedAction getAnnotationsAction( + final AnnotatedElement element) { + return new PrivilegedAction() { + public Object run() { + return element.getAnnotations(); + } + }; + } + + /** + * Return a PrivilegeAction object for + * AnnotatedElement.getDeclaredAnnotations(). + * + * Requires security policy: + * 'permission java.lang.RuntimePermission"accessDeclaredMembers";'+ * + * @return Annotation[] + */ + public static final PrivilegedActiongetDeclaredAnnotationsAction(+ final AnnotatedElement element) { + return new PrivilegedAction() { + public Object run() { + return element.getDeclaredAnnotations(); + } + }; + } + + /** + * Return a PrivilegeAction object for + * AnnotatedElement.isAnnotationPresent(). + * + * Requires security policy: + * 'permission java.lang.RuntimePermission"accessDeclaredMembers";'+ * + * @return Boolean + */+ public static final PrivilegedAction isAnnotationPresentAction(+ final AnnotatedElement element, final ClassannotationClazz) {+ return new PrivilegedAction() { + public Object run() {+ return element.isAnnotationPresent (annotationClazz)+ ? Boolean.TRUE : Boolean.FALSE; + } + }; + } + + /** * Return a PrivilegedExceptionAction object forclazz.newInstanceopenjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/ openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java().* * Requires security policy: @@ -794,14 +852,17 @@ * * Requires security policy:* 'permission java.lang.RuntimePermission"modifyThreadGroup";' + * 'permission java.lang.RuntimePermission "modifyThread";'* * @return Thread */ - public static final PrivilegedAction newThreadAction( + public static final PrivilegedAction newDaemonThreadAction( final Runnable target, final String name) { return new PrivilegedAction() { public Object run() { - return new Thread(target, name); + Thread thread = new Thread(target, name); + thread.setDaemon(true); + return thread; } }; } Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence- jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/ AnnotationPersistenceMappingParser.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/ openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java---openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/ openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java(original)+++Tue Sep 18 12:44:06 2007@@ -21,6 +21,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Modifier; +import java.security.AccessController; import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; @@ -74,6 +75,7 @@ import org.apache.openjpa.jdbc.schema.Unique; import org.apache.openjpa.jdbc.sql.DBDictionary; import org.apache.openjpa.lib.log.Log; +import org.apache.openjpa.lib.util.J2DoPrivHelper; import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.meta.ClassMetaData; import org.apache.openjpa.meta.FieldMetaData; @@ -1058,7 +1060,9 @@ if (xmlTypeClass != null&& StringUtils.isEmpty(pcols [i].columnDefinition())- && fm.getDeclaredType().isAnnotationPresent(xmlTypeClass)){+ && ((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction (fm.getDeclaredType(),openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceMetaDataParser.java+ xmlTypeClass))).booleanValue()) { DBDictionary dict = ((MappingRepository)getRepository()).getDBDictionary(); if (dict.supportsXMLColumn) Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/ src/main/java/org/apache/openjpa/persistence/ AnnotationPersistenceMetaDataParser.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceMetaDataParser.java---openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceMetaDataParser.java(original)+++Tue Sep 18 12:44:06 2007@@ -465,9 +465,14 @@ // check immediately whether the user is using anyannotations,// regardless of mode. this prevents adding non-entityclassesto// repository if we're ignoring these annotations inmappingmode- if (!_cls.isAnnotationPresent(Entity.class) - && !_cls.isAnnotationPresent(Embeddable.class)- && !_cls.isAnnotationPresent (MappedSuperclass.class))+ if (!((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(_cls, Entity.class))).booleanValue()+ && !((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(_cls, Embeddable.class)))+ .booleanValue() + && !((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(_cls,MappedSuperclass.class)))+ .booleanValue()) return null; // find / create metadata @@ -762,7 +767,9 @@ J2DoPrivHelper.getDeclaredFieldsAction( meta.getDescribedType())); for (int i = 0; i < fields.length; i++) - if (fields[i].isAnnotationPresent(DetachedState.class))+ if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(fields[i],DetachedState.class)))+ .booleanValue()) meta.setDetachedState(fields[i].getName()); } } @@ -818,7 +825,8 @@ MetaDataDefaults def = repos.getMetaDataFactory().getDefaults();for (Method m : methods) { - for (Annotation anno : m.getDeclaredAnnotations()) {+ for (Annotation anno : (Annotation[]) AccessController+ .doPrivileged(J2DoPrivHelper.getDeclaredAnnotationsAction(m))) {MetaDataTag tag = _tags.get (anno.annotationType());if (tag == null) continue; @@ -956,7 +964,8 @@ fmd.setExplicit(true); AnnotatedElement el = (AnnotatedElement) member; - boolean lob = el.isAnnotationPresent(Lob.class); + boolean lob = ((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(el, Lob.class))).booleanValue();openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.javaif (isMetaDataMode()) { switch (pstrat) { case BASIC: Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/ src/main/java/org/apache/openjpa/persistence/ AnnotationPersistenceXMLMetaDataParser.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java---openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/AnnotationPersistenceXMLMetaDataParser.java(original)+++Tue Sep 18 12:44:06 2007@@ -22,10 +22,12 @@ import java.lang.reflect.Field; import java.lang.reflect.Member; import java.lang.reflect.Method; +import java.security.AccessController; import org.apache.commons.lang.StringUtils; import org.apache.openjpa.conf.OpenJPAConfiguration; import org.apache.openjpa.lib.log.Log; +import org.apache.openjpa.lib.util.J2DoPrivHelper; import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.meta.DelegatingMetaDataFactory; import org.apache.openjpa.meta.FieldMetaData; @@ -171,8 +173,11 @@ private XMLMetaData parseXMLClassAnnotations() { // check immediately whether the class has JAXB XMLannotationsif (_cls == null || xmlTypeClass == null - || !(_cls.isAnnotationPresent(xmlTypeClass)- && _cls.isAnnotationPresent (xmlRootElementClass)))+ || !(((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(_cls,xmlTypeClass))).booleanValue()+ && ((Boolean) AccessController + .doPrivileged(J2DoPrivHelper.isAnnotationPresentAction(_cls,+ xmlRootElementClass))).booleanValue())) return null; // find / create metadata @@ -220,7 +225,9 @@ Class superclass = cls.getSuperclass(); // handle inheritance at sub-element level - if (superclass.isAnnotationPresent(xmlTypeClass))+ if (((Boolean) AccessController.doPrivileged (J2DoPrivHelper + .isAnnotationPresentAction(superclass, xmlTypeClass)))+ .booleanValue()) populateFromReflection(superclass, meta); try { @@ -240,8 +247,9 @@ // avoid JAXB XML bind default nameif (StringUtils.equals (XMLMetaData.defaultName,xmlname))xmlname = member.getName(); - if (((Field) member).getType() - .isAnnotationPresent(xmlTypeClass)) { + if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(((Field)member).getType(),+ xmlTypeClass))).booleanValue()) { field = _repos.addXMLMetaData(((Field)member).getType(), member.getName()); parseXmlRootElement(((Field)member).getType(),openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataDefaults.javafield);Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/ src/main/java/org/apache/openjpa/persistence/ PersistenceMetaDataDefaults.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataDefaults.java---openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataDefaults.java(original)+++Tue Sep 18 12:44:06 2007@@ -116,7 +116,8 @@ if (member == null) return null; AnnotatedElement el = (AnnotatedElement) member; - if (el.isAnnotationPresent(Transient.class))+ if (((Boolean) AccessController.doPrivileged (J2DoPrivHelper+ .isAnnotationPresentAction(el, Transient.class))).booleanValue())return TRANSIENT; if (fmd != null && fmd.getManagement() !=FieldMetaData.MANAGE_PERSISTENT)@@ -182,7 +183,8 @@ } //### EJB3: what if defined in XML? - if (type.isAnnotationPresent(Embeddable.class))+ if (((Boolean) AccessController.doPrivileged (J2DoPrivHelper+ .isAnnotationPresentAction(type, Embeddable.class))).booleanValue())return EMBEDDED; if (Serializable.class.isAssignableFrom(type)) return BASIC; @@ -271,7 +273,8 @@ Annotation[] annos; String name; for (int i = 0; i < members.length; i++) { - annos = members[i].getAnnotations(); + annos = (Annotation[]) AccessController.doPrivileged(J2DoPrivHelper+ .getAnnotationsAction(members[i])); for (int j = 0; j < annos.length; j++) { name = annos[j].annotationType().getName(); if ((name.startsWith("javax.persistence.") @@ -317,7 +320,9 @@ private boolean isAnnotatedTransient(Member member) { return member instanceof AnnotatedElement - && ((AnnotatedElement) member).isAnnotationPresent(Transient.class);+ && ((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(((AnnotatedElement)member),+ Transient.class))).booleanValue(); } private void logNoSetter(ClassMetaData meta, String name,Exceptionopenjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataFactory.javae) {Modified:http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/ src/main/java/org/apache/openjpa/persistence/ PersistenceMetaDataFactory.java? rev=577029&r1=577028&r2=577029&view=diffURL:==================================================================== ==========openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataFactory.java---openjpa/trunk/openjpa-persistence/src/main/java/org/apache/ openjpa/persistence/PersistenceMetaDataFactory.java(original)+++Tue Sep 18 12:44:06 2007@@ -293,18 +293,26 @@ return null; Collection classes = repos.loadPersistentTypes(false,loader);for (Class cls : (Collection<Class>) classes) { - if (cls.isAnnotationPresent(NamedQuery.class) &&hasNamedQuery+ if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls, NamedQuery.class)))+ .booleanValue() && hasNamedQuery (queryName, (NamedQuery) cls.getAnnotation(NamedQuery.class)))return cls; - if (cls.isAnnotationPresent(NamedQueries.class) && + if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls, NamedQueries.class)))+ .booleanValue() && hasNamedQuery(queryName, ((NamedQueries) cls. getAnnotation(NamedQueries.class)).value())) return cls;- if (cls.isAnnotationPresent (NamedNativeQuery.class) &&+ if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls,NamedNativeQuery.class)))+ .booleanValue() &&hasNamedNativeQuery(queryName, (NamedNativeQuery)cls.getAnnotation(NamedNativeQuery.class))) return cls;- if (cls.isAnnotationPresent (NamedNativeQueries.class)&&+ if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls,NamedNativeQueries.class)))+ .booleanValue() && hasNamedNativeQuery(queryName,((NamedNativeQueries)cls.getAnnotation(NamedNativeQueries.class)).value()))return cls; @@ -320,13 +328,17 @@ Collection classes = repos.loadPersistentTypes(false,loader);for (Class cls : (Collection<Class>) classes) { -- if (cls.isAnnotationPresent (SqlResultSetMapping.class)&&+ + if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls,SqlResultSetMapping.class)))+ .booleanValue() &&hasRSMapping(rsMappingName, (SqlResultSetMapping)cls.getAnnotation(SqlResultSetMapping.class))) return cls; -- if (cls.isAnnotationPresent (SqlResultSetMappings.class)&&+ + if (((Boolean) AccessController.doPrivileged(J2DoPrivHelper+ .isAnnotationPresentAction(cls,SqlResultSetMappings.class)))+ .booleanValue() &&hasRSMapping(rsMappingName, ((SqlResultSetMappings)cls.getAnnotation(SqlResultSetMappings.class)).value()))return cls;-- Patrick Linskey 202 669 5907-- Patrick Linskey 202 669 5907-- Patrick Linskey 202 669 5907
Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!
smime.p7s
Description: S/MIME cryptographic signature
