All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.joynr.android.contentprovider.PersistentJoynrContentProvider Maven / Gradle / Ivy

/*-
 * #%L
 * %%
 * Copyright (C) 2020 BMW Car IT GmbH
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package io.joynr.android.contentprovider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import io.joynr.android.AndroidBinderRuntime;
import io.joynr.capabilities.PropertiesFileParticipantIdStorage;
import io.joynr.provider.AbstractJoynrProvider;
import io.joynr.provider.ProviderContainer;
import io.joynr.provider.ProviderContainerFactory;
import io.joynr.runtime.PropertyLoader;
import joynr.types.DiscoveryEntry;
import joynr.types.ProviderQos;

import static io.joynr.messaging.ConfigurableMessagingSettings.PROPERTY_DISCOVERY_PROVIDER_DEFAULT_EXPIRY_TIME_MS;
import static io.joynr.messaging.MessagingPropertyKeys.DEFAULT_MESSAGING_PROPERTIES_FILE;
import static io.joynr.util.VersionUtil.getVersionFromAnnotation;

/**
 * Class that users can inherit in order to abstract from the process of initial persistent
 * provider registration.
 */
public abstract class PersistentJoynrContentProvider extends ContentProvider {

    private final int INIT_URL = 1;
    private final String[] CURSOR_COLUMN_NAMES = {
            "providerVersionMajor",
            "providerVersionMinor",
            "domain",
            "interfaceName",
            "participantId",
            "qosCustomParameters",
            "qosPriority",
            "qosScope",
            "qosSupportsOnChangeSubscriptions",
            "lastSeenDateMs",
            "expiryDateMs",
            "publicKeyId"
    };

    private long defaultExpiryTimeMs = 0L;

    private List providers;

    static UriMatcher uriMatcher;

    public PersistentJoynrContentProvider() {
        providers = new ArrayList<>();
    }

    @Override
    public boolean onCreate() {
        String contentProviderName = getContext().getPackageName() + ".provider";
        String queryString = "init";
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(contentProviderName, queryString, INIT_URL);
        providers = registerPersistentProvider();
        defaultExpiryTimeMs = getDefaultExpiryTimeMs();

        return true;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {

        MatrixCursor mc = null;
        switch (uriMatcher.match(uri)) {
            case INIT_URL:
                mc = new MatrixCursor(CURSOR_COLUMN_NAMES);
                for (PersistentProvider persistentProvider : providers) {
                    DiscoveryEntry discoveryEntry = generatePrimitiveDiscoveryEntry(persistentProvider);
                    mc.newRow()
                            .add(CURSOR_COLUMN_NAMES[0], discoveryEntry.getProviderVersion().getMajorVersion())
                            .add(CURSOR_COLUMN_NAMES[1], discoveryEntry.getProviderVersion().getMinorVersion())
                            .add(CURSOR_COLUMN_NAMES[2], discoveryEntry.getDomain())
                            .add(CURSOR_COLUMN_NAMES[3], discoveryEntry.getInterfaceName())
                            .add(CURSOR_COLUMN_NAMES[4], discoveryEntry.getParticipantId())
                            .add(CURSOR_COLUMN_NAMES[5], discoveryEntry.getQos().getCustomParameters())
                            .add(CURSOR_COLUMN_NAMES[6], discoveryEntry.getQos().getPriority())
                            .add(CURSOR_COLUMN_NAMES[7], discoveryEntry.getQos().getScope())
                            .add(CURSOR_COLUMN_NAMES[8], discoveryEntry.getQos().getSupportsOnChangeSubscriptions())
                            .add(CURSOR_COLUMN_NAMES[9], discoveryEntry.getLastSeenDateMs())
                            .add(CURSOR_COLUMN_NAMES[10], discoveryEntry.getExpiryDateMs())
                            .add(CURSOR_COLUMN_NAMES[11], discoveryEntry.getPublicKeyId());
                }
            default:
                // no-op
        }
        return mc;
    }

    private DiscoveryEntry generatePrimitiveDiscoveryEntry(
            PersistentProvider provider
    ) {

        ProviderContainerFactory providerContainerFactory = AndroidBinderRuntime.getInjector().getInstance(ProviderContainerFactory.class);
        ProviderContainer providerContainer = providerContainerFactory.create(provider.joynrProvider);
        PropertiesFileParticipantIdStorage participantIdStorage =
                AndroidBinderRuntime
                        .getInjector()
                        .getInstance(PropertiesFileParticipantIdStorage.class);

        String participantId = participantIdStorage.getProviderParticipantId(
                provider.domain,
                providerContainer.getInterfaceName(),
                providerContainer.getMajorVersion());

        String defaultPublicKeyId = "";
        DiscoveryEntry discoveryEntry = new DiscoveryEntry(
                getVersionFromAnnotation(provider.joynrProvider.getClass()),
                provider.domain,
                providerContainer.getInterfaceName(),
                participantId,
                provider.providerQos,
                System.currentTimeMillis(),
                System.currentTimeMillis() + defaultExpiryTimeMs,
                defaultPublicKeyId);

        return discoveryEntry;
    }

    private long getDefaultExpiryTimeMs() {
        Properties defaultMessagingProperties = PropertyLoader.loadProperties(DEFAULT_MESSAGING_PROPERTIES_FILE);
        return Long.parseLong(defaultMessagingProperties.getProperty(PROPERTY_DISCOVERY_PROVIDER_DEFAULT_EXPIRY_TIME_MS));
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    /**
     * Method to create and register a list of providers that are meant to be subjected to special
     * conditions as soon as the component is started, since the Android ContentProvider is called
     * before anything else. These conditions, e.g., to control provider behavior within a system,
     * must be implemented by the interested party/system component.
     *
     * @return List of joynr persistent providers that are going to be registered
     */
    public abstract List registerPersistentProvider();

    public class PersistentProvider {
        private AbstractJoynrProvider joynrProvider;
        private String domain;
        private ProviderQos providerQos;

        public PersistentProvider(AbstractJoynrProvider joynrProvider, String domain, ProviderQos providerQos) {
            this.joynrProvider = joynrProvider;
            this.domain = domain;
            this.providerQos = providerQos;
        }

        public AbstractJoynrProvider getJoynrProvider() {
            return joynrProvider;
        }

        public void setJoynrProvider(AbstractJoynrProvider joynrProvider) {
            this.joynrProvider = joynrProvider;
        }

        public String getDomain() {
            return domain;
        }

        public void setDomain(String domain) {
            this.domain = domain;
        }

        public ProviderQos getProviderQos() {
            return providerQos;
        }

        public void setProviderQos(ProviderQos providerQos) {
            this.providerQos = providerQos;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy