com.baasbox.db.Evolution_0_8_4.java Source code

Java tutorial

Introduction

Here is the source code for com.baasbox.db.Evolution_0_8_4.java

Source

/*
 * Copyright (c) 2014.
 *
 * BaasBox - info-at-baasbox.com
 *
 * 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.
 */

package com.baasbox.db;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import com.baasbox.configuration.Push;
import com.baasbox.configuration.index.IndexPushConfiguration;
import com.baasbox.dao.RoleDao;
import com.baasbox.dao.UserDao;
import com.baasbox.dao.exception.DocumentNotFoundException;
import com.baasbox.dao.exception.InvalidModelException;
import com.baasbox.enumerations.DefaultRoles;
import com.baasbox.exception.IndexNotFoundException;
import com.baasbox.service.logging.BaasBoxLogger;
import com.baasbox.util.ConfigurationFileContainer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.orientechnologies.orient.core.db.record.ODatabaseRecordTx;
import com.orientechnologies.orient.core.db.record.OTrackedMap;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.index.mvrbtree.OMVRBTree.EntrySet;
import com.orientechnologies.orient.core.record.impl.ODocument;

public class Evolution_0_8_4 implements IEvolution {
    private String version = "0.8.4";

    public Evolution_0_8_4() {
    }

    @Override
    public String getFinalVersion() {
        return version;
    }

    @Override
    public void evolve(ODatabaseRecordTx db) {
        BaasBoxLogger.info("Applying evolutions to evolve to the " + version + " level");
        try {
            registeredRoleInheritsFromAnonymousRole(db);
            updateDefaultTimeFormat(db);
            //            addScriptsClass(db);
            //            addScriptsPermission();
            multiPushProfileSettings(db);
            exposeSocialId(db);
        } catch (Throwable e) {
            BaasBoxLogger.error("Error applying evolution to " + version + " level!!", e);
            throw new RuntimeException(e);
        }
        BaasBoxLogger.info("DB now is on " + version + " level");
    }

    //issue #195 Registered users should have access to anonymous resources
    private void registeredRoleInheritsFromAnonymousRole(ODatabaseRecordTx db) {
        BaasBoxLogger.info("...updating registered role");

        RoleDao.getRole(DefaultRoles.ADMIN.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, RoleDao.getRole("admin").getDocument().getRecord()).save();
        RoleDao.getRole(DefaultRoles.ANONYMOUS_USER.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, RoleDao.getRole("writer").getDocument().getRecord()).save();
        RoleDao.getRole(DefaultRoles.REGISTERED_USER.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, RoleDao.getRole("anonymous").getDocument().getRecord()).save();
        RoleDao.getRole(DefaultRoles.BACKOFFICE_USER.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, RoleDao.getRole("writer").getDocument().getRecord()).save();

        RoleDao.getRole(DefaultRoles.BASE_READER.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, (ODocument) null).save();
        RoleDao.getRole(DefaultRoles.BASE_WRITER.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, (ODocument) null).save();
        RoleDao.getRole(DefaultRoles.BASE_ADMIN.toString()).getDocument()
                .field(RoleDao.FIELD_INHERITED, (ODocument) null).save();

        db.getMetadata().reload();
        BaasBoxLogger.info("...done");
    }

    private void updateDefaultTimeFormat(ODatabaseRecordTx db) {
        DbHelper.execMultiLineCommands(db, true, "alter database DATETIMEFORMAT yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    }

    /***
     * creates new records for new push settings and migrates the old ones into the profile n.1
     * @param db
     */
    private void multiPushProfileSettings(ODatabaseRecordTx db) {
        IndexPushConfiguration idx;
        try {
            idx = new IndexPushConfiguration();
        } catch (IndexNotFoundException e) {
            throw new RuntimeException(e);
        }

        //load the old settings
        String sandbox = null;
        if (idx.get("push.sandbox.enable") == null)
            sandbox = "true";
        else
            sandbox = idx.get("push.sandbox.enable").toString();
        //String sandbox = StringUtils.defaultString(()idx.get("push.sandbox.enable"),"true");
        String appleTimeout = null;
        if (idx.get("push.apple.timeout") == null)
            appleTimeout = "0";
        else
            appleTimeout = idx.get("push.apple.timeout").toString();

        //StringUtils.defaultString((String)idx.get("push.apple.timeout"),null);

        String sandboxAndroidApiKey = StringUtils.defaultString((String) idx.get("sandbox.android.api.key"), null);
        String sandBoxIosCertificatePassword = StringUtils
                .defaultString((String) idx.get("sandbox.ios.certificate.password"), null);

        String prodAndroidApiKey = StringUtils.defaultString((String) idx.get("production.android.api.key"), null);
        String prodBoxIosCertificatePassword = StringUtils
                .defaultString((String) idx.get("production.ios.certificate.password"), null);

        //Houston we have a problem. Here we have to handle the iOS certificates that are files!
        Object sandBoxIosCertificate = getValueAsFileContainer(idx.get("sandbox.ios.certificate"));
        Object prodBoxIosCertificate = getValueAsFileContainer(idx.get("production.ios.certificate"));

        try {
            //set the new profile1 settings
            Push.PROFILE1_PRODUCTION_ANDROID_API_KEY._setValue(prodAndroidApiKey);
            if (prodBoxIosCertificate != null)
                Push.PROFILE1_PRODUCTION_IOS_CERTIFICATE._setValue(prodBoxIosCertificate);
            Push.PROFILE1_PRODUCTION_IOS_CERTIFICATE_PASSWORD._setValue(prodBoxIosCertificatePassword);
            Push.PROFILE1_PUSH_APPLE_TIMEOUT._setValue(appleTimeout);
            Push.PROFILE1_SANDBOX_ANDROID_API_KEY._setValue(sandboxAndroidApiKey);
            if (sandBoxIosCertificate != null)
                Push.PROFILE1_SANDBOX_IOS_CERTIFICATE._setValue(sandBoxIosCertificate);
            Push.PROFILE1_SANDBOX_IOS_CERTIFICATE_PASSWORD._setValue(sandBoxIosCertificatePassword);
            Push.PROFILE1_PUSH_SANDBOX_ENABLE._setValue(sandbox);

            Push.PROFILE1_PUSH_PROFILE_ENABLE.setValue(false);
            try {
                Push.PROFILE1_PUSH_PROFILE_ENABLE.setValue(true);
            } catch (Exception e) {
                Push.PROFILE1_PUSH_PROFILE_ENABLE.setValue(false);
            }

            //disable other profiles
            Push.PROFILE2_PUSH_PROFILE_ENABLE._setValue(false);
            Push.PROFILE3_PUSH_PROFILE_ENABLE._setValue(false);

            //default value other profiles
            Push.PROFILE2_PUSH_SANDBOX_ENABLE._setValue(true);
            Push.PROFILE2_PRODUCTION_ANDROID_API_KEY._setValue("");
            //Push.PROFILE2_PRODUCTION_IOS_CERTIFICATE
            Push.PROFILE2_PRODUCTION_IOS_CERTIFICATE_PASSWORD._setValue("");
            Push.PROFILE2_PUSH_APPLE_TIMEOUT._setValue(0);
            Push.PROFILE2_SANDBOX_ANDROID_API_KEY._setValue("");
            //Push.PROFILE2_SANDBOX_IOS_CERTIFICATE
            Push.PROFILE2_SANDBOX_IOS_CERTIFICATE_PASSWORD._setValue("");

            Push.PROFILE3_PUSH_SANDBOX_ENABLE._setValue(true);
            Push.PROFILE3_PRODUCTION_ANDROID_API_KEY._setValue("");
            //Push.PROFILE3_PRODUCTION_IOS_CERTIFICATE
            Push.PROFILE3_PRODUCTION_IOS_CERTIFICATE_PASSWORD._setValue("");
            Push.PROFILE3_PUSH_APPLE_TIMEOUT._setValue(0);
            Push.PROFILE3_SANDBOX_ANDROID_API_KEY._setValue("");
            //Push.PROFILE3_SANDBOX_IOS_CERTIFICATE
            Push.PROFILE3_SANDBOX_IOS_CERTIFICATE_PASSWORD._setValue("");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //this is needed due iOS certificates migrations
    private ConfigurationFileContainer getValueAsFileContainer(Object v) {
        ConfigurationFileContainer result = null;
        if (v != null) {
            ObjectMapper om = new ObjectMapper();
            try {
                result = om.readValue(v.toString(), ConfigurationFileContainer.class);
            } catch (Exception e) {
                e.printStackTrace();
                return result;
            }
        }
        return result;
    }

    /***
     * expose some attributes when users logged in via social network
     * @param db
     * @throws DocumentNotFoundException 
     * @throws InvalidModelException 
     */
    private void exposeSocialId(ODatabaseRecordTx db) throws InvalidModelException, DocumentNotFoundException {
        //take all users and expose their generated flag
        //remove permission for registered users to system attributes
        //put the signupdate in user system info
        //put the _social data structure into the visiblyByRegisteredUsers attribute
        DbHelper.execMultiLineCommands(db, true,
                new String[] { "update _bb_user set generated = system.generated_username;",
                        "update _bb_user set system._allowRead = [];",
                        "update _bb_user set system.signUpDate=signUpDate;" });
        BaasBoxLogger.info("...moving social ids. This can take several minutes....");
        Object listOfUser = DbHelper.genericSQLStatementExecute(
                "select @rid,system.sso_tokens as social_network from _bb_user where system.sso_tokens is not null",
                new String[] { "" });
        for (Object doc : (List) listOfUser) {
            UserDao udao = UserDao.getInstance();

            ODocument odoc = (ODocument) doc;
            ODocument profile;
            if (odoc.field("rid") instanceof ODocument) {
                profile = odoc.field("rid");
            } else {
                ORID rid = odoc.field("rid");
                profile = udao.get(rid);
            }
            OTrackedMap sn = odoc.field("social_network");

            ODocument registeredUserProp = profile.field(UserDao.ATTRIBUTES_VISIBLE_BY_REGISTERED_USER);
            if (registeredUserProp == null)
                registeredUserProp = new ODocument(UserDao.USER_ATTRIBUTES_CLASS);

            Map socialdata = registeredUserProp.field("_social");
            if (socialdata == null) {
                socialdata = new HashMap<String, Map>();
            }
            Set socialNetworks = sn.keySet();
            for (Object socialNetwork : socialNetworks) {
                ODocument socialInfo = (ODocument) sn.get(socialNetwork);
                Map dataMap = new HashMap<String, String>();
                dataMap.put("id", socialInfo.field("id"));
                socialdata.put(socialNetwork, dataMap);
            }

            /*
            for (int i=0;i<sn.fields();i++){
               String socialNetwork = sn.fieldNames()[i];
               ODocument socialInfo = (ODocument)sn.fieldValues()[i];
               socialdata.put(socialNetwork, (ODocument)new ODocument().fromJSON("{\"id\":\""+ socialInfo.field("id") +"\"}"));
            }
            */

            registeredUserProp.field("_social", socialdata);
            registeredUserProp.save();
            profile.save();
        }
    }

}