public void performUpgrade()

in bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java [78:221]


    public void performUpgrade(Environment environment, UpgradeInteractionHandler handler, ConfiguredObject<?> parent)
    {
        reportStarting(environment, 7);

        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setTransactional(true);
        dbConfig.setAllowCreate(true);

        Database hierarchyDb = environment.openDatabase(null, "CONFIGURED_OBJECT_HIERARCHY", dbConfig);
        Database configuredObjectsDb = environment.openDatabase(null, "CONFIGURED_OBJECTS", dbConfig);
        Database configVersionDb = environment.openDatabase(null, "CONFIG_VERSION", dbConfig);
        Database messageMetadataDb = environment.openDatabase(null, "MESSAGE_METADATA", dbConfig);
        Database messageMetadataSeqDb = environment.openDatabase(null, "MESSAGE_METADATA.SEQ", dbConfig);

        long maxMessageId = getMaximumMessageId(messageMetadataDb);
        createMessageMetadataSequence(messageMetadataSeqDb, maxMessageId);

        Cursor objectsCursor = null;

        String stringifiedConfigVersion = BrokerModel.MODEL_VERSION;
        int configVersion = getConfigVersion(configVersionDb);
        if (configVersion > -1)
        {
            stringifiedConfigVersion = "0." + configVersion;
        }
        configVersionDb.close();

        String virtualHostName = parent.getName();
        Map<String, Object> virtualHostAttributes = new HashMap<>();
        virtualHostAttributes.put("modelVersion", stringifiedConfigVersion);
        virtualHostAttributes.put("name", virtualHostName);
        UUID virtualHostId = UUIDGenerator.generateVhostUUID(virtualHostName);
        ConfiguredObjectRecord virtualHostRecord = new org.apache.qpid.server.store.ConfiguredObjectRecordImpl(virtualHostId, "VirtualHost", virtualHostAttributes);

        Transaction txn = environment.beginTransaction(null, null);

        try
        {
            objectsCursor = configuredObjectsDb.openCursor(txn, null);
            DatabaseEntry key = new DatabaseEntry();
            DatabaseEntry value = new DatabaseEntry();
            ObjectMapper mapper = new ObjectMapper();

            while (objectsCursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
            {
                UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
                TupleInput input = TupleBinding.entryToInput(value);
                String type = input.readString();
                String json = input.readString();
                Map<String,Object> attributes = null;
                try
                {
                    attributes = mapper.readValue(json, MAP_TYPE_REFERENCE);
                }
                catch (Exception e)
                {
                    throw new StoreException(e);
                }
                String name = (String)attributes.get("name");

                if (type.equals("Exchange"))
                {
                    _defaultExchanges.remove(name);
                }

                if(!type.endsWith("Binding"))
                {
                    storeVirtualHostHierarchyRecord(hierarchyDb, txn, id, virtualHostId);
                }
                else
                {
                    try
                    {
                        DatabaseEntry hierarchyKey = new DatabaseEntry();
                        DatabaseEntry hierarchyValue = new DatabaseEntry();

                        Object queueIdString = attributes.remove("queue");
                        if(queueIdString instanceof String)
                        {
                            UUID queueId = UUID.fromString(queueIdString.toString());
                            UUIDTupleBinding.getInstance().objectToEntry(queueId,hierarchyValue);
                            TupleOutput tupleOutput = new TupleOutput();
                            tupleOutput.writeLong(id.getMostSignificantBits());
                            tupleOutput.writeLong(id.getLeastSignificantBits());
                            tupleOutput.writeString("Queue");
                            TupleBinding.outputToEntry(tupleOutput, hierarchyKey);
                            hierarchyDb.put(txn, hierarchyKey, hierarchyValue);
                        }
                        Object exchangeIdString = attributes.remove("exchange");
                        if(exchangeIdString instanceof String)
                        {
                            UUID exchangeId = UUID.fromString(exchangeIdString.toString());
                            UUIDTupleBinding.getInstance().objectToEntry(exchangeId,hierarchyValue);
                            TupleOutput tupleOutput = new TupleOutput();
                            tupleOutput.writeLong(id.getMostSignificantBits());
                            tupleOutput.writeLong(id.getLeastSignificantBits());
                            tupleOutput.writeString("Exchange");
                            TupleBinding.outputToEntry(tupleOutput, hierarchyKey);
                            hierarchyDb.put(txn, hierarchyKey, hierarchyValue);
                        }
                        TupleOutput tupleOutput = new TupleOutput();
                        tupleOutput.writeString(type);
                        StringWriter writer = new StringWriter();
                        mapper.writeValue(writer,attributes);
                        tupleOutput.writeString(writer.getBuffer().toString());
                        TupleBinding.outputToEntry(tupleOutput, value);
                        objectsCursor.putCurrent(value);
                    }
                    catch (IOException e)
                    {
                        throw new StoreException(e);
                    }
                }
            }
        }
        finally
        {
            if(objectsCursor != null)
            {
                objectsCursor.close();
            }
        }

        storeConfiguredObjectEntry(configuredObjectsDb, txn, virtualHostRecord);
        for (Map.Entry<String, String> defaultExchangeEntry : _defaultExchanges.entrySet())
        {
            UUID id = UUIDGenerator.generateExchangeUUID(defaultExchangeEntry.getKey(), virtualHostName);
            Map<String, Object> exchangeAttributes = new HashMap<>();
            exchangeAttributes.put("name", defaultExchangeEntry.getKey());
            exchangeAttributes.put("type", defaultExchangeEntry.getValue());
            exchangeAttributes.put("lifetimePolicy", "PERMANENT");
            ConfiguredObjectRecord exchangeRecord = new org.apache.qpid.server.store.ConfiguredObjectRecordImpl(id, "Exchange", exchangeAttributes);
            storeConfiguredObjectEntry(configuredObjectsDb, txn, exchangeRecord);
            storeVirtualHostHierarchyRecord(hierarchyDb, txn, id, virtualHostId);
        }
        txn.commit();

        hierarchyDb.close();
        configuredObjectsDb.close();
        messageMetadataDb.close();
        messageMetadataSeqDb.close();

        reportFinished(environment, 8);
    }