def UpdateDatastoreIndexesAutoXml(self, openfile=open):
    """Update datastore-indexes-auto.xml if appropriate."""




    datastore_indexes_xml_file = os.path.join(
        self.root_path, 'WEB-INF', 'datastore-indexes.xml')
    try:
      datastore_indexes_xml_mtime = os.path.getmtime(datastore_indexes_xml_file)
    except os.error:
      datastore_indexes_xml_mtime = None
    if datastore_indexes_xml_mtime != self.datastore_indexes_xml_mtime:
      self.datastore_indexes_xml_mtime = datastore_indexes_xml_mtime
      if self.datastore_indexes_xml_mtime:
        with openfile(datastore_indexes_xml_file) as f:
          self.datastore_indexes_xml = f.read()
          self.auto_generated = datastore_index_xml.IsAutoGenerated(
              self.datastore_indexes_xml)
      else:
        self.auto_generated = True
        self.datastore_indexes_xml = None

    if not self.auto_generated:
      logging.debug('Detected <datastore-indexes autoGenerated="false">,'
                    ' will not update datastore-indexes-auto.xml')
      return


    datastore_stub = apiproxy_stub_map.apiproxy.GetStub('datastore_v3')
    query_ci_history_len = datastore_stub._QueryCompositeIndexHistoryLength()
    history_changed = (query_ci_history_len != self.last_history_size)
    self.last_history_size = query_ci_history_len
    if not history_changed:
      logging.debug('No need to update datastore-indexes-auto.xml')
      return

    datastore_indexes_auto_xml_file = os.path.join(
        self.root_path, 'WEB-INF', 'appengine-generated',
        'datastore-indexes-auto.xml')
    try:
      with open(datastore_indexes_auto_xml_file) as f:
        datastore_indexes_auto_xml = f.read()
    except IOError, err:
      datastore_indexes_auto_xml = None
    def UpdateDatastoreIndexesAutoXml(self, openfile=open):
        """Update datastore-indexes-auto.xml if appropriate."""

        datastore_indexes_xml_file = os.path.join(self.root_path, 'WEB-INF',
                                                  'datastore-indexes.xml')
        try:
            datastore_indexes_xml_mtime = os.path.getmtime(
                datastore_indexes_xml_file)
        except os.error:
            datastore_indexes_xml_mtime = None
        if datastore_indexes_xml_mtime != self.datastore_indexes_xml_mtime:
            self.datastore_indexes_xml_mtime = datastore_indexes_xml_mtime
            if self.datastore_indexes_xml_mtime:
                with openfile(datastore_indexes_xml_file) as f:
                    self.datastore_indexes_xml = f.read()
                    self.auto_generated = datastore_index_xml.IsAutoGenerated(
                        self.datastore_indexes_xml)
            else:
                self.auto_generated = True
                self.datastore_indexes_xml = None

        if not self.auto_generated:
            logging.debug('Detected <datastore-indexes autoGenerated="false">,'
                          ' will not update datastore-indexes-auto.xml')
            return

        datastore_stub = apiproxy_stub_map.apiproxy.GetStub('datastore_v3')
        query_ci_history_len = datastore_stub._QueryCompositeIndexHistoryLength(
        )
        history_changed = (query_ci_history_len != self.last_history_size)
        self.last_history_size = query_ci_history_len
        if not history_changed:
            logging.debug('No need to update datastore-indexes-auto.xml')
            return

        datastore_indexes_auto_xml_file = os.path.join(
            self.root_path, 'WEB-INF', 'appengine-generated',
            'datastore-indexes-auto.xml')
        try:
            with open(datastore_indexes_auto_xml_file) as f:
                datastore_indexes_auto_xml = f.read()
        except IOError as err:
            datastore_indexes_auto_xml = None

        if self.datastore_indexes_xml:
            try:
                manual_index_definitions = (
                    datastore_index_xml.IndexesXmlToIndexDefinitions(
                        self.datastore_indexes_xml))
            except validation.ValidationError as e:
                logging.error('Error parsing %s: %s',
                              datastore_indexes_xml_file, e)
                return
        else:
            manual_index_definitions = datastore_index.IndexDefinitions(
                indexes=[])

        if datastore_indexes_auto_xml:
            try:
                prev_auto_index_definitions = (
                    datastore_index_xml.IndexesXmlToIndexDefinitions(
                        datastore_indexes_auto_xml))
            except validation.ValidationError as e:
                logging.error('Error parsing %s: %s',
                              datastore_indexes_auto_xml_file, e)
                return
        else:
            prev_auto_index_definitions = datastore_index.IndexDefinitions(
                indexes=[])

        all_index_definitions = datastore_index.IndexDefinitions(
            indexes=(manual_index_definitions.indexes +
                     prev_auto_index_definitions.indexes))
        query_history = datastore_stub.QueryHistory()
        auto_index_dict = GenerateIndexDictFromHistory(
            query_history, all_index_definitions, manual_index_definitions)
        auto_indexes, counts = self._IndexesFromIndexDict(auto_index_dict)
        auto_index_definitions = datastore_index.IndexDefinitions(
            indexes=auto_indexes)
        if auto_index_definitions == prev_auto_index_definitions:
            return

        try:
            appengine_generated = os.path.dirname(
                datastore_indexes_auto_xml_file)
            if not os.path.exists(appengine_generated):
                os.mkdir(appengine_generated)
            with open(datastore_indexes_auto_xml_file, 'w') as f:
                f.write(self._IndexXmlFromIndexes(auto_indexes, counts))
        except os.error as err:
            logging.error('Could not update %s: %s',
                          datastore_indexes_auto_xml_file, err)