Source code: org/hibernate/bytecode/AbstractClassTransformerImpl.java
1 //$Id: $
2 package org.hibernate.bytecode;
3
4 import java.security.ProtectionDomain;
5 import java.util.HashSet;
6 import java.util.Set;
7
8 /**
9 * @author Emmanuel Bernard
10 */
11 public abstract class AbstractClassTransformerImpl implements ClassTransformer {
12
13 final private Set entities;
14 final private String[] packages;
15
16
17 public AbstractClassTransformerImpl(String[] packages, String[] classes) {
18 this.packages = packages;
19 if (classes == null) {
20 this.entities = null;
21 }
22 else {
23 this.entities = new HashSet();
24 for ( int i = 0; i < classes.length; i++ ) {
25 entities.add( classes[i] );
26 }
27 }
28 }
29
30 public byte[] transform(
31 ClassLoader loader,
32 String className,
33 Class classBeingRedefined,
34 ProtectionDomain protectionDomain,
35 byte[] classfileBuffer) {
36 boolean enhance = false;
37 String safeClassName = className.replace( '/', '.' );
38 if ( entities == null && packages == null ) {
39 enhance = true;
40 }
41 if ( ! enhance && entities != null && entities.contains( safeClassName ) ) {
42 enhance = true;
43 }
44 if ( ! enhance && packages != null ) {
45 for ( int i = 0; i < packages.length; i++ ) {
46 if ( safeClassName.startsWith( packages[i] ) ) {
47 enhance = true;
48 break;
49 }
50 }
51 }
52 if ( ! enhance ) return classfileBuffer;
53
54 return doTransform( loader, className, classBeingRedefined, protectionDomain, classfileBuffer );
55 }
56
57 protected abstract byte[] doTransform(
58 ClassLoader loader,
59 String className,
60 Class classBeingRedefined,
61 ProtectionDomain protectionDomain,
62 byte[] classfileBuffer);
63 }