def call_trigger(self, call_type, obj): try: self.objects._send_flag = 0 if self.verbose: print call_type, obj.id self.check_consistency("before new_object:", []) if call_type != "delete": resolved_objects = self.resolver.new_object(obj) else: resolved_objects = [obj] self.check_consistency("before:", resolved_objects) #CHEAT: should store call call_type at first try and use that changes_flag = -1 while changes_flag: changes_flag = 0 for i in range(len(resolved_objects)): obj2 = resolved_objects[i] if obj2.id == "right_meadow": print "type(right_meadow.contains[0]) ==", type( obj2.contains[0]) obj3 = self.check_class(obj2) ## if obj2.id=="fence2": ## print "???? fence2 <- right_meadow:", self.objects.get("right_meadow") ## print "classes:", obj2.__class__, obj2.__class__.__bases__, obj3.__class__, obj3.__class__.__bases__ ## print "fence2:self,resolver:", self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ if id(obj3) != id(obj2): ## print obj2.id, obj2.__class__, obj3.id, obj3.__class__ changes_flag = changes_flag + 1 setattr(self.objects, obj3.id, obj3) resolved_objects[i] = obj2 = self.objects[obj2.id] ## print ">>>fence2:self,resolver:", getattr(self.objects, obj2.id).__class__, getattr(self.objects, obj2.id).__class__.__bases__, self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ for pointer in self.resolver.links.get1(obj2.id): obj_other, id_other = atlas.resolve_pointer2( self.objects, pointer) obj_other[id_other] = obj2 ## if obj2.id=="right_meadow" and pointer=="meadow1.contains.1": ## if type(obj2.contains[0])==StringType: ## print "eeeerr0:", obj2.id, obj2.contains[0] ## print "!!!!", obj2.id, obj2.__class__, obj2.__class__.__bases__, obj2.contains[0].id, obj2.contains[0].__class__, obj2.contains[0].__class__.__bases__ ## print "fence2:self,resolver:", self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ self.check_consistency("loop: %s:" % obj2.id, resolved_objects) ## print "call_trigger: changes loop:", changes_flag, map(lambda o:o.id, resolved_objects) ## print "call_trigger:", map(str_inf, resolved_objects) ## print "call_trigger: links:", self.resolver.links self.check_consistency("after:", resolved_objects) for obj2 in resolved_objects: for func in self.triggers.get(call_type, []): self.check_consistency("before func with %s:" % obj2.id, []) res = func(obj2) self.check_consistency("after func with %s:" % obj2.id, []) if res: self.ask(res) self.check_consistency("after ask with %s:" % obj2.id, []) self.check_consistency("after func:", resolved_objects) finally: self.objects._send_flag = 1
def call_trigger(self, call_type, obj): try: self.objects._send_flag = 0 if self.verbose: print call_type, obj.id self.check_consistency("before new_object:", []) if call_type!="delete": resolved_objects = self.resolver.new_object(obj) else: resolved_objects = [obj] self.check_consistency("before:", resolved_objects) #CHEAT: should store call call_type at first try and use that changes_flag = -1 while changes_flag: changes_flag = 0 for i in range(len(resolved_objects)): obj2 = resolved_objects[i] if obj2.id=="right_meadow": print "type(right_meadow.contains[0]) ==",type(obj2.contains[0]) obj3 = self.check_class(obj2) ## if obj2.id=="fence2": ## print "???? fence2 <- right_meadow:", self.objects.get("right_meadow") ## print "classes:", obj2.__class__, obj2.__class__.__bases__, obj3.__class__, obj3.__class__.__bases__ ## print "fence2:self,resolver:", self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ if id(obj3)!=id(obj2): ## print obj2.id, obj2.__class__, obj3.id, obj3.__class__ changes_flag = changes_flag + 1 setattr(self.objects, obj3.id, obj3) resolved_objects[i] = obj2 = self.objects[obj2.id] ## print ">>>fence2:self,resolver:", getattr(self.objects, obj2.id).__class__, getattr(self.objects, obj2.id).__class__.__bases__, self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ for pointer in self.resolver.links.get1(obj2.id): obj_other, id_other = atlas.resolve_pointer2(self.objects, pointer) obj_other[id_other] = obj2 ## if obj2.id=="right_meadow" and pointer=="meadow1.contains.1": ## if type(obj2.contains[0])==StringType: ## print "eeeerr0:", obj2.id, obj2.contains[0] ## print "!!!!", obj2.id, obj2.__class__, obj2.__class__.__bases__, obj2.contains[0].id, obj2.contains[0].__class__, obj2.contains[0].__class__.__bases__ ## print "fence2:self,resolver:", self.objects["fence2"].__class__, self.objects["fence2"].__class__.__bases__, self.resolver.objects["fence2"].__class__, self.resolver.objects["fence2"].__class__.__bases__ self.check_consistency("loop: %s:" % obj2.id, resolved_objects) ## print "call_trigger: changes loop:", changes_flag, map(lambda o:o.id, resolved_objects) ## print "call_trigger:", map(str_inf, resolved_objects) ## print "call_trigger: links:", self.resolver.links self.check_consistency("after:", resolved_objects) for obj2 in resolved_objects: for func in self.triggers.get(call_type, []): self.check_consistency("before func with %s:" % obj2.id, []) res = func(obj2) self.check_consistency("after func with %s:" % obj2.id, []) if res: self.ask(res) self.check_consistency("after ask with %s:" % obj2.id, []) self.check_consistency("after func:", resolved_objects) finally: self.objects._send_flag = 1
def new_object(self, obj): ok_objects = {} if self.verbose: print "-" * 60 print "new_object:", obj.id for pointer in self.pending.get1(obj.id): if self.verbose: print "pointer:", pointer obj2, id = atlas.resolve_pointer2(self.objects, pointer) #obj2[id] = obj if type(obj2[id]) == StringType: obj2[id] = atlas.resolve_pointer(self.objects, obj2[id]) self.check_bidirectiontal(obj2, id) self.links.add(obj.id, pointer) other_id_lst = self.depencies.get2(pointer) self.depencies.remove(pointer) for other_id in other_id_lst: if self.verbose: print "other_id:", other_id self.depencies.copy(other_id, obj.id) if not self.depencies.get1(other_id): if self.verbose: print "!!", other_id ok_objects[other_id] = self.objects[other_id] self.pending.remove(obj.id) if self.depencies.get1(obj.id): if self.verbose: print "not ok!" else: if self.verbose: print "ok!" ok_objects[obj.id] = self.objects[obj.id] if self.verbose: print "===> ok_objects:", obj.id, ok_objects.keys() print "!!!>", self.pending print "???>", self.depencies #print self.links print "=" * 60 for i in range(4): print import sys sys.stdout.flush() return ok_objects.values()
def new_object(self, obj): ok_objects = {} if self.verbose: print "-"*60 print "new_object:", obj.id for pointer in self.pending.get1(obj.id): if self.verbose: print "pointer:", pointer obj2, id = atlas.resolve_pointer2(self.objects, pointer) #obj2[id] = obj if type(obj2[id])==StringType: obj2[id] = atlas.resolve_pointer(self.objects, obj2[id]) self.check_bidirectiontal(obj2, id) self.links.add(obj.id, pointer) other_id_lst = self.depencies.get2(pointer) self.depencies.remove(pointer) for other_id in other_id_lst: if self.verbose: print "other_id:", other_id self.depencies.copy(other_id, obj.id) if not self.depencies.get1(other_id): if self.verbose: print "!!", other_id ok_objects[other_id] = self.objects[other_id] self.pending.remove(obj.id) if self.depencies.get1(obj.id): if self.verbose: print "not ok!" else: if self.verbose: print "ok!" ok_objects[obj.id] = self.objects[obj.id] if self.verbose: print "===> ok_objects:", obj.id, ok_objects.keys() print "!!!>", self.pending print "???>", self.depencies #print self.links print "="*60 for i in range(4): print import sys sys.stdout.flush() return ok_objects.values()
def delete_op(self, op): id_lst = string.split(op.arg.id, ".") root_obj = self.objects[id_lst[0]] self.objects._send_flag = 0 try: obj, id = atlas.resolve_pointer2(self.objects, op.arg.id) if type(obj) == ListType: del obj[id] else: delattr(obj, id) finally: self.objects._send_flag = 1 if self.verbose: print "deleted entity:", op.arg.id if len(id_lst) > 1: self.call_trigger("set", root_obj) else: self.call_trigger("delete", root_obj) if hasattr(root_obj, "loc"): other = root_obj.loc if hasattr(other, "contains"): other.contains.remove(root_obj) print "removed this object from %s contains" % other.id
def delete_op(self, op): id_lst = string.split(op.arg.id, ".") root_obj = self.objects[id_lst[0]] self.objects._send_flag = 0 try: obj, id = atlas.resolve_pointer2(self.objects, op.arg.id) if type(obj)==ListType: del obj[id] else: delattr(obj, id) finally: self.objects._send_flag = 1 if self.verbose: print "deleted entity:", op.arg.id if len(id_lst)>1: self.call_trigger("set", root_obj) else: self.call_trigger("delete", root_obj) if hasattr(root_obj, "loc"): other = root_obj.loc if hasattr(other, "contains"): other.contains.remove(root_obj) print "removed this object from %s contains" % other.id
def fetch_object_id(self, id_path): try: return atlas.resolve_pointer2(self.server.objects, id_path) except IndexError, KeyError: return None, ""