nl.strohalm.cyclos.setup.CreateSmsData.java Source code

Java tutorial

Introduction

Here is the source code for nl.strohalm.cyclos.setup.CreateSmsData.java

Source

/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
    
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    
 */
package nl.strohalm.cyclos.setup;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Set;

import nl.strohalm.cyclos.access.MemberPermission;
import nl.strohalm.cyclos.entities.access.Channel;
import nl.strohalm.cyclos.entities.access.Channel.Credentials;
import nl.strohalm.cyclos.entities.access.Channel.Principal;
import nl.strohalm.cyclos.entities.access.ChannelPrincipal;
import nl.strohalm.cyclos.entities.accounts.MemberAccountType;
import nl.strohalm.cyclos.entities.accounts.SystemAccountType;
import nl.strohalm.cyclos.entities.accounts.transactions.PaymentFilter;
import nl.strohalm.cyclos.entities.accounts.transactions.TransferType;
import nl.strohalm.cyclos.entities.customization.fields.MemberCustomField;
import nl.strohalm.cyclos.entities.groups.BrokerGroup;
import nl.strohalm.cyclos.entities.groups.Group;
import nl.strohalm.cyclos.entities.groups.MemberGroup;
import nl.strohalm.cyclos.entities.groups.MemberGroupSettings;
import nl.strohalm.cyclos.entities.infotexts.InfoText;
import nl.strohalm.cyclos.entities.members.messages.Message;
import nl.strohalm.cyclos.entities.members.messages.Message.Type;
import nl.strohalm.cyclos.entities.services.ServiceClient;
import nl.strohalm.cyclos.entities.services.ServiceOperation;
import nl.strohalm.cyclos.entities.settings.Setting;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

public class CreateSmsData implements Runnable {

    private final ResourceBundle bundle;
    private final Session session;
    private MemberGroup fullMembers;
    private MemberGroup inactiveMembers;
    private BrokerGroup fullBrokers;
    private Channel smsChannel;
    private TransferType smsTradeTT;
    private TransferType smsChargeTT;
    private MemberCustomField mobileCustomField;
    private MemberAccountType memberAccType;
    private SystemAccountType organizationAccType;
    private Collection<MemberGroup> enabledMemberGroups;

    public CreateSmsData(final Setup setup) {
        session = setup.getSession();
        bundle = setup.getBundle();
    }

    @Override
    public void run() {
        Setup.out.println(bundle.getString("sms-data.start"));

        fullMembers = (MemberGroup) session.createCriteria(MemberGroup.class)
                .add(Restrictions.eq("name", bundle.getString("group.full-members.name"))).uniqueResult();
        inactiveMembers = (MemberGroup) session.createCriteria(MemberGroup.class)
                .add(Restrictions.eq("name", bundle.getString("group.inactive-members.name"))).uniqueResult();
        fullBrokers = (BrokerGroup) session.createCriteria(BrokerGroup.class)
                .add(Restrictions.eq("name", bundle.getString("group.full-brokers.name"))).uniqueResult();

        enabledMemberGroups = Arrays.asList(fullMembers, fullBrokers);

        mobileCustomField = (MemberCustomField) session.createCriteria(MemberCustomField.class)
                .add(Restrictions.eq("internalName", "mobilePhone")).uniqueResult();

        memberAccType = (MemberAccountType) session.createCriteria(MemberAccountType.class)
                .add(Restrictions.eq("name", bundle.getString("account.member.name"))).uniqueResult();
        organizationAccType = (SystemAccountType) session.createCriteria(SystemAccountType.class)
                .add(Restrictions.eq("name", bundle.getString("account.organization.name"))).uniqueResult();

        createChannel();
        createTransfers();
        createServiceClient();
        createLocalSettings();
        creatInfoText();
        updateMemberGroup();
        updatePaymentFilter();
        customizeFullMembersGroup();
        customizeInactiveMembersGroup();

        session.flush();
        Setup.out.println(bundle.getString("sms-data.end"));
    }

    private void createChannel() {
        List<ChannelPrincipal> principals = new ArrayList<ChannelPrincipal>();

        smsChannel = new Channel();
        smsChannel.setDisplayName("SMS");
        smsChannel.setInternalName("sms");
        smsChannel.setCredentials(Credentials.PIN);
        smsChannel.setPaymentRequestWebServiceUrl("http://localhost:8080/sms/services/paymentRequest");
        smsChannel.setPrincipals(principals);

        final ChannelPrincipal userPrincipal = new ChannelPrincipal();
        userPrincipal.setChannel(smsChannel);
        userPrincipal.setPrincipal(Principal.USER);
        userPrincipal.setDefault(true);
        principals.add(userPrincipal);

        final ChannelPrincipal mobilePrincipal = new ChannelPrincipal();
        mobilePrincipal.setChannel(smsChannel);
        mobilePrincipal.setPrincipal(Principal.CUSTOM_FIELD);
        mobilePrincipal.setCustomField(mobileCustomField);
        principals.add(mobilePrincipal);

        session.save(smsChannel);
        session.save(userPrincipal);
        session.save(mobilePrincipal);
    }

    private void createLocalSettings() {
        CreateBasicData.createSetting(session, Setting.Type.LOCAL, "cyclosId", "cyclos");
        CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsEnabled", "true");
        CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsCustomFieldId",
                mobileCustomField.getId().toString());
        CreateBasicData.createSetting(session, Setting.Type.LOCAL, "smsChannelName", smsChannel.getInternalName());
        CreateBasicData.createSetting(session, Setting.Type.LOCAL, "sendSmsWebServiceUrl",
                "http://localhost:8080/sms/services/smsSender");
    }

    private void createServiceClient() {
        ServiceClient client = new ServiceClient();
        client.setName(bundle.getString("service-client.controller.name"));
        client.setHostname("127.0.0.1");
        client.setAddressBegin("127.000.000.001");
        client.setAddressEnd("127.000.000.001");
        client.setChannel(smsChannel);
        client.setCredentialsRequired(true);
        client.setIgnoreRegistrationValidations(true);

        client.setDoPaymentTypes(Collections.singleton(smsTradeTT));
        client.setChargebackPaymentTypes(Collections.singleton(smsTradeTT));
        client.setManageGroups(new HashSet<MemberGroup>(enabledMemberGroups));

        Set<ServiceOperation> permissions = new HashSet<ServiceOperation>();
        permissions.add(ServiceOperation.DO_PAYMENT);
        permissions.add(ServiceOperation.CHARGEBACK);
        permissions.add(ServiceOperation.MEMBERS);
        permissions.add(ServiceOperation.MANAGE_MEMBERS);
        permissions.add(ServiceOperation.ACCOUNT_DETAILS);
        permissions.add(ServiceOperation.ACCESS);
        permissions.add(ServiceOperation.SMS);
        permissions.add(ServiceOperation.INFO_TEXTS);

        client.setPermissions(permissions);

        session.save(client);
    }

    private void createTransfers() {
        // Add the sms trade transfer
        smsTradeTT = new TransferType();
        smsTradeTT.setName(bundle.getString("transfer-type.sms-trade.name"));
        smsTradeTT.setDescription(bundle.getString("transfer-type.sms-trade.description"));
        smsTradeTT.setFrom(memberAccType);
        smsTradeTT.setTo(memberAccType);
        smsTradeTT.getContext().setPayment(true);
        smsTradeTT.setChannels(Collections.singleton(smsChannel));
        // smsTradeTT.setMaxAmountPerDay(new BigDecimal(500));
        smsTradeTT.setAllowSmsNotification(true);
        smsTradeTT.setGroups(new HashSet<Group>(enabledMemberGroups));

        session.save(smsTradeTT);

        // Add the sms charging transfer
        smsChargeTT = new TransferType();
        smsChargeTT.setName(bundle.getString("transfer-type.sms-charge.name"));
        smsChargeTT.setDescription(bundle.getString("transfer-type.sms-charge.description"));
        smsChargeTT.setFrom(memberAccType);
        smsChargeTT.setTo(organizationAccType);

        session.save(smsChargeTT);

    }

    private void creatInfoText() {
        InfoText info = new InfoText();
        info.setAliases(Collections.singleton("info"));
        info.setBody(bundle.getString("info-text.sample.body"));
        info.setSubject(bundle.getString("info-text.sample.subject"));
        info.setEnabled(true);

        session.save(info);
    }

    private void customizeFullMembersGroup() {
        fullMembers.setInitialGroup(true);
        fullMembers.getPermissions().add(MemberPermission.SMS_VIEW);
    }

    private void customizeInactiveMembersGroup() {
        inactiveMembers.setInitialGroup(false);
    }

    private void updateMemberGroup() {
        for (MemberGroup mGrp : enabledMemberGroups) {

            CreateBasicData.associateGroupToChannel(smsChannel, mGrp);

            // Default messages sent by SMS
            Collection<Message.Type> smsMessages = mGrp.getDefaultSmsMessages();
            if (smsMessages == null) {
                smsMessages = new ArrayList<Message.Type>();
                mGrp.setDefaultSmsMessages(smsMessages);
            }
            smsMessages.add(Message.Type.PAYMENT);

            // SMS allowed messages
            final List<Type> smsMessageTypes = new ArrayList<Type>(Arrays.asList(Message.Type.values()));
            CollectionUtils.filter(smsMessageTypes, new Predicate() {
                @Override
                public boolean evaluate(final Object object) {
                    final Message.Type type = (Message.Type) object;
                    switch (type) {
                    case FROM_MEMBER:
                    case FROM_ADMIN_TO_MEMBER:
                    case FROM_ADMIN_TO_GROUP:
                        return false;
                    default:
                        return true;
                    }
                }
            });
            mGrp.setSmsMessages(smsMessageTypes);
            mGrp.setDefaultAllowChargingSms(true);
            mGrp.setDefaultAcceptFreeMailing(true);
            mGrp.setDefaultAcceptPaidMailing(true);

            MemberGroupSettings mSettings = mGrp.getMemberSettings();
            mSettings.setSmsChargeTransferType(smsChargeTT);
            mSettings.setSmsChargeAmount(new BigDecimal(1));

            // Add the sms trade transfer to the member-to-member permission collection
            mGrp.getTransferTypes().add(smsTradeTT);
            session.save(mGrp);
        }
    }

    private void updatePaymentFilter() {
        PaymentFilter filter = (PaymentFilter) session.createCriteria(PaymentFilter.class)
                .add(Restrictions.eq("name", bundle.getString("payment-filter.member-payments")))
                .add(Restrictions.eq("accountType", memberAccType)).uniqueResult();
        filter.getTransferTypes().add(smsTradeTT);

        filter = (PaymentFilter) session.createCriteria(PaymentFilter.class)
                .add(Restrictions.eq("name", bundle.getString("payment-filter.member-payments")))
                .add(Restrictions.eq("accountType", organizationAccType)).uniqueResult();
        filter.getTransferTypes().add(smsChargeTT);

        session.save(filter);
    }
}