net.dstc.mkts.data.jcr.JcrSurveyDAO.java Source code

Java tutorial

Introduction

Here is the source code for net.dstc.mkts.data.jcr.JcrSurveyDAO.java

Source

/* 
 * Copyright 2016 eul0860.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.dstc.mkts.data.jcr;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.inject.Singleton;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import net.dstc.mkts.data.SurveyStatus;
import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.ocm.manager.ObjectContentManager;
import org.apache.jackrabbit.ocm.manager.impl.ObjectContentManagerImpl;
import org.apache.jackrabbit.ocm.mapper.Mapper;
import org.apache.jackrabbit.ocm.mapper.impl.annotation.AnnotationMapperImpl;
import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node;
import org.apache.jackrabbit.ocm.query.Filter;
import org.apache.jackrabbit.ocm.query.Query;
import org.apache.jackrabbit.ocm.query.QueryManager;
import net.dstc.mkts.data.SurveyDO;
import net.dstc.mkts.data.SurveyTargetDO;
import net.dstc.mkts.data.SurveyDAO;
import org.jvnet.hk2.annotations.Service;

/**
 *
 * @author Patrizio Bruno <desertconsulting@gmail.com>
 */
@Resource
@Node
@Singleton
@Service
public class JcrSurveyDAO implements SurveyDAO, org.glassfish.hk2.api.PreDestroy {

    private ObjectContentManager ocm = null;

    public JcrSurveyDAO() {
        if (ocm == null) {
            try {
                RepositoryConfig config = RepositoryConfig.create(
                        SurveyDAO.class.getClassLoader().getResourceAsStream("repository.xml"), "/tmp/mktsurvey");
                Repository rep = RepositoryImpl.create(config);
                Session session = rep.login(new SimpleCredentials("admin", "admin".toCharArray()));

                List<Class> classes = new ArrayList<>(1);
                classes.add(SurveyTargetDO.class);
                classes.add(JcrSurveyTargetDO.class);
                classes.add(JcrSurveyDO.class);
                classes.add(JcrSurveyDAO.class);
                Mapper mapper = new AnnotationMapperImpl(classes);

                session.getRootNode().addNode("survey");
                session.save();

                ocm = new ObjectContentManagerImpl(session, mapper);
            } catch (RepositoryException ex) {
                Logger.getLogger(JcrSurveyDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    @Override
    @PreDestroy
    public void preDestroy() {
        shutdown();
    }

    @Override
    public void shutdown() {
        if (ocm != null) {
            try {
                ocm.logout();
                ocm = null;
            } catch (Exception ex) {
            }
        }
    }

    private Query createSearchQuery(SurveyDO query) {
        QueryManager qm = ocm.getQueryManager();

        Filter filter = qm.createFilter(JcrSurveyDO.class);
        filter.setScope("/survey//");

        if (query != null) {
            //            String id = query.getId();
            //            if (!StringUtils.isEmpty(id)) {
            //                filter.addEqualTo("id", id);
            //            }

            Date startDate = query.getStartDate();
            if (startDate != null) {
                filter.addEqualTo("startDate", startDate);
            }

            SurveyStatus status = query.getStatus();
            if (status != null) {
                filter.addEqualTo("status", status);
            }

            String title = query.getTitle();
            if (!StringUtils.isEmpty(title)) {
                filter.addEqualTo("title", title);
            }

            SurveyTargetDO target = query.getTarget();
            if (target != null) {
                String targetExpression = createTargetFilter(target).toString();
                if (!StringUtils.isEmpty(targetExpression)) {
                    filter.addJCRExpression(targetExpression.replaceAll("@([a-z]+)", ".//target/@$1"));
                }
            }
        }

        Query searchQuery = qm.createQuery(filter);

        return searchQuery;
    }

    private Filter createTargetFilter(SurveyTargetDO query) {
        QueryManager qm = ocm.getQueryManager();
        Filter filter = qm.createFilter(JcrSurveyTargetDO.class);

        String country = query.getCountry();
        if (!StringUtils.isEmpty(country)) {
            filter.addEqualTo("country", country);
        }

        String gender = query.getGender();
        if (!StringUtils.isEmpty(gender)) {
            filter.addEqualTo("gender", gender);
        }

        int maxAge = query.getMaxAge();
        if (maxAge != 0) {
            filter.addLessOrEqualThan("maxAge", maxAge);
            filter.addLessThan("minAge", maxAge);
        }

        int minAge = query.getMinAge();
        if (minAge != 0) {
            filter.addGreaterOrEqualThan("minAge", minAge);
            filter.addGreaterThan("maxAge", minAge);
        }

        int maxIncome = query.getMaxIncome();
        if (maxIncome != 0) {
            filter.addLessOrEqualThan("maxIncome", maxIncome);
            filter.addLessThan("minIncome", maxIncome);
        }

        int minIncome = query.getMinIncome();
        if (minIncome != 0) {
            filter.addGreaterOrEqualThan("minIncome", minIncome);
            filter.addGreaterThan("maxIncome", minIncome);
        }

        return filter;
    }

    @Override
    public void add(SurveyDO survey) {
        survey.setId(getId(survey.getId()));
        ocm.insert(survey);
        ocm.save();
    }

    @Override
    public Collection<SurveyDO> list(SurveyDO query) {
        Query searchQuery = createSearchQuery(query);
        return ocm.getObjects(searchQuery);
    }

    @Override
    public SurveyDO get(String id) {
        return (SurveyDO) ocm.getObject(JcrSurveyDO.class, getId(id));
    }

    @Override
    public void delete(String id) {
        ocm.remove(getId(id));
        ocm.save();
    }

    @Override
    public void update(SurveyDO s) {
        ocm.update(s);
        ocm.save();
    }

    @Override
    public SurveyDO createSurvey() {
        return new JcrSurveyDO();
    }

    @Override
    public SurveyTargetDO createSurveyTarget() {
        return new JcrSurveyTargetDO();
    }

    private String getId(String id) {
        if (StringUtils.indexOf(id, "/survey/") != 0) {
            return "/survey/" + id;
        }
        return id;
    }
}