/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.core.server.state;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.waveprotocol.wave.model.waveref.InvalidWaveRefException;
import org.waveprotocol.wave.util.escapers.jvm.JavaWaverefEncoder;
import cc.kune.common.shared.i18n.I18nTranslationService;
import cc.kune.common.shared.utils.TextUtils;
import cc.kune.core.client.errors.AccessViolationException;
import cc.kune.core.server.access.AccessRightsService;
import cc.kune.core.server.manager.GroupManager;
import cc.kune.core.server.manager.SocialNetworkManager;
import cc.kune.core.server.manager.TagUserContentManager;
import cc.kune.domain.Container;
import cc.kune.domain.Content;
import cc.kune.domain.Group;
import cc.kune.domain.License;
import cc.kune.domain.Revision;
import cc.kune.domain.User;
import cc.kune.events.server.utils.EventsServerConversionUtil;
import cc.kune.events.shared.EventsToolConstants;
import cc.kune.wave.server.kspecific.KuneWaveService;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.wave.api.Participants;
import com.google.wave.api.Wavelet;
// TODO: Auto-generated Javadoc
/**
* The Class StateServiceDefault.
*
* @author danigb@gmail.com
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
@Singleton
public class StateServiceDefault implements StateService {
/** The Constant LOG. */
public static final Log LOG = LogFactory.getLog(StateServiceDefault.class);
/** The group manager. */
private final GroupManager groupManager;
/** The i18n. */
private final I18nTranslationService i18n;
/** The kune wave service. */
private final KuneWaveService kuneWaveService;
/** The rendered waves. */
private final RenderedWavesCache renderedWaves;
/** The rights service. */
private final AccessRightsService rightsService;
/** The social network manager. */
private final SocialNetworkManager socialNetworkManager;
/** The tag manager. */
private final TagUserContentManager tagManager;
/**
* Instantiates a new state service default.
*
* @param groupManager
* the group manager
* @param socialNetworkManager
* the social network manager
* @param tagManager
* the tag manager
* @param rightsService
* the rights service
* @param i18n
* the i18n
* @param kuneWaveService
* the kune wave service
* @param renderedWaves
* the rendered waves
*/
@Inject
public StateServiceDefault(final GroupManager groupManager,
final SocialNetworkManager socialNetworkManager, final TagUserContentManager tagManager,
final AccessRightsService rightsService, final I18nTranslationService i18n,
final KuneWaveService kuneWaveService, final RenderedWavesCache renderedWaves) {
this.groupManager = groupManager;
this.socialNetworkManager = socialNetworkManager;
this.tagManager = tagManager;
this.rightsService = rightsService;
this.i18n = i18n;
this.kuneWaveService = kuneWaveService;
this.renderedWaves = renderedWaves;
}
/**
* Calculate root container.
*
* @param container
* the container
* @return the container
*/
private Container calculateRootContainer(final Container container) {
return container.isRoot() ? container : container.getAbsolutePath().get(0);
}
/*
* (non-Javadoc)
*
* @see cc.kune.core.server.state.StateService#create(cc.kune.domain.User,
* cc.kune.domain.Container)
*/
@Override
public StateContainer create(final User userLogged, final Container container) {
final boolean isCalendar = container.getTypeId().equals(EventsToolConstants.TYPE_ROOT);
final StateContainer state = isCalendar ? new StateEventContainer() : new StateContainer();
state.setTitle(container.getName());
state.setTypeId(container.getTypeId());
state.setLanguage(container.getLanguage());
state.setStateToken(container.getStateToken());
state.setLicense(container.getOwner().getDefaultLicense());
state.setAccessLists(container.getAccessLists());
final Group group = container.getOwner();
setCommon(state, userLogged, group, container);
if (isCalendar) {
((StateEventContainer) state).setAppointments(EventsServerConversionUtil.getAppointments(container));
}
return state;
}
/*
* (non-Javadoc)
*
* @see cc.kune.core.server.state.StateService#create(cc.kune.domain.User,
* cc.kune.domain.Content)
*/
@Override
public StateContent create(final User userLogged, final Content content) {
// We retrieve that content building a State
final StateContent state = new StateContent();
final String typeId = content.getTypeId();
state.setTypeId(typeId);
state.setMimeType(content.getMimeType());
state.setDocumentId(content.getId().toString());
state.setLanguage(content.getLanguage());
state.setPublishedOn(content.getPublishedOn());
state.setAuthors(content.getAuthors());
state.setTags(tagManager.getTagsAsString(userLogged, content));
state.setStatus(content.getStatus());
state.setStateToken(content.getStateToken());
final Revision revision = content.getLastRevision();
state.setVersion(content.getVersion());
final char[] text = revision.getBody();
final String textBody = text == null ? null : new String(text);
if (content.isWave()) {
final String waveRef = content.getWaveId();
state.setWaveRef(waveRef);
try {
// FIXME if we remove the authors this fails...
final Wavelet wavelet = kuneWaveService.fetchWave(
JavaWaverefEncoder.decodeWaveRefFromPath(waveRef),
content.getAuthors().get(0).getShortName());
// final String currentContent = wavelet.getRootBlip().getContent();
state.setContent(renderedWaves.getOrRender(wavelet));
// Well we "cache" the last modified time of waves in db (w'll find
// another way to do it better in the future with db persitence of
// waves)
// FIXME, how to do this
// contentManager.setModifiedOn(content, wavelet.getLastModifiedTime());
// contentManager.save(userLogged, content, currentContent);
state.setTitle(wavelet.getTitle());
state.setIsParticipant(userLogged != User.UNKNOWN_USER ? kuneWaveService.isParticipant(wavelet,
userLogged.getShortName()) : false);
// Wave participant list
final Participants waveParticipants = wavelet.getParticipants();
final List<String> participantList = new ArrayList<String>();
for (final String string : waveParticipants) {
participantList.add(string);
}
state.setWaveParticipants(participantList);
state.setWaveCreator(wavelet.getCreator());
} catch (final AccessViolationException e) {
throw e;
} catch (final Exception e) {
LOG.error("Error accessing wave " + waveRef, e);
String waveUrl = null;
try {
waveUrl = TextUtils.generateHtmlLink(
"#"
+ JavaWaverefEncoder.encodeToUriPathSegment(JavaWaverefEncoder.decodeWaveRefFromPath(waveRef)),
waveRef, false);
} catch (final InvalidWaveRefException invalidEx) {
}
state.setContent(i18n.t("Error accessing this document. "
+ "Please contact the administrators providing this reference ([%s]) "
+ "and any other relevant info.", (waveUrl == null ? waveRef : waveUrl)));
state.setTitle(revision.getTitle());
}
} else {
state.setContent(textBody);
state.setTitle(revision.getTitle());
}
final Container container = content.getContainer();
final License license = content.getLicense();
final Group group = container.getOwner();
state.setLicense(license == null ? group.getDefaultLicense() : license);
state.setContentRights(rightsService.get(userLogged, content.getAccessLists()));
state.setAccessLists(content.getAccessLists());
setCommon(state, userLogged, group, container);
// if (userLogged != User.UNKNOWN_USER) {
// state.setCurrentUserRate(contentManager.getRateContent(userLogged,
// content));
// }
// FIXME: user RateResult
// final Double rateAvg = contentManager.getRateAvg(content);
// state.setRate(rateAvg != null ? rateAvg : 0D);
// final Long rateByUsers = contentManager.getRateByUsers(content);
// state.setRateByUsers(rateByUsers != null ? rateByUsers.intValue() : 0);
return state;
}
/*
* (non-Javadoc)
*
* @see
* cc.kune.core.server.state.StateService#createNoHome(cc.kune.domain.User,
* java.lang.String)
*/
@Override
public StateNoContent createNoHome(final User userLogged, final String groupShortName) {
final Group group = groupManager.findByShortName(groupShortName);
assert (group.isPersonal());
final StateNoContent state = new StateNoContent();
state.setGroup(group);
state.setEnabledTools(groupManager.findEnabledTools(group.getId()));
setSocialNetwork(state, userLogged, group);
state.setStateToken(group.getStateToken());
state.setTitle("<h2>" + i18n.t("This user does not have a homepage") + "</h2>");
return state;
}
/**
* Sets the common.
*
* @param state
* the state
* @param userLogged
* the user logged
* @param group
* the group
* @param container
* the container
*/
private void setCommon(final StateContainer state, final User userLogged, final Group group,
final Container container) {
final Container root = calculateRootContainer(container);
state.setRootContainer(root);
state.setToolName(root.getToolName());
state.setGroup(group);
state.setContainer(container);
state.setContainerRights(rightsService.get(userLogged, container.getAccessLists()));
state.setEnabledTools(groupManager.findEnabledTools(group.getId()));
// state.setTagCloudResult(tagManager.getTagCloudResultByGroup(group));
setSocialNetwork(state, userLogged, group);
}
/**
* Sets the social network.
*
* @param state
* the state
* @param userLogged
* the user logged
* @param group
* the group
*/
private void setSocialNetwork(final StateAbstract state, final User userLogged, final Group group) {
state.setSocialNetworkData(socialNetworkManager.getSocialNetworkData(userLogged, group));
}
}