Java tutorial
/* * 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(); } }