/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.vulcan.sample.rest.internal.vulcan.representor;
import com.liferay.blogs.kernel.model.BlogsEntry;
import com.liferay.portal.kernel.exception.NoSuchUserException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.service.UserService;
import com.liferay.portal.kernel.util.DateUtil;
import com.liferay.vulcan.representor.ModelRepresentorMapper;
import com.liferay.vulcan.representor.builder.RepresentorBuilder;
import java.text.DateFormat;
import java.util.Date;
import java.util.Optional;
import java.util.function.Function;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.ServerErrorException;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Alejandro Hernández
* @author Carlos Sierra Andrés
* @author Jorge Ferrer
*/
@Component(
immediate = true,
service = {
BlogPostingModelRepresentorMapper.class, ModelRepresentorMapper.class
}
)
public class BlogPostingModelRepresentorMapper
implements ModelRepresentorMapper<BlogsEntry> {
@Override
public void buildRepresentor(
RepresentorBuilder<BlogsEntry> representorBuilder) {
RepresentorBuilder.FirstStep<BlogsEntry> firstStep =
representorBuilder.getFirstStep(
blogsEntry -> String.valueOf(blogsEntry.getEntryId()));
firstStep.addEmbeddedModel(
"creator", User.class, this::_getUserOptional);
firstStep.addField("alternativeHeadline", BlogsEntry::getSubtitle);
firstStep.addField("articleBody", BlogsEntry::getContent);
Function<Date, Object> formatFunction = date -> {
if (date == null) {
return null;
}
DateFormat dateFormat = DateUtil.getISO8601Format();
return dateFormat.format(date);
};
firstStep.addField(
"createDate",
blogsEntry -> formatFunction.apply(blogsEntry.getCreateDate()));
firstStep.addField("fileFormat", blogsEntry -> "text/html");
firstStep.addField("headline", BlogsEntry::getTitle);
firstStep.addField(
"modifiedDate",
blogsEntry -> formatFunction.apply(blogsEntry.getModifiedDate()));
firstStep.addField(
"publishedDate",
blogsEntry -> formatFunction.apply(
blogsEntry.getLastPublishDate()));
firstStep.addLinkedModel("author", User.class, this::_getUserOptional);
firstStep.addLink(
"license", "https://creativecommons.org/licenses/by/4.0");
firstStep.addType("BlogPosting");
}
private Optional<User> _getUserOptional(BlogsEntry blogsEntry) {
try {
return Optional.ofNullable(
_userService.getUserById(blogsEntry.getUserId()));
}
catch (NoSuchUserException | PrincipalException e) {
throw new NotFoundException();
}
catch (PortalException pe) {
throw new ServerErrorException(500, pe);
}
}
@Reference
private UserService _userService;
}