public ClassObjectType getClassObjectType( final ClassObjectType objectType, final boolean isEvent, final AcceptsClassObjectType target) { AccessorKey key = new AccessorKey( objectType.getClassName(), isEvent ? "$$DROOLS__isEvent__" : null, AccessorKey.AccessorType.ClassObjectType); ClassObjectTypeLookupEntry entry = (ClassObjectTypeLookupEntry) this.lookup.get(key); if (entry == null) { entry = new ClassObjectTypeLookupEntry(cache.getClassObjectType(objectType)); this.lookup.put(key, entry); } if (target != null) { entry.addAccessorTarget(target); target.setClassObjectType(entry.getClassObjectType()); } return entry.getClassObjectType(); }
public void wire(ClassFieldWriter writer) { writer.setWriteAccessor(cache.getWriteAcessor(writer)); }
public void wire(ClassFieldReader reader) { reader.setReadAccessor(cache.getReadAcessor(reader)); }
public void merge(ClassFieldAccessorStore other) { for (Entry<AccessorKey, BaseLookupEntry> entry : other.lookup.entrySet()) { switch (entry.getValue().getAccessorType()) { case FieldAccessor: { FieldLookupEntry lookupEntry = (FieldLookupEntry) this.lookup.get(entry.getKey()); if (lookupEntry == null) { lookupEntry = (FieldLookupEntry) entry.getValue(); this.lookup.put(entry.getKey(), lookupEntry); // wire up ClassFieldReaders if (lookupEntry.getClassFieldReader() != null) { wire(lookupEntry.getClassFieldReader()); } if (lookupEntry.getClassFieldWriter() != null) { wire(lookupEntry.getClassFieldWriter()); } } else { // iterate through new targets adding them and wiring them up // to the existing ClassFieldReader, no need to wire generated accessor // as we know it already exists for (Acceptor target : entry.getValue().getAccessorTargets()) { if (target instanceof AcceptsReadAccessor) { ((AcceptsReadAccessor) target).setReadAccessor(lookupEntry.getClassFieldReader()); } else if (target instanceof AcceptsWriteAccessor) { ((AcceptsWriteAccessor) target) .setWriteAccessor(lookupEntry.getClassFieldWriter()); } lookupEntry.addAccessorTarget(target); } if (lookupEntry.getClassFieldReader() != null) { wire(((FieldLookupEntry) entry.getValue()).getClassFieldReader()); } if (lookupEntry.getClassFieldWriter() != null) { wire(((FieldLookupEntry) entry.getValue()).getClassFieldWriter()); } } break; } case ClassObjectType: { ClassObjectTypeLookupEntry lookupEntry = (ClassObjectTypeLookupEntry) this.lookup.get(entry.getKey()); if (lookupEntry == null) { // Create new entry with correct ClassObjectType and targets lookupEntry = new ClassObjectTypeLookupEntry( cache.getClassObjectType( ((ClassObjectTypeLookupEntry) entry.getValue()).getClassObjectType())); this.lookup.put(entry.getKey(), lookupEntry); } for (Acceptor target : entry.getValue().getAccessorTargets()) { ((AcceptsClassObjectType) target) .setClassObjectType(lookupEntry.getClassObjectType()); lookupEntry.addAccessorTarget(target); } } // case ObjectAccessor : { // ObjectExtractorLookupEntry lookupEntry = ( // ObjectExtractorLookupEntry ) this.lookup.get( entry.getKey() ); // if ( lookupEntry == null ) { // lookupEntry = ( ObjectExtractorLookupEntry ) entry.getValue(); // this.lookup.put( entry.getKey(), // lookupEntry ); // wire( lookupEntry.getObjectExtractor() ); // } else { // for ( Acceptor target : entry.getValue().getAccessorTargets() ) // { // ((Declaration)target).setReadAccessor( // lookupEntry.getObjectExtractor() ); // lookupEntry.addAccessorTarget( target ); // } // } // break; // } // case GlobalAccessor : { // GlobalExtractorLookupEntry lookupEntry = ( // GlobalExtractorLookupEntry ) this.lookup.get( entry.getKey() ); // if ( lookupEntry == null ) { // lookupEntry = ( GlobalExtractorLookupEntry ) entry.getValue(); // this.lookup.put( entry.getKey(), // lookupEntry ); // wire( lookupEntry.getGlobalExtractor() ); // } else { // for ( Acceptor target : entry.getValue().getAccessorTargets() ) // { // ((Declaration)target).setReadAccessor( // lookupEntry.getGlobalExtractor() ); // lookupEntry.addAccessorTarget( target ); // } // } // break; // } } } }