Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chinese Locale Support #80

Merged
merged 9 commits into from
Apr 11, 2017
19 changes: 18 additions & 1 deletion src/main/java/io/codearte/jfairy/Bootstrap.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,23 @@ public static Fairy create(Provider<DataMaster> dataMaster, Locale locale) {
return builder().withDataMasterProvider(dataMaster).withLocale(locale).build();
}

/**
* Support customized language config
* @param dataMaster master of the config
* @param locale The Locale to set.
* @param random specific random
* @return FariyModule instance in accordance with locale
*/
private static FairyModule getFairyModuleForLocale(DataMaster dataMaster, Locale locale, Random random) {
LanguageCode code = LanguageCode.valueOf(locale.getLanguage().toUpperCase());

LanguageCode code = null;
try {
code = LanguageCode.valueOf(locale.getLanguage().toUpperCase());
} catch (IllegalArgumentException e) {
LOG.warn("Uknown locale " + locale);
code = LanguageCode.EN;
}

switch (code) {
case PL:
return new PlFairyModule(dataMaster, random);
Expand All @@ -127,6 +142,8 @@ private static FairyModule getFairyModuleForLocale(DataMaster dataMaster, Locale
return new EsFairyModule(dataMaster, random);
case SV:
return new SvFairyModule(dataMaster, random);
case ZH:
return new ZhFairyModule(dataMaster, random);
default:
LOG.info("No data for your language - using EN");
return new EnFairyModule(dataMaster, random);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/io/codearte/jfairy/Fairy.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ public Person person(PersonProperties.PersonProperty... personProperties) {
/**
* Use this method to generate fake company
*
* @param companyProperties desired company features
* @return A {@link io.codearte.jfairy.producer.company.CompanyProvider} instance
*/
public Company company(CompanyProperties.CompanyProperty... companyProperties) {
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/io/codearte/jfairy/FairyModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@
import com.google.inject.assistedinject.FactoryModuleBuilder;
import io.codearte.jfairy.data.DataMaster;
import io.codearte.jfairy.producer.company.CompanyFactory;
import io.codearte.jfairy.producer.company.CompanyProvider;
import io.codearte.jfairy.producer.company.DefaultCompanyProvider;
import io.codearte.jfairy.producer.payment.DefaultIBANProvider;
import io.codearte.jfairy.producer.payment.IBANFactory;
import io.codearte.jfairy.producer.payment.IBANProvider;
import io.codearte.jfairy.producer.person.DefaultPersonProvider;
import io.codearte.jfairy.producer.person.PersonFactory;
import io.codearte.jfairy.producer.person.PersonProvider;

import java.util.Random;

Expand All @@ -30,9 +36,9 @@ protected void configure() {
bind(DataMaster.class).toInstance(dataMaster);
bind(Random.class).toInstance(random);

install(new FactoryModuleBuilder().build(PersonFactory.class));
install(new FactoryModuleBuilder().build(FairyFactory.class));
install(new FactoryModuleBuilder().build(CompanyFactory.class));
install(new FactoryModuleBuilder().build(IBANFactory.class));
install(new FactoryModuleBuilder().implement(PersonProvider.class, DefaultPersonProvider.class).build(PersonFactory.class));
install(new FactoryModuleBuilder().implement(CompanyProvider.class, DefaultCompanyProvider.class).build(CompanyFactory.class));
install(new FactoryModuleBuilder().implement(IBANProvider.class, DefaultIBANProvider.class).build(IBANFactory.class));
}
}
36 changes: 36 additions & 0 deletions src/main/java/io/codearte/jfairy/ZhFairyModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.codearte.jfairy;

import io.codearte.jfairy.data.DataMaster;
import io.codearte.jfairy.producer.VATIdentificationNumberProvider;
import io.codearte.jfairy.producer.company.locale.zh.ZhVATIdentificationNumberProvider;
import io.codearte.jfairy.producer.person.*;
import io.codearte.jfairy.producer.person.locale.NoNationalIdentificationNumberFactory;
import io.codearte.jfairy.producer.person.locale.zh.ZhAddressProvider;
import io.codearte.jfairy.producer.person.locale.zh.ZhNationalIdentityCardNumberProvider;
import io.codearte.jfairy.producer.person.locale.zh.ZhPassportNumberProvider;

import java.util.Random;

/**
* io.codearte.jfairy.ZhFairyModule
*
* @author lhfcws
* @since 2017/03/01
*/
public class ZhFairyModule extends FairyModule {
public ZhFairyModule(DataMaster dataMaster, Random random) {
super(dataMaster, random);
}

@Override
protected void configure() {
super.configure();

// Social Insurance Number is the same as ID number in China now
bind(NationalIdentificationNumberFactory.class).to(NoNationalIdentificationNumberFactory.class);
bind(NationalIdentityCardNumberProvider.class).to(ZhNationalIdentityCardNumberProvider.class);
bind(VATIdentificationNumberProvider.class).to(ZhVATIdentificationNumberProvider.class);
bind(AddressProvider.class).to(ZhAddressProvider.class);
bind(PassportNumberProvider.class).to(ZhPassportNumberProvider.class);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.codearte.jfairy.producer.company;

import io.codearte.jfairy.producer.BaseProducer;

public final class CompanyProperties {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,98 +6,34 @@
import io.codearte.jfairy.producer.BaseProducer;
import io.codearte.jfairy.producer.VATIdentificationNumberProvider;
import io.codearte.jfairy.producer.util.TextUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import javax.inject.Inject;

public class CompanyProvider implements Provider<Company> {

private static final String DOMAIN = "domains";
private static final String COMPANY_NAME = "companyNames";
private static final String COMPANY_SUFFIX = "companySuffixes";
private static final String COMPANY_EMAIL = "companyEmails";

private String name;
private String domain;
private String email;
private String vatIdentificationNumber;

private BaseProducer baseProducer;
private DataMaster dataMaster;

private final VATIdentificationNumberProvider vatIdentificationNumberProvider;

@Inject
public CompanyProvider(BaseProducer baseProducer,
DataMaster dataMaster,
VATIdentificationNumberProvider vatIdentificationNumberProvider,
@Assisted CompanyProperties.CompanyProperty... companyProperties) {
this.baseProducer = baseProducer;
this.dataMaster = dataMaster;
this.vatIdentificationNumberProvider = vatIdentificationNumberProvider;

for (CompanyProperties.CompanyProperty companyProperty : companyProperties) {
companyProperty.apply(this);
}
}
public interface CompanyProvider extends Provider<Company> {

String DOMAIN = "domains";
String COMPANY_SUFFIX = "companySuffixes";
String COMPANY_NAME = "companyNames";
String COMPANY_EMAIL = "companyEmails";

@Override
public Company get() {

generateName();
generateDomain();
generateEmail();
generateVatIdentificationNumber();

return new Company(name, domain, email, vatIdentificationNumber);
}
Company get();

private void generateName() {
if (name != null) {
return;
}
name = dataMaster.getRandomValue(COMPANY_NAME);
if (baseProducer.trueOrFalse()) {
name += " " + dataMaster.getRandomValue(COMPANY_SUFFIX);
}
}
void generateName();

private void generateDomain() {
if (domain != null) {
return;
}
domain = TextUtils.stripAccents(StringUtils.strip(StringUtils.deleteWhitespace(name.toLowerCase()), ".").replace("/", ""))
+ "." + dataMaster.getRandomValue(DOMAIN);
}
void generateDomain();

private void generateEmail() {
if (email != null) {
return;
}
email = dataMaster.getRandomValue(COMPANY_EMAIL);
}
void generateEmail();

private void generateVatIdentificationNumber() {
if (vatIdentificationNumber != null) {
return;
}
vatIdentificationNumber = vatIdentificationNumberProvider.get();
}
void generateVatIdentificationNumber();

void setName(String name);

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

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

public void setEmail(String email) {
this.email = email;
}
public void setVatIdentificationNumber(String vatIdentificationNumber) {
this.vatIdentificationNumber = vatIdentificationNumber;
}
void setVatIdentificationNumber(String vatIdentificationNumber);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package io.codearte.jfairy.producer.company;

import com.google.inject.assistedinject.Assisted;
import io.codearte.jfairy.data.DataMaster;
import io.codearte.jfairy.producer.BaseProducer;
import io.codearte.jfairy.producer.VATIdentificationNumberProvider;
import io.codearte.jfairy.producer.util.TextUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import javax.inject.Inject;

public class DefaultCompanyProvider implements CompanyProvider {

protected String name;
protected String domain;
protected String email;
protected String vatIdentificationNumber;

protected BaseProducer baseProducer;
protected DataMaster dataMaster;

protected VATIdentificationNumberProvider vatIdentificationNumberProvider;

@Inject
public DefaultCompanyProvider(BaseProducer baseProducer,
DataMaster dataMaster,
VATIdentificationNumberProvider vatIdentificationNumberProvider,
@Assisted CompanyProperties.CompanyProperty... companyProperties) {
this.baseProducer = baseProducer;
this.dataMaster = dataMaster;
this.vatIdentificationNumberProvider = vatIdentificationNumberProvider;

for (CompanyProperties.CompanyProperty companyProperty : companyProperties) {
companyProperty.apply(this);
}
}

@Override
public Company get() {

generateName();
generateDomain();
generateEmail();
generateVatIdentificationNumber();

return new Company(name, domain, email, vatIdentificationNumber);
}

@Override
public void generateName() {
if (name != null) {
return;
}
name = dataMaster.getRandomValue(COMPANY_NAME);
if (baseProducer.trueOrFalse()) {
name += " " + dataMaster.getRandomValue(COMPANY_SUFFIX);
}
}

/**
* In case of the illegal hostname characters in company name
* and truncate it if it is too long (length &gt; 10) after escape
*
* It is compatible with other non-latin language and will not change the original result for latin language.
*
* P.S. Actually the best way for Chinese here is to use phonetic writing (so as Japanese or Korean)
*/
@Override
public void generateDomain() {
if (domain != null) {
return;
}

String host = TextUtils.stripAccents(StringUtils.strip(StringUtils.deleteWhitespace(name.toLowerCase()), ".").replace("/", ""));
int len1 = host.length();
host = StringEscapeUtils.escapeJava(host).replaceAll("\\\\u", "");
int len2 = host.length();
if (len2 > len1 && len2 > 10)
host = host.substring(0, 10);

domain = host + "." + dataMaster.getRandomValue(DOMAIN);
}

@Override
public void generateEmail() {
if (email != null) {
return;
}
email = dataMaster.getRandomValue(COMPANY_EMAIL);
}

@Override
public void generateVatIdentificationNumber() {
if (vatIdentificationNumber != null) {
return;
}
vatIdentificationNumber = vatIdentificationNumberProvider.get();
}

@Override
public void setName(String name) {
this.name = name;
}

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

@Override
public void setEmail(String email) {
this.email = email;
}

@Override
public void setVatIdentificationNumber(String vatIdentificationNumber) {
this.vatIdentificationNumber = vatIdentificationNumber;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.codearte.jfairy.producer.company.locale.zh;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change your local variables such as s, r, etc., to have more miningful names.


import io.codearte.jfairy.producer.BaseProducer;
import io.codearte.jfairy.producer.VATIdentificationNumberProvider;

import java.util.Random;

import static io.codearte.jfairy.producer.util.ZhFairyUtil.*;

/**
* io.codearte.jfairy.producer.company.locale.zh.ZhVATIdentificationNumberProvider
*
* 6 digit for area location, 9 char (0-9A-Z) for organization code (2 char for business type, 2 char for industry type, 5 char for order number), total 15 digit
*
* @author lhfcws
* @since 2017/3/1
*/
public class ZhVATIdentificationNumberProvider implements VATIdentificationNumberProvider {

private static BaseProducer baseProducer = new BaseProducer(new Random());

@Override
public String get() {
StringBuilder vatBuilder = new StringBuilder();
vatBuilder.append(baseProducer.randomElement(PROV_LIST));
vatBuilder.append(getRandomNumStr(baseProducer, CITY_MAX, 2));
vatBuilder.append(getRandomNumStr(baseProducer, DISTRICT_MAX, 2));
vatBuilder.append(getChars(9));
return vatBuilder.toString();
}

private char getChar() {
int rndNum = baseProducer.randomBetween(0, 35);
if (rndNum < 10) {
return (char) (49 + rndNum);
} else {
return (char) (65 + rndNum - 10);
}
}

private String getChars(int paddingSize) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < paddingSize; i++) {
sb.append(getChar());
}
return sb.toString();
}
}