org.apache.usergrid.tools.ExportDataCreator.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.usergrid.tools.ExportDataCreator.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.usergrid.tools;

import io.codearte.jfairy.Fairy;
import io.codearte.jfairy.producer.company.Company;
import io.codearte.jfairy.producer.person.Person;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.usergrid.management.ApplicationInfo;
import org.apache.usergrid.management.OrganizationInfo;
import org.apache.usergrid.management.OrganizationOwnerInfo;
import org.apache.usergrid.persistence.Entity;
import org.apache.usergrid.persistence.EntityManager;
import org.apache.usergrid.persistence.EntityRef;
import org.apache.usergrid.persistence.entities.Activity;
import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;

import java.util.*;

/**
 * Create an app full of users and data.
 */
public class ExportDataCreator extends ToolBase {

    public static final String APP_NAME = "application";
    public static final String ORG_NAME = "organization";
    public static final String NUM_USERS = "users";
    public static final String NUM_COLLECTIONS = "collections";
    public static final String NUM_ENTITIES = "entities";
    public static final String ADMIN_USERNAME = "username";
    public static final String ADMIN_PASSWORD = "password";

    public String appName = "test-app";
    public String orgName = "test-organization";
    public int numUsers = 100;
    public int numCollections = 20;
    public int numEntities = 100;
    public String adminUsername = "adminuser";
    public String adminPassword = "test";

    @Override
    public void runTool(CommandLine line) throws Exception {

        startSpring();

        setVerbose(line);

        if (line.hasOption(APP_NAME)) {
            appName = line.getOptionValue(APP_NAME);
        }
        if (line.hasOption(ORG_NAME)) {
            orgName = line.getOptionValue(ORG_NAME);
        }
        if (line.hasOption(NUM_USERS)) {
            numUsers = Integer.parseInt(line.getOptionValue(NUM_USERS));
        }
        if (line.hasOption(NUM_COLLECTIONS)) {
            numCollections = Integer.parseInt(line.getOptionValue(NUM_COLLECTIONS));
        }
        if (line.hasOption(NUM_ENTITIES)) {
            numEntities = Integer.parseInt(line.getOptionValue(NUM_ENTITIES));
        }
        if (line.hasOption(ADMIN_USERNAME)) {
            adminUsername = line.getOptionValue(ADMIN_USERNAME);
        }
        if (line.hasOption(ADMIN_PASSWORD)) {
            adminPassword = line.getOptionValue(ADMIN_PASSWORD);
        }

        createTestData();
    }

    @Override
    @SuppressWarnings("static-access")
    public Options createOptions() {

        Options options = super.createOptions();

        Option appName = OptionBuilder.hasArg().withDescription("Application name to use").create(APP_NAME);

        Option orgName = OptionBuilder.hasArg().withDescription("Organization to use (will create if not present)")
                .create(ORG_NAME);

        Option numUsers = OptionBuilder.hasArg().withDescription("Number of users create (in addition to users)")
                .create(NUM_USERS);

        Option numCollection = OptionBuilder.hasArg()
                .withDescription("Number of collections to create (in addition to users)").create(NUM_COLLECTIONS);

        Option numEntities = OptionBuilder.hasArg().withDescription("Number of entities to create per collection")
                .create(NUM_ENTITIES);

        Option adminUsername = OptionBuilder.hasArg().withDescription("Admin Username").create(ADMIN_USERNAME);

        Option adminPassword = OptionBuilder.hasArg().withDescription("Admin Password").create(ADMIN_PASSWORD);

        options.addOption(appName);
        options.addOption(orgName);
        options.addOption(numUsers);
        options.addOption(numCollection);
        options.addOption(numEntities);
        options.addOption(adminUsername);
        options.addOption(adminPassword);

        return options;
    }

    public void createTestData() throws Exception {

        OrganizationInfo orgInfo = managementService.getOrganizationByName(orgName);

        if (orgInfo == null) {
            OrganizationOwnerInfo ownerInfo = managementService.createOwnerAndOrganization(orgName,
                    adminUsername + "@example.com", adminUsername, adminUsername + "@example.com", adminPassword,
                    true, false);
            orgInfo = ownerInfo.getOrganization();
        }

        ApplicationInfo appInfo = managementService.getApplicationInfo(orgName + "/" + appName);

        if (appInfo == null) {
            UUID appId = managementService.createApplication(orgInfo.getUuid(), appName).getId();
            appInfo = managementService.getApplicationInfo(appId);
        }

        EntityManager em = emf.getEntityManager(appInfo.getId());

        Fairy fairy = Fairy.create();

        List<Entity> users = new ArrayList<Entity>(numUsers);

        for (int i = 0; i < numUsers; i++) {

            final Person person = fairy.person();
            Entity userEntity = null;
            try {
                final Map<String, Object> userMap = new HashMap<String, Object>() {
                    {
                        put("name", person.username());
                        put("username", person.username());
                        put("password", person.password());
                        put("email", person.email());
                        put("companyEmail", person.companyEmail());
                        put("dateOfBirth", person.dateOfBirth().toDate().toString());
                        put("firstName", person.firstName());
                        put("lastName", person.lastName());
                        put("nationalIdentificationNumber", person.nationalIdentificationNumber());
                        put("telephoneNumber", person.telephoneNumber());
                        put("passportNumber", person.passportNumber());
                        put("address", new HashMap<String, Object>() {
                            {
                                put("streetNumber", person.getAddress().streetNumber());
                                put("street", person.getAddress().street());
                                put("city", person.getAddress().getCity());
                                put("postalCode", person.getAddress().getPostalCode());
                            }
                        });
                    }
                };

                userEntity = em.create("user", userMap);
                users.add(userEntity);

                logger.debug("Created user {}", userEntity.getName());

            } catch (DuplicateUniquePropertyExistsException e) {
                logger.error("Dup user generated: " + person.username());
                continue;
            } catch (Exception e) {
                logger.error("Error creating user", e);
                continue;
            }

            em.refreshIndex();

            final Company company = person.getCompany();
            try {
                EntityRef ref = em.getAlias("company", company.name());
                Entity companyEntity = (ref == null) ? null : em.get(ref);

                // create company if it does not exist yet
                if (companyEntity == null) {
                    final Map<String, Object> companyMap = new HashMap<String, Object>() {
                        {
                            put("name", company.name());
                            put("domain", company.domain());
                            put("email", company.email());
                            put("url", company.url());
                            put("vatIdentificationNumber", company.vatIdentificationNumber());
                        }
                    };
                    companyEntity = em.create("company", companyMap);
                } else {
                    logger.info("Company {} already exists", company.name());
                }

                em.createConnection(userEntity, "employer", companyEntity);
                logger.debug("User {} now employed by {}", userEntity.getName(), companyEntity.getName());

            } catch (DuplicateUniquePropertyExistsException e) {
                logger.error("Dup company generated {} property={}", company.name(), e.getPropertyName());
                continue;
            } catch (Exception e) {
                logger.error("Error creating or connecting company", e);
                continue;
            }

            em.refreshIndex();

            try {
                for (int j = 0; j < 5; j++) {
                    Activity activity = new Activity();
                    Activity.ActivityObject actor = new Activity.ActivityObject();
                    actor.setEntityType("user");
                    actor.setId(userEntity.getUuid().toString());
                    activity.setActor(actor);
                    activity.setVerb("POST");
                    activity.setContent("User " + person.username() + " generated a random string "
                            + RandomStringUtils.randomAlphanumeric(5));
                    em.createItemInCollection(userEntity, "activities", "activity", activity.getProperties());

                    logger.debug("Created activity {}", activity.getContent());
                }

                if (users.size() > 10) {
                    for (int j = 0; j < 5; j++) {
                        try {
                            Entity otherUser = users.get((int) (Math.random() * users.size()));
                            em.createConnection(userEntity, "associate", otherUser);
                            logger.debug("User {} now associated with user {}", userEntity.getName(),
                                    otherUser.getName());
                        } catch (Exception e) {
                            logger.error("Error connecting user to user: " + e.getMessage());
                        }
                    }
                }

                em.refreshIndex();

                Set<String> connectionTypes = em.getConnectionTypes(userEntity);

                logger.debug("User {} now has {} connection types: {}",
                        new Object[] { userEntity.getName(), connectionTypes.size(), connectionTypes });

            } catch (Exception e) {
                logger.error("Error creating activities", e);
                continue;
            }

        }

        em.refreshIndex();
    }

}