com.agnitas.dao.ComMailingDao

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 7

19 Source : MailingTargetGroupLocator.java
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

/**
 * 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

/**
 * 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

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

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

public void setMailingDao(ComMailingDao mailingDao) {
    this.mailingDao = mailingDao;
}

19 Source : ComOptimizationScheduleServiceImpl.java
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

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

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

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

@Required
public void setMailingDao(ComMailingDao mailingDao) {
    this.mailingDao = mailingDao;
}

18 Source : RedirectServlet.java
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

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

@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

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

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

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

/**
 * 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

/**
 * 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

/**
 * 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

@Required
public void setMailingDao(ComMailingDao dao) {
    this.mailingDao = dao;
}

18 Source : ScriptHelperService.java
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

/**
 * 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

@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

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

/**
 * 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

@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

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

/**
 * 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

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

@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

/**
 * 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

@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

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

@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

@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

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

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

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

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

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

/**
 * 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

/**
 * 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

/**
 * 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

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

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

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

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

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

/**
 * 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