コード例 #1
0
 def GetTypeRoles(self, tp):
     if IsUri(tp):
         return self.GetTypeRolesByUri(tp)
     else:
         path = tp.split('.')
         if len(path) > 1:
             return self.GetTypeRolesByName(path[0], path[1])
     return None
コード例 #2
0
 def GetResolvableUri(self):
     value = self.part.get(self.role)
     if isinstance(value, basestring):
         if IsUri(value):
             return value
         else:
             path = value.split('.')
             if len(path) > 1:
                 return appdata.datamodel.GetEntityUri(path[0], path[1])
コード例 #3
0
    def CreateEditor(self, tree):
        roles = set()
        values = set()

        for v in self.option['parts']:
            roles |= v.viewkeys()
            if 'self' in v:
                roles.add(v['self'])

        roles |= self.pattern['signature'].viewkeys()
        roles |= set(['type', 'uri'])
        roles -= set(self.part.keys())
        roles.discard('self')

        values = []
        tp = None
        if self.role != 'type':
            tp = self.part.get('type', None)

        props = appdata.datamodel.GetAvailableProps(tp)
        values += props.keys()

        roles = sorted(roles)
        values = sorted(values)

        if self.role:
            if self.role in roles:
                roles.remove(self.role)

            roles.insert(0, self.role)

            value_names = []
            for v in value2list(self.part[self.role]):
                if IsUri(v):
                    n = appdata.datamodel.GetEntityName(v)
                    if n:
                        value_names.append(n)
                    else:
                        value_names.append(v)
                else:
                    value_names.append(v)
            value = '|'.join(value_names)
            if values in values:
                values.remove(value)
            values.insert(0, value)

        if self.editor_value:
            if self.editor_value in values:
                values.remove(self.editor_value)
            values.insert(0, self.editor_value)
            self.editor_value = None

        return PattternRoleEditor(tree, roles, values,
                                  GenerateSortedModel(roles),
                                  appdata.datamodel.GetModel())
コード例 #4
0
    def GetEntityDoc(self, text):
        uri = None
        if IsUri(text):
            uri = text
        else:
            path = text.split('.')
            if len(path) > 1:
                uri = self.GetEntityUri(path[0], path[1])

        if uri:
            for doc in appdata.documents(GraphDocument):
                for t in doc.grTriplesForSubj(uri):
                    if t.p in (kb.rdf_type, kb.rdfs_subclassof):
                        return doc
コード例 #5
0
 def ViewType(self):
     value = self.part.get('uri', self.part.get('type'))
     if isinstance(value, basestring):
         if IsUri(value):
             return appdata.environment_manager.FindViewType(
                 self.doc, value)
         else:
             path = value.split('.')
             if len(path) > 1:
                 if path[0] == 'part2':
                     return type('', (Part2TypesView, ),
                                 dict(bound_uri='part2:' + path[1]))
                 elif path[0] == 'patterns':
                     if path[1] in self.doc.patterns:
                         return type(
                             '', (PatternsView, ),
                             dict(document=self.doc, bound_uri=path[1]))
                 else:
                     uri = appdata.datamodel.GetEntityUri(path[0], path[1])
                     if uri:
                         return appdata.environment_manager.FindViewType(
                             self.doc, uri)
コード例 #6
0
    def ResolveNameOrUri(self, value, tp = None, force_uri = False):
        is_uri = IsUri(value)

        if is_uri and force_uri:
            return value

        props = self.GetAvailableProps(tp)
        for propname, prop in props.iteritems():
            if is_uri and 'uri' in prop and prop['uri'] == value:
                return propname
            elif not is_uri and value == propname:
                return propname

        if is_uri:
            path = self.GetEntityModuleAndName(value)
        else:
            path = value.split('.')

        if path and len(path) > 1:
            if path[0] == 'part2':
                return value
            doc = self.modules.get(path[0])
            if doc:
                templates = doc.grGetTemplates()
                if path[1] in templates:
                    if force_uri:
                        return templates[path[1]]
                    else:
                        return '.'.join((path[0], path[1]))
                else:
                    m = self.entities.get(path[0])
                    if m:
                        curi = m.get(path[1])
                        if curi:
                            return expand_uri(curi)

        return value
コード例 #7
0
ファイル: patterns.py プロジェクト: yogeshsajanikar/dot15926
    def build(self, doc, roles, items=None, current=None, done=None):
        if self.base:
            if hasattr(self.base, 'build'):
                roles = self.base.build(doc, self.prepare_base_props(roles),
                                        items, current, done)
                return self.translate_base(roles, True)
            else:
                return

        if self.value:
            return {self.ownrole if self.ownrole else name: self.value}

        if self.function:
            value = eval(self.function, dict(roles))
            return {self.ownrole if self.ownrole else name: value}

        itemid = None

        if self.name in roles and not self.ownrole:
            itemid = roles[self.name]
        else:
            if self.uri:
                if len(self.uri) == 1:
                    itemid = iter(self.uri).next()
                else:
                    return
            elif self.ownrole:
                if self.ownrole in roles:
                    itemid = roles[self.ownrole]
                    if not itemid:
                        return

            if not itemid:
                found = self.scan_by_roles(doc, roles)
                if len(found) == 1:
                    itemid = iter(found).next()
                    # if items != None:
                    #     items.add(itemid)
                    # return {self.ownrole if self.ownrole else name: itemid}
            elif itemid != 'new':
                if not IsUri(itemid):
                    itemid = doc.basens + itemid
            else:
                itemid = doc.infGenerateUri()

        for k, v in self.roles.iteritems():
            if v == 'self':
                continue
            value = roles.get(k)
            if not value and (not itemid or not v.get('is_optional')):
                return

        if not itemid:
            itemid = doc.infGenerateUri()

        result = {}
        result[self.ownrole if self.ownrole else self.name] = itemid

        triples = doc.grTriplesForSubj(itemid)

        if self.types and len(self.types) == 1:
            if (itemid, kb.rdf_type) not in done:
                if (itemid, kb.rdf_type) not in current:
                    for t in triples:
                        if t.p == kb.rdf_type:
                            t.deletefrom(doc)
                current.add((itemid, kb.rdf_type))
                for v in self.types:
                    ObjectTriple.insert(doc, itemid, kb.rdf_type, v)

        for k, v in self.roles.iteritems():
            if v == 'self':
                continue
            value = roles.get(k)
            if not value:
                continue

            if (itemid, v['uri']) in done:
                continue

            if value == 'new':
                if not v['is_literal']:
                    value = doc.infGenerateUri()
                result[k] = value

            if (itemid, v['uri']) not in current:
                for t in triples:
                    if t.p == v['uri']:
                        t.deletefrom(doc)

            current.add((itemid, v['uri']))

            if v['is_literal']:
                LiteralTriple.insert(doc, itemid, v['uri'], value)
            else:
                ObjectTriple.insert(doc, itemid, v['uri'], value)

        doc.AsyncChangeState(doc.state_changed)
        if items != None:
            items.add(itemid)
        return result
コード例 #8
0
ファイル: patterns.py プロジェクト: yogeshsajanikar/dot15926
    def __init__(self, part, index, option, pattern):
        if not part:
            raise PatternPartException(pattern, option, index, 'empty part')

        part = copy.copy(part)
        tp = part.pop('type', None)
        self.uri = part.pop('uri', None)
        self.roles = part
        self.props = {}
        self.ownrole = part.pop('self', None)
        self.option = option
        self.pattern = pattern
        self.index = index
        self.base = None
        self.typename = None
        self.types = set()
        self.name = 'part_%i' % self.index
        self.value = part.pop('value', None)
        self.function = part.pop('lambda', None)
        self.use_classification = False

        if self.uri:
            self.uri = set_lift(self.uri)

        if tp:
            if isinstance(tp, basestring):
                if IsUri(tp):
                    self.use_classification = True
                    self.types = set_lift(tp)
                else:
                    try:
                        tp = eval(tp, {}, self.pattern.env.work_env)
                    except:
                        raise PatternPartException(
                            pattern, option, index,
                            'type %s not evaluated' % tp)
                    if isinstance(tp, PatternProxy) or isinstance(
                            tp, PatternOption):
                        self.base = tp
                    else:
                        if getattr(tp, 'uri', None) != None:
                            self.types = set_lift(tp.uri)
                        if getattr(tp, 'template', None) != None:
                            self.typename = tp.template['name']
            else:
                self.use_classification = True
                self.types = set_lift(tp)

        for k, v in self.roles.iteritems():
            if self.base:
                if v not in self.base.GetRoles():
                    raise PatternPartException(
                        pattern, option, index,
                        'role %s not found in base pattern' % v)
                self.props[v] = k
            elif isinstance(v, basestring):
                prop = None

                if tp and hasattr(tp, 'get_prop'):
                    prop = tp.get_prop(v)

                if not prop and self.pattern.env.graph:
                    doc = self.pattern.env.graph
                    prop_uri = doc.roles_by_name.get(v)
                    if not prop_uri:
                        prop_uri = doc.annotations_by_name.get(v)
                    if not prop_uri:
                        prop_uri = v
                    prop = doc.props_by_uri.get(prop_uri)

                if prop:
                    self.props[prop['uri']] = k
                    self.roles[k] = prop
                elif IsUri(v):
                    self.props[v] = k
                    self.roles[k] = {
                        'uri': v,
                        'is_literal': False,
                        'is_optional': True
                    }
                else:
                    raise PatternPartException(
                        pattern, option, index,
                        'property %s not found in environment' % v)
            else:
                raise PatternPartException(pattern, option, index,
                                           'property %s not evaluated' % v)

        if self.ownrole:
            self.roles[self.ownrole] = 'self'
コード例 #9
0
    def GetNameAndIcon(self, value, tp = None):
        is_uri = IsUri(value)

        if is_uri:
            v = kb.uri2name(value)
            if v:
                is_uri = False
                value = v

        if tp:
            if tp.startswith('patterns.'):
                return value, 'iso_literal'

            v = kb.uri2name(tp)
            if v:
                tp = v
 
            roles = self.GetTypeRoles(tp)
            role = None
            if roles:
                if is_uri:
                    for v in roles.itervalues():
                        if value == v.get('uri'):
                            role = v
                            break
                else:
                    role = roles.get(value)

            if role:
                if tp.startswith('part2.'):
                    type_uri = role['type_uri']
                    if type_uri.startswith('xsd:'):
                        return role['name'], 'iso_syntax'
                    else:
                        return role['name'], kb.icons_map.get(kb.part2_itself[type_uri]['icon'], 'iso_unknown')
                else:
                    doc = self.GetEntityDoc(tp)
                    type_uri = roles[value]['type_uri']
                    restricted_by_value = roles[value].get('restricted_by_value', False)
                    type_label, type_icon = doc.infGetRestrictionNameAndIcon(type_uri, restricted_by_value)
                    return role['name'], type_icon
        else:
            uri = None
            if is_uri:
                uri = value
            else:
                path = value.split('.')
                if path[0] == 'part2':
                    if 'part2:'+path[1] in kb.part2_itself:
                        return path[1], kb.part2_itself['part2:'+path[1]]['icon']
                if len(path) > 1:
                    uri = self.GetEntityUri(path[0], path[1])
            if uri:
                doc = self.GetEntityDoc(uri)
                if doc:
                    name, tp_label, icon  = doc.infGetEntityVisual(uri)
                    if isinstance(name, list):
                        name = ', '.join(name)
                    return name, icon

        for k, v in appdata.project.annotations:
            if (is_uri and v == value) or (not is_uri and k == value):
                return k, 'iso_annotation'

        for k, v in appdata.project.roles:
            if (is_uri and v == value) or (not is_uri and k == value):
                return k, 'iso_role'

        return value, 'iso_unknown'