configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/contentml.py
author m2lahtel
Thu, 21 Oct 2010 16:36:53 +0300
changeset 5 d2c80f5cab53
parent 3 e7e0ae78773e
permissions -rw-r--r--
Updated to version 1.2.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
A plugin implementation for content selection from ConfigurationLayers.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
'''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import re
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import sys
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import shutil
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
import pkg_resources
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import __init__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
from cone.public import exceptions,plugin,utils,api,container
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
from contentplugin import contentmlparser
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
class ContentImpl(plugin.ImplBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    ContentImpl plugin finds all content resources from each layer and copies
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    them to the output correctly. It follows the Configuration project override
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    rules, so that the topmost layer files override files on the previous layers.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    IMPL_TYPE_ID = 'content'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    def __init__(self,ref,configuration):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        Overloading the default constructor
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        plugin.ImplBase.__init__(self,ref,configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        self.desc = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        self.logger = logging.getLogger('cone.content(%s)' % self.ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        self.errors = False
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    50
        self.context = plugin.GenerationContext(configuration=configuration)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    51
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    def list_output_files(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        Return a list of output files as an array. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        if not self.errors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
            copylist = self.get_full_copy_list()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            outputfiles = [entry[1] for entry in copylist]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            return outputfiles
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
            return []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    def get_refs(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
        refs = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        for output in self.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
            refs.extend(output.get_refs())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        if refs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            return refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
    def get_full_copy_list(self, print_info=False):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        fullcopylist = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
        for output in self.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
            for input in output.inputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
                copylist = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
                if print_info:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
                    self.logger.info('Content copy items from %s to %s' % (input.dir,os.path.join(self.output,output.dir)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
                if input.__class__.__name__ == "ContentInput":
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    82
                    copylist = self.create_copy_list(content=self.configuration.layered_content(empty_folders=True),
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
                                                     input=input.dir,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
                                                     output=os.path.join(self.output,output.dir),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
                                                     include_pattern=input.get_include_pattern(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
                                                     exclude_pattern=input.get_exclude_pattern(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
                                                     files=input.get_filelist(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
                                                     flatten=output.flatten,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
                                                     output_file=output.file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
                elif input.__class__.__name__ == "ExternalContentInput":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
                    #Handling external inputs separately
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
                    if input.dir != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
                        fulldir = os.path.abspath(os.path.join(self.configuration.get_project().get_storage().get_path(),input.dir))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
                    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
                        fulldir = self.configuration.get_project().get_storage().get_path()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
                    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    97
                    data = container.DataContainer()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
                    for root, dirs, files in os.walk(fulldir):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    99
                        for f in files:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
                            filepath = utils.resourceref.norm(os.path.join(root, f))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
                            key = utils.resourceref.replace_dir(filepath,fulldir,"")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
                            data.add_value(key,filepath)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   103
                        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   104
                        # If the root contains no directories and no files, it is
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   105
                        # an empty directory and needs to be added
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   106
                        if not dirs and not files:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   107
                            filepath = utils.resourceref.norm(root)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   108
                            key = utils.resourceref.replace_dir(filepath,fulldir,"")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   109
                            data.add_value(key,filepath)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   110
                    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
                    copylist = self.create_copy_list(content=data,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
                                                     input=input.dir,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
                                                     output=os.path.join(self.output,output.dir),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
                                                     include_pattern=input.get_include_pattern(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
                                                     exclude_pattern=input.get_exclude_pattern(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
                                                     files=input.get_filelist(),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
                                                     flatten=output.flatten,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
                                                     output_file=output.file,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
                                                     external=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
                    logging.getLogger('cone.content').warning("Unknown input %s" % (input.__class__.__name__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
                
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
                fullcopylist += copylist
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   124
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
        # Sort to make automated testing easier (list always in same order)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   126
        fullcopylist.sort()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   127
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        return fullcopylist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    def generate(self, context=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
        Generate the given implementation.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   134
        #assert context, "No Context given for generation!"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   135
        self.context = context
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        self.logger.info('Generating')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        self.create_output()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
    def create_output(self,layers=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        Create the output directory from the content folder files
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        if not self.errors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
            copylist = self.get_full_copy_list(True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            for copy_item in copylist:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   147
                source_path = copy_item[0]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   148
                target_path = copy_item[1]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   149
                external = copy_item[2]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   150
                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   151
                self.logger.info('Copy from %s to %s' % (source_path,target_path))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
                
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   153
                # Open file resource if the source is a file
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   154
                file_res = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   155
                if not external and not self.configuration.get_storage().is_folder(source_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   156
                    file_res = self.configuration.get_storage().open_resource(source_path, "rb")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   157
                elif external and os.path.isfile(source_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   158
                    file_res = open(source_path, 'rb')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
                # Copy file or create empty directory
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
                if file_res:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
                    try:        self._copy_file(file_res, target_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   163
                    finally:    file_res.close()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
                else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
                    path = os.path.join(self.context.output, target_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   166
                    if not os.path.exists(path): os.makedirs(path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
            return 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
        else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
            self.logger.error('Plugin had errors! Bailing out!')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   171
    def _copy_file(self, source_file, target_file_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   172
        outfile = self.context.create_file(target_file_path, implementation=self)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   173
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   174
            # Copy data in chunks of max 2 MB to avoid
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   175
            # memory errors with very large files
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   176
            while True:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   177
                data = source_file.read(2 * 1024 * 1024)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   178
                if data:    outfile.write(data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   179
                else:       break
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   180
        finally:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   181
            outfile.close()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
    def create_copy_list(self, **kwargs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
        Return a list copy list where each element is a (from, to, is_external) tuple 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        datacontainer = kwargs.get('content',None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        input_dir     = kwargs.get('input','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        output_dir    = kwargs.get('output','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        output_file   = kwargs.get('output_file','')        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
        include_filter= kwargs.get('include_pattern','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        exclude_filter= kwargs.get('exclude_pattern','')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        files         = kwargs.get('files',[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
        flatten       = kwargs.get('flatten',False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
        external      = kwargs.get('external',False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
        copylist = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        contentfiles = datacontainer.list_keys()      
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        """ 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
        First get only the files list from content files.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   200
        Then apply the possible filters. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        if input_dir == None:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   203
            self.logger.warning("Input dir is none!")
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   205
        files = utils.flatten_list(files)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   206
        self.logger.info("Files: %s" % files)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        if files != []:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
            for f in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
                if f in contentfiles:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
                    pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
                elif f not in  contentfiles:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
                    self.logger.info("File: %s not found in content" % f)   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
        if files != []:
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   217
            contentfiles = files
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        if include_filter != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
            filter_regexp = include_filter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            filter_regexp = filter_regexp.replace('.','\.')         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
            filter_regexp = filter_regexp.replace('*','.*')         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
            self.logger.info("filtering with include %s" % filter_regexp)   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            contentfiles = utils.resourceref.filter_resources(contentfiles,filter_regexp)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        if exclude_filter != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
            filter_regexp = exclude_filter
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
            filter_regexp = filter_regexp.replace('.','\.')            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
            filter_regexp = filter_regexp.replace('*','.*')         
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
            self.logger.info("filtering with exclude %s" % filter_regexp)   
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
            contentfiles = utils.resourceref.neg_filter_resources(contentfiles,filter_regexp)
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   230
        for (index, outfile) in enumerate(contentfiles):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
            sourcefile = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
            targetfile = ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
            
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   234
            # For the startswith() check, make sure that input dir has a trailing slash
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   235
            if input_dir and input_dir[-1] != '/':  input_dir_check = input_dir + '/'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   236
            else:                                   input_dir_check = input_dir
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   237
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   238
            if input_dir != None and (input_dir == outfile or outfile.startswith(input_dir_check)):
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   239
                try:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   240
                    sourcefile = datacontainer.get_value(outfile)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   241
                except KeyError:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   242
                    self.logger.info("Input file not found: %s" % outfile)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
                else:
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   244
                    if flatten:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   245
                        targetfile = utils.resourceref.join_refs([output_dir, os.path.basename(outfile)])
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   246
                        targetfile = utils.resourceref.norm(targetfile)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   247
                    else:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   248
                        targetfile = utils.resourceref.replace_dir(outfile,input_dir,output_dir)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
            elif external:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
                #External inputs
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   251
                try: 
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   252
                    sourcefile = utils.resourceref.norm(datacontainer.get_value(outfile))
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   253
                except KeyError:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   254
                    self.logger.info("Input file not found: %s" % outfile)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
                else:
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   256
                    if flatten:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   257
                        targetfile = utils.resourceref.join_refs([output_dir, os.path.basename(sourcefile)])
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   258
                        targetfile = utils.resourceref.norm(targetfile)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   259
                    else:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   260
                        fulldir = os.path.abspath(os.path.join(self.configuration.get_project().get_storage().get_path(),input_dir))
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   261
                        targetfile = utils.resourceref.replace_dir(sourcefile,fulldir,output_dir)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   262
                    
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   263
            if isinstance(output_file,list):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   264
                #Renaming output if defined
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   265
                targetfile = targetfile.replace(os.path.basename(targetfile), output_file[index])
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   266
            elif output_file:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
                #Renaming output if defined
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
                targetfile = targetfile.replace(os.path.basename(targetfile), output_file)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   269
                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   270
            if sourcefile and targetfile:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   271
                copylist.append((sourcefile,targetfile,external))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        return copylist
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   273
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   274
    def uses_layer(self, layer):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   275
        layered_content = layer.layered_content().list_keys()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   276
        for f in self.get_full_copy_list():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   277
            for file in layered_content:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   278
                if utils.resourceref.norm(os.path.join(utils.resourceref.get_path(layer.get_path()), 'content', file)) == f[0]:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   279
                    return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   280
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   281
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   282
    def uses_layers(self, layers, context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   283
        # Use the base implementation to check with refs first
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   284
        if super(ContentImpl, self).uses_layers(layers, context):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   285
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   286
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   287
        # Then check if any of the files in the copy list come from the layers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   288
        copy_list = self.get_full_copy_list()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   289
        for layer in layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   290
            layered_content = layer.layered_content().list_keys()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   291
            for f in copy_list:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   292
                for file in layered_content:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   293
                    if utils.resourceref.norm(os.path.join(utils.resourceref.get_path(layer.get_path()), 'content', file)) == f[0]:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   294
                        return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   295
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   297
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
class ContentImplReaderBase(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
    FILE_EXTENSIONS = ['content', 'contentml']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
    def read_impl(cls, resource_ref, configuration, etree):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        parser = cls.parser_class()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        desc = parser.parse_desc(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        outputs = parser.parse_outputs(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        phase = parser.parse_phase(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        tags = parser.parse_tags(etree)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        impl = ContentImpl(resource_ref, configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        impl.desc = desc
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        impl.outputs = outputs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        if tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
            impl.set_tags(tags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        for output in impl.outputs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            output.set_configuration(configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        if phase != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
            impl.set_invocation_phase(phase)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        return impl
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
class ContentImplReader1(ContentImplReaderBase, plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
    NAMESPACE = 'http://www.s60.com/xml/content/1'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   324
    NAMESPACE_ID = 'contentml1'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   325
    ROOT_ELEMENT_NAME = 'content'
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
    parser_class = contentmlparser.Content1Parser
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   327
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   328
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   329
    def get_schema_data(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   330
        return pkg_resources.resource_string('contentplugin', 'xsd/contentml.xsd')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
class ContentImplReader2(ContentImplReaderBase, plugin.ReaderBase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    NAMESPACE = 'http://www.s60.com/xml/content/2'
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   334
    NAMESPACE_ID = 'contentml2'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   335
    ROOT_ELEMENT_NAME = 'content'
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
    parser_class = contentmlparser.Content2Parser
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   337
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   338
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   339
    def get_schema_data(cls):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   340
        return pkg_resources.resource_string('contentplugin', 'xsd/contentml2.xsd')