Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions src/main/java/net/datafaker/providers/base/BaseFaker.java
Original file line number Diff line number Diff line change
Expand Up @@ -334,26 +334,8 @@ public static <PR extends ProviderRegistration, AP extends AbstractProvider<PR>>
METHODS.putIfAbsent(newMappingClass, new ConcurrentHashMap<>(methods.length));
for (Method method: methods) {
if (method.getParameterCount() > 0) continue;
StringBuilder sb = null;
final String methodName = method.getName();
final int length = methodName.length();
int start = 0;
for (int i = 0; i < length; i++) {
char ch = methodName.charAt(i);
if (i > 0 && Character.isUpperCase(ch)) {
if (sb == null) {
sb = new StringBuilder();
}
sb.append(methodName.toLowerCase(Locale.ROOT), start, i + 1).append('_');
start = i + 1;
}
}
final String name;
if (start > 0) {
name = sb.append(methodName, start, methodName.length()).toString();
} else {
name = methodName;
}

Map<String, Method> methodMap = METHODS.get(newMappingClass);
if (methodMap == null) {
synchronized (BaseFaker.class) {
Expand All @@ -364,7 +346,7 @@ public static <PR extends ProviderRegistration, AP extends AbstractProvider<PR>>
}
}
}
methodMap.put(name, method);
methodMap.put(methodName, method);
}
map.putIfAbsent(faker.getContext(), newMapping);
CLASSES.get(simpleName).put(faker.getContext(), newMapping);
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/net/datafaker/service/FakeValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
Expand All @@ -32,7 +33,7 @@ private FakeValues(FakeValuesContext fakeValuesContext) {
} finally {
lock.unlock();
}
fakeValuesContext.setPath(values == null || values.isEmpty() ? null : values.keySet().iterator().next());
fakeValuesContext.setPath(values == null || values.isEmpty() ? null : values.keySet());
}
}

Expand Down Expand Up @@ -186,10 +187,10 @@ private Map<String, Object> readFromStream(InputStream stream) {
}

boolean supportsPath(String path) {
return fakeValuesContext.getPath().equals(path);
return fakeValuesContext.getPath().contains(path);
}

String getPath() {
Set<String> getPathes() {
return fakeValuesContext.getPath();
}

Expand Down
25 changes: 14 additions & 11 deletions src/main/java/net/datafaker/service/FakeValuesContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
import java.net.URL;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;

class FakeValuesContext {
private final SingletonLocale sLocale;
private final String filename;
private final int filenameHashCode;
private String path;
private Set<String> pathes;
private final URL url;
private final int urlHashCode;

Expand All @@ -30,7 +31,7 @@ private FakeValuesContext(Locale locale, String filename, String path) {
private FakeValuesContext(Locale locale, String filename, String path, URL url) {
this.sLocale = SingletonLocale.get(locale);
this.filename = filename;
this.path = path;
this.pathes = path == null ? null : Set.of(path);
this.url = url;
this.filenameHashCode = filename == null ? 0 : filename.hashCode();
try {
Expand Down Expand Up @@ -69,8 +70,10 @@ private static String getFilename(Locale locale) {
* This addresses that unfortunate condition.
*/
private static String language(Locale l) {
if ("iw".equals(l.getLanguage())) {
return "he";
switch (l.getLanguage()) {
case "iw": return "he";
case "in": return "id";
case "ji": return "yi";
}
return l.getLanguage();
}
Expand All @@ -83,12 +86,12 @@ public String getFilename() {
return filename;
}

public String getPath() {
return path;
public Set<String> getPath() {
return pathes;
}

public void setPath(String path) {
this.path = path;
public void setPath(Set<String> pathes) {
this.pathes = pathes;
}

public URL getUrl() {
Expand All @@ -104,15 +107,15 @@ public boolean equals(Object o) {

if (!Objects.equals(sLocale, that.sLocale)) return false;
if (!Objects.equals(filename, that.filename)) return false;
if (!Objects.equals(path, that.path)) return false;
if (!Objects.equals(pathes, that.pathes)) return false;
return Objects.equals(url, that.url);
}

@Override
public int hashCode() {
int result = sLocale == null ? 0 : sLocale.hashCode();
result = 31 * result + filenameHashCode;
result = 31 * result + (path == null ? 0 : path.hashCode());
result = 31 * result + (pathes == null ? 0 : pathes.hashCode());
result = 31 * result + urlHashCode;
return result;
}
Expand All @@ -122,7 +125,7 @@ public String toString() {
return "FakeValuesContext{" +
"sLocale=" + sLocale +
", filename='" + filename + '\'' +
", path='" + path + '\'' +
", path='" + pathes + '\'' +
", url=" + url +
'}';
}
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/net/datafaker/service/FakeValuesGrouping.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ public class FakeValuesGrouping implements FakeValuesInterface {

public void add(FakeValuesInterface fakeValue) {
if (fakeValue instanceof FakeValues) {
fakeValues.computeIfAbsent(((FakeValues) fakeValue).getPath(), key -> new HashSet<>())
.add(fakeValue);
((FakeValues) fakeValue).getPathes().forEach(p ->
fakeValues.computeIfAbsent(p, key -> new HashSet<>())
.add(fakeValue));
} else if (fakeValue instanceof FakeValuesGrouping) {
fakeValues.putAll(((FakeValuesGrouping) fakeValue).fakeValues);
} else {
Expand Down
76 changes: 76 additions & 0 deletions src/main/java/net/datafaker/service/FakeValuesService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.datafaker.internal.helper.COWMap;
import net.datafaker.internal.helper.SingletonLocale;
import net.datafaker.internal.helper.WordUtils;
import net.datafaker.providers.base.AbstractProvider;
import net.datafaker.providers.base.Address;
import net.datafaker.providers.base.BaseFaker;
Expand Down Expand Up @@ -221,6 +222,7 @@ public Object fetchObject(String key, FakerContext context) {

String[] path = split(key);
SingletonLocale local2Add = null;
path[0] = path[0].toLowerCase(Locale.ROOT);
for (SingletonLocale sLocale : localeChain) {
Object currentValue = fakeValuesInterfaceMap.get(sLocale);
for (int p = 0; currentValue != null && p < path.length; p++) {
Expand All @@ -240,9 +242,83 @@ public Object fetchObject(String key, FakerContext context) {
if (local2Add != null) {
key2fetchedObject.updateNestedValue(local2Add, MAP_STRING_OBJECT_SUPPLIER, key, result);
}
if (path.length > 0 && result instanceof List) {
List list = (List) result;
for (int i = 0; i < list.size(); i++) {
Object item = list.get(i);
if (!(item instanceof String)) {
break;
}
String itemStr = (String) item;
final int itemStrLength = itemStr.length();
if (itemStrLength < 2) {
break;
}
int j = 0;
StringBuilder sb = null;
int start = 0;
while (j < itemStrLength) {
char c;
while (j < itemStrLength - 2 && ((c = itemStr.charAt(j)) != '#' || itemStr.charAt(j + 1) != '{')) j++;
int startWord = j + 2;
boolean letterOrDigitOnly = true;
j = startWord;
while (j < itemStrLength && (c = itemStr.charAt(j)) != '}') {
letterOrDigitOnly &= Character.isLetter(c) || Character.isDigit(c) || c == '_';
j++;
}
if (start < itemStrLength&& startWord < itemStrLength && letterOrDigitOnly) {
if (sb == null) {
sb = new StringBuilder();
}
sb.append(itemStr, start, startWord);
sb.append(WordUtils.capitalize(path[0]) + "." + toJavaNames(itemStr.substring(startWord, j), true) + "}");
start = j + 1;
}
}
if (sb != null) {
if (start < itemStrLength) {
sb.append(itemStr, start, itemStrLength);
}
list.set(i, sb.toString());
}
}
}
return result;
}


private static String toJavaNames(String string, boolean isMethod) {
final int length;
if (string == null || (length = string.length()) == 0) {
return string;
}
int cnt = 0;
for (int i = 0; i < length; i++) {
if (string.charAt(i) == '_') {
cnt++;
}
}
if (cnt == 0 && (Character.isUpperCase(string.charAt(0)) && !isMethod || isMethod && Character.isLowerCase(string.charAt(0)))) return string;
final char[] res = new char[length - cnt];
int pos = 0;
for (int i = 0; i < length; i++) {
char c = string.charAt(i);
if (i == 0 && Character.isLetter(c)) {
res[pos++] = isMethod ? Character.toLowerCase(c) : Character.toUpperCase(c);
} else if (c == '_') {
final char next = string.charAt(i + 1);
if (i < length - 1 && Character.isLetter(next)) {
res[pos++] = Character.toUpperCase(next);
i++;
}
} else {
res[pos++] = c;
}
}
return new String(res);
}

private String[] split(String string) {
String[] result = KEY_2_SPLITTED_KEY.get(string);
if (result != null) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/en/internet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ en:
- "Visit #{Country.name}"
- "Want to play a game?"
- "Since we can’t all win the lottery..."
- "#{FamousLastWords}"
- "#{FamousLastWords.lastWords}"
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This is a dangerous usage
it could potentially change the behavior once there will be more methods added
that's why there should be a specific method mentioned

- "Happy Holidays From #{Company.name}"
domain_suffix:
- "com"
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/in-ID.yml → src/main/resources/id-ID.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
in-ID:
id-ID:
faker:
name:
first_name: [Aan, Adi, Aditya, Agus, Ahmad, Aji, Andi, Anita, Anton, Arif, Arya, Aulia, Bagas, Bagus, Bambang, Bayu, Beni, Bima, Budi, Chandra, Choirul, Citra, Danang, David, Dea, Deni, Derry, Desi, Devi, Diah, Dimas, Dina, Dion, Edi, Edwin, Effendi, Endang, Erika, Ferdian, Fika, Galih, Gita, Gugun, Hamdan, Hengky, Heni, Heri, Heru, Imam, Iman, Indah, Indra, Iwan, Jaka, Jaya, Kartika, Kartini, Kemal, Khrisna, Kiki, Komar, Lely, Lia, Liana, Lidya, Lisa, Mahesa, Martin, Merry, Muhammad, Niko, Nina, Nisa, Noval, Oki, Okta, Olivia, Pandu, Popi, Pradipta, Prily, Prima, Putri, Qomar, Qorri, Raditya, Rahmat, Roni, Rosa, Rudi, Ruslan, Salim, Sandi, Setya, Sigit, Slamet, Tiara, Tito, Tomi, Toni, Topan, Tri, Udin, Umar, Unang, Valentinus, Vanya, Vicky, Victor, Vira, Vivi, Wahyu, Wawan, Wendy, Wira, Wisnu, Yahya, Yanuar, Yoga, Yossi, Yudha, Yudhistira, Yudi, Zaenal]
last_name: [Abdullah, Adriansyah, Alamsyah, Andrianto, Ardianto, Aristianto, Armansyah, Atmadja, Basri, Bimantara, Bintara, Budiarto, Budiman, Budiono, Cahyadi, Cahyono, Candrawijaya, Ciputra, Daniawan, Darmadi, Darmawan, Dinata, Djunaedi, Dwiantoro, Dzulfikar, Erik, Erlangga, Fachri, Fachriawan, Fauzi, Febriansyah, Ferdian, Ferianto, Firmansyah, Gautama, Ginanjar, Ginting, Gondokusumo, Gozali, Gunajaya, Gunardi, Hadiwijaya, Handaru, Harjono, Hartanto, Hartono, Haryanto, Hendrawinata, Hermawan, Idris, Ikhsan, Ilham, Indragiri, Indrajaya, Ismail, Iswanto, Januar, Jayadi, Jayadinata, Jayakusuma, Junaedi, Kartawijaya, Komarudin, Kurniadi, Kurnianto, Kurniawan, Kusuma, Kusumawardhana, Lazuardi, Lesmana, Linggar, Listiyono, Listyawan, Madjid, Mahendra, Maheswara, Mardiansyah, Mardianto, Marzuki, Maulana, Nababan, Nainggolan, Nasrudin, Novianto, Nugraha, Nurdiansyah, Oktara, Oktavian, Ongky, Pahlevi, Pradhana, Pradipta, Pranata, Prawira, Pribadi, Qodir, Riansyah, Rianto, Riyadi, Rudianto, Rusli, Rusmana, Rustam, Sanjaya, Santoso, Sapta, Saputra, Saragih, Satria, Setiawan, Sugianto, Sugiarto, Suhendra, Suryatama, Taslim, Thamrin, Tjahjadi, Triwijaya, Umbara, Unggul, Utama, Virgiawan, Waluyo, Wardhana, Wicaksono, Wijanarko, Wijaya, Winardi, Winarta, Wirawan, Yudhanto, Yudhistira, Yudhiswara, Yulianto, Zaenal, Zaini, Zulfikara, Zulfikri, Zulkarnain]
name: "#{first_name} #{last_name}"
name: "#{Name.first_name} #{Name.last_name}"
address:
city_name: [Aceh Barat, Aceh Barat Daya, Aceh Besar, Aceh Jaya, Aceh Selatan, Aceh Singkil, Aceh Tamiang, Aceh Tengah, Aceh Tenggara, Aceh Timur, Aceh Utara, Agam, Alor, Ambon, Asahan, Asmat, Badung, Balangan, Balikpapan, Banda Aceh, Bandar Lampung, Bandung, Bandung Barat, Banggai, Banggai Kepulauan, Bangka, Bangka Barat, Bangka Selatan, Bangka Tengah, Bangkalan, Bangli, Banjar, Banjar Baru, Banjarmasin, Banjarnegara, Bantaeng, Bantul, Banyu Asin, Banyumas, Banyuwangi, Barito Kuala, Barito Selatan, Barito Timur, Barito Utara, Barru, Baru, Batam, Batang, Batang Hari, Batu, Batu Bara, Baubau, Bekasi, Belitung, Belitung Timur, Belu, Bener Meriah, Bengkalis, Bengkayang, Bengkulu, Bengkulu Selatan, Bengkulu Tengah, Bengkulu Utara, Berau, Biak Numfor, Bima, Binjai, Bintan, Bireuen, Bitung, Blitar, Blora, Boalemo, Bogor, Bojonegoro, Bolaang Mongondow, Bolaang Mongondow Selatan, Bolaang Mongondow Timur, Bolaang Mongondow Utara, Bombana, Bondowoso, Bone, Bone Bolango, Bontang, Boven Digoel, Boyolali, Brebes, Bukittinggi, Buleleng, Bulukumba, Bulungan, Bungo, Buol, Buru, Buru Selatan, Buton, Buton Utara, Ciamis, Cianjur, Cilacap, Cilegon, Cimahi, Cirebon, Dairi, Deiyai, Deli Serdang, Demak, Denpasar, Depok, Dharmasraya, Dogiyai, Dompu, Donggala, Dumai, Empat Lawang, Ende, Enrekang, Fakfak, Flores Timur, Garut, Gayo Lues, Gianyar, Gorontalo, Gorontalo Utara, Gowa, Gresik, Grobogan, Gunung Kidul, Gunung Mas, Gunungsitoli, Halmahera Barat, Halmahera Selatan, Halmahera Tengah, Halmahera Timur, Halmahera Utara, Hulu Sungai Selatan, Hulu Sungai Tengah, Hulu Sungai Utara, Humbang Hasundutan, Indragiri Hilir, Indragiri Hulu, Indramayu, Intan Jaya, Jakarta Barat, Jakarta Pusat, Jakarta Selatan, Jakarta Timur, Jakarta Utara, Jambi, Jayapura, Jayawijaya, Jember, Jembrana, Jeneponto, Jepara, Jombang, Kaimana, Kampar, Kapuas, Kapuas Hulu, Karang Asem, Karanganyar, Karawang, Karimun, Karo, Katingan, Kaur, Kayong Utara, Kebumen, Kediri, Keerom, Kendal, Kendari, Kepahiang, Kepulauan Anambas, Kepulauan Aru, Kepulauan Mentawai, Kepulauan Meranti, Kepulauan Sangihe, Kepulauan Selayar, Kepulauan Seribu, Kepulauan Sula, Kepulauan Talaud, Kepulauan Yapen, Kerinci, Ketapang, Klaten, Klungkung, Kolaka, Kolaka Utara, Konawe, Konawe Selatan, Konawe Utara, Kotamobagu, Kotawaringin Barat, Kotawaringin Timur, Kuantan Singingi, Kubu Raya, Kudus, Kulon Progo, Kuningan, Kupang, Kutai Barat, Kutai Kartanegara, Kutai Timur, Labuhan Batu, Labuhan Batu Selatan, Labuhan Batu Utara, Lahat, Lamandau, Lamongan, Lampung Barat, Lampung Selatan, Lampung Tengah, Lampung Timur, Lampung Utara, Landak, Langkat, Langsa, Lanny Jaya, Lebak, Lebong, Lembata, Lhokseumawe, Lima Puluh Kota, Lingga, Lombok Barat, Lombok Tengah, Lombok Timur, Lombok Utara, Lubuklinggau, Lumajang, Luwu, Luwu Timur, Luwu Utara, Madiun, Magelang, Magetan, Majalengka, Majene, Makassar, Malang, Malinau, Maluku Barat Daya, Maluku Tengah, Maluku Tenggara, Maluku Tenggara Barat, Mamasa, Mamberamo Raya, Mamberamo Tengah, Mamuju, Mamuju Utara, Manado, Mandailing Natal, Manggarai, Manggarai Barat, Manggarai Timur, Manokwari, Mappi, Maros, Mataram, Maybrat, Medan, Melawi, Merangin, Merauke, Mesuji, Metro, Mimika, Minahasa, Minahasa Selatan, Minahasa Tenggara, Minahasa Utara, Mojokerto, Morowali, Muara Enim, Muaro Jambi, Mukomuko, Muna, Murung Raya, Musi Banyuasin, Musi Rawas, Nabire, Nagan Raya, Nagekeo, Natuna, Nduga, Ngada, Nganjuk, Ngawi, Nias, Nias Barat, Nias Selatan, Nias Utara, Nunukan, Ogan Ilir, Ogan Komering Ilir, Ogan Komering Ulu, Ogan Komering Ulu Selatan, Ogan Komering Ulu Timur, Pacitan, Padang, Padang Lawas, Padang Lawas Utara, Padang Panjang, Padang Pariaman, Padangsidimpuan, Pagar Alam, Pakpak Bharat, Palangka Raya, Palembang, Palopo, Palu, Pamekasan, Pandeglang, Pangandaran, Pangkajene Dan Kepulauan, Pangkal Pinang, Paniai, Parepare, Pariaman, Parigi Moutong, Pasaman, Pasaman Barat, Paser, Pasuruan, Pati, Payakumbuh, Pegunungan Bintang, Pekalongan, Pekanbaru, Pelalawan, Pemalang, Pematang Siantar, Penajam Paser Utara, Pesawaran, Pesisir Barat, Pesisir Selatan, Pidie, Pidie Jaya, Pinrang, Pohuwato, Polewali Mandar, Ponorogo, Pontianak, Poso, Prabumulih, Pringsewu, Probolinggo, Pulang Pisau, Pulau Morotai, Puncak, Puncak Jaya, Purbalingga, Purwakarta, Purworejo, Raja Ampat, Rejang Lebong, Rembang, Rokan Hilir, Rokan Hulu, Rote Ndao, Sabang, Sabu Raijua, Salatiga, Samarinda, Sambas, Samosir, Sampang, Sanggau, Sarmi, Sarolangun, Sawah Lunto, Sekadau, Seluma, Semarang, Seram Bagian Barat, Seram Bagian Timur, Serang, Serdang Bedagai, Seruyan, Siak, Siau Tagulandang Biaro, Sibolga, Sidenreng Rappang, Sidoarjo, Sigi, Sijunjung, Sikka, Simalungun, Simeulue, Singkawang, Sinjai, Sintang, Situbondo, Sleman, Solok, Solok Selatan, Soppeng, Sorong, Sorong Selatan, Sragen, Subang, Subulussalam, Sukabumi, Sukamara, Sukoharjo, Sumba Barat, Sumba Barat Daya, Sumba Tengah, Sumba Timur, Sumbawa, Sumbawa Barat, Sumedang, Sumenep, Sungai Penuh, Supiori, Surabaya, Surakarta, Tabalong, Tabanan, Takalar, Tambrauw, Tana Tidung, Tana Toraja, Tanah Bumbu, Tanah Datar, Tanah Laut, Tangerang, Tangerang Selatan, Tanggamus, Tanjung Balai, Tanjung Jabung Barat, Tanjung Jabung Timur, Tanjung Pinang, Tapanuli Selatan, Tapanuli Tengah, Tapanuli Utara, Tapin, Tarakan, Tasikmalaya, Tebing Tinggi, Tebo, Tegal, Teluk Bintuni, Teluk Wondama, Temanggung, Ternate, Tidore Kepulauan, Timor Tengah Selatan, Timor Tengah Utara, Toba Samosir, Tojo Una-una, Toli-toli, Tolikara, Tomohon, Toraja Utara, Trenggalek, Tual, Tuban, Tulang Bawang Barat, Tulangbawang, Tulungagung, Wajo, Wakatobi, Waropen, Way Kanan, Wonogiri, Wonosobo, Yahukimo, Yalimo, Yogyakarta]
city:
Expand Down
Loading