Package org.encuestame.mvc.controller

Source Code of org.encuestame.mvc.controller.AbstractBaseOperations

/*
************************************************************************************
* Copyright (C) 2001-2011 encuestame: system online surveys Copyright (C) 2011
* encuestame Development Team.
* Licensed under the Apache Software License version 2.0
* 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 org.encuestame.mvc.controller;

import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Locale.Builder;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import junit.framework.Assert;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.log4j.Logger;
import org.encuestame.business.service.AbstractSurveyService;
import org.encuestame.business.service.DashboardService;
import org.encuestame.business.service.ProjectService;
import org.encuestame.business.service.ServiceManager;
import org.encuestame.business.service.TweetPollService;
import org.encuestame.core.config.EnMePlaceHolderConfigurer;
import org.encuestame.core.security.util.HTMLInputFilter;
import org.encuestame.core.security.util.WidgetUtil;
import org.encuestame.core.service.AbstractSecurityContext;
import org.encuestame.core.service.MessageSourceFactoryBean;
import org.encuestame.core.service.SecurityService;
import org.encuestame.core.service.imp.GeoLocationSupport;
import org.encuestame.core.service.imp.ICommentService;
import org.encuestame.core.service.imp.IDashboardService;
import org.encuestame.core.service.imp.IFrontEndService;
import org.encuestame.core.service.imp.IPictureService;
import org.encuestame.core.service.imp.IPollService;
import org.encuestame.core.service.imp.IProjectService;
import org.encuestame.core.service.imp.IServiceManager;
import org.encuestame.core.service.imp.IStatisticsService;
import org.encuestame.core.service.imp.ISurveyService;
import org.encuestame.core.service.imp.ITweetPollService;
import org.encuestame.core.service.imp.SearchServiceOperations;
import org.encuestame.core.service.imp.SecurityOperations;
import org.encuestame.core.service.imp.StreamOperations;
import org.encuestame.core.util.ConvertDomainBean;
import org.encuestame.core.util.EnMeUtils;
import org.encuestame.persistence.domain.question.Question;
import org.encuestame.persistence.domain.security.UserAccount;
import org.encuestame.persistence.domain.tweetpoll.TweetPoll;
import org.encuestame.persistence.exception.EnMeExpcetion;
import org.encuestame.persistence.exception.EnMeNoResultsFoundException;
import org.encuestame.utils.DateUtil;
import org.encuestame.utils.captcha.ReCaptcha;
import org.encuestame.utils.enums.RelativeTimeEnum;
import org.encuestame.utils.json.ProfileUserAccount;
import org.encuestame.utils.json.QuestionBean;
import org.encuestame.utils.json.TweetPollBean;
import org.encuestame.utils.web.HashTagBean;
import org.encuestame.utils.web.QuestionAnswerBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils;

/**
* Base Controller.
* @author Picado, Juan juanATencuestame.org
* @since Mar 13, 2010 10:41:38 PM
*/
public abstract class AbstractBaseOperations extends AbstractSecurityContext{

     /**
      *
      */
     private Logger log = Logger.getLogger(this.getClass());

     /**
      * Simple date format.
      */
     public static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(DateUtil.DEFAULT_FORMAT_DATE);

     /**
      * Simple time format.
      */
     public static final SimpleDateFormat SIMPLE_TIME_FORMAT = new SimpleDateFormat(DateUtil.DEFAULT_FORMAT_TIME);

     /**
      *
      */
     protected static final Integer START_DEFAULT = 0;

     /**
      * Max total results to retrieve.
      */
     protected static final Integer MAX_RESULTS = 100;

     /**
      * {@link ReCaptcha}.
      */
     private ReCaptcha reCaptcha;

     /**
      *
      */
     @Resource
     private LocaleResolver localeResolver;

    /**
     * {@link ServiceManager}.
     */
    @Autowired
    private IServiceManager serviceManager;


    private MessageSourceFactoryBean messageSourceFactoryBean;


    /**
     * @return the messageSourceFactoryBean
     */
    public MessageSourceFactoryBean getMessageSourceFactoryBean() {
        return messageSourceFactoryBean;
    }

    /**
     * @param messageSourceFactoryBean the messageSourceFactoryBean to set
     */
    @Autowired
    public void setMessageSourceFactoryBean(
            MessageSourceFactoryBean messageSourceFactoryBean) {
        this.messageSourceFactoryBean = messageSourceFactoryBean;
    }

    /** Force Proxy Pass Enabled. **/
    @Value("${application.proxyPass}") private Boolean proxyPass;

    /**
     * {@link AuthenticationManager}.
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * @return the serviceManager
     */
    public IServiceManager getServiceManager() {
        return serviceManager;
    }

    /**
     * Get Current Request Attributes.
     * @return {@link RequestAttributes}
     */
    public RequestAttributes getContexHolder(){
         return RequestContextHolder.currentRequestAttributes();
    }

    /**
     * Get {@link ServletRequestAttributes}.
     * @return {@link ServletRequestAttributes}
     */
    public HttpServletRequest getServletRequestAttributes(){
        return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    }

    /**
     * Get By Username.
     * @param username username
     * @return
     * @throws EnMeNoResultsFoundException
     */
    public UserAccount getByUsername(final String username) throws EnMeNoResultsFoundException{
        return getServiceManager().getApplicationServices().getSecurityService().getUserAccount(username);
    }

    /**
     * Get by username without Exceptions.
     * @param username user name
     * @return {@link UserAccount}.
     */
    public UserAccount findByUsername(final String username){
        return getServiceManager().getApplicationServices().getSecurityService().findUserByUserName(username);
    }

    /**
     * Fetch user account currently logged.
     * @return
     * @throws EnMeNoResultsFoundException
     */
    public UserAccount getUserAccount() throws EnMeNoResultsFoundException{
        final UserAccount account = this.getByUsername(this.getUserPrincipalUsername());
        if (account == null) {
            log.fatal("user session not found ");
            throw new EnMeNoResultsFoundException("user not found");
        }
        return account;
    }

    /**
     * Create new tweetPoll.
     * @param question
     * @param hashtags
     * @param answers
     * @param user
     * @return
     * @throws EnMeExpcetion
     */
    //@Deprecated
    public TweetPoll createTweetPoll(
            final String question,
            String[] hashtags,
            UserAccount user) throws EnMeExpcetion{
        //create new tweetPoll
        final TweetPollBean tweetPollBean = new TweetPollBean();
        tweetPollBean.getHashTags().addAll(fillListOfHashTagsBean(hashtags));
        // save create tweet poll
        tweetPollBean.setUserId(user.getAccount().getUid());
        tweetPollBean.setCloseNotification(Boolean.FALSE);
        tweetPollBean.setResultNotification(Boolean.FALSE);
        //tweetPollBean.setPublishPoll(Boolean.TRUE); // always TRUE
        tweetPollBean.setSchedule(Boolean.FALSE);
        return getTweetPollService().createTweetPoll(tweetPollBean, question, user, null);
    }

    /**
     * Create {@link HashTagBean} list.
     * @param arrayHashTags
     * @return
     */
    public List<HashTagBean> createHashTagBeansList(final String[] arrayHashTags) {
        return EnMeUtils.createHashTagBeansList(arrayHashTags);
    }

    /**
     *
     * @param tweetPollBean
     * @return
     * @throws EnMeExpcetion
     */
    public TweetPoll createTweetPoll(final TweetPollBean tweetPollBean) throws EnMeExpcetion{
        //create new tweetPoll
        log.debug("createTweetPoll Bean "+tweetPollBean.toString());
        return getTweetPollService().createTweetPoll(tweetPollBean,
                tweetPollBean.getQuestionBean().getQuestionName(),
                getUserAccount(), null);
    }

    /**
     *
     * @param tweetPollBean
     * @return
     * @throws EnMeExpcetion
     */
    public TweetPoll updateTweetPoll(
            final TweetPollBean tweetPollBean) throws EnMeExpcetion{
            //final List<HashTagBean> hashtagsList = fillListOfHashTagsBean(hashtags);
            return getTweetPollService().updateTweetPoll(tweetPollBean);
       }

    /**
     * Get the Host IP Address.
     * @param
     * @return ip as string format.
     * @throws UnknownHostException
     */
    public String getIpClient(final HttpServletRequest request) throws UnknownHostException {
        return EnMeUtils.getIP(request, this.proxyPass);
    }

    /**
     *
     * @param max
     * @return
     */
    public Integer limitTotalMax(Integer max) {
        return max == null ? null : (max > this.MAX_RESULTS ? this.MAX_RESULTS : max);
    }

    /**
     * Relative Time.
     * @param date
     * @return
     */
    @Deprecated
    protected  HashMap<Integer, RelativeTimeEnum> getRelativeTime(final Date date){
         return DateUtil.getRelativeTime(date);
    }


    /**
     *
     * @param tpbean
     * @param request
     */
    @Deprecated
    public void convertRelativeTime(final TweetPollBean tpbean, final HttpServletRequest request){
        final HashMap<Integer, RelativeTimeEnum> relativeTime = getRelativeTime(tpbean.getCreatedDateAt());
        final Iterator it = relativeTime.entrySet().iterator();
        while (it.hasNext()) {
            final Map.Entry<Integer, RelativeTimeEnum> e = (Map.Entry<Integer, RelativeTimeEnum>)it.next();
            log.debug("--"+e.getKey() + "**" + e.getValue());
            tpbean.setRelativeTime(convertRelativeTimeMessage(e.getValue(), e.getKey(), request));
        }
    }

   /**
    * Convert Relative Time Message.
    * @param relativeTimeEnum
    * @param number
    * @param request
    * @param objects
    * @return
    */
    @Deprecated
   public String convertRelativeTimeMessage(final RelativeTimeEnum relativeTimeEnum, final Integer number,
           final HttpServletRequest request){
       final StringBuilder builder = new StringBuilder();
       //builder.append(number);
       //builder.append(" ");
       log.debug("Convert Message Relative Time");
       log.debug(relativeTimeEnum);
       log.debug(number);
       String str[] = {number.toString()};
       if (relativeTimeEnum.equals(RelativeTimeEnum.ONE_SECOND_AGO)) {
           builder.append(getMessage("relative.time.one.second.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.SECONDS_AGO)) {
           builder.append(getMessage("relative.time.one.seconds.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.A_MINUTE_AGO)) {
           builder.append(getMessage("relative.time.one.minute.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.MINUTES_AGO)) {
           builder.append(getMessage("relative.time.one.minutes.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.AN_HOUR_AGO)) {
           builder.append(getMessage("relative.time.one.hour.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.HOURS_AGO)) {
           builder.append(getMessage("relative.time.one.hours.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.MONTHS_AGO)) {
           builder.append(getMessage("relative.time.one.months.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.ONE_MONTH_AGO)) {
           builder.append(getMessage("relative.time.one.month.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.ONE_YEAR_AGO)) {
           builder.append(getMessage("relative.time.one.year.ago", request, str));
       } else if(relativeTimeEnum.equals(RelativeTimeEnum.YEARS_AGO)) {
           builder.append(getMessage("relative.time.one.years.ago", request, str));
       }
       return builder.toString();
   }



    /**
     * Get Message with Locale.
     * @param message
     * @param request
     * @param args
     * @return
     */
    public String getMessage(final String message,
            final HttpServletRequest request,
            final Object[] args) {
        String stringValue = "";
        try {
            stringValue = this.getMessageSourceFactoryBean().getMessageSource().getMessage(message, args, getLocale(request));
        } catch (Exception e) {
            log.error(e);
        }
        return stringValue;
    }

    /**
     * Get Message.
     * @param message
     * @param args
     * @return
     */
    //@Deprecated
    public String getMessage(final String message, Object[] args){
        return getMessage(message, null, args);
    }

    /**
     * Get Message.
     * @param message
     * @return
     */
    //@Deprecated
    public String getMessage(final String message){
        return getMessage(message, null, null);
    }

    /**
     * Get Locale.
     * @param request
     * @return
     */
    private Locale getLocale(final HttpServletRequest request) {
        if (request == null) {
            return Locale.ENGLISH;
        } else {
            return RequestContextUtils.getLocale(request);
        }
    }

    /**
     * Filter Value.
     * @param value value.
     * @return
     */
    public String filterValue(String value){
        final HTMLInputFilter vFilter = new HTMLInputFilter(true);
        return vFilter.filter(value);
    }

    /**
     * @param serviceManager
     *            the serviceManager to set
     */
    public void setServiceManager(IServiceManager serviceManager) {
        this.serviceManager = serviceManager;
    }

    /**
     * Get {@link AbstractSurveyService}.
     * @return survey service
     */
    public ISurveyService getSurveyService(){
        return getServiceManager().getApplicationServices().getSurveyService();
    }

    /**
     * Get {@link DashboardService}
     * @return
     */
    public IDashboardService getDashboardService(){
        return getServiceManager().getApplicationServices().getDashboardService();
    }

    /**
     *
     * @return
     */
    public ICommentService getCommentService(){
        return getServiceManager().getApplicationServices().getCommentService();
    }

    /**
     *
     * @return
     */
    public StreamOperations getStreamOperations(){
        return getServiceManager().getApplicationServices().getStreamOperations();
    }

    /**
     * Get {@link SecurityService}.
     * @return
     */
    public SecurityOperations getSecurityService(){
        return getServiceManager().getApplicationServices().getSecurityService();
    }

    /**
     * Get {@link SearchServiceOperations}.
     * @return
     */
    public SearchServiceOperations getSearchService(){
        return getServiceManager().getApplicationServices().getSearchService();
    }

    /**
     * Location Service.
     * @return
     */
    public GeoLocationSupport getLocationService(){
        return getServiceManager().getApplicationServices().getLocationService();
    }

    /**
     * Get {@link TweetPollService}.
     * @return
     */
    public ITweetPollService getTweetPollService(){
        return getServiceManager().getApplicationServices().getTweetPollService();
    }

    public IPollService getPollService(){
        return getServiceManager().getApplicationServices().getPollService();
    }

    /**
     * Get {@link ProjectService}.
     * @return
     */
    public IProjectService getProjectService(){
        return getServiceManager().getApplicationServices().getProjectService();
    }

    /**
     * Get {@link FrontEndCoreService}.
     * @return
     */
    public IFrontEndService getFrontService(){
        return getServiceManager().getApplicationServices().getFrontEndService();
    }

    /**
     *
     * @return
     */
    public IStatisticsService getStatisticsService(){
        return getServiceManager().getApplicationServices().getStatisticService();
    }

    /**
     * Get Picture Service.
     * @return
     */
    public IPictureService getPictureService(){
        return getServiceManager().getApplicationServices().getPictureService();
    }

    /**
     * @return the authenticationManager
     */
    public AuthenticationManager getAuthenticationManager() {
        return authenticationManager;
    }

    /**
     * @param authenticationManager the authenticationManager to set
     */
    public void setAuthenticationManager(final AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }


    /**
     * @return the reCaptcha
     */
    public ReCaptcha getReCaptcha() {
        return reCaptcha;
    }

    /**
     * @param reCaptcha
     *            the reCaptcha to set
     */
    @Autowired
    public void setReCaptcha(final ReCaptcha reCaptcha) {
        this.reCaptcha = reCaptcha;
    }

    /**
     * Get Format Date.
     * @param date
     * @return
     */
    public Date getFormatDate(final String date){
        Assert.assertNotNull(date);
        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DateUtil.DEFAULT_FORMAT_DATE);
        simpleDateFormat.format(DateUtil.DEFAULT_FORMAT_DATE);
        return simpleDateFormat.getCalendar().getTime();
    }

    /**
     * Get full profile logged user info.
     * @return
     * @throws EnMeNoResultsFoundException
     */
    public ProfileUserAccount getProfileUserInfo() throws EnMeNoResultsFoundException{
        return ConvertDomainBean.convertUserAccountToUserProfileBean(getUserAccount());
    }

    /**
     * Create question with answers.
     * @param questionName question description
     * @param user {@link UserAccount} owner.
     * @return {@link Question}
     * @throws EnMeExpcetion exception
     */
    public Question createQuestion(final String questionName, final String[] answers, final UserAccount user) throws EnMeExpcetion{
        final QuestionBean questionBean = new QuestionBean();
        questionBean.setQuestionName(questionName);
        questionBean.setUserId(user.getUid());
        // setting Answers.
        for (int row = 0; row < answers.length; row++) {
            final QuestionAnswerBean answer = new QuestionAnswerBean();
            answer.setAnswers(answers[row].trim());
            answer.setAnswerHash(RandomStringUtils.randomAscii(5));
            questionBean.getListAnswers().add(answer);
        }
        final Question questionDomain = getSurveyService().createQuestion(
                questionBean);
        return questionDomain;
    }

    /**
     * Create a list of {@link HashTagBean}.
     * @param hashtags array of hashtags strings.
     * @return list of {@link HashTagBean}.
     */
    public List<HashTagBean> fillListOfHashTagsBean(String[] hashtags) {
        final List<HashTagBean> hashtagsList = new ArrayList<HashTagBean>();
        hashtags = hashtags == null ? new String[0] : hashtags;
        log.debug("HashTag size:{" + hashtags.length);
        for (int row = 0; row < hashtags.length; row++) {
            final HashTagBean hashTag = new HashTagBean();
            final String hashtagE = hashtags[row];
            if (hashtagE != null && !hashtagE.isEmpty()) {
                log.debug("HashTag:{" + hashTag);
                hashTag.setHashTagName(hashtags[row].toLowerCase().trim());
                hashtagsList.add(hashTag);
            } else {
                log.warn("Trying to save empty or null hashtag?");
            }
        }
        log.debug("hashtag fillListOfHashTagsBean->"+hashtagsList.size());
        return hashtagsList;
    }

    /**
     *
     * @param model
     * @param key
     * @param request
     */
    public void addi18nProperty(
            ModelMap model,
            final String key,
            final HttpServletRequest request,
            final HttpServletResponse response) {
        log.debug("--- after addi18nProperty -->" + request.getLocale().toLanguageTag());
        try {
            getLocaleResolver().setLocale(request, response, getUserAccountLocale(getByUsername(getUserPrincipalUsername())));
        } catch (EnMeNoResultsFoundException e) {
            //   FIXME: just ignore the locale, for now.
        }
        log.debug("--- before addi18nProperty -->" + request.getLocale().toLanguageTag());
        @SuppressWarnings("unchecked")
        HashMap<String, String> i18n = (HashMap<String, String>) model.get("i18n");
        if (i18n == null) {
            i18n = new HashMap<String, String>();
            model.addAttribute("i18n", i18n);
        }
        i18n.put(key, getMessage(key, request, null));
    }

   /**
    * If is not complete check and validate current status.
    * @param tweetPoll
    */
   public void checkTweetPollStatus(final TweetPoll tweetPoll){
       if (!tweetPoll.getCompleted()) {
           getTweetPollService().checkTweetPollCompleteStatus(tweetPoll);
       }
   }

   /**
    *
    * @return
    */
   public Boolean isSocialSignInUpEnabled(){
       return EnMePlaceHolderConfigurer.getBooleanProperty("application.social.signin.enabled");
   }

   /**
    * Add to model the social picker messages.
    * @param model
    */
   public void addSocialPickerWidgetMessages(ModelMap model, HttpServletRequest request, HttpServletResponse response) {
       addi18nProperty(model, "social_picker_only_selected", request, response);
       addi18nProperty(model, "social_picker_select_all", request, response);
       addi18nProperty(model, "social_picker_unselect_all", request, response);
       addi18nProperty(model, "social_picker_accounts_selected", request, response);
       addi18nProperty(model, "social_picker_filter_selected", request, response);
       addi18nProperty(model, "e_022", request, response);
   }

   /**
    *
    * @param model
* @param response
    */
   public void addItemsManangeMessages(ModelMap model, final HttpServletRequest request, HttpServletResponse response) {

       addi18nProperty(model, "detail_manage_by_account", request, response);
       addi18nProperty(model, "detail_manage_today",request, response);
       addi18nProperty(model, "detail_manage_last_week", request, response);
       addi18nProperty(model, "detail_manage_favorites", request, response);
       addi18nProperty(model, "detail_manage_scheduled", request, response);
       addi18nProperty(model, "detail_manage_all", request, response);
       addi18nProperty(model, "detail_manage_published", request, response);
       addi18nProperty(model, "detail_manage_unpublished", request, response);
       addi18nProperty(model, "detail_manage_only_completed", request, response);
       //folder messages
       addi18nProperty(model, "detail_manage_folder_title", request, response);
       addi18nProperty(model, "detail_manage_delete", request, response);
       addi18nProperty(model, "detail_manage_new", request, response);
       addi18nProperty(model, "detail_manage_search", request, response);
       addi18nProperty(model, "detail_manage_folder_replace_name", request, response);
       //filters
       addi18nProperty(model, "detail_manage_filters_advanced", request, response);
       addi18nProperty(model, "detail_manage_filters_order", request, response);
       addi18nProperty(model, "detail_manage_filters_social_network", request, response);
       addi18nProperty(model, "detail_manage_filters_votes_options", request, response);
       // advanced filter
       addi18nProperty(model, "detail_manage_filters_advanced_title", request, response);
       addi18nProperty(model, "detail_manage_filters_advanced_type_to_search", request, response);
       addi18nProperty(model, "detail_manage_filters_advanced_all_results", request, response);
       addi18nProperty(model, "detail_manage_filters_advanced_range_days", request, response);
       // commons
       addi18nProperty(model, "commons_filter", request, response);
       addi18nProperty(model, "commons_confirm", request, response);
       addi18nProperty(model, "commons_yes", request, response);
       addi18nProperty(model, "commons_no", request, response);
       addSocialPickerWidgetMessages(model, request, response);
   }

   /**
    *
    * @return
    */
   public Locale getUserAccountLocale(final UserAccount account) {
       //try {
               //final UserAccount account = getSecurityService().findUserByUserName(username);
               if (account != null) {
                   final String language = account.getLanguage();
                final Locale lang = WidgetUtil.toLocale(language);
                return lang;
               } else {
                   //throw new EnMeExpcetion("anonymous user does not have locale");
                   log.info(account + " user does not have locale");
                   return Locale.ENGLISH;
               }
        //} catch (EnMeExpcetion e) {
            //log.warn(e.getMessage());
            //return Locale.ENGLISH;
        //}
   }

    /**
     * @return the localeResolver
     */
    public LocaleResolver getLocaleResolver() {
        return localeResolver;
    }

}
TOP

Related Classes of org.encuestame.mvc.controller.AbstractBaseOperations

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.