Here are the examples of the java api com.agnitas.dao.ComMailingDao taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
74 Examples
19
Source : MailingTargetGroupLocator.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Searches for target groups in mailings (Does not include graphic components,
* content block, etc.)
*
* If a target group is only used in sent mailings, target group can be marked as deleted.
* If the target group is used in no mailing, it can be deleted from DB completely
*/
public clreplaced MailingTargetGroupLocator implements TargetGroupLocator {
private ComMailingDao mailingDao;
@Override
public TargetDeleteStatus isTargetGroupCanBeDeleted(int companyID, int targetGroupID) {
if (!mailingDao.existMailingsDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CAN_BE_FULLY_DELETED_FROM_DB;
}
if (mailingDao.existsNotSentMailingsDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CANT_BE_DELETED;
}
return TargetDeleteStatus.CAN_BE_MARKED_AS_DELETED;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
19
Source : MailingContentTargetGroupLocator.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Implementation of {@link TargetGroupLocator} working on mailing content blocks.
*/
public clreplaced MailingContentTargetGroupLocator implements TargetGroupLocator {
private ComMailingDao mailingDao;
@Override
public TargetDeleteStatus isTargetGroupCanBeDeleted(int companyID, int targetGroupID) throws TargetGroupException {
if (!mailingDao.existMailingsWhichContentDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CAN_BE_FULLY_DELETED_FROM_DB;
}
if (mailingDao.existsNotSentMailingsWhichContentDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CANT_BE_DELETED;
}
return TargetDeleteStatus.CAN_BE_MARKED_AS_DELETED;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
19
Source : MailingComponentTargetGroupLocator.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Implementation of {@link TargetGroupLocator} working on mailing components.
*/
public clreplaced MailingComponentTargetGroupLocator implements TargetGroupLocator {
private ComMailingDao mailingDao;
@Override
public TargetDeleteStatus isTargetGroupCanBeDeleted(int companyID, int targetGroupID) throws TargetGroupException {
if (!mailingDao.existMailingsWhichComponentDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CAN_BE_FULLY_DELETED_FROM_DB;
}
if (mailingDao.existsNotSentMailingsWhichComponentDependsOnTargetGroup(companyID, targetGroupID)) {
return TargetDeleteStatus.CANT_BE_DELETED;
}
return TargetDeleteStatus.CAN_BE_MARKED_AS_DELETED;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
19
Source : ScriptHelper.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public void setMailingDao(final ComMailingDao mailingDao) {
/*
* **************************************************
* IMPORTANT IMPORTANT IMPORTANT IMPORTANT
* **************************************************
*
* DO NOT REMOVE METHOD OR CHANGE SIGNATURE!!!
*/
this.mailingDao = mailingDao;
}
19
Source : MailingSendRecipientStatWorker.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced MailingSendRecipientStatWorker implements Callable<Map<Integer, Integer>>, Serializable {
private static final long serialVersionUID = 1866393658794265093L;
private ComMailingDao mailingDao;
private int mailingId;
private int companyId;
public MailingSendRecipientStatWorker(ComMailingDao mailingDao, int mailingId, @VelocityCheck int companyId) {
this.mailingDao = mailingDao;
this.mailingId = mailingId;
this.companyId = companyId;
}
@Override
public Map<Integer, Integer> call() throws Exception {
ComMailing mailing = mailingDao.getMailing(mailingId, companyId);
return mailingDao.getSendStats(mailing, companyId);
}
}
19
Source : ComOptimizationStatServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
19
Source : ComOptimizationScheduleServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Set DAO accessing mailings.
*
* @param mailingDao DAO accessing mailings
*/
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
19
Source : EmmMailingTypeResolverImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced EmmMailingTypeResolverImpl implements MailingTypeResolver {
private final ComMailingDao mailingDao;
public EmmMailingTypeResolverImpl(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Override
public MailingType resolveMailingType(int mailingId, int companyId) throws MailingResolverException {
int mailingType = mailingDao.getMailingType(mailingId);
if (mailingType == -1) {
throw new MailingResolverException("Unknown mailing ID: " + mailingId + " (company " + companyId + ")");
}
if (mailingType == MailingTypes.INTERVAL.getCode())
return MailingType.INTERVAL;
else
return MailingType.NORMAL;
}
}
19
Source : EmmMailingTypeResolverFactory.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced EmmMailingTypeResolverFactory {
private ComMailingDao mailingDao;
public MailingTypeResolver newResolver() {
return new EmmMailingTypeResolverImpl(mailingDao);
}
@Required
public void setMailingDao(ComMailingDao dao) {
this.mailingDao = dao;
}
}
19
Source : CalendarServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced CalendarServiceImpl implements CalendarService {
private ComMailingDao mailingDao;
private static final String DATE_FORMAT = "dd-MM-yyyy";
private static final String TIME_FORMAT = "HH:mm";
private static final String LINE_SEPARATOR = "\u2028";
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
protected ComMailingDao getMailingDao() {
return mailingDao;
}
@Override
public PaginatedListImpl<Map<String, Object>> getUnsentMailings(ComAdmin admin, int listSize) {
return mailingDao.getUnsentMailings(admin.getCompanyID(), admin.getAdminID(), listSize);
}
@Override
public PaginatedListImpl<Map<String, Object>> getPlannedMailings(ComAdmin admin, int listSize) {
return mailingDao.getPlannedMailings(admin.getCompanyID(), admin.getAdminID(), listSize);
}
@Override
public JSONArray getMailings(ComAdmin admin, LocalDate startDate, LocalDate endDate) {
List<Map<String, Object>> mailings = new ArrayList<>();
int companyId = admin.getCompanyID();
ZoneId zoneId = AgnUtils.getZoneId(admin);
// TODO: change DAO methods to use inclusive (not exclusive) date bounds.
Date start = DateUtilities.toDate(startDate.atStartOfDay().minusNanos(1), zoneId);
Date end = DateUtilities.toDate(endDate.plusDays(1), zoneId);
mailings.addAll(getMailings(admin, start, end));
mailings.addAll(getPlannedMailings(admin, start, end));
List<Integer> sentMailings = getSentMailings(mailings);
Map<Integer, Integer> openers = Collections.emptyMap();
Map<Integer, Integer> clickers = Collections.emptyMap();
if (!sentMailings.isEmpty()) {
openers = mailingDao.getOpeners(companyId, sentMailings);
clickers = mailingDao.getClickers(companyId, sentMailings);
}
setMailingData(mailings);
return mailingsAsJson(mailings, openers, clickers, admin);
}
protected List<Map<String, Object>> getPlannedMailings(final ComAdmin admin, final Date startDate, final Date endDate) {
List<Map<String, Object>> plannedMailings = mailingDao.getPlannedMailings(admin.getCompanyID(), admin.getAdminID(), startDate, endDate);
return addSomeFieldsToPlannedMailings(plannedMailings, AgnUtils.getZoneId(admin));
}
protected List<Map<String, Object>> addSomeFieldsToPlannedMailings(final List<Map<String, Object>> mailings, final ZoneId zoneId) {
final Date midnight = DateUtilities.midnight(zoneId);
for (Map<String, Object> plannedMailing : mailings) {
Date sendDate = (Date) plannedMailing.get("senddate");
plannedMailing.put("planned", true);
plannedMailing.put("plannedInPast", sendDate.before(midnight));
}
return mailings;
}
protected List<Map<String, Object>> getMailings(final ComAdmin admin, Date startDate, Date endDate) {
List<Map<String, Object>> mailings = mailingDao.getSentAndScheduled(admin.getCompanyID(), admin.getAdminID(), startDate, endDate);
return addSomeFieldsToSentAndScheduledMailings(mailings);
}
protected List<Map<String, Object>> addSomeFieldsToSentAndScheduledMailings(final List<Map<String, Object>> mailings) {
for (Map<String, Object> mailing : mailings) {
mailing.put("planned", false);
mailing.put("plannedInPast", false);
}
return mailings;
}
private List<Integer> getSentMailings(List<Map<String, Object>> mailings) {
List<Integer> sentMailings = new ArrayList<>();
for (Map<String, Object> mailing : mailings) {
if (getIntValue(mailing, "genstatus") > MaildropGenerationStatus.SCHEDULED.getCode()) {
sentMailings.add(getIntValue(mailing, "mailingId"));
}
}
return sentMailings;
}
private void setMailingData(List<Map<String, Object>> mailings) {
for (Map<String, Object> mailing : mailings) {
String subject = (String) mailing.get("subject");
if (Objects.nonNull(subject)) {
subject = subject.replace("'", "'").replace("\n", "<br />").replace(LINE_SEPARATOR, "");
mailing.put("subject", subject);
}
}
}
@Override
public boolean moveMailing(ComAdmin admin, int mailingId, LocalDate date) {
ComMailing mailing = mailingDao.getMailing(mailingId, admin.getCompanyID());
// Avoid schedule in the past.
if (mailing.getId() == mailingId && !date.isBefore(LocalDate.now())) {
MaildropEntry drop = getMaildropForUpdate(mailing.getMaildropStatus());
if (setMailingDate(admin, mailing, drop, date)) {
mailingDao.saveMailing(mailing, false);
return true;
}
}
return false;
}
private boolean setMailingDate(ComAdmin admin, ComMailing mailing, MaildropEntry drop, LocalDate date) {
ZoneId zoneId = AgnUtils.getZoneId(admin);
boolean success = false;
if (Objects.nonNull(drop)) {
if (drop.getGenStatus() == MaildropGenerationStatus.SCHEDULED.getCode()) {
// Merge new date with old time (simply change the date without changing time).
LocalDateTime sendDate = DateUtilities.merge(date, DateUtilities.toLocalTime(drop.getSendDate(), zoneId));
success = setSendDate(drop, DateUtilities.toDate(sendDate, zoneId));
} else if (drop.getStatus() == MaildropStatus.ADMIN.getCode() || drop.getStatus() == MaildropStatus.TEST.getCode()) {
mailing.setPlanDate(DateUtilities.toDate(date, zoneId));
success = true;
}
} else if (Objects.nonNull(mailing.getPlanDate())) {
// Mailing has only plan date without any drop statuses.
mailing.setPlanDate(DateUtilities.toDate(date, zoneId));
success = true;
}
return success;
}
private boolean setSendDate(MaildropEntry drop, Date sendDate) {
boolean result = false;
if (DateUtilities.isFuture(sendDate)) {
Date genDate = (drop.getStatus() == MaildropStatus.TEST.getCode()) ? sendDate : DateUtils.addHours(sendDate, -3);
if (DateUtilities.isPast(genDate)) {
genDate = new Date();
drop.setGenStatus(MaildropGenerationStatus.NOW.getCode());
}
drop.setSendDate(sendDate);
drop.setGenDate(genDate);
result = true;
}
return result;
}
private MaildropEntry getMaildropForUpdate(Set<MaildropEntry> entries) {
MaildropEntry drop = null;
Date maxDate = null;
for (MaildropEntry entry : entries) {
if (maxDate == null || maxDate.before(entry.getGenChangeDate())) {
maxDate = entry.getGenChangeDate();
drop = entry;
}
}
return drop;
}
private int getIntValue(Map<String, Object> map, String key) {
Number num = (Number) map.get(key);
return num.intValue();
}
private JSONArray mailingsAsJson(List<Map<String, Object>> mailings, Map<Integer, Integer> openers, Map<Integer, Integer> clickers, ComAdmin admin) {
TimeZone timezone = AgnUtils.getTimeZone(admin);
Locale locale = admin.getLocale();
DateFormat dateFormat = DateUtilities.getFormat(DATE_FORMAT, timezone);
DateFormat timeFormat = DateUtilities.getFormat(TIME_FORMAT, timezone);
JSONArray result = new JSONArray();
for (Map<String, Object> mailing : mailings) {
JSONObject object = new JSONObject();
Date sendDate = (Date) mailing.get("senddate");
int mailingId = getIntValue(mailing, "mailingId");
boolean isSent = getIntValue(mailing, "genstatus") > MaildropGenerationStatus.SCHEDULED.getCode();
// hardcode because dao returns keys in different case (depends on db)
object.element("shortname", getShortname(mailing));
object.element("mailingId", mailing.get("mailingid"));
object.element("workstatus", mailing.get("workstatus"));
object.element("workstatusIn", I18nString.getLocaleString((String) mailing.get("workstatus"), locale));
object.element("preview_component", mailing.get("preview_component"));
object.element("mailsSent", mailing.get("mailssent"));
object.element("genstatus", mailing.get("genstatus"));
object.element("statusfield", mailing.get("statusfield"));
object.element("subject", mailing.get("subject"));
object.element("planned", mailing.get("planned"));
object.element("plannedInPast", mailing.get("plannedInPast"));
object.element("sendDate", DateUtilities.format(sendDate, dateFormat));
object.element("sendTime", DateUtilities.format(sendDate, timeFormat));
object.element("sent", isSent);
object.element("openers", openers.getOrDefault(mailingId, 0));
object.element("clickers", clickers.getOrDefault(mailingId, 0));
result.add(object);
}
return result;
}
private String getShortname(Map<String, Object> mailing) {
String shortname = (String) mailing.get("shortname");
if (StringUtils.isNotEmpty(shortname)) {
return shortname.replace("'", "'").replace(LINE_SEPARATOR, "");
}
return StringUtils.EMPTY;
}
}
18
Source : MailingRecipientExportReporter.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
18
Source : RedirectServlet.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public void setMailingDao(ComMailingDao comMailingDao) {
this.mailingDao = comMailingDao;
}
18
Source : ComMailingLightServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComMailingLightServiceImpl implements ComMailingLightService {
private ComMailingDao mailingDao;
private ComCompanyDao companyDao;
private MaildropService maildropService;
@Override
public List<LightweightMailingWithMailingList> getLightweightMailings(@VelocityCheck int companyID, int adminId, int parentMailingId, int mailingId) {
List<ComMailing> mailings = mailingDao.getMailings(companyID, adminId, TAKE_ALL_MAILINGS, "W", true);
List<LightweightMailingWithMailingList> results = mailings.stream().filter(mailing -> mailing.getDeleted() == 0 || maildropService.isActiveMailing(mailing.getId(), companyID)).map(mailing -> new LightweightMailingWithMailingList(mailing, mailing.getMailinglistID())).collect(Collectors.toList());
boolean isParentIdNotInResultsList = results.stream().mapToInt(LightweightMailingWithMailingList::getMailingListId).noneMatch(id -> id == parentMailingId);
if (parentMailingId > 0 && parentMailingId != mailingId && isParentIdNotInResultsList) {
ComMailing parentMailing = mailingDao.getMailing(parentMailingId, companyID);
results.add(new LightweightMailingWithMailingList(parentMailing, parentMailing.getMailinglistID()));
}
return results;
}
@Override
public boolean isMailtrackingActive(@VelocityCheck int companyID) {
return companyDao.isMailtrackingActive(companyID);
}
@Override
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Override
@Required
public void setCompanyDao(ComCompanyDao companyDao) {
this.companyDao = companyDao;
}
@Override
@Required
public void setMaildropService(final MaildropService service) {
this.maildropService = service;
}
}
18
Source : AgnTagResolverFactoryImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public final void setMailingDao(final ComMailingDao dao) {
this.mailingDao = Objects.requireNonNull(dao, "Mailing DAO cannot be null");
}
18
Source : ComOptimizationStatServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComOptimizationStatServiceImpl implements ComOptimizationStatService {
private ComOptimizationStatDao statDao;
private ComMailingDao mailingDao;
private ComCompanyDao comCompanyDao;
@Override
public CampaignStatEntry getStat(int mailingID, @VelocityCheck int companyID) {
CampaignStatEntry statEntry = new CampaignStatEntryImpl();
statEntry.setShortname(mailingDao.getMailingName(mailingID, companyID));
statEntry.setTotalMails(statDao.getSend(mailingID, CommonKeys.TYPE_WORLDMAILING));
/* AGNEMM-1517: Disabled
statEntry.setBounces(statDao.getBounces(mailingID, companyID));
*/
statEntry.setClicks(statDao.getClicks(mailingID, companyID, CommonKeys.ALL_SUBSCRIBERS));
statEntry.setOpened(statDao.getOpened(mailingID, companyID, CommonKeys.ALL_SUBSCRIBERS));
/* AGNEMM-1517: Disabled
statEntry.setOptouts(statDao.getOptOuts(mailingID, companyID));
*/
if (comCompanyDao.hasDeepTrackingTables(companyID)) {
statEntry.setRevenue(statDao.getRevenue(mailingID, companyID));
} else {
statEntry.setRevenue(0);
}
statEntry.setClickRate(statEntry.getTotalMails() != 0 ? ((double) statEntry.getClicks()) / ((double) statEntry.getTotalMails()) : 0);
statEntry.setOpenRate(statEntry.getTotalMails() != 0 ? ((double) statEntry.getOpened()) / ((double) statEntry.getTotalMails()) : 0);
return statEntry;
}
@Override
public Hashtable<Integer, CampaignStatEntry> getStat(ComOptimization optimization) {
Hashtable<Integer, CampaignStatEntry> optimizationStat = new Hashtable<>();
if (optimization.getGroup1() > 0) {
optimizationStat.put(optimization.getGroup1(), getStat(optimization.getGroup1(), optimization.getCompanyID()));
}
if (optimization.getGroup2() > 0) {
optimizationStat.put(optimization.getGroup2(), getStat(optimization.getGroup2(), optimization.getCompanyID()));
}
if (optimization.getGroup3() > 0) {
optimizationStat.put(optimization.getGroup3(), getStat(optimization.getGroup3(), optimization.getCompanyID()));
}
if (optimization.getGroup4() > 0) {
optimizationStat.put(optimization.getGroup4(), getStat(optimization.getGroup4(), optimization.getCompanyID()));
}
if (optimization.getGroup5() > 0) {
optimizationStat.put(optimization.getGroup5(), getStat(optimization.getGroup5(), optimization.getCompanyID()));
}
return optimizationStat;
}
public void setStatDao(ComOptimizationStatDao statDao) {
this.statDao = statDao;
}
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
public void setComCompanyDao(ComCompanyDao comCompanyDao) {
this.comCompanyDao = comCompanyDao;
}
}
18
Source : ComOptimizationCommonServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComOptimizationCommonServiceImpl implements ComOptimizationCommonService {
private ComOptimizationDao optimizationDao;
private MaildropStatusDao maildropStatusDao;
private ComMailingDao mailingDao;
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#save(com.agnitas.mailing.autooptimization.beans.ComOptimization)
*/
@Override
public int save(ComOptimization optimization) {
return optimizationDao.save(optimization);
}
@Override
public void unscheduleOptimization(ComOptimization optimization) throws MaildropDeleteException {
unscheduleOptimization(optimization, false);
}
@Override
public void unscheduleOptimization(ComOptimization optimization, boolean testComplete) throws MaildropDeleteException {
final int previousStatus = optimization.getStatus();
// remove the send date of the optimization
optimization.setSendDate(null);
optimization.setStatus(STATUS_NOT_STARTED);
save(optimization);
int droppedEntriesCount = 0;
// remove the maildrop entries of all mailings
for (Integer mailingID : optimization.getTestmailingIDs()) {
droppedEntriesCount += maildropStatusDao.deleteUnsentEntries(mailingID);
if (!(optimization.isTestRun() && testComplete)) {
mailingDao.updateStatus(mailingID, "canceled");
}
}
int finalMailingId = optimization.getFinalMailingId();
if (finalMailingId > 0) {
droppedEntriesCount += maildropStatusDao.deleteUnsentEntries(finalMailingId);
if (!(optimization.isTestRun() && testComplete)) {
mailingDao.updateStatus(finalMailingId, "canceled");
}
}
if (previousStatus != STATUS_NOT_STARTED && droppedEntriesCount == 0) {
throw new MaildropDeleteException("Failure while unscheduling , could not drop entries from maildrop_status_tbl !");
}
}
public void setOptimizationDao(ComOptimizationDao optimizationDao) {
this.optimizationDao = optimizationDao;
}
public void setMaildropStatusDao(MaildropStatusDao maildropStatusDao) {
this.maildropStatusDao = maildropStatusDao;
}
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
18
Source : Unsubscription.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
final clreplaced Unsubscription {
/**
* DAO accessing mailing data.
*/
private final ComMailingDao mailingDao;
/**
* DAO accessing subscriber bindings.
*/
private final ComBindingEntryDao bindingEntryDao;
public Unsubscription(final ComMailingDao mailingDao, final ComBindingEntryDao bindingEntryDao) {
this.mailingDao = Objects.requireNonNull(mailingDao, "Mailing DAO is null");
this.bindingEntryDao = Objects.requireNonNull(bindingEntryDao, "Binding entry DAO is null");
}
public final void performUnsubscription(final ComExtensibleUID uid, final String remark) {
final int mailinglistID = mailingDao.getMailinglistId(uid.getMailingID(), uid.getCompanyID());
if (mailinglistID > 0) {
final BindingEntry entry = bindingEntryDao.get(uid.getCustomerID(), uid.getCompanyID(), mailinglistID, 0);
entry.setUserStatus(UserStatus.UserOut.getStatusCode());
entry.setExitMailingID(uid.getMailingID());
entry.setUserRemark(remark);
bindingEntryDao.updateBinding(entry, uid.getCompanyID());
}
}
}
18
Source : ComTargetServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Sets DAO for accessing mailing data.
*
* @param mailingDao DAO for accessing mailing data
*/
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
18
Source : EmmMailingIdValidator.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* EMM-specific implementation of {@link MailingIdValidator} interface.
*/
public clreplaced EmmMailingIdValidator implements MailingIdValidator {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(EmmMailingIdValidator.clreplaced);
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
@Override
public void validateMailingId(int mailingId, int companyId) throws MailingIdValidationException {
if (logger.isInfoEnabled()) {
logger.info("Validating mailing ID " + mailingId + " for company " + companyId);
}
LightweightMailing mailing = mailingDao.getLightweightMailing(companyId, mailingId);
if (mailing == null) {
if (logger.isInfoEnabled()) {
logger.info("Validation mailing ID " + mailingId + " for company " + companyId + " failed.");
}
throw new MailingIdValidationException("Unknown mailing ID " + mailingId + " (company ID " + companyId + ")");
}
}
/**
* Sets DAO for accessing mailing data.
*
* @param dao DAO for accessing mailing data
*/
@Required
public void setMailingDao(ComMailingDao dao) {
this.mailingDao = dao;
}
}
18
Source : EmmMailingIdValidator.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Sets DAO for accessing mailing data.
*
* @param dao DAO for accessing mailing data
*/
@Required
public void setMailingDao(ComMailingDao dao) {
this.mailingDao = dao;
}
18
Source : EmmMailingTypeResolverFactory.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public void setMailingDao(ComMailingDao dao) {
this.mailingDao = dao;
}
18
Source : ScriptHelperService.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ScriptHelperService {
private ComMailingDao mailingDao;
private PreviewFactory previewFactory;
/**
* this method returns the mailingID for last sent mailing for the given company,customer.
* ATTENTION! Only already sent World-Mailings will be found!
* @param companyID
* @param customerID
* @return
*/
public int getLastSentMailingID(@VelocityCheck int companyID, int customerID) {
int returnValue = -1;
returnValue = mailingDao.getLastSentMailing(companyID, customerID);
return returnValue;
}
/**
* This method returns the mailing ID for a already sent world-mailing with the given companyID and
* (if given) the mailingListID. If no mailingListID is given (null or "0") it will be ignored.
* @param companyID
* @param mailingListID
* @return
*/
public int getLastSentWorldMailingByCompanyAndMailinglist(@VelocityCheck int companyID, int mailingListID) {
return mailingDao.getLastSentWorldMailingByCompanyAndMailinglist(companyID, mailingListID);
}
public Map<String, Object> getAnonLastSentMailing(@VelocityCheck int companyID, int customerID) throws Exception {
int lastNewsletter = -1;
lastNewsletter = getLastSentMailingID(companyID, customerID);
if (lastNewsletter == -1) {
throw new Exception("No Mailing found with companyID: " + companyID + " and customerID: " + customerID);
}
return generateBackEndPreview(lastNewsletter, customerID);
}
/**
* This method returns the HTML Part for the given customerID and the given mailingID.
* @param mailingID
* @param customerID
* @return
* @throws Exception
*/
public Object getAnonLastSentMailingByMailingID(int mailingID, int customerID) throws Exception {
Object returnObject = null;
try {
returnObject = generateBackEndHTMLPreview(mailingID, customerID);
} catch (Exception e) {
throw new Exception("ScriptHelperService failed to generate the html preview: " + e);
}
if (returnObject == null) {
throw new Exception("ScriptHelperService failed to generate the html preview. MailingID: " + mailingID + ", customerID: " + customerID);
}
return returnObject;
}
@Deprecated
protected Map<String, Object> generateBackEndPreview(int mailingID, int customerID) {
// PreviewFactory previewFactory = (PreviewFactory) con.getBean("PreviewFactory");
Preview preview = previewFactory.createPreview();
// get a anonymized Fullview.
Map<String, Object> output = preview.createPreview(mailingID, customerID, null, true, false);
preview.done();
return output;
}
/**
* generates a html representation of the given mailing (mailingID) with the given Customer.
* @param mailingID
* @param customerID
* @return
* @throws Exception
*/
protected Object generateBackEndHTMLPreview(int mailingID, int customerID) throws Exception {
return generateBackEndHTMLPreview(mailingID, customerID, false);
}
/**
* generates a html representation of the given mailing (mailingID) with the given Customer.
* if mobile is true, the mobile representation will be returned. BUT if the mobile part is null,
* the normal html part will be returned!
* @param mailingID
* @param customerID
* @param mobile
* @return
* @throws Exception
*/
protected Object generateBackEndHTMLPreview(int mailingID, int customerID, boolean mobile) throws Exception {
Preview preview = previewFactory.createPreview();
Page page = preview.makePreview(mailingID, customerID, null, true, false);
if (page.getError() != null) {
throw new Exception("ScriptHelperService::generateBackEndHTMLPreview: Error generating preview. mailingID: " + mailingID + " customerID: " + customerID + "\n previewError: " + page.getError());
}
return page.getHTML();
}
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
public void setPreviewFactory(PreviewFactory previewFactory) {
this.previewFactory = previewFactory;
}
}
18
Source : MailloopServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Set DAO for accessing mailing data.
*
* @param dao DAO for accessing mailing data
*/
@Required
public void setMailingDao(final ComMailingDao dao) {
this.mailingDao = dao;
}
18
Source : MailingContentServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Service
public clreplaced MailingContentServiceImpl implements MailingContentService {
private DynamicTagContentFactory dynamicTagContentFactory;
private ComMailingBaseService mailingBaseService;
private ConversionService conversionService;
private ApplicationContext applicationContext;
private ComMailingDao mailingDao;
private EmmActionDao actionDao;
public MailingContentServiceImpl(DynamicTagContentFactory dynamicTagContentFactory, ComMailingBaseService mailingBaseService, ConversionService conversionService, ApplicationContext applicationContext, ComMailingDao mailingDao, EmmActionDao actionDao) {
this.dynamicTagContentFactory = dynamicTagContentFactory;
this.mailingBaseService = mailingBaseService;
this.conversionService = conversionService;
this.applicationContext = applicationContext;
this.mailingDao = mailingDao;
this.actionDao = actionDao;
}
private void removeAbsentDynContent(DynamicTag oldDynamicTag, DynamicTag newDynamicTag) {
List<Integer> idForRemoving = getIdForRemoving(oldDynamicTag, newDynamicTag);
idForRemoving.forEach(contentId -> {
mailingDao.deleteContentFromMailing(oldDynamicTag.getCompanyID(), oldDynamicTag.getMailingID(), contentId);
});
}
@Override
public ServiceResult<List<UserAction>> updateDynContent(Mailing mailing, DynTagDto dynTagDto, ComAdmin admin) throws Exception {
DynamicTag oldDynamicTag = mailing.getDynamicTagById(dynTagDto.getId());
DynamicTag newDynamicTag = convertDynTagDtoToDynamicTag(admin.getCompanyID(), oldDynamicTag, dynTagDto);
mailing.getDynTags().replace(newDynamicTag.getDynName(), newDynamicTag);
List<EmmAction> actions = actionDao.getEmmActions(admin.getCompanyID());
mailing.setPossibleActions(actions);
final ActionMessages errors = new ActionMessages();
mailing.buildDependencies(false, null, applicationContext, null, errors, admin);
if (!errors.isEmpty()) {
final List<Message> messages = new ArrayList<>();
@SuppressWarnings("unchecked")
Iterator<ActionMessage> iterator = errors.get();
iterator.forEachRemaining(err -> messages.add(Message.of(err.getKey(), err.getValues())));
return ServiceResult.error(messages);
}
boolean hasNoCleanPermission = admin.permissionAllowed(Permission.MAILING_TRACKABLELINKS_NOCLEANUP);
mailingBaseService.saveMailingWithUndo(mailing, admin.getAdminID(), hasNoCleanPermission);
mailingDao.updateStatus(mailing.getId(), "edit");
List<UserAction> userActions = getUserActions(oldDynamicTag, newDynamicTag, mailing);
removeAbsentDynContent(oldDynamicTag, newDynamicTag);
return ServiceResult.success(userActions);
}
@Override
public DynTagDto getDynTag(@VelocityCheck int companyId, int dynNameId) {
DynamicTag tag = mailingBaseService.getDynamicTag(companyId, dynNameId);
if (tag == null) {
return null;
}
return conversionService.convert(tag, DynTagDto.clreplaced);
}
private List<Integer> getIdForRemoving(DynamicTag oldDynamicTag, DynamicTag newDynamicTag) {
Set<Integer> oldIds = oldDynamicTag.getDynContent().values().stream().map(DynamicTagContent::getId).collect(Collectors.toSet());
Set<Integer> newIds = newDynamicTag.getDynContent().values().stream().map(DynamicTagContent::getId).collect(Collectors.toSet());
return oldIds.stream().filter(oldId -> !newIds.contains(oldId)).collect(Collectors.toList());
}
private List<Integer> getCreatedId(DynamicTag oldDynamicTag, DynamicTag newDynamicTag) {
Set<Integer> oldIds = oldDynamicTag.getDynContent().values().stream().map(DynamicTagContent::getId).collect(Collectors.toSet());
Set<Integer> newIds = newDynamicTag.getDynContent().values().stream().map(DynamicTagContent::getId).collect(Collectors.toSet());
return newIds.stream().filter(oldId -> !oldIds.contains(oldId)).collect(Collectors.toList());
}
private List<Integer> getUpdateContentIds(DynamicTag oldDynamicTag, DynamicTag newDynamicTag) {
return oldDynamicTag.getDynContent().values().stream().filter((oldDynContent) -> {
DynamicTagContent newDynContent = newDynamicTag.getDynContentID(oldDynContent.getId());
return Objects.nonNull(newDynContent) && !oldDynContent.getDynContent().equals(newDynContent.getDynContent());
}).map(DynamicTagContent::getId).collect(Collectors.toList());
}
private List<Integer> getUpdateTargetGroupIds(DynamicTag oldDynamicTag, DynamicTag newDynamicTag) {
return oldDynamicTag.getDynContent().values().stream().filter((oldDynContent) -> {
DynamicTagContent newDynContent = newDynamicTag.getDynContentID(oldDynContent.getId());
return Objects.nonNull(newDynContent) && oldDynContent.getTargetID() != newDynContent.getTargetID();
}).map(DynamicTagContent::getId).collect(Collectors.toList());
}
private DynamicTag convertDynTagDtoToDynamicTag(int companyId, DynamicTag oldDynamicTag, DynTagDto dynTagDto) {
DynamicTag clonedDynTag = oldDynamicTag.clone();
clonedDynTag.setId(dynTagDto.getId());
clonedDynTag.setDynName(dynTagDto.getName());
clonedDynTag.setMailingID(dynTagDto.getMailingId());
clonedDynTag.setDynInterestGroup(dynTagDto.getInterestGroup());
clonedDynTag.setCompanyID(companyId);
Map<Integer, DynamicTagContent> dynamicTagContentMap = dynTagDto.getContentBlocks().stream().map(content -> {
DynamicTagContent oldContent = oldDynamicTag.getDynContentID(content.getId());
return convertDynContentDtoToDynamicTagContent(companyId, oldContent, content, dynTagDto);
}).collect(Collectors.toMap(DynamicTagContent::getDynOrder, Function.idenreplacedy()));
clonedDynTag.setDynContent(dynamicTagContentMap);
return clonedDynTag;
}
private List<UserAction> getUserActions(DynamicTag oldDynamicTag, DynamicTag newDynamicTag, Mailing mailing) {
ArrayList<UserAction> userActions = new ArrayList<>();
final String formatPattern = "%s (%d) %s %s %s (%d)";
String mailingEnreplacedyName = mailing.isIsTemplate() ? "template" : "mailing";
String mailingShortname = mailing.getShortname();
int mailingId = mailing.getId();
List<Integer> idForRemoving = getIdForRemoving(oldDynamicTag, newDynamicTag);
idForRemoving.forEach((removedId) -> {
final Object[] formatParameter = new Object[] { null, null, null, mailingEnreplacedyName, mailingShortname, mailingId };
formatParameter[0] = oldDynamicTag.getDynName();
formatParameter[1] = removedId;
formatParameter[2] = "from";
userActions.add(new UserAction("delete textblock", String.format(formatPattern, formatParameter)));
});
List<Integer> updateContentIds = getUpdateContentIds(oldDynamicTag, newDynamicTag);
updateContentIds.forEach((updatedContentId) -> {
final Object[] formatParameter = new Object[] { null, null, null, mailingEnreplacedyName, mailingShortname, mailingId };
formatParameter[0] = oldDynamicTag.getDynName();
formatParameter[1] = updatedContentId;
formatParameter[2] = "from";
userActions.add(new UserAction("edit textblock content", String.format(formatPattern, formatParameter)));
});
List<Integer> updateTargetGroupIds = getUpdateTargetGroupIds(oldDynamicTag, newDynamicTag);
updateTargetGroupIds.forEach((updatedTargetId) -> {
final Object[] formatParameter = new Object[] { null, null, null, mailingEnreplacedyName, mailingShortname, mailingId };
formatParameter[0] = oldDynamicTag.getDynName();
formatParameter[1] = updatedTargetId;
formatParameter[2] = "from";
userActions.add(new UserAction("edit textblock target group", String.format(formatPattern, formatParameter)));
});
List<Integer> createdIds = getCreatedId(oldDynamicTag, newDynamicTag);
createdIds.forEach((createdId) -> {
final Object[] formatParameter = new Object[] { null, null, null, mailingEnreplacedyName, mailingShortname, mailingId };
formatParameter[0] = newDynamicTag.getDynName();
formatParameter[1] = createdId;
formatParameter[2] = "in the";
userActions.add(new UserAction("create textblock", String.format(formatPattern, formatParameter)));
});
return userActions;
}
private DynamicTagContent convertDynContentDtoToDynamicTagContent(int companyId, DynamicTagContent oldDynContent, DynContentDto dynContentDto, DynTagDto dynTagDto) {
DynamicTagContent clonedDynContent;
if (Objects.nonNull(oldDynContent)) {
clonedDynContent = oldDynContent.clone();
} else {
clonedDynContent = dynamicTagContentFactory.newDynamicTagContent();
}
clonedDynContent.setId(dynContentDto.getId());
clonedDynContent.setDynOrder(dynContentDto.getIndex());
clonedDynContent.setDynContent(dynContentDto.getContent());
clonedDynContent.setTargetID(dynContentDto.getTargetId());
clonedDynContent.setCompanyID(companyId);
clonedDynContent.setDynName(dynTagDto.getName());
clonedDynContent.setDynNameID(dynTagDto.getId());
clonedDynContent.setMailingID(dynTagDto.getMailingId());
return clonedDynContent;
}
}
18
Source : MailingContentTypeCacheImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public final clreplaced MailingContentTypeCacheImpl extends AbstractCompanyBasedDaoCache<MailingContentType> implements MailingContentTypeCache {
private ComMailingDao mailingDao;
private ConfigService configService;
@Required
public final void setMailingDao(final ComMailingDao dao) {
this.mailingDao = Objects.requireNonNull(dao, "Mailing DAO cannot be null");
}
@Required
public final void setConfigService(final ConfigService configService) {
this.configService = Objects.requireNonNull(configService, "ConfigService cannot be null");
}
@Override
protected final MailingContentType gereplacedemFromDao(final int mailingId, final int companyId) {
if (!isCacheInitialized()) {
setCache(new TimeoutLRUMap<IdWithCompanyID, MailingContentType>(configService.getIntegerValue(ConfigValue.CompanyMaxCache), configService.getIntegerValue(ConfigValue.CompanyMaxCacheTimeMillis)));
}
return mailingDao.getMailingContentType(companyId, mailingId);
}
}
18
Source : ComSnowflakeMailingCacheImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Setter for ComMailingDao.
*
* @param comMailingDao
* DAO
*/
@Required
public void setComMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
18
Source : MaildropServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public void setMailingDao(final ComMailingDao dao) {
this.mailingDao = dao;
}
18
Source : ComRdirMailingDataDaoCache.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComRdirMailingDataDaoCache extends AbstractDaoCache<ComRdirMailingData> {
private ComMailingDao mailingDao;
private ConfigService configService;
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setConfigService(ConfigService configService) {
this.configService = configService;
}
@Override
protected ComRdirMailingData gereplacedemFromDao(int mailingId) {
if (!isCacheInitialized()) {
setCache(new TimeoutLRUMap<Integer, ComRdirMailingData>(configService.getIntegerValue(ConfigValue.RdirMailingIdsMaxCache), configService.getIntegerValue(ConfigValue.RdirMailingIdsMaxCacheTimeMillis)));
}
return this.mailingDao.getRdirMailingData(mailingId);
}
}
18
Source : ComBirtReportServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Set DAO accessing mailing data.
*
* @param mailingDao DAO accessing mailing data
*/
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
18
Source : ActionOperationUnsubscribeCustomerImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ActionOperationUnsubscribeCustomerImpl implements EmmActionOperation {
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
private BeanLookupFactory beanLookupFactory;
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setBeanLookupFactory(BeanLookupFactory beanLookupFactory) {
this.beanLookupFactory = beanLookupFactory;
}
@Override
public boolean execute(AbstractActionOperationParameters operation, Map<String, Object> params, final EmmActionOperationErrors actionOperationErrors) throws Exception {
ActionOperationUnsubscribeCustomerParameters op = (ActionOperationUnsubscribeCustomerParameters) operation;
int companyID = op.getCompanyId();
int customerID = 0;
int mailingID = 0;
if (params.get("customerID") != null) {
customerID = ((Integer) params.get("customerID")).intValue();
}
if (params.get("mailingID") != null) {
mailingID = ((Integer) params.get("mailingID")).intValue();
}
if (customerID != 0 && mailingID != 0) {
Recipient aCust = beanLookupFactory.getBeanRecipient();
aCust.setCompanyID(companyID);
aCust.setCustomerID(customerID);
aCust.loadCustDBStructure();
aCust.loadAllListBindings();
final int mailinglistID = mailingDao.getMailinglistId(mailingID, companyID);
if (mailinglistID <= 0) {
return false;
} else {
Map<Integer, Map<Integer, BindingEntry>> bindingsByMailinglistAndMediatype = aCust.getListBindings();
if (bindingsByMailinglistAndMediatype.containsKey(mailinglistID)) {
Map<Integer, BindingEntry> bindingsByMediatype = bindingsByMailinglistAndMediatype.get(mailinglistID);
if (bindingsByMediatype.containsKey(MediaTypes.EMAIL.getMediaCode())) {
BindingEntry aEntry = bindingsByMediatype.get(MediaTypes.EMAIL.getMediaCode());
switch(UserStatus.getUserStatusByID(aEntry.getUserStatus())) {
case Active:
case Bounce:
case Suspend:
if (!aEntry.getUserType().equals(UserType.TestVIP.getTypeCode()) && !aEntry.getUserType().equals(UserType.WorldVIP.getTypeCode())) {
aEntry.setUserStatus(UserStatus.UserOut.getStatusCode());
aEntry.setUserRemark("Opt-Out-Mailing: " + mailingID);
aEntry.setExitMailingID(mailingID);
aEntry.updateBindingInDB(companyID);
// next Event-Mailing goes to a user with status 4
params.put("__agn_USER_STATUS", "4");
}
return true;
case AdminOut:
case UserOut:
// next Event-Mailing goes to a user with status 4
params.put("__agn_USER_STATUS", "4");
return true;
default:
return false;
}
} else {
return false;
}
} else {
return false;
}
}
} else {
return false;
}
}
@Override
public ActionOperationType processedType() {
return ActionOperationType.UNSUBSCRIBE_CUSTOMER;
}
}
18
Source : ActionOperationSendMailingImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Required
public void setMailingDao(final ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
17
Source : ImportProfileDaoImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* DAO handler for ImportProfile-Objects
* This clreplaced is compatible with oracle and mysql datasources and databases
*/
public clreplaced ImportProfileDaoImpl extends BaseDaoImpl implements ImportProfileDao {
private static final transient Logger logger = Logger.getLogger(ImportProfileDaoImpl.clreplaced);
protected DataEncryptor dataEncryptor;
private EmmActionOperationDao emmActionOperationDao;
private ComMailingDao mailingDao;
@Required
public void setDataEncryptor(DataEncryptor dataEncryptor) {
this.dataEncryptor = dataEncryptor;
}
@Required
public void setEmmActionOperationDao(EmmActionOperationDao emmActionOperationDao) {
this.emmActionOperationDao = emmActionOperationDao;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Override
@DaoUpdateReturnValueCheck
public int insertImportProfile(ImportProfile importProfile) throws Exception {
int profileId;
if (isOracleDB()) {
profileId = selectInt(logger, "SELECT import_profile_tbl_seq.nextval FROM DUAL");
update(logger, "INSERT INTO import_profile_tbl (id, company_id, admin_id, shortname, column_separator, text_delimiter" + ", file_charset, date_format, import_mode, null_values_action, key_column, report_email, error_email, check_for_duplicates" + ", mail_type, update_all_duplicates, pre_import_action, decimal_separator, action_for_new_recipients, noheaders, zip, zip_preplacedword_encr, automapping, mediatype, datatype)" + " VALUES (" + AgnUtils.repeatString("?", 25, ", ") + ")", profileId, importProfile.getCompanyId(), importProfile.getAdminId(), importProfile.getName(), importProfile.getSeparator(), importProfile.getTextRecognitionChar(), importProfile.getCharset(), importProfile.getDateFormat(), importProfile.getImportMode(), importProfile.getNullValuesAction(), StringUtils.join(importProfile.getKeyColumns(), ", "), importProfile.getMailForReport(), importProfile.getMailForError(), importProfile.getCheckForDuplicates(), importProfile.getDefaultMailType(), importProfile.getUpdateAllDuplicates() ? 1 : 0, importProfile.getImportProcessActionID(), Character.toString(importProfile.getDecimalSeparator()), importProfile.getActionForNewRecipients(), importProfile.isNoHeaders() ? 1 : 0, importProfile.isZipped() ? 1 : 0, StringUtils.isEmpty(importProfile.getZipPreplacedword()) ? null : dataEncryptor.encrypt(importProfile.getZipPreplacedword()), importProfile.isAutoMapping() ? 1 : 0, importProfile.getMediatype() == null ? MediaTypes.EMAIL.getMediaCode() : importProfile.getMediatype().getMediaCode(), importProfile.getDatatype());
} else {
profileId = insertIntoAutoincrementMysqlTable(logger, "id", "INSERT INTO import_profile_tbl (company_id, admin_id, shortname, column_separator, text_delimiter" + ", file_charset, date_format, import_mode, null_values_action, key_column, report_email, error_email, check_for_duplicates" + ", mail_type, update_all_duplicates, pre_import_action, decimal_separator, action_for_new_recipients, noheaders, zip, zip_preplacedword_encr, automapping, mediatype, datatype)" + " VALUES (" + AgnUtils.repeatString("?", 24, ", ") + ")", importProfile.getCompanyId(), importProfile.getAdminId(), importProfile.getName(), importProfile.getSeparator(), importProfile.getTextRecognitionChar(), importProfile.getCharset(), importProfile.getDateFormat(), importProfile.getImportMode(), importProfile.getNullValuesAction(), StringUtils.join(importProfile.getKeyColumns(), ", "), importProfile.getMailForReport(), importProfile.getMailForError(), importProfile.getCheckForDuplicates(), importProfile.getDefaultMailType(), importProfile.getUpdateAllDuplicates() ? 1 : 0, importProfile.getImportProcessActionID(), Character.toString(importProfile.getDecimalSeparator()), importProfile.getActionForNewRecipients(), importProfile.isNoHeaders() ? 1 : 0, importProfile.isZipped() ? 1 : 0, StringUtils.isEmpty(importProfile.getZipPreplacedword()) ? null : dataEncryptor.encrypt(importProfile.getZipPreplacedword()), importProfile.isAutoMapping() ? 1 : 0, importProfile.getMediatype() == null ? MediaTypes.EMAIL.getMediaCode() : importProfile.getMediatype().getMediaCode(), importProfile.getDatatype());
}
importProfile.setId(profileId);
insertGenderMappings(importProfile.getGenderMapping(), importProfile.getId());
updateMailinglists(importProfile);
return importProfile.getId();
}
@Override
@DaoUpdateReturnValueCheck
public void updateImportProfile(ImportProfile importProfile) throws Exception {
update(logger, "UPDATE import_profile_tbl SET company_id = ?, admin_id = ?, shortname = ?, column_separator = ?, text_delimiter = ?, file_charset = ?, date_format = ?, import_mode = ?, null_values_action = ?, key_column = ?, report_email = ?, error_email = ?, check_for_duplicates = ?, mail_type = ?, update_all_duplicates = ?, pre_import_action = ?, decimal_separator = ?, action_for_new_recipients = ?, noheaders = ?, zip = ?, zip_preplacedword_encr = ?, automapping = ?, mediatype = ?, datatype = ? WHERE id = ?", importProfile.getCompanyId(), importProfile.getAdminId(), importProfile.getName(), importProfile.getSeparator(), importProfile.getTextRecognitionChar(), importProfile.getCharset(), importProfile.getDateFormat(), importProfile.getImportMode(), importProfile.getNullValuesAction(), StringUtils.join(importProfile.getKeyColumns(), ", "), importProfile.getMailForReport(), importProfile.getMailForError(), importProfile.getCheckForDuplicates(), importProfile.getDefaultMailType(), importProfile.getUpdateAllDuplicates() ? 1 : 0, importProfile.getImportProcessActionID(), Character.toString(importProfile.getDecimalSeparator()), importProfile.getActionForNewRecipients(), importProfile.isNoHeaders() ? 1 : 0, importProfile.isZipped() ? 1 : 0, StringUtils.isEmpty(importProfile.getZipPreplacedword()) ? null : dataEncryptor.encrypt(importProfile.getZipPreplacedword()), importProfile.isAutoMapping() ? 1 : 0, importProfile.getMediatype() == null ? MediaTypes.EMAIL.getMediaCode() : importProfile.getMediatype().getMediaCode(), importProfile.getDatatype(), importProfile.getId());
update(logger, "DELETE FROM import_gender_mapping_tbl WHERE profile_id = ?", importProfile.getId());
insertGenderMappings(importProfile.getGenderMapping(), importProfile.getId());
updateMailinglists(importProfile);
}
private void updateMailinglists(ImportProfile profile) {
// Keep old mailing list bindings untouched if EMM action is selected.
if (profile.getActionForNewRecipients() == 0) {
updateMailinglists(profile.getMailinglistIds(), profile.getId(), profile.getCompanyId());
}
}
private void updateMailinglists(List<Integer> mailinglists, int profileId, int companyId) {
String cleanMailinglistsSql = "DELETE FROM import_profile_mlist_bind_tbl WHERE company_id = ? AND import_profile_id = ?";
update(logger, cleanMailinglistsSql, companyId, profileId);
String insertMailinglists = "INSERT INTO import_profile_mlist_bind_tbl(import_profile_id, mailinglist_id, company_id) VALUES (?, ?, ?)";
List<Object[]> params = new ArrayList<>();
for (int mailinglistId : mailinglists) {
params.add(new Object[] { profileId, mailinglistId, companyId });
}
batchupdate(logger, insertMailinglists, params);
}
@Override
public ImportProfile getImportProfileById(int id) {
try {
return selectObjectDefaultNull(logger, "SELECT * FROM import_profile_tbl WHERE id = ? AND deleted != 1", new ImportProfileRowMapper(), id);
} catch (DataAccessException e) {
// No ImportProfile found
return null;
}
}
@Override
public ImportProfile getImportProfileByShortname(String shortname) {
return selectObjectDefaultNull(logger, "SELECT * FROM import_profile_tbl WHERE UPPER(shortname) = UPPER(?) AND deleted != 1", new ImportProfileRowMapper(), shortname);
}
@Override
public List<ImportProfile> getImportProfilesByCompanyId(@VelocityCheck int companyId) {
return select(logger, "SELECT * FROM import_profile_tbl WHERE company_id = ? AND deleted != 1 ORDER BY LOWER(shortname) ASC", new ImportProfileRowMapper(), companyId);
}
@Override
public List<ImportProfile> getAllImportProfilesByCompanyId(@VelocityCheck int companyId) {
return select(logger, "SELECT * FROM import_profile_tbl WHERE company_id = ?", new ImportProfileRowMapper(), companyId);
}
@Override
@DaoUpdateReturnValueCheck
public boolean deleteImportProfileById(int profileId) {
try {
update(logger, "DELETE FROM import_profile_mlist_bind_tbl WHERE import_profile_id = ?", profileId);
update(logger, "DELETE FROM import_profile_tbl WHERE id = ?", profileId);
update(logger, "DELETE FROM import_column_mapping_tbl WHERE profile_id = ?", profileId);
update(logger, "DELETE FROM import_gender_mapping_tbl WHERE profile_id = ?", profileId);
} catch (Exception e) {
return false;
}
return true;
}
@Override
public void insertColumnMappings(List<ColumnMapping> columnMappings) {
if (columnMappings != null && !columnMappings.isEmpty()) {
String insertStatementString;
if (isOracleDB()) {
insertStatementString = "INSERT INTO import_column_mapping_tbl (id, profile_id, file_column, db_column, mandatory, encrypted, default_value) VALUES (import_column_mapping_tbl_seq.NEXTVAL, ?, ?, ?, ?, ?, ?)";
} else {
insertStatementString = "INSERT INTO import_column_mapping_tbl (profile_id, file_column, db_column, mandatory, encrypted, default_value) VALUES (?, ?, ?, ?, ?, ?)";
}
List<Object[]> parameterList = new ArrayList<>();
for (ColumnMapping mapping : columnMappings) {
parameterList.add(new Object[] { mapping.getProfileId(), mapping.getFileColumn(), mapping.getDatabaseColumn(), mapping.isMandatory(), mapping.isEncrypted(), mapping.getDefaultValue() });
}
batchupdate(logger, insertStatementString, parameterList);
}
}
@Override
public void updateColumnMappings(List<ColumnMapping> mappings) {
if (!CollectionUtils.isEmpty(mappings)) {
String updateStatement = "UPDATE import_column_mapping_tbl SET profile_id = ?, file_column = ?, db_column = ?, mandatory = ?, encrypted = ?, default_value = ? WHERE id = ?";
List<Object[]> parameterListForUpdate = new ArrayList<>();
for (ColumnMapping mapping : mappings) {
parameterListForUpdate.add(new Object[] { mapping.getProfileId(), mapping.getFileColumn(), mapping.getDatabaseColumn(), mapping.isMandatory(), mapping.isEncrypted(), mapping.getDefaultValue(), mapping.getId() });
}
batchupdate(logger, updateStatement, parameterListForUpdate);
}
}
@Override
public void deleteColumnMappings(List<Integer> ids) {
if (!CollectionUtils.isEmpty(ids)) {
String sql = "DELETE FROM import_column_mapping_tbl WHERE id = ?";
batchupdate(logger, sql, ids.stream().map(id -> new Object[] { id }).collect(Collectors.toList()));
}
}
@Override
public List<Integer> getSelectedMailingListIds(int id, @VelocityCheck int companyId) {
String sqlGetMailingListIds = "SELECT mailinglist_id FROM import_profile_mlist_bind_tbl WHERE import_profile_id = ? AND company_id = ?";
return select(logger, sqlGetMailingListIds, new IntegerRowMapper(), id, companyId);
}
@DaoUpdateReturnValueCheck
private void insertGenderMappings(Map<String, Integer> mappings, int importProfileId) {
if (mappings != null && !mappings.isEmpty()) {
String insertStatementString;
if (isOracleDB()) {
insertStatementString = "INSERT INTO import_gender_mapping_tbl (id, profile_id, int_gender, string_gender) VALUES (import_gender_mapping_tbl_seq.nextval, ?, ?, ?)";
} else {
insertStatementString = "INSERT INTO import_gender_mapping_tbl (profile_id, int_gender, string_gender) VALUES (?, ?, ?)";
}
List<Object[]> parameterList = new ArrayList<>();
for (Entry<String, Integer> entry : mappings.entrySet()) {
parameterList.add(new Object[] { importProfileId, entry.getValue(), entry.getKey() });
}
batchupdate(logger, insertStatementString, parameterList);
}
}
private clreplaced ImportProfileRowMapper implements RowMapper<ImportProfile> {
@Override
public ImportProfile mapRow(ResultSet resultSet, int row) throws SQLException {
try {
ImportProfile profile = new ImportProfileImpl();
profile.setId(resultSet.getInt("id"));
profile.setName(resultSet.getString("shortname"));
profile.setCompanyId(resultSet.getInt("company_id"));
profile.setAdminId(resultSet.getInt("admin_id"));
profile.setSeparator(resultSet.getInt("column_separator"));
profile.setTextRecognitionChar(resultSet.getInt("text_delimiter"));
profile.setCharset(resultSet.getInt("file_charset"));
profile.setDateFormat(resultSet.getInt("date_format"));
profile.setImportMode(resultSet.getInt("import_mode"));
profile.setKeyColumns(AgnUtils.splitAndTrimList(resultSet.getString("key_column")));
profile.setCheckForDuplicates(resultSet.getInt("check_for_duplicates"));
profile.setNullValuesAction(resultSet.getInt("null_values_action"));
profile.setMailForReport(resultSet.getString("report_email"));
profile.setMailForError(resultSet.getString("error_email"));
profile.setDefaultMailType(resultSet.getInt("mail_type"));
profile.setUpdateAllDuplicates(resultSet.getBoolean("update_all_duplicates"));
if (resultSet.getObject("pre_import_action") == null) {
profile.setImportProcessActionID(0);
} else {
profile.setImportProcessActionID(resultSet.getInt("pre_import_action"));
}
if (resultSet.getObject("action_for_new_recipients") == null) {
profile.setActionForNewRecipients(0);
} else {
profile.setActionForNewRecipients(resultSet.getInt("action_for_new_recipients"));
}
// Read additional data
// Read ColumnMappings
profile.setColumnMapping(select(logger, "SELECT * FROM import_column_mapping_tbl WHERE profile_id = ? AND deleted != 1", new ColumnMappingRowMapper(), profile.getId()));
// Read GenderMappings
List<Map<String, Object>> queryResult = select(logger, "SELECT * FROM import_gender_mapping_tbl WHERE profile_id = ? AND deleted != 1 ORDER BY id", profile.getId());
Map<String, Integer> genderMappings = new HashMap<>();
for (Map<String, Object> resultSetRow : queryResult) {
genderMappings.put((String) resultSetRow.get("string_gender"), ((Number) resultSetRow.get("int_gender")).intValue());
}
profile.setGenderMapping(genderMappings);
String decimalSeparator = resultSet.getString("decimal_separator");
if (StringUtils.isNotEmpty(decimalSeparator)) {
profile.setDecimalSeparator(decimalSeparator.charAt(0));
}
profile.setNoHeaders(resultSet.getBoolean("noheaders"));
profile.setZipped(resultSet.getBoolean("zip"));
profile.setAutoMapping(resultSet.getBoolean("automapping"));
String zipPreplacedwordEncrypted = resultSet.getString("zip_preplacedword_encr");
if (StringUtils.isNotEmpty(zipPreplacedwordEncrypted)) {
profile.setZipPreplacedword(dataEncryptor.decrypt(zipPreplacedwordEncrypted));
} else {
profile.setZipPreplacedword(null);
}
if (profile.getActionForNewRecipients() != 0) {
List<Integer> mailinglistIDs = new ArrayList<>();
List<AbstractActionOperationParameters> operations = emmActionOperationDao.getOperations(profile.getActionForNewRecipients(), profile.getCompanyId());
for (AbstractActionOperationParameters operation : operations) {
if (operation instanceof ActionOperationSendMailingParameters) {
int mailingID = ((ActionOperationSendMailingParameters) operation).getMailingID();
mailinglistIDs.add(mailingDao.getMailinglistId(mailingID, profile.getCompanyId()));
}
}
profile.setMailinglists(mailinglistIDs);
} else {
profile.setMailinglists(getSelectedMailingListIds(profile.getId(), profile.getCompanyId()));
}
profile.setMediatype(MediaTypes.getMediaTypeForCode(resultSet.getInt("mediatype")));
profile.setDatatype(resultSet.getString("datatype"));
return profile;
} catch (Exception e) {
throw new SQLException("Error in ImportProfile data: " + e.getMessage(), e);
}
}
}
private clreplaced ColumnMappingRowMapper implements RowMapper<ColumnMapping> {
@Override
public ColumnMapping mapRow(ResultSet resultSet, int row) throws SQLException {
ColumnMapping mapping = new ColumnMappingImpl();
mapping.setId(resultSet.getInt("id"));
mapping.setProfileId(resultSet.getInt("profile_id"));
mapping.setMandatory(resultSet.getBoolean("mandatory"));
mapping.setEncrypted(resultSet.getBoolean("encrypted"));
mapping.setDatabaseColumn(resultSet.getString("db_column"));
mapping.setFileColumn(resultSet.getString("file_column"));
String defaultValue = resultSet.getString("default_value");
if (StringUtils.isNotEmpty(defaultValue)) {
mapping.setDefaultValue(defaultValue);
}
return mapping;
}
}
}
17
Source : ComMailingLightServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Override
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
17
Source : ComOptimizationScheduleServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComOptimizationScheduleServiceImpl implements ComOptimizationScheduleService {
/**
* DAO accessing mailings.
*/
private ComMailingDao mailingDao;
/**
* DAO accessing target groups.
*/
private ComTargetDao targetDao;
private ComOptimizationCommonService optimizationCommonService;
private MaildropService maildropService;
@Override
public void scheduleOptimization(ComOptimization optimization) throws MailingAllReadySentException, OptimizationIsFinishedException, MaildropDeleteException {
scheduleOptimization(optimization, null);
}
@Override
public void scheduleOptimization(ComOptimization optimization, Map<Integer, MailingSendingProperties> properties) throws MailingAllReadySentException, OptimizationIsFinishedException, MaildropDeleteException {
if (optimization.getStatus() == STATUS_SCHEDULED) {
// re-schedule an
// existing
// optimization
// keep the provided dates, unschedule will overwrite them
Date testSendDate = optimization.getTestMailingsSendDate();
Date sendDate = optimization.getSendDate();
unscheduleOptimization(optimization);
optimization.setSendDate(sendDate);
optimization.setTestMailingsSendDate(testSendDate);
optimization.setStatus(STATUS_SCHEDULED);
}
boolean result = true;
ComTarget splitPart = null;
if (!(optimization.getStatus() == STATUS_SCHEDULED || optimization.getStatus() == STATUS_NOT_STARTED)) {
throw new OptimizationIsFinishedException("The optimization has with id: " + optimization.getId() + " has state " + optimization.getStatus());
}
List<ComMailing> allMailings = getTestMailings(optimization);
// loop over mailings
int i = 0;
for (ComMailing testMailing : allMailings) {
i++;
// check if mailingtype is 'normal' and mailing has not been sent as
// a 'world-mailing' yet,
// if it has been sent throw an Exception
if (testMailing.getMailingType() != MailingTypes.NORMAL.getCode() || this.maildropService.isActiveMailing(testMailing.getId(), testMailing.getCompanyID())) {
throw new MailingAllReadySentException("Mailing has allready been sent ! Mailing-ID: " + testMailing.getId());
}
// set mailinglist_id, target_id, split_id , doublecheck and save it
testMailing.setMailinglistID(optimization.getMailinglistID());
testMailing.setTargetID(0);
String targetExpression = optimization.getTargetExpression();
if (StringUtils.isNotEmpty(targetExpression)) {
String[] targetGroups = targetExpression.split(",");
String operator;
// todo: auto-optimization doesn't seem to support "Subscriber isn't allowed to be in target-groups" target mode
if (optimization.getTargetMode() == Mailing.TARGET_MODE_AND) {
operator = " & ";
} else {
operator = " | ";
}
testMailing.setTargetExpression(StringUtils.join(targetGroups, operator));
} else {
testMailing.setTargetExpression("");
}
splitPart = targetDao.getListSplitTarget(optimization.getSplitType(), i, optimization.getCompanyID());
testMailing.setSplitID(splitPart.getId());
MediatypeEmail emailParam = testMailing.getEmailParam();
if (optimization.getWorkflowId() > 0 && properties != null) {
// workflow driven auto optimization doesn't have such settings and is always false
// so don't update such parameter from optimization fields
MailingSendingProperties mailingSendingProperties = properties.get(testMailing.getId());
if (mailingSendingProperties != null) {
emailParam.setDoublechecking(mailingSendingProperties.isDoubleCheck());
emailParam.setSkipempty(mailingSendingProperties.isSkipEmptyBlocks());
}
} else {
emailParam.setDoublechecking(optimization.isDoubleCheckingActivated());
}
if (mailingDao.saveMailing(testMailing, false) <= 0) {
result = false;
break;
}
}
if (result) {
// schedule mailings by setting entries in maildrop_status_tbl
for (Mailing testMailing : allMailings) {
MailingSendingProperties mailingSendingProperties = null;
if (properties != null) {
mailingSendingProperties = properties.get(testMailing.getId());
}
scheduleMailing(testMailing, optimization.getTestMailingsSendDate(), optimization.isTestRun(), mailingSendingProperties);
}
optimization.setStatus(STATUS_SCHEDULED);
} else {
optimization.setStatus(STATUS_NOT_STARTED);
}
optimizationCommonService.save(optimization);
}
@Override
public void unscheduleOptimization(ComOptimization optimization) throws MaildropDeleteException {
optimizationCommonService.unscheduleOptimization(optimization);
}
private void scheduleMailing(Mailing mailing, Date sendDate, boolean testRun, MailingSendingProperties properties) {
MaildropEntry drop = new MaildropEntryImpl();
drop.setStatus(testRun ? MaildropStatus.TEST.getCode() : MaildropStatus.WORLD.getCode());
drop.setGenStatus(MaildropGenerationStatus.SCHEDULED.getCode());
drop.setSendDate(sendDate);
drop.setGenDate(sendDate);
drop.setGenChangeDate(sendDate);
drop.setMailingID(mailing.getId());
drop.setCompanyID(mailing.getCompanyID());
if (properties != null) {
drop.setMaxRecipients(properties.getMaxRecipients());
Tuple<Integer, Integer> blocksizeAndStepping = AgnUtils.makeBlocksizeAndSteppingFromBlocksize(properties.getBlocksize(), DEFAULT_STEPPING);
drop.setBlocksize(blocksizeAndStepping.getFirst());
drop.setStepping(blocksizeAndStepping.getSecond());
}
mailing.getMaildropStatus().add(drop);
mailingDao.saveMailing(mailing, false);
mailingDao.updateStatus(drop.getMailingID(), testRun ? "test" : "scheduled");
}
private List<ComMailing> getTestMailings(ComOptimization optimization) {
List<ComMailing> allMailings = new ArrayList<>();
List<Integer> testMailingIDs = optimization.getTestmailingIDs();
for (Integer mailingID : testMailingIDs) {
Mailing mailing = mailingDao.getMailing(mailingID, optimization.getCompanyID());
allMailings.add((ComMailing) mailing);
}
return allMailings;
}
/**
* Set DAO accessing mailings.
*
* @param mailingDao DAO accessing mailings
*/
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
/**
* Set DAO accessing target groups.
*
* @param targetDao DAO accessing target groups
*/
@Required
public void setTargetDao(ComTargetDao targetDao) {
this.targetDao = targetDao;
}
@Required
public void setMaildropService(final MaildropService service) {
this.maildropService = service;
}
public void setOptimizationCommonService(ComOptimizationCommonService optimizationCommonService) {
this.optimizationCommonService = optimizationCommonService;
}
}
17
Source : UnsavedChanges.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Component
public clreplaced UnsavedChanges implements CalculationRecipients<CalculationRecipientsConfig> {
private ComMailingDao mailingDao;
private ComMailingBaseService mailingBaseService;
private ComTargetService targetService;
public UnsavedChanges(ComMailingDao mailingDao, ComMailingBaseService mailingBaseService, ComTargetService targetService) {
this.mailingDao = mailingDao;
this.mailingBaseService = mailingBaseService;
this.targetService = targetService;
}
@Override
public int calculate(CalculationRecipientsConfig config) throws Exception {
if (config.getFollowUpMailing() > 0) {
String sqlTargetExpression = targetService.getSQLFromTargetExpression(TargetExpressionUtils.makeTargetExpression(config.getTargetGroupIds(), config.isConjunction()), config.getSplitId(), config.getCompanyId());
return mailingDao.getFollowUpStat(config.getFollowUpMailing(), config.getFollowUpType(), config.getCompanyId(), sqlTargetExpression);
}
return mailingBaseService.calculateRecipients(config.getCompanyId(), config.getMailingListId(), config.getSplitId(), config.getTargetGroupIds(), config.isConjunction());
}
}
17
Source : DefaultCalculation.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
@Component
public clreplaced DefaultCalculation implements CalculationRecipients<CalculationRecipientsConfig> {
private ComMailingBaseService mailingBaseService;
private ComMailingDao mailingDao;
public DefaultCalculation(ComMailingBaseService mailingBaseService, ComMailingDao mailingDao) {
this.mailingBaseService = mailingBaseService;
this.mailingDao = mailingDao;
}
@Override
public int calculate(CalculationRecipientsConfig config) throws Exception {
if (config.getFollowUpMailing() > 0) {
return mailingDao.getFollowUpStat(config.getMailingId(), config.getFollowUpMailing(), config.getFollowUpType(), config.getCompanyId(), true);
}
return mailingBaseService.calculateRecipients(config.getCompanyId(), config.getMailingId());
}
}
17
Source : MaildropServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced MaildropServiceImpl implements MaildropService {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(MaildropServiceImpl.clreplaced);
private SteppingAndBlocksizeComputer steppingAndBlocksizeComputer;
private ComMailingDao mailingDao;
private MaildropStatusDao maildropStatusDao;
@Override
public final boolean stopWorldMailingBeforeGeneration(final int companyID, final int mailingID) {
return maildropStatusDao.delete(companyID, mailingID, MaildropStatus.WORLD, MaildropGenerationStatus.SCHEDULED);
}
@Override
public final int scheduleAdminMailing(final int mailingID, final int companyID, final int adminTargetID) throws Exception {
checkMailtype(mailingID, MailingType.NORMAL);
final MaildropEntry entry = MaildropEntryFactory.newAdminMaildrop(mailingID, companyID, adminTargetID);
return this.maildropStatusDao.saveMaildropEntry(entry);
}
@Override
public final int scheduleTestMailing(final int mailingID, final int companyID, final int testTargetID) throws Exception {
checkMailtype(mailingID, MailingType.NORMAL);
final MaildropEntry entry = MaildropEntryFactory.newTestMaildrop(mailingID, companyID, testTargetID);
return this.maildropStatusDao.saveMaildropEntry(entry);
}
@Override
public final void scheduleWorldMailing(final int mailingID, final int companyID, final Date sendDate, final int stepping, final int blocksize) throws MaildropException {
checkMailtype(mailingID, MailingType.NORMAL);
if (hasMaildropStatus(mailingID, companyID, MaildropStatus.WORLD)) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Cannot schedule mailing %d for world delivery. Mailing already sent", mailingID));
}
throw new MailingAlreadySentException(mailingID);
}
// TODO: Compute genstatus, gendate, etc.
}
@Override
public final void scheduleWorldMailing(final int mailingID, final int companyID, final Date sendDate, final int mailsPerHour) throws MaildropException {
final SteppingAndBlocksize sab = this.steppingAndBlocksizeComputer.computeFromMailingsPerHour(mailsPerHour);
scheduleWorldMailing(mailingID, companyID, sendDate, sab.getStepping(), sab.getBlocksize());
}
@Override
public final void activateDatebasedMailing(final int mailingID, final int companyID, final int hour, final int stepping, final int blocksize) throws MaildropException {
checkMailtype(mailingID, MailingType.DATE_BASED);
}
@Override
public final void activateDatebasedMailing(final int mailingID, final int companyID, final int hour, final int mailsPerHour) throws MaildropException {
final SteppingAndBlocksize sab = this.steppingAndBlocksizeComputer.computeFromMailingsPerHour(mailsPerHour);
activateDatebasedMailing(mailingID, companyID, hour, sab.getStepping(), sab.getBlocksize());
}
@Override
public final void deactivateDatebasedMailing(final int mailingID, final int companyID) throws MaildropException {
// Check for world mailing not required here. Either there is a "Date"-maildrop entry or not.
}
@Override
public void activateActionbasedMailing(final int mailingID, final int companyID) throws MaildropException {
checkMailtype(mailingID, MailingType.ACTION_BASED);
}
@Override
public void deactivateActionbasedMailing(final int mailingID, final int companyID) throws MaildropException {
// Check for world mailing not required here. Either there is a "Action"-maildrop entry or not.
}
@Override
public final boolean isActiveMailing(final int mailingID, final int companyID) {
return hasMaildropStatus(mailingID, companyID, MaildropStatus.ACTION_BASED, MaildropStatus.DATE_BASED, MaildropStatus.WORLD);
}
@Override
public final boolean hasMaildropStatus(final int mailingID, final int companyID, final MaildropStatus... statusList) {
final Collection<MaildropEntry> entries = this.maildropStatusDao.listMaildropStatus(mailingID, companyID);
for (final MaildropEntry entry : entries) {
for (MaildropStatus status : statusList) {
if (entry.getStatus() == status.getCode()) {
return true;
}
}
}
return false;
}
@Override
@Transactional
public void selectTestRecipients(@VelocityCheck int companyId, int maildropStatusId, List<Integer> customerIds) {
if (companyId > 0 && maildropStatusId > 0 && CollectionUtils.isNotEmpty(customerIds)) {
if (maildropStatusDao.setSelectedTestRecipients(companyId, maildropStatusId, true)) {
maildropStatusDao.setTestRecipients(maildropStatusId, customerIds);
}
}
}
/**
* Checks, that the mailing type of given mailing ID matches excepted mailing type.
*
* @param mailingID ID of mailing
* @param expectedMailingType expected mailing type
*
* @throws UnknownMailingException if mailing ID is unknown
* @throws InvalidMailingTypeException if mailing type does not match
*/
private final void checkMailtype(final int mailingID, final MailingType expectedMailingType) throws UnknownMailingException, InvalidMailingTypeException {
final int currentMailingTypeCode = this.mailingDao.getMailingType(mailingID);
if (currentMailingTypeCode == -1) {
throw new UnknownMailingException(mailingID);
}
final MailingType currentMailingType = MailingType.fromCode(currentMailingTypeCode);
if (!expectedMailingType.equals(currentMailingType)) {
throw new InvalidMailingTypeException(expectedMailingType, currentMailingType);
}
}
@Required
public void setMailingDao(final ComMailingDao dao) {
this.mailingDao = dao;
}
@Required
public void setMaildropStatusDao(final MaildropStatusDao dao) {
this.maildropStatusDao = dao;
}
}
17
Source : ActionOperationSendMailingImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ActionOperationSendMailingImpl implements EmmActionOperation {
/**
* The logger.
*/
private static final Logger logger = Logger.getLogger(ActionOperationSendMailingImpl.clreplaced);
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
/**
* Service for sending event based mailings
*/
private SendActionbasedMailingService sendActionbasedMailingService;
@Required
public void setMailingDao(final ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setSendActionbasedMailingService(final SendActionbasedMailingService sendActionbasedMailingService) {
this.sendActionbasedMailingService = sendActionbasedMailingService;
}
@Override
public boolean execute(final AbstractActionOperationParameters operation, final Map<String, Object> params, final EmmActionOperationErrors errors) {
final ActionOperationSendMailingParameters actionOperationSendMailingParameters = (ActionOperationSendMailingParameters) operation;
final int companyID = actionOperationSendMailingParameters.getCompanyId();
final int mailingID = actionOperationSendMailingParameters.getMailingID();
if (params.get("customerID") == null) {
return false;
} else {
final int customerID = (Integer) params.get("customerID");
if (customerID == 0) {
return false;
} else {
if (mailingDao.exist(mailingID, companyID)) {
try {
final MailgunOptions mailgunOptions = new MailgunOptions();
final List<Integer> userStatusList = new Vector<>();
userStatusList.add(UserStatus.Active.getStatusCode());
userStatusList.add(UserStatus.WaitForConfirm.getStatusCode());
mailgunOptions.withAllowedUserStatus(userStatusList);
try {
if (StringUtils.isNotBlank(actionOperationSendMailingParameters.getBcc())) {
mailgunOptions.withBccEmails(actionOperationSendMailingParameters.getBcc());
}
sendActionbasedMailingService.sendActionbasedMailing(companyID, mailingID, customerID, actionOperationSendMailingParameters.getDelayMinutes(), mailgunOptions);
} catch (final Exception e) {
logger.error("Cannot fire campaign-/event-mail", e);
throw new UnableToSendActionbasedMailingException(mailingID, customerID, e);
}
if (logger.isInfoEnabled()) {
logger.info("executeOperation: Mailing " + mailingID + " to " + customerID + " sent");
}
return true;
} catch (final SendActionbasedMailingException e) {
logger.error("executeOperation: Mailing " + mailingID + " to " + customerID + " failed");
return false;
}
} else {
return false;
}
}
}
}
@Override
public ActionOperationType processedType() {
return ActionOperationType.SEND_MAILING;
}
}
17
Source : ActionOperationActivateDoubleOptInImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ActionOperationActivateDoubleOptInImpl implements EmmActionOperation {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(ActionOperationActivateDoubleOptInImpl.clreplaced);
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
/**
* DAO for accessing subscription/binding data.
*/
private ComBindingEntryDao bindingEntryDao;
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setBindingEntryDao(ComBindingEntryDao bindingEntryDao) {
this.bindingEntryDao = bindingEntryDao;
}
@Override
public boolean execute(AbstractActionOperationParameters operation, Map<String, Object> requestParameters, final EmmActionOperationErrors errors) throws Exception {
final ActionOperationActivateDoubleOptInParameters activateDoiOperation = (ActionOperationActivateDoubleOptInParameters) operation;
replacedert activateDoiOperation.getMediaType() != null;
final int companyID = activateDoiOperation.getCompanyId();
HttpServletRequest request = (HttpServletRequest) requestParameters.get("_request");
if (requestParameters.get("customerID") == null) {
return false;
} else {
int customerID = (Integer) requestParameters.get("customerID");
if (customerID == 0) {
return false;
} else {
if (activateDoiOperation.isForAllLists()) {
List<BindingEntry> bindingEntries = bindingEntryDao.getBindings(companyID, customerID);
boolean returnValue = false;
for (BindingEntry bindingEntry : bindingEntries) {
if (bindingEntry.getMediaType() == MediaTypes.EMAIL.getMediaCode()) {
int mailingID = 0;
try {
mailingID = (Integer) requestParameters.get("mailingID");
} catch (Exception e) {
logger.error("Invalid mailingID for DoubleOptInActiovation");
}
returnValue |= changeBindingStatusToConfirmed(bindingEntry, companyID, mailingID, request.getRemoteAddr(), HttpUtils.getReferrer(request));
}
}
return returnValue;
} else {
if (requestParameters.get("mailingID") == null) {
return false;
} else {
int mailingID = (Integer) requestParameters.get("mailingID");
int mailinglistID = mailingDao.getMailinglistId(mailingID, companyID);
if (mailinglistID <= 0) {
return false;
} else {
BindingEntry bindingEntry = bindingEntryDao.get(customerID, companyID, mailinglistID, activateDoiOperation.getMediaType().getMediaCode());
if (bindingEntry != null) {
return changeBindingStatusToConfirmed(bindingEntry, companyID, mailingID, request.getRemoteAddr(), HttpUtils.getReferrer(request));
} else {
return false;
}
}
}
}
}
}
}
@Override
public ActionOperationType processedType() {
return ActionOperationType.ACTIVATE_DOUBLE_OPT_IN;
}
private boolean changeBindingStatusToConfirmed(BindingEntry aEntry, int companyID, int mailingID, String remoteAddr, String referrer) throws Exception {
switch(UserStatus.getUserStatusByID(aEntry.getUserStatus())) {
case WaitForConfirm:
aEntry.setUserStatus(UserStatus.Active.getStatusCode());
aEntry.setUserRemark("Opt-In-IP: " + remoteAddr);
aEntry.setReferrer(referrer);
aEntry.setEntryMailingID(mailingID);
bindingEntryDao.updateStatus(aEntry, companyID);
return true;
case Active:
return true;
default:
return false;
}
}
}
16
Source : MailingRecipientExportReporter.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced MailingRecipientExportReporter {
/**
* The logger.
*/
@SuppressWarnings("unused")
private static final transient Logger logger = Logger.getLogger(MailingRecipientExportReporter.clreplaced);
private JavaMailService javaMailService;
private ComCompanyDao companyDao;
private ComMailingDao mailingDao;
private AdminService adminService;
private RecipientsReportService recipientsReportService;
private ConfigService configService;
@Required
public void setJavaMailService(JavaMailService javaMailService) {
this.javaMailService = javaMailService;
}
@Required
public void setCompanyDao(ComCompanyDao companyDao) {
this.companyDao = companyDao;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setAdminService(final AdminService service) {
this.adminService = Objects.requireNonNull(service, "Admin service is null");
}
@Required
public void setRecipientsReportService(RecipientsReportService recipientsReportService) {
this.recipientsReportService = recipientsReportService;
}
@Required
public void setConfigService(ConfigService configService) {
this.configService = configService;
}
/**
* Send a report email about this export to the executing GUI-admin or the creator of the autoexport
*
* @param exportWorker
* @param admin
* @throws Exception
*/
public void sendExportReportMail(MailingRecipientExportWorker exportWorker, ComAdmin admin) throws Exception {
Set<String> emailRecipients = new HashSet<>();
String additionalContent = "";
ComCompany comp = companyDao.getCompany(admin.getCompanyID());
if (comp.getExportNotifyAdmin() > 0) {
final ComAdmin notifyAdmin = adminService.getAdmin(comp.getExportNotifyAdmin(), admin.getCompanyID());
if (notifyAdmin != null && StringUtils.isNotBlank(notifyAdmin.getEmail())) {
emailRecipients.add(AgnUtils.normalizeEmail(notifyAdmin.getEmail()));
} else {
emailRecipients.add(AgnUtils.normalizeEmail(configService.getValue(ConfigValue.Mailaddress_Error)));
additionalContent = "Admin User or Email for this export was not available: CompanyID: " + admin.getCompanyID() + " / AdminID: " + comp.getExportNotifyAdmin() + " \n\n";
}
}
if (StringUtils.isNotBlank(configService.getValue(ConfigValue.ExportAlwaysInformEmail, admin.getCompanyID()))) {
if (StringUtils.isNotBlank(configService.getValue(ConfigValue.ExportAlwaysInformEmail, admin.getCompanyID()))) {
for (String email : AgnUtils.splitAndTrimList(configService.getValue(ConfigValue.ExportAlwaysInformEmail, admin.getCompanyID()))) {
emailRecipients.add(AgnUtils.normalizeEmail(email));
}
}
}
if (exportWorker.getAutoExport() != null && StringUtils.isNotBlank(exportWorker.getAutoExport().getEmailForReport())) {
for (String email : AgnUtils.splitAndTrimList(exportWorker.getAutoExport().getEmailForReport())) {
emailRecipients.add(AgnUtils.normalizeEmail(email));
}
}
if (!emailRecipients.isEmpty()) {
Locale locale = admin.getLocale();
ComCompany company = companyDao.getCompany(exportWorker.getCompanyID());
String subject = I18nString.getLocaleString("ResultMsg", locale) + " \"" + I18nString.getLocaleString("Mailing", locale) + "\" (" + I18nString.getLocaleString("Company", locale) + ": " + company.getShortname() + ")";
String bodyHtml = generateLocalizedExportHtmlReport(exportWorker, admin) + "\n" + additionalContent;
String bodyText = generateLocalizedExportTextReport(exportWorker, locale) + "\n" + additionalContent;
javaMailService.sendEmail(StringUtils.join(emailRecipients, ", "), subject, bodyText, bodyHtml);
}
}
private String generateLocalizedExportTextReport(MailingRecipientExportWorker exportWorker, Locale locale) throws Exception {
String reportContent = I18nString.getLocaleString("ResultMsg", locale) + " \"" + I18nString.getLocaleString("Mailing", locale) + "\":\n\n";
reportContent += I18nString.getLocaleString("decode.licenseID", locale) + ": " + configService.getValue(ConfigValue.System_Licence) + "\n";
ComCompany company = companyDao.getCompany(exportWorker.getCompanyID());
reportContent += I18nString.getLocaleString("Company", locale) + ": " + (company == null ? "Unknown" : company.getShortname() + " (ID: " + company.getId() + ")") + "\n";
Mailing mailing = mailingDao.getMailing(exportWorker.getMailingID(), exportWorker.getCompanyID());
reportContent += I18nString.getLocaleString("Mailing", locale) + ": " + (mailing == null ? "Unknown" : mailing.getShortname() + " (ID: " + mailing.getId() + ")") + "\n";
String filterTypeText = "Unknown";
if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_ALL) {
filterTypeText = I18nString.getLocaleString("default.All", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_OPENED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_opened", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_CLICKED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_clicked", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_BOUNCED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_bounced", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_UNSUBSCRIBED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_unsubscribed", locale);
}
reportContent += I18nString.getLocaleString("report.mailing.filter", locale) + ": " + filterTypeText + "\n";
if (exportWorker.getAutoExport() != null) {
reportContent += "AutoExport: " + exportWorker.getAutoExport().getShortname() + " (ID: " + exportWorker.getAutoExport().getAutoExportId() + ")" + "\n";
reportContent += I18nString.getLocaleString("error.import.profile.email", locale) + ": " + (StringUtils.isBlank(exportWorker.getAutoExport().getEmailOnError()) ? I18nString.getLocaleString("default.none", locale) : exportWorker.getAutoExport().getEmailOnError());
reportContent += I18nString.getLocaleString("autoImport.fileServer", locale) + ": " + exportWorker.getAutoExport().getFileServerWithoutCredentials();
reportContent += I18nString.getLocaleString("autoImport.filePath", locale) + ": " + exportWorker.getAutoExport().getFilePath();
reportContent += I18nString.getLocaleString("settings.FileName", locale) + ": " + exportWorker.getAutoExport().getFileNameWithPatterns();
}
if (exportWorker.getUsername() != null) {
reportContent += "User: " + exportWorker.getUsername();
}
reportContent += I18nString.getLocaleString("export.type", locale) + ": " + I18nString.getLocaleString("Mailing", locale) + "\n";
String profileContent = "";
profileContent += I18nString.getLocaleString("Charset", locale) + ": " + exportWorker.getEncoding() + "\n";
try {
profileContent += I18nString.getLocaleString("csv.Delimiter", locale) + ": " + Character.toString(Separator.getSeparatorByChar(exportWorker.getDelimiter()).getValueChar()) + "\n";
} catch (Exception e) {
profileContent += I18nString.getLocaleString("csv.Delimiter", locale) + ": " + "Invalid (\"" + e.getMessage() + "\")" + "\n";
}
try {
profileContent += I18nString.getLocaleString("csv.StringQuote", locale) + ": " + I18nString.getLocaleString(TextRecognitionChar.getTextRecognitionCharByChar(exportWorker.getStringQuote()).getPublicValue(), locale) + "\n";
} catch (Exception e) {
profileContent += I18nString.getLocaleString("csv.StringQuote", locale) + ": " + "Invalid (\"" + e.getMessage() + "\")" + "\n";
}
profileContent += I18nString.getLocaleString("csv.alwaysQuote", locale) + ": " + I18nString.getLocaleString(exportWorker.getAlwaysQuote() ? "delimiter.always" : "delimiter.ifneeded", locale) + "\n";
profileContent += I18nString.getLocaleString("htmled.columns", locale) + ": " + StringUtils.join(AgnUtils.removeEmptyFromStringlist(exportWorker.getColumns()), ", ") + "\n";
reportContent += "\t" + profileContent.replace("\n", "\n\t") + "\n";
reportContent += I18nString.getLocaleString("StartTime", locale) + ": " + (exportWorker.getStartTime() == null ? I18nString.getLocaleString("Unknown", locale) : new SimpleDateFormat(DateUtilities.DD_MM_YYYY_HH_MM_SS).format(exportWorker.getStartTime())) + "\n";
reportContent += I18nString.getLocaleString("EndTime", locale) + ": " + (exportWorker.getEndTime() == null ? I18nString.getLocaleString("Unknown", locale) : new SimpleDateFormat(DateUtilities.DD_MM_YYYY_HH_MM_SS).format(exportWorker.getEndTime())) + "\n";
if (exportWorker.getRemoteFile() != null) {
reportContent += I18nString.getLocaleString("settings.FileName", locale) + ": " + (StringUtils.isBlank(exportWorker.getRemoteFile().getRemoteFilePath()) ? I18nString.getLocaleString("Unknown", locale) : exportWorker.getRemoteFile().getRemoteFilePath()) + "\n";
if (exportWorker.getRemoteFile().getDownloadDurationMillis() > -1) {
reportContent += I18nString.getLocaleString("UploadDuration", locale) + ": " + AgnUtils.getHumanReadableDurationFromMillis(exportWorker.getRemoteFile().getDownloadDurationMillis()) + "\n";
}
}
if (exportWorker.getError() != null) {
reportContent += I18nString.getLocaleString("import.csv_fatal_error", locale) + ": " + exportWorker.getError().getClreplaced().getSimpleName() + ": \n" + exportWorker.getError().getMessage() + "\n";
}
if (new File(exportWorker.getExportFile()).length() >= 0) {
reportContent += I18nString.getLocaleString("mailing.Graphics_Component.FileSize", locale) + ": " + AgnUtils.getHumanReadableNumber(new File(exportWorker.getExportFile()).length(), "Byte", false, locale) + "\n";
}
reportContent += I18nString.getLocaleString("import.result.csvlines", locale) + ": " + AgnUtils.getHumanReadableNumber(exportWorker.getExportedLines(), locale) + " (+1 " + I18nString.getLocaleString("csv.ContainsHeaders", locale) + ")" + "\n";
return reportContent;
}
private String generateLocalizedExportHtmlReport(MailingRecipientExportWorker exportWorker, ComAdmin admin) throws Exception {
Locale locale = admin.getLocale();
String replacedle;
if (exportWorker.getAutoExport() != null) {
replacedle = "AutoExport: " + exportWorker.getAutoExport().getShortname() + " (ID: " + exportWorker.getAutoExport().getAutoExportId() + ")";
} else {
replacedle = "Export: " + I18nString.getLocaleString("Mailing", locale);
}
StringBuilder htmlContent = new StringBuilder(HtmlReporterHelper.getHtmlPrefixWithCssStyles(replacedle));
htmlContent.append(HtmlReporterHelper.getHeader(replacedle, I18nString.getLocaleString("default.version", locale)));
// Fatal Error
if (exportWorker.getError() != null) {
htmlContent.append(HtmlReporterHelper.getOutputTableStart());
htmlContent.append(HtmlReporterHelper.getOutputTableHeader(I18nString.getLocaleString("import.csv_fatal_error", locale)));
htmlContent.append(HtmlReporterHelper.getOutputTableContentStart(false));
htmlContent.append(HtmlReporterHelper.getOutputTableErrorContentLine(exportWorker.getError().getClreplaced().getSimpleName() + ": \n" + exportWorker.getError().getMessage()));
htmlContent.append(HtmlReporterHelper.getOutputTableContentEnd());
htmlContent.append(HtmlReporterHelper.getOutputTableEnd());
}
// Results
htmlContent.append(HtmlReporterHelper.getOutputTableStart());
htmlContent.append(HtmlReporterHelper.getOutputTableHeader(I18nString.getLocaleString("ResultMsg", locale)));
htmlContent.append(HtmlReporterHelper.getOutputTableContentStart(true));
if (new File(exportWorker.getExportFile()).length() >= 0) {
htmlContent.append(HtmlReporterHelper.getOutputTableResultContentLine(I18nString.getLocaleString("mailing.Graphics_Component.FileSize", locale), AgnUtils.getHumanReadableNumber(new File(exportWorker.getExportFile()).length(), "Byte", false, locale)));
}
htmlContent.append(HtmlReporterHelper.getOutputTableResultContentLine(I18nString.getLocaleString("import.result.csvlines", locale), AgnUtils.getHumanReadableNumber(exportWorker.getExportedLines(), locale) + " (+1 " + I18nString.getLocaleString("csv.ContainsHeaders", locale) + ")"));
htmlContent.append(HtmlReporterHelper.getOutputTableContentEnd());
htmlContent.append(HtmlReporterHelper.getOutputTableEnd());
// Informations
htmlContent.append(HtmlReporterHelper.getOutputTableStart());
htmlContent.append(HtmlReporterHelper.getOutputTableHeader(I18nString.getLocaleString("Info", locale)));
htmlContent.append(HtmlReporterHelper.getOutputTableContentStart(false));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("decode.licenseID", locale), configService.getValue(ConfigValue.System_Licence)));
ComCompany company = companyDao.getCompany(exportWorker.getCompanyID());
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("Company", locale), (company == null ? "Unknown" : company.getShortname() + " (ID: " + company.getId() + ")")));
Mailing mailing = mailingDao.getMailing(exportWorker.getMailingID(), exportWorker.getCompanyID());
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("Mailing", locale), (mailing == null ? "Unknown" : mailing.getShortname() + " (ID: " + mailing.getId() + ")")));
String filterTypeText = "Unknown";
if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_ALL) {
filterTypeText = I18nString.getLocaleString("default.All", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_OPENED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_opened", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_CLICKED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_clicked", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_BOUNCED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_bounced", locale);
} else if (exportWorker.getFilterType() == MailingRecipientExportWorker.MAILING_RECIPIENTS_UNSUBSCRIBED) {
filterTypeText = I18nString.getLocaleString("mailing.recipients.mailing_unsubscribed", locale);
}
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("report.mailing.filter", locale), filterTypeText));
if (exportWorker.getAutoExport() != null) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine("AutoExport", exportWorker.getAutoExport().getShortname() + " (ID: " + exportWorker.getAutoExport().getAutoExportId() + ")"));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("error.import.profile.email", locale), (StringUtils.isBlank(exportWorker.getAutoExport().getEmailOnError()) ? I18nString.getLocaleString("default.none", locale) : exportWorker.getAutoExport().getEmailOnError())));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("autoImport.fileServer", locale), exportWorker.getAutoExport().getFileServerWithoutCredentials()));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("autoImport.filePath", locale), exportWorker.getAutoExport().getFilePath()));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("settings.FileName", locale), exportWorker.getAutoExport().getFileNameWithPatterns()));
}
if (exportWorker.getUsername() != null) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine("User", exportWorker.getUsername()));
}
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("export.type", locale), I18nString.getLocaleString("Mailing", locale)));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("Charset", locale), exportWorker.getEncoding()));
try {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("csv.Delimiter", locale), Character.toString(Separator.getSeparatorByChar(exportWorker.getDelimiter()).getValueChar())));
} catch (Exception e) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("csv.Delimiter", locale), "Invalid (\"" + e.getMessage() + "\")"));
}
try {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("csv.StringQuote", locale), I18nString.getLocaleString(TextRecognitionChar.getTextRecognitionCharByChar(exportWorker.getStringQuote()).getPublicValue(), locale)));
} catch (Exception e) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("csv.StringQuote", locale), "Invalid (\"" + e.getMessage() + "\")"));
}
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("csv.alwaysQuote", locale), I18nString.getLocaleString(exportWorker.getAlwaysQuote() ? "delimiter.always" : "delimiter.ifneeded", locale)));
htmlContent.append(HtmlReporterHelper.getOutputTableSubHeader(I18nString.getLocaleString("htmled.columns", locale), false));
for (String columnName : AgnUtils.removeEmptyFromStringlist(exportWorker.getColumns())) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine("", columnName));
}
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("StartTime", locale), (exportWorker.getStartTime() == null ? I18nString.getLocaleString("Unknown", locale) : DateUtilities.getDateTimeString(exportWorker.getStartTime(), TimeZone.getTimeZone(admin.getAdminTimezone()).toZoneId(), admin.getDateTimeFormatter()))));
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("EndTime", locale), (exportWorker.getEndTime() == null ? I18nString.getLocaleString("Unknown", locale) : DateUtilities.getDateTimeString(exportWorker.getEndTime(), TimeZone.getTimeZone(admin.getAdminTimezone()).toZoneId(), admin.getDateTimeFormatter()))));
if (exportWorker.getRemoteFile() != null) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("settings.FileName", locale), StringUtils.isBlank(exportWorker.getRemoteFile().getRemoteFilePath()) ? I18nString.getLocaleString("Unknown", locale) : exportWorker.getRemoteFile().getRemoteFilePath()));
if (exportWorker.getRemoteFile().getDownloadDurationMillis() > -1) {
htmlContent.append(HtmlReporterHelper.getOutputTableInfoContentLine(I18nString.getLocaleString("UploadDuration", locale), AgnUtils.getHumanReadableDurationFromMillis(exportWorker.getRemoteFile().getDownloadDurationMillis())));
}
}
htmlContent.append(HtmlReporterHelper.getOutputTableContentEnd());
htmlContent.append(HtmlReporterHelper.getOutputTableEnd());
htmlContent.append(HtmlReporterHelper.getFooter(AgnUtils.getHostName(), configService.getValue(ConfigValue.ApplicationVersion)));
return htmlContent.toString();
}
public void sendExportErrorMail(MailingRecipientExportWorker exportWorker, ComAdmin admin) throws Exception {
Set<String> emailRecipients = new HashSet<>();
String additionalContent = "";
ComCompany comp = companyDao.getCompany(admin.getCompanyID());
if (comp.getExportNotifyAdmin() > 0) {
final ComAdmin notifyAdmin = adminService.getAdmin(comp.getExportNotifyAdmin(), admin.getCompanyID());
if (notifyAdmin != null && StringUtils.isNotBlank(notifyAdmin.getEmail())) {
emailRecipients.add(AgnUtils.normalizeEmail(notifyAdmin.getEmail()));
} else {
emailRecipients.add(AgnUtils.normalizeEmail(configService.getValue(ConfigValue.Mailaddress_Error)));
additionalContent = "Admin User or Email for this export was not available: CompanyID: " + admin.getCompanyID() + " / AdminID: " + comp.getExportNotifyAdmin() + " \n\n";
}
}
if (StringUtils.isNotBlank(configService.getValue(ConfigValue.ExportAlwaysInformEmail, admin.getCompanyID()))) {
for (String email : AgnUtils.splitAndTrimList(configService.getValue(ConfigValue.ExportAlwaysInformEmail, admin.getCompanyID()))) {
emailRecipients.add(AgnUtils.normalizeEmail(email));
}
}
if (StringUtils.isNotBlank(configService.getValue(ConfigValue.Mailaddress_Error))) {
emailRecipients.add(configService.getValue(ConfigValue.Mailaddress_Error).toLowerCase());
}
if (exportWorker.getAutoExport() != null && StringUtils.isNotBlank(exportWorker.getAutoExport().getEmailForReport())) {
for (String email : AgnUtils.splitAndTrimList(exportWorker.getAutoExport().getEmailForReport())) {
emailRecipients.add(AgnUtils.normalizeEmail(email));
}
}
if (exportWorker.getAutoExport() != null && StringUtils.isNotBlank(exportWorker.getAutoExport().getEmailOnError())) {
for (String email : AgnUtils.splitAndTrimList(exportWorker.getAutoExport().getEmailOnError())) {
emailRecipients.add(AgnUtils.normalizeEmail(email));
}
}
if (!emailRecipients.isEmpty()) {
Locale locale = admin.getLocale();
ComCompany company = companyDao.getCompany(exportWorker.getCompanyID());
String subject = "Export-ERROR: " + I18nString.getLocaleString("ResultMsg", locale) + ": " + " \"" + I18nString.getLocaleString("Mailing", locale) + "\" (" + I18nString.getLocaleString("Company", locale) + ": " + company.getShortname() + ")";
String bodyHtml = generateLocalizedExportHtmlReport(exportWorker, admin) + "\n" + additionalContent;
String bodyText = "Export-ERROR:\n" + generateLocalizedExportTextReport(exportWorker, locale) + "\n" + additionalContent;
javaMailService.sendEmail(StringUtils.join(emailRecipients, ", "), subject, bodyText, bodyHtml);
}
}
public void createAndSaveExportReport(MailingRecipientExportWorker exportWorker, ComAdmin admin, boolean isError) throws Exception {
recipientsReportService.createAndSaveExportReport(admin, new File(exportWorker.getExportFile()).getName(), exportWorker.getEndTime(), generateLocalizedExportHtmlReport(exportWorker, admin), isError);
}
}
16
Source : ComMailingContentServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComMailingContentServiceImpl implements ComMailingContentService {
private static final Logger logger = Logger.getLogger(ComMailingContentServiceImpl.clreplaced);
private static final int LINK_TEXT_MAX_LENGTH = 75;
private static final Pattern MULTIPLE_WHITESPACES_PATTERN = Pattern.compile("[\\s\u00A0]{2,}");
private DynamicTagContentFactory dynamicTagContentFactory;
private DynamicTagFactory dynamicTagFactory;
private ComMailingBaseService mailingBaseService;
private AgnTagService agnTagService;
private ComMailingDao mailingDao;
@Override
public void generateTextContent(Mailing mailing) {
Objects.requireNonNull(mailing, "mailing == null");
MailingComponent html = mailing.getHtmlTemplate();
MailingComponent text = mailing.getTextTemplate();
Objects.requireNonNull(html, "html template is required");
Objects.requireNonNull(text, "text template is required");
Map<String, DynamicTag> tags = mailing.getDynTags();
Function<String, DynamicTag> getSourceTag = tags::get;
Function<String, DynamicTag> getTargetTag = name -> {
DynamicTag tag = tags.get(name);
if (tag == null) {
tag = dynamicTagFactory.newDynamicTag();
tag.setDynName(name);
tags.put(name, tag);
return tag;
}
// Reuse existing tag.
clearDynTag(mailing, tag);
return tag;
};
// Generate text template out of html template.
text.setEmmBlock(generateTextContentTemplate(html.getEmmBlock(), getSourceTag, getTargetTag), "text/plain");
}
private String generateTextContentTemplate(String html, Function<String, DynamicTag> getSourceTag, Function<String, DynamicTag> getTargetTag) {
String text = generateTextContent(html);
List<DynamicTag> mentionedTags = getDynamicTags(text);
if (mentionedTags.isEmpty()) {
return text;
}
// Source dyn name -> target dyn name (html block -> text block).
Map<String, String> namesMap = generateDynNamesMap(mentionedTags);
generateTextContentBlocks(namesMap, getSourceTag, getTargetTag);
return eraseExtraWhitespaces(replaceTags(text, asReplaceableTags(mentionedTags, namesMap)));
}
private void generateTextContentBlocks(Map<String, String> namesMap, Function<String, DynamicTag> getSourceTag, Function<String, DynamicTag> getTargetTag) {
for (Map.Entry<String, String> entry : namesMap.entrySet()) {
String sourceName = entry.getKey();
String targetName = entry.getValue();
DynamicTag sourceTag = getSourceTag.apply(sourceName);
if (sourceTag != null) {
DynamicTag targetTag = getTargetTag.apply(targetName);
for (DynamicTagContent sourceContent : sourceTag.getDynContent().values()) {
DynamicTagContent targetContent = dynamicTagContentFactory.newDynamicTagContent();
targetContent.setDynName(targetName);
targetContent.setDynOrder(sourceContent.getDynOrder());
targetContent.setTargetID(sourceContent.getTargetID());
targetContent.setDynContent(generateTextContent(sourceContent.getDynContent(), namesMap));
targetTag.addContent(targetContent);
}
}
}
}
private String generateTextContent(String html, Map<String, String> namesMap) {
String text = generateTextContent(html);
List<DynamicTag> tags = getDynamicTags(text);
if (tags.isEmpty()) {
return text;
} else {
return replaceTags(text, asReplaceableTags(tags, namesMap));
}
}
private Map<String, String> generateDynNamesMap(List<DynamicTag> tags) {
Set<String> names = tags.stream().map(DynamicTag::getDynName).collect(Collectors.toCollection(LinkedHashSet::new));
// Maps source names (html version) to target names (text version).
Map<String, String> namesMap = new LinkedHashMap<>();
// Generate target names for all the mentioned dyn tags.
for (String sourceName : new ArrayList<>(names)) {
namesMap.put(sourceName, generateDynName(sourceName, names));
}
return namesMap;
}
private String generateTextContent(String html) {
if (StringUtils.isBlank(html)) {
return StringUtils.EMPTY;
}
Doreplacedent doreplacedent = Jsoup.parse(AgnTagUtils.escapeAgnTags(html));
StringBuilder sb = new StringBuilder();
generateTextContent(sb, doreplacedent.childNodes());
return sb.toString();
}
private String eraseExtraWhitespaces(String content) {
Matcher matcher = MULTIPLE_WHITESPACES_PATTERN.matcher(content);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String spaces = matcher.group();
if (spaces.indexOf('\n') >= 0) {
// Erase line's trailing and leading whitespaces.
// Collapse blank lines (multiple newline characters become a single one).
matcher.appendReplacement(sb, "\n");
} else {
// Ignore doreplacedent's leading and trailing whitespaces.
if (sb.length() > 0 && !matcher.hitEnd()) {
matcher.appendReplacement(sb, spaces);
}
}
}
matcher.appendTail(sb);
return sb.toString();
}
private void generateTextContent(StringBuilder sb, List<Node> nodes) {
for (Node node : nodes) {
if (node instanceof Element) {
Element element = (Element) node;
switch(element.nodeName()) {
case "a":
sb.append(getTextLink(element));
break;
case "br":
sb.append('\n');
break;
default:
generateTextContent(sb, element.childNodes());
break;
}
} else if (node instanceof TextNode) {
sb.append(((TextNode) node).getWholeText());
}
}
}
private String getTextLink(Element element) {
String address = element.attr("href");
String text = StringUtils.abbreviate(element.text(), LINK_TEXT_MAX_LENGTH);
String textLink = "";
if (StringUtils.isNotBlank(address)) {
if (StringUtils.isNotBlank(text)) {
textLink = String.format("%s (%s)", address, text);
} else {
textLink = address;
}
} else if (StringUtils.isNotBlank(text)) {
textLink = text;
}
return StringUtils.isNotEmpty(textLink) ? " " + textLink + " " : textLink;
}
private String generateDynName(String sourceName, Set<String> namesInUse) {
if (AgnUtils.DEFAULT_MAILING_HTML_DYNNAME.equals(sourceName)) {
return AgnUtils.DEFAULT_MAILING_TEXT_DYNNAME;
} else {
String newName = sourceName + " (Text)";
if (namesInUse.contains(newName)) {
int index = 1;
while (namesInUse.contains(newName + "-" + index)) {
index++;
}
return newName + "-" + index;
}
return newName;
}
}
private void clearDynTag(Mailing mailing, DynamicTag tag) {
mailingDao.cleanupContentForDynName(mailing.getId(), mailing.getCompanyID(), tag.getDynName());
tag.getDynContent().clear();
}
private String replaceTags(String text, List<Tag> tags) {
StringBuilder sb = new StringBuilder();
int begin = 0;
for (Tag tag : tags) {
if (begin < tag.getBegin()) {
sb.append(text, begin, tag.getBegin());
}
sb.append(tag.toString());
begin = tag.getEnd();
}
if (begin < text.length()) {
sb.append(text, begin, text.length());
}
return sb.toString();
}
@Override
public boolean isGenerationAvailable(Mailing mailing) {
if (mailing.getHtmlTemplate() == null || mailing.getTextTemplate() == null) {
return false;
}
MailingComponent template = mailing.getHtmlTemplate();
return !mailingBaseService.isContentBlank(template.getEmmBlock(), mailing.getDynTags());
}
private List<Tag> asReplaceableTags(List<DynamicTag> dynamicTags, Map<String, String> namesMap) {
List<Tag> tags = new ArrayList<>();
for (DynamicTag tag : dynamicTags) {
String name = namesMap.getOrDefault(tag.getDynName(), tag.getDynName());
tags.add(new Tag(tag.getStartTagStart(), tag.getStartTagEnd(), tag.isStandaloneTag() ? TagType.STANDALONE : TagType.OPENING, name));
if (tag.getValueTagStart() != tag.getValueTagEnd()) {
tags.add(new Tag(tag.getValueTagStart(), tag.getValueTagEnd(), TagType.VALUE, name));
}
if (tag.getEndTagStart() != tag.getEndTagEnd()) {
tags.add(new Tag(tag.getEndTagStart(), tag.getEndTagEnd(), TagType.CLOSING, name));
}
}
tags.sort(Comparator.comparingInt(Tag::getBegin));
return tags;
}
private List<DynamicTag> getDynamicTags(String content) {
try {
return agnTagService.getDynTags(content);
} catch (DynTagException e) {
logger.error("Error occurred: " + e.getMessage(), e);
return Collections.emptyList();
}
}
private enum TagType {
STANDALONE, OPENING, VALUE, CLOSING
}
public static clreplaced Tag extends Span {
private TagType type;
private String name;
public Tag(int begin, int end, TagType type, String name) {
super(begin, end);
this.type = type;
this.name = name;
}
public TagType getType() {
return type;
}
public String getName() {
return name;
}
@Override
public String toString() {
switch(type) {
case STANDALONE:
return String.format("[agnDYN name=\"%s\"/]", name);
case OPENING:
return String.format("[agnDYN name=\"%s\"]", name);
case VALUE:
return String.format("[agnDVALUE name=\"%s\"]", name);
case CLOSING:
return String.format("[/agnDYN name=\"%s\"]", name);
default:
break;
}
throw new RuntimeException("Unexpected type value (" + type + ")");
}
}
public final ComMailingDao getMailingDao() {
return this.mailingDao;
}
@Required
public void setDynamicTagContentFactory(DynamicTagContentFactory dynamicTagContentFactory) {
this.dynamicTagContentFactory = dynamicTagContentFactory;
}
@Required
public void setDynamicTagFactory(DynamicTagFactory dynamicTagFactory) {
this.dynamicTagFactory = dynamicTagFactory;
}
@Required
public void setMailingBaseService(ComMailingBaseService mailingBaseService) {
this.mailingBaseService = mailingBaseService;
}
@Required
public void setAgnTagService(AgnTagService agnTagService) {
this.agnTagService = agnTagService;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
16
Source : MailloopServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Implementation of {@link MailloopService}.
*/
public clreplaced MailloopServiceImpl implements MailloopService {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(MailloopServiceImpl.clreplaced);
/**
* DAO for accessing mailloop settings.
*/
private MailloopDao mailloopDao;
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
/**
* Service for sending action-based mailings.
*/
private SendActionbasedMailingService sendActionbasedMailingService;
@Override
public void sendAutoresponderMail(final int mailloopID, final int companyID, final int customerID, final String securityToken) throws MailloopException {
if (logger.isInfoEnabled()) {
logger.info(String.format("Called sendAutoresponderMail() - mailloop %d, company %d, customer %d", mailloopID, companyID, customerID));
}
final Mailloop mailloop = this.mailloopDao.getMailloop(mailloopID, companyID);
if (mailloop == null || mailloop.getId() == 0) {
if (logger.isInfoEnabled()) {
logger.info(String.format("Unknown mailloop %d for company %d", mailloopID, companyID));
}
throw new UnknownMailloopIdException(mailloopID, companyID);
}
if (securityToken == null || !securityToken.equals(mailloop.getSecurityToken())) {
throw new InvalidMailloopSecurityTokenException(mailloopID);
}
sendAutoresponderMail(mailloop, customerID);
}
/**
* Send auto-responder mail for previously loaded {@link Mailloop}.
*
* @param mailloop {@link Mailloop} for sending auto-responder
* @param customerID customer ID that triggered sending of the auto-responder
* @throws UnableToSendAutoresponderMailingException on errors sending auto-responder mailing
*/
private void sendAutoresponderMail(final Mailloop mailloop, final int customerID) throws UnableToSendAutoresponderMailingException {
if (mailloop.getAutoresponderMailingId() == 0) {
throw new UnableToSendAutoresponderMailingException(mailloop.getAutoresponderMailingId(), customerID, mailloop.getId());
} else {
sendAutoresponderAsActionbasedMailing(mailloop, customerID);
}
}
/**
* Send auto-responder mail as action-based mailing for previously loaded {@link Mailloop}.
*
* @param mailloop {@link Mailloop} for sending auto-responder with {@link Mailloop#getAutoresponderMailingId()} returning a positive, non-zero value
* @param customerID customer ID that triggered sending of the auto-responder
*
* @throws UnableToSendAutoresponderMailingException on errors sending auto-responder mailing
*/
private void sendAutoresponderAsActionbasedMailing(final Mailloop mailloop, final int customerID) throws UnableToSendAutoresponderMailingException {
final int autoresponderMailingId = mailloop.getAutoresponderMailingId();
// Satisfied due to previous checks
replacedert (autoresponderMailingId > 0);
final LightweightMailing mailing = mailingDao.getLightweightMailing(mailloop.getCompanyID(), autoresponderMailingId);
final List<Integer> allowedUserStatusList = createUserStatusList();
// Currently no mailgun option is overwritten
final Map<String, String> overwriteMailgunOptions = null;
try {
final MailgunOptions mailgunOptions = new MailgunOptions();
mailgunOptions.withForceSending(true);
mailgunOptions.withAllowedUserStatus(allowedUserStatusList);
mailgunOptions.withProfileFieldValues(overwriteMailgunOptions);
mailgunOptions.withForceSending(true);
sendActionbasedMailingService.sendActionbasedMailing(mailing.getCompanyID(), mailing.getMailingID(), customerID, 0, mailgunOptions);
} catch (final SendActionbasedMailingException e) {
logger.error("Error sending auto-responder", e);
throw new UnableToSendAutoresponderMailingException(autoresponderMailingId, customerID, mailloop.getId(), e);
}
}
/**
* Create list containing all user status, that are allowed to send mailings to.
*
* @return list of user status
*/
private static List<Integer> createUserStatusList() {
final List<Integer> list = new Vector<>();
list.add(UserStatus.Active.getStatusCode());
list.add(UserStatus.WaitForConfirm.getStatusCode());
return list;
}
/**
* Set DAO for accessing mailloop settings.
*
* @param dao DAO for accessing mailloop settings
*/
@Required
public void setMailloopDao(final MailloopDao dao) {
this.mailloopDao = dao;
}
/**
* Set service for sending action-based mailings.
*
* @param service service for sending action-based mailings
*/
@Required
public void setSendActionbasedMailingService(final SendActionbasedMailingService service) {
this.sendActionbasedMailingService = service;
}
/**
* Set DAO for accessing mailing data.
*
* @param dao DAO for accessing mailing data
*/
@Required
public void setMailingDao(final ComMailingDao dao) {
this.mailingDao = dao;
}
}
16
Source : MailingPreviewHelper.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Updated preview format in preview form.
* @param previewForm PreviewForm
* @param request PreviewForm
* @param mailingId mailing ID
* @param companyID company ID
* @param dao DAO for accessing mailings
*/
public static void updateActiveMailingPreviewFormat(PreviewForm previewForm, HttpServletRequest request, int mailingId, int companyID, ComMailingDao dao) {
int activeFormat = computeActivePreviewFormat(previewForm.getFormat(), mailingId, companyID, dao);
previewForm.setFormat(activeFormat);
request.setAttribute("PREVIEW_FORMAT", activeFormat);
}
16
Source : ComSnowflakeMailingCacheImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* Cache for light-weight mailing objects with DAO access.
*/
public clreplaced ComSnowflakeMailingCacheImpl implements SnowflakeMailingCache {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(ComSnowflakeMailingCacheImpl.clreplaced);
private ConfigService configService;
/**
* DAO for accessing mailing data.
*/
private ComMailingDao mailingDao;
/**
* Internal cache structure.
*/
private TimeoutLRUMap<String, LightweightMailing> cache;
@Override
public LightweightMailing getSnowflakeMailing(int companyId, int mailingId) throws ComSnowflakeMailingCacheException {
LightweightMailing mailing = getCache().get(companyId + "_" + mailingId);
if (mailing == null) {
mailing = mailingDao.getLightweightMailing(companyId, mailingId);
if (mailing != null && mailing.getMailingID() != 0) {
getCache().put(companyId + "_" + mailingId, mailing);
} else {
mailing = null;
}
}
if (mailing == null) {
logger.error("Mailing ID " + mailingId + " not found");
throw new ComSnowflakeMailingCacheException("Mailing ID " + mailingId + " not found");
}
return mailing;
}
private TimeoutLRUMap<String, LightweightMailing> getCache() {
if (cache == null) {
cache = new TimeoutLRUMap<>(configService.getIntegerValue(ConfigValue.MailgunMaxCache), configService.getLongValue(ConfigValue.MailgunMaxCacheTimeMillis));
}
return cache;
}
@Required
public void setConfigService(ConfigService configService) {
this.configService = configService;
}
/**
* Setter for ComMailingDao.
*
* @param comMailingDao
* DAO
*/
@Required
public void setComMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
}
16
Source : DashboardServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced DashboardServiceImpl implements DashboardService {
private Logger logger = Logger.getLogger(DashboardServiceImpl.clreplaced);
private static final int DEFAULT_STATISTIC_VALUE = 0;
private MailingSummaryDataSetFactory summaryDataSetFactory;
private ComMailingDao mailingDao;
private static final List<Integer> OPENERS_STATISTIC_INDEXES = new ArrayList<>(Arrays.asList(CommonKeys.OPENERS_PC_INDEX, CommonKeys.OPENERS_MOBILE_INDEX, CommonKeys.OPENERS_TABLET_INDEX, CommonKeys.OPENERS_SMARTTV_INDEX, CommonKeys.OPENERS_PC_AND_MOBILE_INDEX));
private static final List<Integer> CLICKERS_STATISTIC_INDEXES = new ArrayList<>(Arrays.asList(CommonKeys.CLICKER_PC_INDEX, CommonKeys.CLICKER_MOBILE_INDEX, CommonKeys.CLICKER_TABLET_INDEX, CommonKeys.CLICKER_SMARTTV_INDEX, CommonKeys.CLICKER_PC_AND_MOBILE_INDEX));
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setSummaryDataSetFactory(MailingSummaryDataSetFactory summaryDataSetFactory) {
this.summaryDataSetFactory = summaryDataSetFactory;
}
public ComMailingDao getMailingDao() {
return mailingDao;
}
@Override
public PaginatedListImpl<Map<String, Object>> getMailings(ComAdmin admin, String sort, String direction, int rownums) {
return mailingDao.getDashboardMailingList(admin.getCompanyID(), admin.getAdminID(), sort, direction, rownums);
}
@Override
public List<Map<String, Object>> getLastSentWorldMailings(ComAdmin admin, int rownums) {
return mailingDao.getLastSentWorldMailings(admin.getCompanyID(), admin.getAdminID(), rownums);
}
@Override
public JSONObject getStatisticsInfo(int mailingId, Locale locale, int companyId) throws Exception {
JSONObject statData = new JSONObject();
Map<Integer, Integer> data = getReportData(mailingId, companyId);
int clickerTracked = data.getOrDefault(CommonKeys.CLICKER_TRACKED_INDEX, DEFAULT_STATISTIC_VALUE);
int openersTracked = data.getOrDefault(CommonKeys.OPENERS_TRACKED_INDEX, DEFAULT_STATISTIC_VALUE);
int deliveredEmails = data.getOrDefault(CommonKeys.DELIVERED_EMAILS_INDEX, DEFAULT_STATISTIC_VALUE);
double clickerPercent = 0.0;
double openersPercent = 0.0;
if (openersTracked != 0 && deliveredEmails != 0) {
clickerPercent = (double) clickerTracked / openersTracked;
openersPercent = (double) openersTracked / deliveredEmails;
}
statData.put("common", getCommonStat(data, locale));
statData.put("clickers", getClickersStat(data, locale));
statData.put("openers", getOpenersStat(data, locale));
statData.put("clickersPercent", Collections.singletonList(clickerPercent));
statData.put("openersPercent", Collections.singletonList(openersPercent));
return statData;
}
private Map<Integer, Integer> getReportData(int mailingId, int companyId) throws Exception {
MailingSummaryDataSet mailingSummaryDataSet = summaryDataSetFactory.create();
Map<Integer, Integer> data = new HashMap<>();
if (mailingId != 0) {
int tempTableID = mailingSummaryDataSet.prepareDashboardForCharts(mailingId, companyId);
List<? extends SendStatRow> rowList = mailingSummaryDataSet.getSummaryData(tempTableID);
for (SendStatRow row : rowList) {
// when the value in summary data set is "-1"
// it's mean that the requested data is not exists in db, so we should set "0"
int value = Math.max(0, row.getCount());
data.put(row.getCategoryindex(), value);
}
} else {
logger.error("Parameter mailingId is missed");
}
return data;
}
private List<String[]> getCommonStat(Map<Integer, Integer> data, Locale locale) {
List<Integer> dataKeys = new ArrayList<>(data.keySet());
List<String[]> commonStat = new ArrayList<>();
Collections.sort(dataKeys);
for (Integer categoryId : dataKeys) {
String messageKey;
switch(categoryId) {
case CommonKeys.DELIVERED_EMAILS_INDEX:
messageKey = "mailing.status.sent";
break;
case CommonKeys.OPENERS_INDEX:
messageKey = "statistic.opener";
break;
case CommonKeys.CLICKER_INDEX:
messageKey = "statistic.clicker";
break;
case CommonKeys.OPT_OUTS_INDEX:
messageKey = "statistic.Opt_Outs";
break;
case CommonKeys.HARD_BOUNCES_INDEX:
messageKey = "statistic.bounces.hardbounce";
break;
default:
continue;
}
String[] items = new String[] { SafeString.getLocaleString(messageKey, locale), Double.toString(data.get(categoryId)) };
commonStat.add(items);
}
return commonStat;
}
private List<String[]> getClickersStat(Map<Integer, Integer> data, Locale locale) {
List<String[]> clickersStat = new ArrayList<>();
for (int categoryId : CLICKERS_STATISTIC_INDEXES) {
String messageKey;
Integer categoryVal = data.get(categoryId);
if (Objects.isNull(categoryVal)) {
continue;
}
messageKey = getDeviceMessageKey(categoryId);
int clickerTracked = data.getOrDefault(CommonKeys.CLICKER_TRACKED_INDEX, DEFAULT_STATISTIC_VALUE);
String[] items = gereplacedems(messageKey, locale, clickerTracked, categoryVal);
clickersStat.add(items);
}
return clickersStat;
}
private List<String[]> getOpenersStat(Map<Integer, Integer> data, Locale locale) {
List<String[]> openersStat = new ArrayList<>();
for (Integer categoryId : OPENERS_STATISTIC_INDEXES) {
String messageKey;
Integer categoryVal = data.get(categoryId);
if (Objects.isNull(categoryVal)) {
continue;
}
messageKey = getDeviceMessageKey(categoryId);
int openersTracked = data.getOrDefault(CommonKeys.OPENERS_TRACKED_INDEX, DEFAULT_STATISTIC_VALUE);
String[] items = gereplacedems(messageKey, locale, openersTracked, categoryVal);
openersStat.add(items);
}
return openersStat;
}
private String[] gereplacedems(String messageKey, Locale locale, int divider, int divided) {
return new String[] { SafeString.getLocaleString(messageKey, locale), divider == 0 ? Double.toString(0.0) : Double.toString((double) divided / divider) };
}
private String getDeviceMessageKey(int categoryId) {
switch(categoryId) {
case CommonKeys.CLICKER_PC_INDEX:
case CommonKeys.OPENERS_PC_INDEX:
return "predelivery.desktop";
case CommonKeys.CLICKER_TABLET_INDEX:
case CommonKeys.OPENERS_TABLET_INDEX:
return "report.openers.tablet.shortname";
case CommonKeys.CLICKER_MOBILE_INDEX:
case CommonKeys.OPENERS_MOBILE_INDEX:
return "report.openers.mobile.shortname";
case CommonKeys.CLICKER_SMARTTV_INDEX:
case CommonKeys.OPENERS_SMARTTV_INDEX:
return "report.openers.smarttv.shortname";
case CommonKeys.CLICKER_PC_AND_MOBILE_INDEX:
case CommonKeys.OPENERS_PC_AND_MOBILE_INDEX:
return "report.openers.multiple-devices.shortname";
default:
return "predelivery.desktop";
}
}
}
16
Source : ComBirtReportServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComBirtReportServiceImpl implements ComBirtReportService {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(ComBirtReportServiceImpl.clreplaced);
public static final String KEY_START_DATE = "from";
public static final String KEY_END_DATE = "to";
/**
* DAO accessing BIRT report data.
*/
private ComBirtReportDao birtReportDao;
/**
* DAO accessing mailing data.
*/
private ComMailingDao mailingDao;
private DataSource dataSource;
@Override
public boolean insert(ComBirtReport report) throws Exception {
if (report.isReportActive() == 1) {
report.setActivationDate(new Date());
}
return birtReportDao.insert(report);
}
@Override
public void logSentReport(ComBirtReport report) {
if (report.isTriggeredByMailing()) {
final ComBirtReportMailingSettings reportMailingSettings = report.getReportMailingSettings();
final List<Integer> mailingsIdsToSend = reportMailingSettings.getMailingsIdsToSend();
birtReportDao.insertSentMailings(report.getId(), report.getCompanyID(), mailingsIdsToSend);
if (reportMailingSettings.getReportSettingAsInt(ComBirtReportSettings.MAILING_FILTER_KEY) == FilterType.FILTER_MAILING.getKey()) {
// Only deactivate this report if it is NOT an recurring report like e.g. "last mailing sent of mailinglist"
birtReportDao.deactivateBirtReport(report.getId());
}
if (!mailingsIdsToSend.isEmpty()) {
reportMailingSettings.getSettingsMap().remove(MAILINGS_TO_SEND_KEY);
}
} else {
birtReportDao.insertSentMailings(report.getId(), report.getCompanyID(), null);
}
}
protected List<MailingBase> getPredefinedMailingsForReports(@VelocityCheck int companyId, int number, int filterType, int filterValue, int mailingType, String orderKey) {
return mailingDao.getPredefinedMailingsForReports(companyId, number, filterType, filterValue, mailingType, orderKey, 0);
}
protected List<MailingBase> getPredefinedMailingsForReports(@VelocityCheck int companyId, int number, int filterType, int filterValue, int mailingType, String orderKey, Map<String, LocalDate> datesRestriction) {
if (number == 0) {
Date from = DateUtilities.toDate(datesRestriction.get(KEY_START_DATE), AgnUtils.getSystemTimeZoneId());
// Include the defined day completely, so use limit of next day 00:00
Date to = DateUtilities.toDate(datesRestriction.get(KEY_END_DATE).plus(1, ChronoUnit.DAYS), AgnUtils.getSystemTimeZoneId());
return mailingDao.getPredefinedNormalMailingsForReports(companyId, from, to, filterType, filterValue, orderKey);
} else {
return mailingDao.getPredefinedMailingsForReports(companyId, number, filterType, filterValue, mailingType, orderKey, 0);
}
}
private boolean checkReportToSend(final ComBirtReport birtReport) {
try {
if (birtReport.isTriggeredByMailing()) {
ComBirtReportMailingSettings mailingSettings = birtReport.getReportMailingSettings();
if (!mailingSettings.isEnabled()) {
return false;
}
BirtReportType reportType = BirtReportType.getTypeByCode(birtReport.getReportType());
if (reportType == null) {
throw new RuntimeException("Invalid report type");
}
final Date activationDate = birtReport.getActivationDate();
final Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(activationDate);
final Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(new Date());
switch(reportType) {
case TYPE_AFTER_MAILING_24HOURS:
startCalendar.add(GregorianCalendar.DATE, -1);
endCalendar.add(GregorianCalendar.DATE, -1);
break;
case TYPE_AFTER_MAILING_48HOURS:
startCalendar.add(GregorianCalendar.DATE, -2);
endCalendar.add(GregorianCalendar.DATE, -2);
break;
case TYPE_AFTER_MAILING_WEEK:
startCalendar.add(GregorianCalendar.DATE, -7);
endCalendar.add(GregorianCalendar.DATE, -7);
break;
default:
throw new RuntimeException("Invalid report type");
}
final Date startDate = startCalendar.getTime();
final Date endDate = endCalendar.getTime();
int filterId = mailingSettings.getReportSettingAsInt(MAILING_FILTER_KEY);
int filterValue = mailingSettings.getReportSettingAsInt(ComBirtReportSettings.PREDEFINED_ID_KEY);
final List<Integer> mailingsToSend = mailingDao.getBirtReportMailingsToSend(birtReport.getCompanyID(), birtReport.getId(), startDate, endDate, filterId, filterValue);
mailingSettings.setMailingsToSend(mailingsToSend);
return !mailingsToSend.isEmpty();
} else {
ComBirtReportMailingSettings mailingSettings = birtReport.getReportMailingSettings();
updateSelectedMailingIds(mailingSettings, birtReport.getCompanyID());
final List<Integer> mailingsToSend = mailingSettings.getMailingsIdsToSend();
boolean doMailingReport = mailingSettings.isEnabled() && !mailingsToSend.isEmpty();
ComBirtReportComparisonSettings comparisonSettings = birtReport.getReportComparisonSettings();
updateSelectedComparisonIds(comparisonSettings, birtReport.getCompanyID());
List<String> compareMailings = comparisonSettings.getMailings();
boolean doComparisonReport = comparisonSettings.isEnabled() && CollectionUtils.isNotEmpty(compareMailings);
boolean doRecipientReport = birtReport.getReportRecipientSettings().isEnabled();
boolean doTopDomainsReport = birtReport.getReportTopDomainsSettings().isEnabled();
return doComparisonReport || doMailingReport || doRecipientReport || doTopDomainsReport;
}
} catch (Exception e) {
logger.error("Cannot check status of report: " + birtReport.getId(), e);
return false;
}
}
protected void updateSelectedMailingIds(ComBirtReportMailingSettings reportMailingSettings, int companyId) {
List<Integer> mailingIds;
int mailingType = reportMailingSettings.getMailingType();
int mailingGeneralType = reportMailingSettings.getMailingGeneralType();
if (mailingGeneralType == MAILING_NORMAL) {
if (mailingType == ComBirtReportMailingSettings.MAILING_PREDEFINED) {
int filterValue = 0;
int filterType = reportMailingSettings.getReportSettingAsInt(MAILING_FILTER_KEY, FilterType.FILTER_NO_FILTER.getKey());
int numOfMailings = getLastNumberValue(reportMailingSettings.getPredefinedMailings());
String sortOrder = reportMailingSettings.getReportSettingreplacedtring(SORT_MAILINGS_KEY);
if (filterType == FilterType.FILTER_ARCHIVE.getKey() || filterType == FilterType.FILTER_MAILINGLIST.getKey()) {
filterValue = reportMailingSettings.getReportSettingAsInt(ComBirtReportMailingSettings.PREDEFINED_ID_KEY);
}
mailingIds = getPredefinedMailingsForReports(companyId, numOfMailings, filterType, filterValue, -1, sortOrder).stream().map(MailingBase::getId).collect(Collectors.toList());
reportMailingSettings.setMailingsToSend(mailingIds);
}
} else if (mailingGeneralType == ComBirtReportMailingSettings.MAILING_ACTION_BASED || mailingGeneralType == ComBirtReportMailingSettings.MAILING_DATE_BASED) {
Object reportSetting = reportMailingSettings.getReportSetting(MAILINGS_KEY);
reportMailingSettings.setReportSetting(MAILINGS_TO_SEND_KEY, reportSetting);
}
}
protected void updateSelectedComparisonIds(ComBirtReportComparisonSettings reportComparisonSettings, int companyId) {
updateSelectedComparisonIds(reportComparisonSettings, null, companyId);
}
protected void updateSelectedComparisonIds(ComBirtReportComparisonSettings reportComparisonSettings, DateTimeFormatter formatter, int companyId) {
int mailingType = reportComparisonSettings.getReportSettingAsInt(MAILING_TYPE_KEY);
if (mailingType == ComBirtReportSettings.MAILINGS_PREDEFINED) {
String sortOrder = reportComparisonSettings.getReportSettingreplacedtring(SORT_MAILINGS_KEY);
int numOfMailings = reportComparisonSettings.getReportSettingAsInt(PREDEFINED_MAILINGS_KEY);
int filterType = reportComparisonSettings.getReportSettingAsInt(MAILING_FILTER_KEY, FilterType.FILTER_NO_FILTER.getKey());
int filterValue = 0;
if ((filterType == FilterType.FILTER_ARCHIVE.getKey() || filterType == FilterType.FILTER_MAILINGLIST.getKey())) {
filterValue = reportComparisonSettings.getReportSettingAsInt(ComBirtReportComparisonSettings.PREDEFINED_ID_KEY);
}
if (numOfMailings >= 0) {
PeriodType periodType = PeriodType.getTypeByKey(reportComparisonSettings.getPeriodType());
Map<String, LocalDate> datesRestriction = getDatesRestrictionMap(periodType, reportComparisonSettings.getSettingsMap(), formatter);
String[] mailingIds = getPredefinedMailingsForReports(companyId, numOfMailings, filterType, filterValue, -1, sortOrder, datesRestriction).stream().map(mailing -> Integer.toString(mailing.getId())).toArray(String[]::new);
reportComparisonSettings.setMailings(mailingIds);
}
}
}
protected Map<String, LocalDate> getDatesRestrictionMap(PeriodType periodType, Map<String, Object> settings, DateTimeFormatter dateTimeFormatter) {
if (Objects.isNull(periodType)) {
return new HashMap<>();
}
LocalDate to = LocalDate.now();
LocalDate from = LocalDate.now();
switch(periodType) {
case DATE_RANGE_CUSTOM:
String startDate = BirtReportSettingsUtils.getSettingsProperty(settings, BirtReportSettingsUtils.START_DATE);
String stopDate = BirtReportSettingsUtils.getSettingsProperty(settings, BirtReportSettingsUtils.END_DATE);
if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(stopDate)) {
if (dateTimeFormatter != null) {
from = LocalDate.parse(startDate, dateTimeFormatter);
to = LocalDate.parse(stopDate, dateTimeFormatter);
} else {
// Information about date format is lost, TODO: store a unified date string
try {
from = LocalDate.parse(startDate, DateTimeFormatter.ofPattern(DateUtilities.YYYY_MM_DD));
} catch (DateTimeParseException e1) {
try {
from = LocalDate.parse(startDate, DateTimeFormatter.ofPattern(DateUtilities.DD_MM_YYYY));
} catch (DateTimeParseException e2) {
throw new RuntimeException("Unknown start date format");
}
}
try {
to = LocalDate.parse(stopDate, DateTimeFormatter.ofPattern(DateUtilities.YYYY_MM_DD));
} catch (DateTimeParseException e1) {
try {
to = LocalDate.parse(stopDate, DateTimeFormatter.ofPattern(DateUtilities.DD_MM_YYYY));
} catch (DateTimeParseException e2) {
throw new RuntimeException("Unknown stop date format");
}
}
}
}
break;
case DATE_RANGE_MONTH:
from = to.minusMonths(1);
break;
case DATE_RANGE_WEEK:
from = to.minusWeeks(1);
break;
case DATE_RANGE_DAY:
from = to.minusDays(1);
break;
case DATE_RANGE_THREE_MONTH:
from = to.minusDays(1);
break;
default:
from = null;
to = null;
}
Map<String, LocalDate> datesRestriction = new HashMap<>();
datesRestriction.put(KEY_START_DATE, from);
datesRestriction.put(KEY_END_DATE, to);
return datesRestriction;
}
private int getLastNumberValue(String predefinedMailings) {
return PredefinedType.getLastNumberValue(predefinedMailings);
}
@Override
public boolean isExistedBenchmarkMailingTbls() {
return DbUtilities.checkIfTableExists(dataSource, "benchmark_mailing_tbl") && DbUtilities.checkIfTableExists(dataSource, "benchmark_mailing_stat_tbl");
}
/**
* Set DAO accessing BIRT report data.
*
* @param birtReportDao DAO accessing BIRT report data
*/
@Required
public void setBirtReportDao(ComBirtReportDao birtReportDao) {
this.birtReportDao = birtReportDao;
}
/**
* Set DAO accessing mailing data.
*
* @param mailingDao DAO accessing mailing data
*/
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
public ComMailingDao getMailingDao() {
return mailingDao;
}
@Required
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public boolean announceStart(ComBirtReport birtReport) {
return birtReportDao.announceStart(birtReport);
}
@Override
public void announceEnd(ComBirtReport birtReport) {
birtReportDao.announceEnd(birtReport);
}
@Override
public int getRunningReportsByHost(String hostName) {
return birtReportDao.getRunningReportsByHost(hostName);
}
@Override
public List<ComBirtReport> getReportsToSend(int maximumNumberOfReports, List<Integer> includedCompanyIds, List<Integer> excludedCompanyIds) {
if (maximumNumberOfReports <= 0) {
return new ArrayList<>();
} else {
final List<ComBirtReport> reportsList = birtReportDao.getReportsToSend(includedCompanyIds, excludedCompanyIds);
List<ComBirtReport> reportsToSend = new ArrayList<>();
for (ComBirtReport birtReport : reportsList) {
if (reportsToSend.size() < maximumNumberOfReports) {
if (checkReportToSend(birtReport)) {
reportsToSend.add(birtReport);
} else if (birtReport.getNextStart() != null) {
// Time triggered reports, which do have an additional unfulfilled condition for being sent will be retried after next interval
// (e.g. reports for mailings of a defined mailinglists to be sent within the last week, when no fitting mailing was sent in that week)
birtReport.setNextStart(DateUtilities.calculateNextJobStart(birtReport.getIntervalpattern()));
birtReportDao.announceStart(birtReport);
birtReportDao.announceEnd(birtReport);
}
}
}
return reportsToSend;
}
}
}
16
Source : EmmActionServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced EmmActionServiceImpl implements EmmActionService {
protected EmmActionDao emmActionDao;
private EmmActionOperationDao emmActionOperationDao;
private ComMailingDao mailingDao;
private EmmActionOperationService emmActionOperationService;
private ExtendedConversionService conversionService;
@Required
public void setEmmActionDao(EmmActionDao emmActionDao) {
this.emmActionDao = emmActionDao;
}
@Required
public void setEmmActionOperationDao(EmmActionOperationDao emmActionOperationDao) {
this.emmActionOperationDao = emmActionOperationDao;
}
@Required
public void setEmmActionOperationService(EmmActionOperationService emmActionOperationService) {
this.emmActionOperationService = emmActionOperationService;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setConversionService(ExtendedConversionService conversionService) {
this.conversionService = conversionService;
}
@Override
public boolean actionExists(final int actionID, @VelocityCheck final int companyID) {
return emmActionDao.actionExists(actionID, companyID);
}
@Override
public boolean executeActions(int actionID, @VelocityCheck int companyID, Map<String, Object> params, final EmmActionOperationErrors errors) throws Exception {
if (actionID == 0 || companyID <= 0) {
return false;
}
List<AbstractActionOperationParameters> operations = emmActionOperationDao.getOperations(actionID, companyID);
if (!operations.isEmpty()) {
for (AbstractActionOperationParameters operation : operations) {
if (!emmActionOperationService.executeOperation(operation, params, errors)) {
return false;
}
}
}
return true;
}
@Override
@Transactional
public int copyEmmAction(EmmAction emmAction, int toCompanyId) {
List<AbstractActionOperationParameters> ops = emmActionOperationDao.getOperations(emmAction.getId(), emmAction.getCompanyID());
for (AbstractActionOperationParameters op : ops) {
op.setId(0);
op.setCompanyId(toCompanyId);
}
emmAction.setActionOperations(ops);
emmAction.setId(0);
emmAction.setCompanyID(toCompanyId);
return saveEmmAction(emmAction);
}
@Override
@Transactional
public int copyActionOperations(int sourceActionCompanyID, int sourceActionID, int destinationActionCompanyId, int destinationActionID) {
EmmAction subscribeAction = getEmmAction(destinationActionID, destinationActionCompanyId);
List<AbstractActionOperationParameters> ops = emmActionOperationDao.getOperations(sourceActionID, sourceActionCompanyID);
for (AbstractActionOperationParameters op : ops) {
op.setId(0);
op.setCompanyId(destinationActionCompanyId);
}
subscribeAction.setActionOperations(ops);
return saveEmmAction(subscribeAction);
}
@Override
public int saveEmmAction(EmmAction action) {
return saveEmmAction(action, null);
}
@Override
@Transactional
public int saveEmmAction(ComAdmin admin, EmmAction action, List<UserAction> userActions) {
EmmAction oldAction = action.getId() > 0 ? getEmmAction(action.getId(), action.getCompanyID()) : null;
int actionId = emmActionDao.saveEmmAction(action);
if (actionId > 0) {
for (AbstractActionOperationParameters operation : action.getActionOperations()) {
operation.setCompanyId(admin.getCompanyID());
operation.setActionId(actionId);
emmActionOperationDao.saveOperation(operation);
}
if (oldAction != null && CollectionUtils.isNotEmpty(oldAction.getActionOperations())) {
for (AbstractActionOperationParameters operation : ListUtils.removeAll(oldAction.getActionOperations(), action.getActionOperations())) {
emmActionOperationDao.deleteOperation(operation);
}
}
if (userActions != null) {
UserAction userAction = new UserAction(oldAction == null ? "create action" : "edit action", String.format("%s (%d)%n%s", action.getShortname(), action.getId(), StringUtils.join(getChangesDescriptions(action, oldAction), '\n')));
userActions.add(userAction);
}
}
return actionId;
}
@Override
@Transactional
public int saveEmmAction(EmmAction action, List<UserAction> userActions) {
EmmAction oldAction = action.getId() > 0 ? getEmmAction(action.getId(), action.getCompanyID()) : null;
int actionId = emmActionDao.saveEmmAction(action);
if (actionId > 0) {
for (AbstractActionOperationParameters operation : action.getActionOperations()) {
operation.setActionId(actionId);
emmActionOperationDao.saveOperation(operation);
}
if (oldAction != null && oldAction.getActionOperations() != null) {
for (AbstractActionOperationParameters operation : ListUtils.removeAll(oldAction.getActionOperations(), action.getActionOperations())) {
emmActionOperationDao.deleteOperation(operation);
}
}
if (userActions != null) {
userActions.add(getChangesAsUserAction(action, oldAction));
}
}
return actionId;
}
private UserAction getChangesAsUserAction(EmmAction newAction, EmmAction oldAction) {
List<String> description = new ArrayList<>();
description.add(String.format("%s (%d)", newAction.getShortname(), newAction.getId()));
if (oldAction == null) {
description.add("Set type to " + getTypereplacedtring(newAction.getType()));
description.add("Made " + (newAction.getIsActive() ? "active" : "inactive"));
for (AbstractActionOperationParameters operation : newAction.getActionOperations()) {
String changes = getChanges(null, operation);
if (changes != null) {
description.add(changes);
}
}
} else {
if (!StringUtils.equals(newAction.getShortname(), oldAction.getShortname())) {
description.add("Renamed " + oldAction.getShortname() + " to " + newAction.getShortname());
}
if (newAction.getType() != oldAction.getType()) {
description.add("Changed type to " + getTypereplacedtring(newAction.getType()));
}
if (newAction.getIsActive() != oldAction.getIsActive()) {
description.add("Made " + (newAction.getIsActive() ? "active" : "inactive"));
}
List<AbstractActionOperationParameters> newOperations = newAction.getActionOperations();
List<AbstractActionOperationParameters> oldOperations = oldAction.getActionOperations();
// Order by id to join both lists by id below.
newOperations.sort(Comparator.comparingInt(AbstractActionOperationParameters::getId));
oldOperations.sort(Comparator.comparingInt(AbstractActionOperationParameters::getId));
int newIndex = 0;
int oldIndex = 0;
while (newIndex < newOperations.size() || oldIndex < oldOperations.size()) {
AbstractActionOperationParameters newOperation = null;
AbstractActionOperationParameters oldOperation = null;
if (newIndex < newOperations.size()) {
newOperation = newOperations.get(newIndex++);
}
if (oldIndex < oldOperations.size()) {
oldOperation = oldOperations.get(oldIndex++);
if (newOperation != null) {
// Join if ids match or roll back a side having greater id otherwise.
if (newOperation.getId() < oldOperation.getId()) {
oldOperation = null;
oldIndex--;
} else if (newOperation.getId() > oldOperation.getId()) {
newOperation = null;
newIndex--;
}
}
}
String changes = getChanges(oldOperation, newOperation);
if (changes != null) {
description.add(changes);
}
}
}
return new UserAction(oldAction == null ? "create action" : "edit action", StringUtils.join(description, '\n'));
}
private List<String> getChangesDescriptions(EmmAction newAction, EmmAction oldAction) {
List<String> descriptions = new ArrayList<>();
if (oldAction == null) {
descriptions.add(String.format("Set type to %s.", getTypereplacedtring(newAction.getType())));
descriptions.add(String.format("Made %s.", newAction.getIsActive() ? "active" : "inactive"));
for (AbstractActionOperationParameters operation : newAction.getActionOperations()) {
String operationDescription = asUalDescription(operation, null);
// Missing description means "nothing changed".
if (StringUtils.isNotBlank(operationDescription)) {
descriptions.add(operationDescription);
}
}
} else {
if (!StringUtils.equals(newAction.getShortname(), oldAction.getShortname())) {
descriptions.add(String.format("Renamed %s to %s.", oldAction.getShortname(), newAction.getShortname()));
}
if (newAction.getType() != oldAction.getType()) {
descriptions.add(String.format("Changed type from %s to %s.", getTypereplacedtring(oldAction.getType()), getTypereplacedtring(newAction.getType())));
}
if (newAction.getIsActive() != oldAction.getIsActive()) {
descriptions.add(String.format("Made %s.", newAction.getIsActive() ? "active" : "inactive"));
}
List<AbstractActionOperationParameters> newOperations = newAction.getActionOperations();
List<AbstractActionOperationParameters> oldOperations = oldAction.getActionOperations();
// Order by id to join both lists by id below.
newOperations.sort(Comparator.comparingInt(AbstractActionOperationParameters::getId));
oldOperations.sort(Comparator.comparingInt(AbstractActionOperationParameters::getId));
int newIndex = 0;
int oldIndex = 0;
while (newIndex < newOperations.size() || oldIndex < oldOperations.size()) {
AbstractActionOperationParameters newOperation = null;
AbstractActionOperationParameters oldOperation = null;
if (newIndex < newOperations.size()) {
newOperation = newOperations.get(newIndex++);
}
if (oldIndex < oldOperations.size()) {
oldOperation = oldOperations.get(oldIndex++);
if (newOperation != null) {
// Join if ids match or roll back a side having greater id otherwise.
if (newOperation.getId() < oldOperation.getId()) {
oldOperation = null;
oldIndex--;
} else if (newOperation.getId() > oldOperation.getId()) {
newOperation = null;
newIndex--;
}
}
}
String operationDescription = asUalDescription(newOperation, oldOperation);
if (StringUtils.isEmpty(operationDescription)) {
// Missing description means "nothing changed".
descriptions.add(operationDescription);
}
}
}
return descriptions;
}
private String getTypereplacedtring(int type) {
switch(type) {
case EmmAction.TYPE_LINK:
return "Links";
case EmmAction.TYPE_FORM:
return "Forms";
case EmmAction.TYPE_ALL:
return "Links and forms";
default:
return "Unknown";
}
}
private String getChanges(AbstractActionOperationParameters oldOperation, AbstractActionOperationParameters newOperation) {
if (newOperation == null) {
return "Removed " + oldOperation.getOperationType().getName() + " module #" + oldOperation.getId();
}
String description = newOperation.getUalDescription(oldOperation);
String changes = (oldOperation == null ? "Added " : "Changed ") + newOperation.getOperationType().getName() + " module #" + newOperation.getId();
if (StringUtils.isNotEmpty(description)) {
return changes + " (" + description + ")";
}
// Missing description means "nothing changed".
if (oldOperation != null && StringUtils.isEmpty(description)) {
return null;
}
return changes;
}
private String asUalDescription(AbstractActionOperationParameters newOperation, AbstractActionOperationParameters oldOperation) {
if (newOperation == null && oldOperation == null) {
return "";
}
if (newOperation == null) {
return String.format("Removed %s module #%d.", oldOperation.getOperationType().getName(), oldOperation.getId());
}
String description = "";
if (newOperation instanceof ActionOperationSendMailingParameters) {
ActionOperationSendMailingParameters sendMailingOp = (ActionOperationSendMailingParameters) newOperation;
if (oldOperation instanceof ActionOperationSendMailingParameters) {
ActionOperationSendMailingParameters sendMailingOldOp = (ActionOperationSendMailingParameters) oldOperation;
if (!StringUtils.equals(sendMailingOldOp.getBcc(), sendMailingOp.getBcc())) {
description = "Changed bcc emails to: " + sendMailingOp.getBcc();
}
} else {
description = "Set bcc emails to: " + sendMailingOp.getBcc();
}
}
return StringUtils.isNotEmpty(description) ? String.format("%s %s module #%d (%s)", oldOperation == null ? "Added " : "Changed ", newOperation.getOperationType().getName(), newOperation.getId(), description) : "";
}
@Override
public EmmAction getEmmAction(int actionID, @VelocityCheck int companyID) {
EmmAction action = emmActionDao.getEmmAction(actionID, companyID);
if (action != null) {
List<AbstractActionOperationParameters> operations = emmActionOperationDao.getOperations(actionID, companyID);
action.setActionOperations(operations);
}
return action;
}
@Override
@Transactional
public boolean deleteEmmAction(int actionID, @VelocityCheck int companyID) {
// Action operations must not be deleted when action itself is marked as deleted.
// emmActionOperationDao.deleteOperations(actionID, companyID);
return emmActionDao.deleteEmmAction(actionID, companyID);
}
@Override
public List<Integer> getReferencedMailinglistsFromAction(int companyID, int actionID) {
List<Integer> mailinglistIDs = new ArrayList<>();
if (actionID != 0) {
List<AbstractActionOperationParameters> operations = emmActionOperationDao.getOperations(actionID, companyID);
for (AbstractActionOperationParameters operation : operations) {
if (operation instanceof ActionOperationSendMailingParameters) {
int mailingID = ((ActionOperationSendMailingParameters) operation).getMailingID();
mailinglistIDs.add(mailingDao.getMailinglistId(mailingID, companyID));
}
}
}
return mailinglistIDs;
}
@Override
public List<EmmAction> getActionListBySendMailingId(@VelocityCheck int companyId, int mailingId) {
return emmActionDao.getActionListBySendMailingId(companyId, mailingId);
}
@Override
public PaginatedListImpl<EmmActionDto> getEmmActions(ComAdmin admin, String sort, String order, int page, int numberOfRows, ActivenessStatus filter) {
sort = StringUtils.defaultString(sort, "shortname");
PaginatedListImpl<EmmAction> actionList = emmActionDao.getPaginatedActionList(admin.getCompanyID(), sort, order, page, numberOfRows, filter);
return conversionService.convertPaginatedList(actionList, EmmAction.clreplaced, EmmActionDto.clreplaced);
}
@Override
public EmmActionDto getCopyOfAction(ComAdmin admin, int originId) {
EmmAction originAction = emmActionDao.getEmmAction(originId, admin.getCompanyID());
if (originAction != null) {
String copyShortname = I18nString.getLocaleString("mailing.CopyOf", admin.getLocale()) + originAction.getShortname();
originAction.setId(0);
originAction.setShortname(copyShortname);
// An operations should be cloned, not referenced
List<AbstractActionOperationParameters> operations = originAction.getActionOperations();
for (AbstractActionOperationParameters operation : CollectionUtils.emptyIfNull(operations)) {
operation.setId(0);
operation.setActionId(0);
}
return conversionService.convert(originAction, EmmActionDto.clreplaced);
} else {
return new EmmActionDto();
}
}
}
16
Source : ActionOperationGetArchiveListImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ActionOperationGetArchiveListImpl implements EmmActionOperation, ApplicationContextAware {
/**
* The logger.
*/
private static final Logger logger = Logger.getLogger(ActionOperationGetArchiveListImpl.clreplaced);
private ApplicationContext applicationContext;
private ExtensibleUIDService uidService;
private ComMailingDao mailingDao;
private ComCompanyDao companyDao;
private ConfigService configService;
@Override
public boolean execute(AbstractActionOperationParameters operation, Map<String, Object> params, final EmmActionOperationErrors actionOperationErrors) {
ActionOperationGetArchiveListParameters op = (ActionOperationGetArchiveListParameters) operation;
int companyID = op.getCompanyId();
int campaignID = op.getCampaignID();
Integer tmpNum = null;
int customerID = 0;
Mailing aMailing = null;
int tmpMailingID = 0;
Hashtable<String, String> shortnames = new Hashtable<>();
Hashtable<String, String> uids = new Hashtable<>();
Hashtable<String, String> subjects = new Hashtable<>();
LinkedList<String> mailingids = new LinkedList<>();
if (params.get("customerID") != null) {
tmpNum = (Integer) params.get("customerID");
customerID = tmpNum.intValue();
} else {
return false;
}
final ComCompany company = companyDao.getCompany(companyID);
if (company == null) {
return false;
}
final int licenseID = this.configService.getLicenseID();
ComExtensibleUID uid = UIDFactory.from(licenseID, companyID, customerID);
try {
List<Map<String, Object>> list = mailingDao.getMailingsForActionOperationGetArchiveList(companyID, campaignID);
for (Map<String, Object> map : list) {
tmpMailingID = ((Number) map.get("mailing_id")).intValue();
aMailing = mailingDao.getMailing(tmpMailingID, companyID);
MediatypeEmail aType = aMailing.getEmailParam();
if (aType != null) {
if (aType.getStatus() == ComMediatype.STATUS_ACTIVE) {
mailingids.add(Integer.toString(tmpMailingID));
shortnames.put(Integer.toString(tmpMailingID), (String) map.get("shortname"));
subjects.put(Integer.toString(tmpMailingID), aMailing.getPreview(aType.getSubject(), MailingPreviewHelper.INPUT_TYPE_HTML, customerID, applicationContext));
uid = UIDFactory.copyWithNewMailingID(uid, tmpMailingID);
try {
uids.put(Integer.toString(tmpMailingID), uidService.buildUIDString(uid));
} catch (Exception e) {
logger.error("problem encrypt: " + e, e);
return false;
}
}
}
}
} catch (Exception e) {
logger.error("problem: " + e, e);
return false;
}
params.put("archiveListSubjects", subjects);
params.put("archiveListNames", shortnames);
params.put("archiveListUids", uids);
params.put("archiveListMailingIDs", mailingids);
if (logger.isInfoEnabled()) {
logger.info("generated feed");
}
return true;
}
@Override
public ActionOperationType processedType() {
return ActionOperationType.GET_ARCHIVE_LIST;
}
@Required
public final void setUidService(final ExtensibleUIDService service) {
this.uidService = Objects.requireNonNull(service, "UID Service cannot be null");
}
@Required
public final void setMailingDao(final ComMailingDao dao) {
this.mailingDao = Objects.requireNonNull(dao, "Mailing DAO cannot be null");
}
@Required
public final void setCompanyDao(final ComCompanyDao dao) {
this.companyDao = Objects.requireNonNull(dao, "Company DAO cannot be null");
}
@Required
public final void setConfigService(final ConfigService service) {
this.configService = Objects.requireNonNull(service, "Config service cannot be null");
}
@Required
@Override
public final void setApplicationContext(final ApplicationContext con) throws BeansException {
this.applicationContext = Objects.requireNonNull(con, "Application context cannot be null");
}
}
15
Source : ComOptimizationServiceImpl.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
public clreplaced ComOptimizationServiceImpl implements // TODO: Remove dependency to ApplicationContextAware
ComOptimizationService, // TODO: Remove dependency to ApplicationContextAware
ApplicationContextAware {
/**
* The logger.
*/
private static final transient Logger logger = Logger.getLogger(ComOptimizationServiceImpl.clreplaced);
/**
* This flag indicates, that finishOptimizationsSingle() is already running.
*/
private volatile boolean optimizationInProgress;
private ComOptimizationDao optimizationDao;
/**
* DAO accessing target groups.
*/
private ComTargetDao targetDao;
/**
* DAO accessing mailings.
*/
private ComMailingDao mailingDao;
// when we will get rid off that ???
private ApplicationContext applicationContext;
// you can't reuse anything from existing code without a huge refactoring and/or including side effects and/or work with that ugly stuff ..
private ComOptimizationCommonService optimizationCommonService;
private ComOptimizationStatService optimizationStatService;
private ComMailingParameterService mailingParameterService;
private CopyMailingService copyMailingService;
public ComOptimizationServiceImpl() {
if (logger.isDebugEnabled()) {
logger.debug("created new instance of " + this.getClreplaced().getCanonicalName() + ", hashCode(this) = " + this.hashCode());
}
optimizationInProgress = false;
}
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#delete(com.agnitas.mailing.autooptimization.beans.ComOptimization)
*/
@Override
public boolean delete(ComOptimization optimization) throws MaildropDeleteException {
if (optimization.getStatus() == STATUS_SCHEDULED) {
optimizationCommonService.unscheduleOptimization(optimization);
}
return optimizationDao.delete(optimization);
}
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#save(com.agnitas.mailing.autooptimization.beans.ComOptimization)
*/
@Override
public int save(ComOptimization optimization) {
List<Integer> testMailingIds = optimization.getTestmailingIDs();
// if optimization is workflow driven - don't change mediatype email parameters
if (optimization.getWorkflowId() <= 0) {
for (Integer mailingId : testMailingIds) {
Mailing testmailing = mailingDao.getMailing(mailingId, optimization.getCompanyID());
MediatypeEmail emailParam = testmailing.getEmailParam();
emailParam.setDoublechecking(optimization.isDoubleCheckingActivated());
mailingDao.saveMailing(testmailing, false);
}
}
return optimizationDao.save(optimization);
}
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#get(int,
* int)
*/
@Override
public ComOptimization get(int optimizationID, @VelocityCheck int companyID) {
ComOptimization comOptimization = optimizationDao.get(optimizationID, companyID);
// For the send date use the 1st testmailing and take the maildrop status entry where the status_field = 'W' or 'T'
int firstTestMailingID = comOptimization.getGroup1();
if (firstTestMailingID != 0) {
Mailing mailing = mailingDao.getMailing(firstTestMailingID, companyID);
MaildropEntry entry = getEffectiveMaildrop(mailing.getMaildropStatus(), comOptimization.isTestRun());
// set the testmailings senddate
if (entry != null) {
comOptimization.setTestMailingsSendDate(entry.getGenDate());
}
}
// refresh the state from maildrop_status_tbl;
comOptimization.setStatus(getState(comOptimization));
return comOptimization;
}
@Override
public int getOptimizationIdByFinalMailing(int finalMailingId, int companyId) {
if (finalMailingId > 0 && companyId > 0) {
return optimizationDao.getOptimizationByFinalMailingId(finalMailingId, companyId);
}
return 0;
}
private MaildropEntry getEffectiveMaildrop(Set<MaildropEntry> entries, boolean isTestRun) {
for (MaildropEntry e : entries) {
if (isTestRun) {
if (e.getStatus() == MaildropStatus.TEST.getCode()) {
return e;
}
} else {
if (e.getStatus() == MaildropStatus.WORLD.getCode()) {
return e;
}
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#list(int,
* int)
*/
@Override
public List<ComOptimization> list(int campaignID, @VelocityCheck int companyID) {
return optimizationDao.list(campaignID, companyID);
}
/*
* (non-Javadoc)
*
* @see com.agnitas.mailing.autooptimization.service.ComOptimizationService#listWorkflowManaged(int, int)
*/
@Override
public List<ComOptimization> listWorkflowManaged(int workflowId, @VelocityCheck int companyID) {
return optimizationDao.listWorkflowManaged(workflowId, companyID);
}
private boolean sendFinalMailing(Mailing mailing, boolean testRun, int blockSize, int stepping) {
logger.debug("sendFinalMailing(" + (testRun ? "test run" : "") + "), mailing ID " + mailing.getId() + ", hashCode(this) = " + hashCode());
MaildropEntry drop = new MaildropEntryImpl();
Date now = new Date();
drop.setSendDate(now);
drop.setGenDate(now);
drop.setGenChangeDate(now);
drop.setMailingID(mailing.getId());
drop.setCompanyID(mailing.getCompanyID());
if (testRun) {
drop.setStatus(MaildropStatus.TEST.getCode());
drop.setGenStatus(MaildropGenerationStatus.SCHEDULED.getCode());
} else {
drop.setBlocksize(blockSize);
drop.setStepping(stepping);
drop.setStatus(MaildropStatus.WORLD.getCode());
drop.setGenStatus(MaildropGenerationStatus.NOW.getCode());
}
mailing.getMaildropStatus().add(drop);
mailingDao.saveMailing(mailing, false);
mailingDao.updateStatus(drop.getMailingID(), testRun ? "test" : "scheduled");
if (testRun) {
return true;
} else {
return mailing.triggerMailing(drop.getId(), new Hashtable<>(), applicationContext);
}
}
@Override
public boolean finishOptimization(ComOptimization optimization) throws Exception {
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", hashCode(this) = " + this.hashCode());
boolean result = true;
ComTarget splitPart = null;
int status = getState(optimization);
optimization.setStatus(status);
if (optimization.getStatus() == STATUS_TEST_SEND) {
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", status = STATUS_TEST_SEND, hashCode(this) = " + this.hashCode());
optimization.setStatus(STATUS_EVAL_IN_PROGRESS);
save(optimization);
int bestMailing = calculateBestMailing(optimization);
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", bestMailing = " + bestMailing + ", hashCode(this) = " + this.hashCode());
if (bestMailing != 0) {
optimization.setResultMailingID(bestMailing);
Mailing orgMailing = mailingDao.getMailing(bestMailing, optimization.getCompanyID());
// Read mailing parameters
List<ComMailingParameter> orgMailingParameters = mailingParameterService.getMailingParameters(optimization.getCompanyID(), bestMailing);
int copiedMailingID = copyMailingService.copyMailing(orgMailing.getCompanyID(), orgMailing.getId(), orgMailing.getCompanyID(), orgMailing.getShortname(), orgMailing.getDescription());
ComMailing mailing = mailingDao.getMailing(copiedMailingID, orgMailing.getCompanyID());
mailing.setCampaignID(orgMailing.getCampaignID());
mailing.setMailingType(orgMailing.getMailingType());
mailing.setTargetID(orgMailing.getTargetID());
mailing.setTargetExpression(orgMailing.getTargetExpression());
mailing.setCampaignID(orgMailing.getCampaignID());
mailing.setMediatypes(orgMailing.getMediatypes());
mailing.setShortname(optimization.getShortname());
mailing.setDescription("AutoOptMail");
int i = 3;
if (optimization.getGroup3() != 0) {
i++;
}
if (optimization.getGroup4() != 0) {
i++;
}
if (optimization.getGroup5() != 0) {
i++;
}
splitPart = targetDao.getListSplitTarget(optimization.getSplitType(), i, optimization.getCompanyID());
mailing.setSplitID(splitPart.getId());
mailing.setMailTemplateID(bestMailing);
// Create clone copy of mailing parameters
if (orgMailingParameters != null) {
List<ComMailingParameter> copiedMailingParameters = new ArrayList<>();
for (ComMailingParameter templateMailingParameter : orgMailingParameters) {
ComMailingParameter copiedMailingParameter = new ComMailingParameter();
copiedMailingParameter.setName(templateMailingParameter.getName());
copiedMailingParameter.setValue(templateMailingParameter.getValue());
copiedMailingParameter.setDescription(templateMailingParameter.getDescription());
copiedMailingParameter.setCreationDate(templateMailingParameter.getCreationDate());
copiedMailingParameters.add(copiedMailingParameter);
}
mailing.setParameters(copiedMailingParameters);
}
if (mailingDao.saveMailing(mailing, false) != 0) {
if (mailing.getParameters() != null) {
// Save mailing parameters only if list of parameters is not null
mailingParameterService.updateParameters(mailing.getCompanyID(), mailing.getId(), mailing.getParameters(), 0);
}
MaildropEntry orgDropEntry = getEffectiveMaildrop(orgMailing.getMaildropStatus(), optimization.isTestRun());
int blockSize = 0;
int stepping = 0;
if (orgDropEntry != null) {
blockSize = orgDropEntry.getBlocksize();
stepping = orgDropEntry.getStepping();
}
result = sendFinalMailing(mailing, optimization.isTestRun(), blockSize, stepping);
optimization.setFinalMailingId(mailing.getId());
} else {
result = false;
}
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", final mailing = " + mailing.getId() + ", send result = " + result + ", hashCode(this) = " + this.hashCode());
}
if (result) {
optimization.setStatus(STATUS_FINISHED);
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", state transition to STATUS_FINISHED, hashCode(this) = " + this.hashCode());
} else {
optimization.setStatus(STATUS_TEST_SEND);
logger.debug("finishOptimization(), optimization ID " + optimization.getId() + ", state transition to TEST_SEND, hashCode(this) = " + this.hashCode());
}
save(optimization);
}
return result;
}
@Override
public int calculateBestMailing(ComOptimization optimization) {
Hashtable<Integer, CampaignStatEntry> stats = optimizationStatService.getStat(optimization);
if (MapUtils.isEmpty(stats)) {
return -1;
}
int[] mailingIDs = { optimization.getGroup2(), optimization.getGroup3(), optimization.getGroup4(), optimization.getGroup5() };
int bestMailingID = optimization.getGroup1();
double bestRate = calculateFactor(stats.get(optimization.getGroup1()), optimization.getEvalType());
for (Integer mailingID : mailingIDs) {
if (stats.containsKey(mailingID)) {
if (bestRate < calculateFactor(stats.get(mailingID), optimization.getEvalType())) {
bestMailingID = mailingID;
}
}
}
return bestMailingID;
}
@Override
public void finishOptimizationsSingle(List<Integer> includedCompanyIds, List<Integer> excludedCompanyIds) {
/*
* This method implements a litte more complex logic to take control over execution.
* This method should terminate as soon as possible if another execution of this
* method is detected. This will release the thread taken from the thread pool as
* soon as possible and will not lock as longer as needed.
*
* To ensure, that finish optimizations runs only once at a time, the "double-checked lock pattern" is used.
* (Note: This pattern does not work with Java before 1.5, due to a bug in "volatile"!)
*/
if (optimizationInProgress) {
// This check is useful to get to synchronized() only if needed. (synchronized() is an expensive construct)
logger.info("Finishing auto-optimizations is already in progress.");
return;
}
synchronized (this) {
if (optimizationInProgress) {
// Do the check again. In the meantime, another thread could be come through synchronized() before the current thread. (-> Double-checked locking pattern)
logger.info("Finishing auto-optimizations is already in progress.");
return;
}
this.optimizationInProgress = true;
}
try {
// This try-finally block ensures, that the flag "optimizationInProgess" is reset to false in any case.
logger.info("Starting process to finish auto-optimizations");
this.finishOptimizations(includedCompanyIds, excludedCompanyIds);
} finally {
logger.info("finishing auto-optimizations is done");
this.optimizationInProgress = false;
}
}
@Override
public void finishOptimizations(List<Integer> includedCompanyIds, List<Integer> excludedCompanyIds) {
if (logger.isDebugEnabled()) {
logger.debug("finishOptimizations(), hashCode(this) = " + this.hashCode());
}
StringBuffer result = new StringBuffer("time: " + System.currentTimeMillis() + " ");
Set<Integer> checkedOptimizations = new HashSet<>();
// date has been reached ...
try {
Map<Integer, Integer> map = optimizationDao.getDueOnDateOptimizations(includedCompanyIds, excludedCompanyIds);
if (logger.isDebugEnabled()) {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
logger.debug(" optimization (date): " + entry.getKey() + ", company ID: " + entry.getValue() + ", hashCode(this) = " + this.hashCode());
}
}
if (MapUtils.isNotEmpty(map)) {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int optimizationId = entry.getKey();
int companyId = entry.getValue();
try {
ComOptimization optimization = optimizationDao.get(optimizationId, companyId);
finishOptimization(optimization);
checkedOptimizations.add(optimizationId);
} catch (Exception e) {
logger.error("Cannot finalize optimization, id: " + optimizationId, e);
}
}
}
} catch (Exception e) {
logger.error("finishOptimizations", e);
result.append(e.getMessage());
}
// threshold has been reached
List<ComOptimization> dueOnThresholdOptimizations = getDueOnThresholdOptimizations(includedCompanyIds, excludedCompanyIds);
if (logger.isDebugEnabled()) {
for (ComOptimization optimization : dueOnThresholdOptimizations) {
logger.debug(" optimization (threshold): " + optimization.getId() + ", company ID: " + optimization.getCompanyID() + ", hashCode(this) = " + this.hashCode());
}
}
for (ComOptimization optimization : dueOnThresholdOptimizations) {
try {
if (!checkedOptimizations.contains(optimization.getId())) {
finishOptimization(optimization);
}
} catch (Exception e) {
logger.error("Cannot finalize optimization: " + e.getMessage(), e);
}
}
if (logger.isDebugEnabled()) {
logger.debug("finishOptimizations() #DONE#, hashCode(this) = " + this.hashCode());
}
}
/**
* get all the optimizations where the threshold has been reached
* @return
*/
@Override
public List<ComOptimization> getDueOnThresholdOptimizations(List<Integer> includedCompanyIds, List<Integer> excludedCompanyIds) {
logger.debug("getDueOnThresholdOptimizations(), hashCode(this) = " + this.hashCode());
List<ComOptimization> optimizationCandidates = optimizationDao.getDueOnThresholdOptimizationCandidates(includedCompanyIds, excludedCompanyIds);
List<ComOptimization> thresholdReachedOptimizations = new ArrayList<>();
for (ComOptimization optimization : optimizationCandidates) {
int threshold = optimization.getThreshold();
Hashtable<Integer, CampaignStatEntry> mailingData = optimizationStatService.getStat(optimization);
if (MapUtils.isNotEmpty(mailingData)) {
for (CampaignStatEntry value : mailingData.values()) {
// should clicks or openings compared with the threshold ?
double mailingStatValue = 0;
if (AO_CRITERIA_CLICKRATE == optimization.getEvalType()) {
mailingStatValue = value.getClicks();
}
if (AO_CRITERIA_OPENRATE == optimization.getEvalType()) {
mailingStatValue = value.getOpened();
}
if (AO_CRITERIA_REVENUE == optimization.getEvalType()) {
mailingStatValue = value.getRevenue();
}
if (mailingStatValue >= threshold) {
// threshold has been reached
thresholdReachedOptimizations.add(optimization);
logger.debug("getDueOnThresholdOptimizations(), found optimization " + optimization.getId() + ", hashCode(this) = " + this.hashCode());
break;
}
}
}
}
return thresholdReachedOptimizations;
}
private double calculateFactor(CampaignStatEntry aEntry, WorkflowDecision.WorkflowAutoOptimizationCriteria evalType) {
double result = 0.0;
double subscribers = 0.0;
subscribers = aEntry.getTotalMails() - aEntry.getBounces() - aEntry.getOptouts();
if (subscribers >= 1.0) {
switch(evalType) {
case AO_CRITERIA_CLICKRATE:
result = (aEntry.getClicks()) / subscribers;
break;
case AO_CRITERIA_OPENRATE:
result = (aEntry.getOpened()) / subscribers;
break;
case AO_CRITERIA_REVENUE:
result = aEntry.getRevenue() / subscribers;
break;
default:
break;
}
}
return result;
}
@Override
public List<String[]> getSplitTypeList(@VelocityCheck int companyID, String splitType, String language) {
List<String> splitNames = targetDao.getSplitNames(companyID);
Map<String, Integer> splitTypes = new HashMap<>();
Map<String, Integer> decimalSplitTypes = new HashMap<>();
for (String splitName : splitNames) {
boolean decimal = false;
if (splitName.startsWith(TargetLight.LIST_SPLIT_PREFIX)) {
splitName = splitName.substring(TargetLight.LIST_SPLIT_PREFIX.length());
} else if (splitName.startsWith(TargetLight.LIST_SPLIT_CM_PREFIX)) {
splitName = splitName.substring(TargetLight.LIST_SPLIT_CM_PREFIX.length());
decimal = true;
} else {
logger.error("Invalid split list name prefix: " + splitName);
continue;
}
int splitPartPos = splitName.lastIndexOf('_');
if (splitPartPos < 0) {
logger.error("Invalid split list name format: " + splitName);
continue;
}
String splitBase = splitName.substring(0, splitPartPos);
if (decimal) {
Integer entries = decimalSplitTypes.get(splitBase);
decimalSplitTypes.put(splitBase, entries == null ? 1 : entries + 1);
} else {
Integer entries = splitTypes.get(splitBase);
splitTypes.put(splitBase, entries == null ? 1 : entries + 1);
}
}
Map<String, String> mergedSplitTypes = new HashMap<>();
for (Entry<String, Integer> entry : splitTypes.entrySet()) {
// Auto-optimization requires at least 3 targets - two test mailings and a final mailing
if (entry.getValue() < 3) {
continue;
}
String splitBase = entry.getKey();
String decimalBase = convertSplitBaseToDecimal(splitBase);
if (decimalBase != null) {
mergedSplitTypes.put(decimalBase, splitBase);
}
}
for (Entry<String, Integer> entry : decimalSplitTypes.entrySet()) {
// Auto-optimization requires at least 3 targets - two test mailings and a final mailing
if (entry.getValue() < 3) {
continue;
}
String decimalSplitBase = entry.getKey();
// Force to overwrite an existing non-custom split type
if (!mergedSplitTypes.containsKey(decimalSplitBase) || decimalSplitBase.equals(splitType)) {
mergedSplitTypes.put(decimalSplitBase, decimalSplitBase);
}
}
return mergedSplitTypes.entrySet().stream().sorted((a, b) -> a.getKey().compareTo(b.getKey())).map(e -> {
String value = e.getValue();
if (StringUtils.equals(e.getKey(), value)) {
String label = createLabelForDecimalSplitBase(value);
return new String[] { value, null, label };
} else {
String labelKey = "listsplit." + value;
return new String[] { value, labelKey, null };
}
}).collect(Collectors.toList());
}
// XXYYZZ -> XX.0;YY.0;ZZ.0
private String convertSplitBaseToDecimal(String splitBase) {
String decimalSplitBase = null;
try {
List<String> groups = new ArrayList<>();
for (int i = 0; (i + 1) < splitBase.length(); i += 2) {
double value = new Integer(splitBase.substring(i, i + 2));
groups.add(String.valueOf(value));
}
decimalSplitBase = StringUtils.join(groups, ';');
} catch (NumberFormatException e) {
logger.error("Invalid split list name format: " + splitBase, e);
}
return decimalSplitBase;
}
// XX.0;YY.0;ZZ.0 -> XX% / YY% / ZZ%
private String createLabelForDecimalSplitBase(String decimalSplitBase) {
List<String> groups = new ArrayList<>();
for (String value : decimalSplitBase.split(";")) {
Double v = new Double(value);
groups.add(v.intValue() + "%");
}
return StringUtils.join(groups, " / ");
}
@Override
public List<TargetLight> getTargetGroupList(@VelocityCheck int companyID) {
return targetDao.getTargetLights(companyID);
}
@Override
public List<TargetLight> getTargets(String targetExpression, @VelocityCheck int companyID) {
Collection<Integer> targetIds = new ArrayList<>();
if (StringUtils.isNotBlank(targetExpression)) {
for (String targetId : targetExpression.split(",")) {
if (StringUtils.isNotEmpty(targetId)) {
targetIds.add(Integer.parseInt(targetId));
}
}
}
return targetDao.getUnchoosenTargetLights(companyID, targetIds);
}
@Override
public List<TargetLight> getChosenTargets(String targetExpression, final int companyID) {
return targetExpression != null && !targetExpression.equals("") ? targetDao.getChoosenTargetLights(targetExpression, companyID) : new ArrayList<>();
}
@Override
public List<ComOptimization> getOptimizationsForCalendar(@VelocityCheck int companyId, Date startDate, Date endDate) {
if (startDate != null && endDate != null) {
return optimizationDao.getOptimizationsForCalendar(companyId, startDate, endDate);
} else {
return Collections.emptyList();
}
}
@Override
public JSONArray getOptimizationsAsJson(ComAdmin admin, LocalDate startDate, LocalDate endDate, DateTimeFormatter formatter) {
JSONArray result = new JSONArray();
if (startDate.isAfter(endDate)) {
return result;
}
ZoneId zoneId = AgnUtils.getZoneId(admin);
Date start = DateUtilities.toDate(startDate, zoneId);
Date end = DateUtilities.toDate(endDate.plusDays(1).atStartOfDay().minusNanos(1), zoneId);
List<ComOptimization> optimizations = optimizationDao.getOptimizationsForCalendar_New(admin.getCompanyID(), start, end);
for (ComOptimization optimization : optimizations) {
JSONObject object = new JSONObject();
object.element("id", optimization.getId());
object.element("shortname", optimization.getShortname());
object.element("campaignID", optimization.getCampaignID());
object.element("workflowId", optimization.getWorkflowId());
object.element("autoOptimizationStatus", optimization.getAutoOptimizationStatus());
object.element("sendDate", DateUtilities.format(optimization.getSendDate(), zoneId, formatter));
result.add(object);
}
return result;
}
@Override
public List<SelectOption> getTestMailingList(ComOptimization optimization) {
Map<Integer, String> groups = optimizationDao.getGroups(optimization.getCampaignID(), optimization.getCompanyID(), optimization.getId());
if (MapUtils.isEmpty(groups)) {
return Collections.emptyList();
}
List<SelectOption> options = new ArrayList<>(groups.size());
groups.forEach((mailingId, shortname) -> options.add(new SelectOption(Integer.toString(mailingId), shortname)));
return options;
}
// helper methods
@Override
public int getSplitNumbers(@VelocityCheck int companyID, String splitType) {
return targetDao.getSplits(companyID, splitType);
}
@Override
public int getState(ComOptimization optimization) {
// The state STATUS_FINISHED is the only state which is directly written to the database
ComOptimization optimizationFromDB = optimizationDao.get(optimization.getId(), optimization.getCompanyID());
if (optimizationFromDB.getStatus() == ComOptimization.STATUS_FINISHED) {
return ComOptimization.STATUS_FINISHED;
}
// ... all other optimization states depend on the states of the test mailings
// replacedume the first test mailing represents the state of the others
List<Integer> testMailingIDs = optimization.getTestmailingIDs();
// the first testmailing ( group1 ) is the reference
if (testMailingIDs.size() > 0) {
int testMailingStatus = mailingDao.getLastGenstatus(testMailingIDs.get(0), optimization.isTestRun() ? MaildropStatus.TEST.getCode() : MaildropStatus.WORLD.getCode());
// Method for selecting mailings throws no exception, but returns -1 as default, if no entry was found
if (testMailingStatus == -1) {
return STATUS_NOT_STARTED;
}
if (testMailingStatus == DeliveryStat.STATUS_NOT_SENT) {
return STATUS_SCHEDULED;
}
if (testMailingStatus == DeliveryStat.STATUS_SENDING || testMailingStatus == DeliveryStat.STATUS_GENERATED || testMailingStatus == DeliveryStat.STATUS_GENERATING) {
return STATUS_TEST_SEND;
}
if (testMailingStatus == DeliveryStat.STATUS_SENT && optimization.getResultMailingID() == 0) {
return STATUS_EVAL_IN_PROGRESS;
}
if (testMailingStatus == DeliveryStat.STATUS_SENT && optimization.getResultMailingID() != 0) {
return STATUS_FINISHED;
}
}
return STATUS_NOT_STARTED;
}
@Override
public int getFinalMailingID(int companyID, int workflowID, int oneOfTheSplitMailingID) {
return optimizationDao.getFinalMailingID(companyID, workflowID, oneOfTheSplitMailingID);
}
@Override
public int getFinalMailingId(@VelocityCheck int companyId, int workflowId) {
return optimizationDao.getFinalMailingId(companyId, workflowId);
}
@Override
public AutoOptimizationLight getOptimizationLight(int companyId, int workflowId) {
AutoOptimizationLight autoOptimizationLight = optimizationDao.getAutoOptimizationLight(companyId, workflowId);
if (autoOptimizationLight == null) {
autoOptimizationLight = new AutoOptimizationLight();
}
return autoOptimizationLight;
}
// make properties 'injectable'
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Required
public void setTargetDao(ComTargetDao targetDao) {
this.targetDao = targetDao;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setOptimizationDao(ComOptimizationDao optimizationDao) {
this.optimizationDao = optimizationDao;
}
@Required
public void setOptimizationCommonService(ComOptimizationCommonService optimizationCommonService) {
this.optimizationCommonService = optimizationCommonService;
}
@Required
public void setOptimizationStatService(ComOptimizationStatService optimizationStatService) {
this.optimizationStatService = optimizationStatService;
}
@Required
public void setMailingParameterService(ComMailingParameterService mailingParameterService) {
this.mailingParameterService = mailingParameterService;
}
@Required
public void setCopyMailingService(CopyMailingService copyMailingService) {
this.copyMailingService = copyMailingService;
}
}
15
Source : ContentRestfulServiceHandler.java
with GNU Affero General Public License v3.0
from agnitas-org
with GNU Affero General Public License v3.0
from agnitas-org
/**
* This restful service is available at:
* https:/<system.url>/restful/content
*/
public clreplaced ContentRestfulServiceHandler implements RestfulServiceHandler {
@SuppressWarnings("unused")
private static final transient Logger logger = Logger.getLogger(ContentRestfulServiceHandler.clreplaced);
public static final String NAMESPACE = "content";
public static final Object EXPORTED_TO_STREAM = new Object();
private UserActivityLogDao userActivityLogDao;
private ComMailingDao mailingDao;
private DynamicTagDao dynamicTagDao;
private ComTargetDao targetDao;
@Required
public void setUserActivityLogDao(UserActivityLogDao userActivityLogDao) {
this.userActivityLogDao = userActivityLogDao;
}
@Required
public void setMailingDao(ComMailingDao mailingDao) {
this.mailingDao = mailingDao;
}
@Required
public void setDynamicTagDao(DynamicTagDao dynamicTagDao) {
this.dynamicTagDao = dynamicTagDao;
}
@Required
public void setTargetDao(ComTargetDao targetDao) {
this.targetDao = targetDao;
}
@Override
public RestfulServiceHandler redirectServiceHandlerIfNeeded(ServletContext context, HttpServletRequest request, String restfulSubInterfaceName) throws Exception {
// No redirect needed
return this;
}
@Override
public void doService(HttpServletRequest request, HttpServletResponse response, ComAdmin admin, String requestDataFilePath, BaseRequestResponse restfulResponse, ServletContext context, RequestMethod requestMethod) throws Exception {
if (requestMethod == RequestMethod.GET) {
((JsonRequestResponse) restfulResponse).setJsonResponseData(new JsonNode(getContent(request, response, admin)));
} else if (requestMethod == RequestMethod.DELETE) {
((JsonRequestResponse) restfulResponse).setJsonResponseData(new JsonNode(deleteContent(request, admin)));
} else if (requestDataFilePath == null || new File(requestDataFilePath).length() <= 0) {
restfulResponse.setError(new RestfulClientException("Missing request data"), ErrorCode.REQUEST_DATA_ERROR);
} else if (requestMethod == RequestMethod.POST) {
((JsonRequestResponse) restfulResponse).setJsonResponseData(new JsonNode(createNewContent(request, new File(requestDataFilePath), admin)));
} else if (requestMethod == RequestMethod.PUT) {
((JsonRequestResponse) restfulResponse).setJsonResponseData(new JsonNode(createOrUpdateContent(request, new File(requestDataFilePath), admin)));
} else {
throw new RestfulClientException("Invalid http request method");
}
}
/**
* Return a single or multiple content data sets
*
* @param request
* @param admin
* @return
* @throws Exception
*/
private Object getContent(HttpServletRequest request, HttpServletResponse response, ComAdmin admin) throws Exception {
if (!admin.permissionAllowed(Permission.MAILING_CONTENT_SHOW)) {
throw new RestfulClientException("Authorization failed: Access denied '" + Permission.MAILING_CONTENT_SHOW.toString() + "'");
}
String[] restfulContext = RestfulServiceHandler.getRestfulContext(request, NAMESPACE, 1, 2);
if (!AgnUtils.isNumber(restfulContext[0])) {
throw new RestfulClientException("Invalid MailingID: " + restfulContext[0]);
}
int mailingID = Integer.parseInt(restfulContext[0]);
if (!mailingDao.exist(mailingID, admin.getCompanyID())) {
throw new RestfulClientException("Invalid not existing MailingID: " + mailingID);
}
if (restfulContext.length == 1) {
// Show all contents of a mailing
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content GET", "MID:" + mailingID + " ALL");
JsonArray contentsJsonArray = new JsonArray();
for (DynamicTag dynamicTag : mailingDao.getDynamicTags(mailingID, admin.getCompanyID())) {
contentsJsonArray.add(createContentJsonObject(dynamicTag));
}
return contentsJsonArray;
} else {
// Export a single content of a mailing
String requestedContentKeyValue = restfulContext[1];
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content GET", "MID: " + mailingID + " " + requestedContentKeyValue);
int dynTagNameID;
if (AgnUtils.isNumber(requestedContentKeyValue)) {
dynTagNameID = Integer.parseInt(requestedContentKeyValue);
} else {
dynTagNameID = dynamicTagDao.getId(admin.getCompanyID(), mailingID, requestedContentKeyValue);
}
if (dynTagNameID <= 0) {
throw new RestfulNoDataFoundException("No data found");
}
DynamicTag dynamicTag = mailingDao.getDynamicTag(dynTagNameID, admin.getCompanyID());
if (dynamicTag == null) {
throw new RestfulNoDataFoundException("No data found");
}
return createContentJsonObject(dynamicTag);
}
}
/**
* Delete a content
*
* @param request
* @param admin
* @return
* @throws Exception
*/
private Object deleteContent(HttpServletRequest request, ComAdmin admin) throws Exception {
if (!admin.permissionAllowed(Permission.MAILING_CHANGE)) {
throw new RestfulClientException("Authorization failed: Access denied '" + Permission.MAILING_CHANGE.toString() + "'");
}
String[] restfulContext = RestfulServiceHandler.getRestfulContext(request, NAMESPACE, 2, 2);
if (!AgnUtils.isNumber(restfulContext[0])) {
throw new RestfulClientException("Invalid MailingID: " + restfulContext[0]);
}
int mailingID = Integer.parseInt(restfulContext[0]);
if (!mailingDao.exist(mailingID, admin.getCompanyID())) {
throw new RestfulClientException("Invalid not existing MailingID: " + mailingID);
}
String requestedContentKeyValue = restfulContext[1];
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content DELETE", "MID: " + mailingID + " " + requestedContentKeyValue);
String dynTagName;
if (AgnUtils.isNumber(requestedContentKeyValue)) {
int dynTagNameID = Integer.parseInt(requestedContentKeyValue);
dynTagName = dynamicTagDao.getDynamicTagName(admin.getCompanyID(), mailingID, dynTagNameID);
} else {
dynTagName = requestedContentKeyValue;
if (dynamicTagDao.getId(admin.getCompanyID(), mailingID, dynTagName) <= 0) {
throw new RestfulNoDataFoundException("No data found for deletion");
}
}
if (StringUtils.isNotBlank(dynTagName)) {
dynamicTagDao.markNameAsDeleted(mailingID, dynTagName);
return "1 content deleted";
} else {
throw new RestfulNoDataFoundException("No data found for deletion");
}
}
/**
* Create a new content
*
* @param request
* @param requestDataFile
* @param admin
* @return
* @throws Exception
*/
private Object createNewContent(HttpServletRequest request, File requestDataFile, ComAdmin admin) throws Exception {
if (!admin.permissionAllowed(Permission.MAILING_CHANGE)) {
throw new RestfulClientException("Authorization failed: Access denied '" + Permission.MAILING_CHANGE.toString() + "'");
}
String[] restfulContext = RestfulServiceHandler.getRestfulContext(request, NAMESPACE, 1, 1);
if (!AgnUtils.isNumber(restfulContext[0])) {
throw new RestfulClientException("Invalid MailingID: " + restfulContext[0]);
}
int mailingID = Integer.parseInt(restfulContext[0]);
if (!mailingDao.exist(mailingID, admin.getCompanyID())) {
throw new RestfulClientException("Invalid not existing MailingID: " + mailingID);
}
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content POST", "MID: " + mailingID);
DynamicTag dynamicTag = parseContentJsonObject(requestDataFile, admin);
dynamicTag.setMailingID(mailingID);
if (dynamicTagDao.getId(admin.getCompanyID(), mailingID, dynamicTag.getDynName()) > 0) {
throw new RestfulClientException("Content already exists: " + dynamicTag.getDynName());
} else {
mailingDao.createDynamicTags(admin.getCompanyID(), mailingID, "UTF-8", Collections.singletonList(dynamicTag));
return createContentJsonObject(mailingDao.getDynamicTag(dynamicTag.getId(), admin.getCompanyID()));
}
}
/**
* Update an existing content
*
* @param request
* @param requestDataFile
* @param admin
* @return
* @throws Exception
*/
private Object createOrUpdateContent(HttpServletRequest request, File requestDataFile, ComAdmin admin) throws Exception {
if (!admin.permissionAllowed(Permission.MAILING_CHANGE)) {
throw new RestfulClientException("Authorization failed: Access denied '" + Permission.MAILING_CHANGE.toString() + "'");
}
String[] restfulContext = RestfulServiceHandler.getRestfulContext(request, NAMESPACE, 1, 2);
if (!AgnUtils.isNumber(restfulContext[0])) {
throw new RestfulClientException("Invalid MailingID: " + restfulContext[0]);
}
int mailingID = Integer.parseInt(restfulContext[0]);
if (!mailingDao.exist(mailingID, admin.getCompanyID())) {
throw new RestfulClientException("Invalid not existing MailingID: " + mailingID);
}
if (restfulContext.length == 1) {
// Insert content to a mailing or update an existing content of a mailing by name
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content PUT", "MID: " + mailingID);
DynamicTag dynamicTag = parseContentJsonObject(requestDataFile, admin);
dynamicTag.setMailingID(mailingID);
if (dynamicTagDao.getId(admin.getCompanyID(), mailingID, dynamicTag.getDynName()) > 0) {
throw new RestfulClientException("Content already exists: " + dynamicTag.getDynName());
} else {
mailingDao.createDynamicTags(admin.getCompanyID(), mailingID, "UTF-8", Collections.singletonList(dynamicTag));
return createContentJsonObject(mailingDao.getDynamicTag(dynamicTag.getId(), admin.getCompanyID()));
}
} else {
// Update content of a mailing by name or content_id
String requestedContentKeyValue = restfulContext[1];
userActivityLogDao.addAdminUseOfFeature(admin, "restful/content", new Date());
userActivityLogDao.writeUserActivityLog(admin, "restful/content PUT", "MID: " + mailingID + " " + requestedContentKeyValue);
DynamicTag dynamicTag = parseContentJsonObject(requestDataFile, admin);
dynamicTag.setMailingID(mailingID);
DynamicTag existingDynamicTag;
if (AgnUtils.isNumber(requestedContentKeyValue)) {
int contentID = Integer.parseInt(requestedContentKeyValue);
if (contentID > 0) {
existingDynamicTag = mailingDao.getDynamicTag(contentID, admin.getCompanyID());
} else {
existingDynamicTag = null;
}
if (existingDynamicTag == null) {
throw new RestfulClientException("Invalid non existing content_id: " + requestedContentKeyValue);
}
} else {
int dynTagId = dynamicTagDao.getId(admin.getCompanyID(), mailingID, dynamicTag.getDynName());
if (dynTagId > 0) {
existingDynamicTag = mailingDao.getDynamicTag(dynTagId, admin.getCompanyID());
} else {
existingDynamicTag = null;
}
if (existingDynamicTag == null) {
throw new RestfulClientException("Invalid non existing content name: " + requestedContentKeyValue);
}
}
dynamicTag.setId(existingDynamicTag.getId());
mailingDao.updateDynamicTags(admin.getCompanyID(), mailingID, "UTF-8", Collections.singletonList(dynamicTag));
DynamicTag storedDynamicTag = mailingDao.getDynamicTag(dynamicTag.getId(), admin.getCompanyID());
if (storedDynamicTag != null) {
return createContentJsonObject(storedDynamicTag);
} else {
throw new RestfulNoDataFoundException("No data found");
}
}
}
private JsonObject createContentJsonObject(DynamicTag dynamicTag) throws Exception {
JsonObject dynamicTagJsonObject = new JsonObject();
dynamicTagJsonObject.add("id", dynamicTag.getId());
dynamicTagJsonObject.add("name", dynamicTag.getDynName());
if (dynamicTag.isDisableLinkExtension()) {
dynamicTagJsonObject.add("disableLinkExtension", dynamicTag.isDisableLinkExtension());
}
if (dynamicTag.getDynContent().size() > 0) {
JsonArray contentArray = new JsonArray();
for (DynamicTagContent dynamicTagContent : dynamicTag.getDynContent().values()) {
JsonObject contentJsonObject = new JsonObject();
contentJsonObject.add("id", dynamicTagContent.getId());
if (dynamicTagContent.getTargetID() > 0) {
contentJsonObject.add("target_id", dynamicTagContent.getTargetID());
}
if (dynamicTagContent.getDynOrder() > 0) {
contentJsonObject.add("order", dynamicTagContent.getDynOrder());
}
contentJsonObject.add("text", dynamicTagContent.getDynContent());
contentArray.add(contentJsonObject);
}
dynamicTagJsonObject.add("content", contentArray);
}
return dynamicTagJsonObject;
}
private DynamicTag parseContentJsonObject(File requestDataFile, ComAdmin admin) throws Exception {
DynamicTag dynamicTag = new DynamicTagImpl();
dynamicTag.setCompanyID(admin.getCompanyID());
try (InputStream inputStream = new FileInputStream(requestDataFile)) {
try (Json5Reader jsonReader = new Json5Reader(inputStream)) {
JsonNode jsonNode = jsonReader.read();
if (JsonDataType.OBJECT == jsonNode.getJsonDataType()) {
JsonObject jsonObject = (JsonObject) jsonNode.getValue();
for (Entry<String, Object> entry : jsonObject.entrySet()) {
if ("name".equals(entry.getKey())) {
if (entry.getValue() != null && entry.getValue() instanceof String) {
dynamicTag.setDynName((String) entry.getValue());
} else {
throw new RestfulClientException("Invalid data type for 'name'. String expected");
}
} else if ("disableLinkExtension".equals(entry.getKey())) {
if (entry.getValue() != null && entry.getValue() instanceof Boolean) {
dynamicTag.setDisableLinkExtension((Boolean) entry.getValue());
} else {
throw new RestfulClientException("Invalid data type for 'disableLinkExtension'. Boolean expected");
}
} else if ("content".equals(entry.getKey())) {
if (entry.getValue() != null && entry.getValue() instanceof JsonArray && ((JsonArray) entry.getValue()).size() > 0) {
for (Object contentObject : (JsonArray) entry.getValue()) {
if (contentObject != null && contentObject instanceof JsonObject) {
DynamicTagContent dynamicTagContent = new DynamicTagContentImpl();
for (Entry<String, Object> contenreplacedemEntry : ((JsonObject) contentObject).entrySet()) {
if ("target_id".equals(contenreplacedemEntry.getKey())) {
if (contenreplacedemEntry.getValue() != null && contenreplacedemEntry.getValue() instanceof Integer) {
dynamicTagContent.setTargetID((Integer) contenreplacedemEntry.getValue());
} else {
throw new RestfulClientException("Invalid data type for 'target_id'. Integer expected");
}
if (targetDao.getTarget(dynamicTagContent.getTargetID(), admin.getCompanyID()) == null) {
throw new RestfulClientException("Invalid not existing 'target_id': " + dynamicTagContent.getTargetID());
}
} else if ("order".equals(contenreplacedemEntry.getKey())) {
if (contenreplacedemEntry.getValue() != null && contenreplacedemEntry.getValue() instanceof Integer) {
dynamicTagContent.setDynOrder((Integer) contenreplacedemEntry.getValue());
} else {
throw new RestfulClientException("Invalid data type for 'order'. Integer expected");
}
} else if ("text".equals(contenreplacedemEntry.getKey())) {
if (contenreplacedemEntry.getValue() != null && contenreplacedemEntry.getValue() instanceof String) {
dynamicTagContent.setDynContent((String) contenreplacedemEntry.getValue());
} else {
throw new RestfulClientException("Invalid data type for 'text'. String expected");
}
} else {
throw new RestfulClientException("Unexpected 'content' item property: " + contenreplacedemEntry.getKey());
}
}
dynamicTag.addContent(dynamicTagContent);
} else {
throw new RestfulClientException("Invalid data type for 'content' item. JsonObject expected");
}
}
} else {
throw new RestfulClientException("Invalid data type for 'content'. JsonArray expected");
}
} else {
throw new RestfulClientException("Unexpected property: " + entry.getKey());
}
}
if (StringUtils.isBlank(dynamicTag.getDynName())) {
throw new RestfulClientException("Missing value for property 'name'. String expected");
}
} else {
throw new RestfulClientException("Invalid request data");
}
}
}
return dynamicTag;
}
@Override
public ResponseType getResponseType() {
return ResponseType.JSON;
}
}
See More Examples