//
// Copyright (c) 2011 Linkeos.
//
// This file is part of Elveos.org.
// Elveos.org is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or (at your
// option) any later version.
//
// Elveos.org is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
// You should have received a copy of the GNU General Public License along
// with Elveos.org. If not, see http://www.gnu.org/licenses/.
//
package com.bloatit.model;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import com.bloatit.data.DaoComment;
import com.bloatit.data.DaoDescription;
import com.bloatit.data.DaoExternalAccount;
import com.bloatit.data.DaoExternalAccount.AccountType;
import com.bloatit.data.DaoFeature;
import com.bloatit.data.DaoFileMetadata;
import com.bloatit.data.DaoFileMetadata.FileType;
import com.bloatit.data.DaoMember;
import com.bloatit.data.DaoOffer;
import com.bloatit.data.DaoSoftware;
import com.bloatit.data.DaoTeam;
import com.bloatit.data.DaoTransaction;
import com.bloatit.data.SessionManager;
import com.bloatit.data.exceptions.NotEnoughMoneyException;
import com.bloatit.data.exceptions.UniqueNameExpectedException;
import com.bloatit.framework.utils.i18n.Language;
public class BigDB {
private static final int nbUsers = 100;
public BigDB() throws UniqueNameExpectedException {
SessionManager.beginWorkUnit();
// Create some users
final List<DaoMember> members = new ArrayList<DaoMember>();
for (int i = 0; i < nbUsers; i++) {
DaoMember member;
member = DaoMember.createAndPersist("member " + i, Integer.toString(i), "salt", "mail" + i + "@nowhere.com", Locale.FRANCE);
member.setFullname("User " + i + " Fullname");
member.setExternalAccount(DaoExternalAccount.createAndPersist(member, AccountType.IBAN, "code"));
members.add(member);
try {
DaoTransaction.createAndPersist(member.getInternalAccount(), member.getExternalAccount(), new BigDecimal("-1000"));
} catch (final NotEnoughMoneyException e) {
e.printStackTrace();
}
if (i % 500 == 0) {
SessionManager.flush();
SessionManager.clear();
}
}
// Create Some Groups
for (int i = 0; i < nbUsers / 4; i += 4) {
final DaoTeam group = DaoTeam.createAndPersiste("group " + (i / 4), "plop" + i + "@plop.com", "description", DaoTeam.Right.PUBLIC);
group.addMember(members.get(i), true);
group.addMember(members.get(i + 1), false);
group.addMember(members.get(i + 2), false);
group.addMember(members.get(i + 3), false);
if (i % 500 == 0) {
SessionManager.flush();
SessionManager.clear();
}
}
DaoTeam.createAndPersiste("b2 ", "plop" + "@plop.com", "description", DaoTeam.Right.PUBLIC);
final DaoSoftware project = DaoSoftware.createAndPersist("VLC", DaoDescription.createAndPersist(members.get(0),
null,
Language.FR,
"title",
"descrip"));
project.setImage(DaoFileMetadata.createAndPersist(members.get(0), null, null, "/dev/", "null", FileType.JPG, 12));
for (int i = 0; i < nbUsers; i++) {
final DaoFeature feature = DaoFeature.createAndPersist(members.get(i),
null,
DaoDescription.createAndPersist(members.get(i),
null,
Language.FR,
fortune(140),
fortune(1000) + fortune(1000) + fortune(1000)),
project);
final int commentCount = (int) (Math.random() * 5);
for (int j = 0; j < commentCount; j++) {
final DaoComment comment = DaoComment.createAndPersist(feature, null, members.get(i), fortune());
createComment(comment);
feature.addComment(comment);
}
final int nbContrib = pick(12);
for (int j = 0; j < nbContrib; j++) {
final DaoMember m = members.get(pick(nbUsers));
try {
feature.addContribution(m, null, new BigDecimal((pick(10) + 1) * 10), fortune(144));
} catch (final NotEnoughMoneyException e) {
e.printStackTrace();
}
}
final DaoMember member = members.get(pick(nbUsers));
if (pick(2) == 0) {
feature.addOffer(new DaoOffer(member,
null,
feature,
new BigDecimal((pick(50) + 10) * 10),
DaoDescription.createAndPersist(member, null, Language.FR, "Offre", fortune(254)),
"GNU GPL",
new Date(System.currentTimeMillis() + 200),
0));
if (pick(2) == 0) {
// for (final DaoContribution contrib : feature.getContributions()) {
// try {
// contrib.validate(feature.getOffers().iterator().next(), 100);
// } catch (final NotEnoughMoneyException e) {
// e.printStackTrace();
// }
// }
}
}
if (i % 100 == 0) {
SessionManager.flush();
SessionManager.clear();
}
}
SessionManager.endWorkUnitAndFlush();
}
private void createComment(final DaoComment comment) {
final int nbComment = (int) (Math.random() * 15);
for (int i = 0; i < nbComment; i++) {
final int memberNum = (int) (Math.random() * nbUsers);
final DaoComment other = DaoComment.createAndPersist(comment, null, DaoMember.getByLogin("member " + memberNum), fortune());
comment.addChildComment(other);
if ((int) (Math.random() * 15) % 15 == 0) {
createComment(other);
}
}
}
public static String fortune() {
String text = "";
try {
String line;
final Process p = Runtime.getRuntime().exec("fortune");
final BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
text += line;
}
input.close();
} catch (final Exception err) {
err.printStackTrace();
}
if (text.isEmpty()) {
text = Long.toHexString(Double.doubleToLongBits(Math.random()));
}
return text;
}
private String fortune(final int i) {
String text = fortune();
if (text.length() > i) {
text = text.substring(0, i);
}
return text;
}
private int pick(final int max) {
return (int) (Math.random() * max);
}
public static void main(final String[] args) throws UniqueNameExpectedException {
new BigDB();
}
}