use of org.haiku.haikudepotserver.feed.model.FeedSpecification in project haikudepotserver by haiku.
the class CreatedUserRatingSyndEntrySupplier method generate.
@Override
public List<SyndEntry> generate(final FeedSpecification specification) {
Preconditions.checkNotNull(specification);
if (specification.getSupplierTypes().contains(FeedSpecification.SupplierType.CREATEDUSERRATING)) {
if (null != specification.getPkgNames() && specification.getPkgNames().isEmpty()) {
return Collections.emptyList();
}
ObjectSelect<UserRating> objectSelect = ObjectSelect.query(UserRating.class).where(UserRating.ACTIVE.isTrue()).and(UserRating.PKG_VERSION.dot(PkgVersion.ACTIVE).isTrue()).and(UserRating.PKG_VERSION.dot(PkgVersion.PKG).dot(Pkg.ACTIVE).isTrue()).statementFetchSize(specification.getLimit()).orderBy(UserRating.CREATE_TIMESTAMP.desc());
if (null != specification.getPkgNames()) {
objectSelect.and(UserRating.PKG_VERSION.dot(PkgVersion.PKG).dot(Pkg.NAME).in(specification.getPkgNames()));
}
ObjectContext context = serverRuntime.newContext();
List<UserRating> userRatings = objectSelect.select(serverRuntime.newContext());
NaturalLanguage naturalLanguage = deriveNaturalLanguage(context, specification);
return userRatings.stream().map(ur -> {
SyndEntry entry = new SyndEntryImpl();
entry.setPublishedDate(ur.getCreateTimestamp());
entry.setUpdatedDate(ur.getModifyTimestamp());
entry.setAuthor(ur.getUser().getNickname());
entry.setUri(URI_PREFIX + Hashing.sha1().hashUnencodedChars(String.format("%s_::_%s_::_%s_::_%s", this.getClass().getCanonicalName(), ur.getPkgVersion().getPkg().getName(), ur.getPkgVersion().toVersionCoordinates().toString(), ur.getUser().getNickname())).toString());
entry.setLink(String.format("%s/#!/userrating/%s", baseUrl, ur.getCode()));
ResolvedPkgVersionLocalization resolvedPkgVersionLocalization = pkgLocalizationService.resolvePkgVersionLocalization(context, ur.getPkgVersion(), null, naturalLanguage);
entry.setTitle(messageSource.getMessage("feed.createdUserRating.atom.title", new Object[] { Optional.ofNullable(resolvedPkgVersionLocalization.getTitle()).orElse(ur.getPkgVersion().getPkg().getName()), ur.getUser().getNickname() }, new Locale(specification.getNaturalLanguageCode())));
String contentString = ur.getComment();
if (null != contentString && contentString.length() > CONTENT_LENGTH) {
contentString = contentString.substring(0, CONTENT_LENGTH) + "...";
}
if (null != ur.getRating()) {
contentString = buildRatingIndicator(ur.getRating()) + (Strings.isNullOrEmpty(contentString) ? "" : " -- " + contentString);
}
SyndContentImpl content = new SyndContentImpl();
content.setType(MediaType.PLAIN_TEXT_UTF_8.type());
content.setValue(contentString);
entry.setDescription(content);
return entry;
}).collect(Collectors.toList());
}
return Collections.emptyList();
}
use of org.haiku.haikudepotserver.feed.model.FeedSpecification in project haikudepotserver by haiku.
the class MiscellaneousApiImpl method generateFeedUrl.
@Override
public GenerateFeedUrlResult generateFeedUrl(final GenerateFeedUrlRequest request) {
Preconditions.checkNotNull(request);
final ObjectContext context = serverRuntime.newContext();
FeedSpecification specification = new FeedSpecification();
specification.setFeedType(FeedSpecification.FeedType.ATOM);
specification.setLimit(request.limit);
if (null != request.supplierTypes) {
specification.setSupplierTypes(request.supplierTypes.stream().map(st -> FeedSpecification.SupplierType.valueOf(st.name())).collect(Collectors.toList()));
}
if (null != request.naturalLanguageCode) {
specification.setNaturalLanguageCode(getNaturalLanguage(context, request.naturalLanguageCode).getCode());
}
if (null != request.pkgNames) {
List<String> checkedPkgNames = new ArrayList<>();
for (String pkgName : request.pkgNames) {
Optional<Pkg> pkgOptional = Pkg.tryGetByName(context, pkgName);
if (pkgOptional.isEmpty()) {
throw new ObjectNotFoundException(Pkg.class.getSimpleName(), pkgName);
}
checkedPkgNames.add(pkgOptional.get().getName());
}
specification.setPkgNames(checkedPkgNames);
}
GenerateFeedUrlResult result = new GenerateFeedUrlResult();
result.url = feedService.generateUrl(specification);
return result;
}
use of org.haiku.haikudepotserver.feed.model.FeedSpecification in project haikudepotserver by haiku.
the class CreatedPkgVersionSyndEntrySupplier method generate.
@Override
public List<SyndEntry> generate(final FeedSpecification specification) {
Preconditions.checkNotNull(specification);
if (specification.getSupplierTypes().contains(FeedSpecification.SupplierType.CREATEDPKGVERSION)) {
if (null != specification.getPkgNames() && specification.getPkgNames().isEmpty()) {
return Collections.emptyList();
}
ObjectSelect<PkgVersion> objectSelect = ObjectSelect.query(PkgVersion.class).where(PkgVersion.ACTIVE.isTrue()).and(PkgVersion.PKG.dot(Pkg.ACTIVE).isTrue()).and(ExpressionFactory.or(PkgVersion.PKG.dot(Pkg.NAME).endsWith(PkgService.SUFFIX_PKG_DEBUGINFO), PkgVersion.PKG.dot(Pkg.NAME).endsWith(PkgService.SUFFIX_PKG_DEVELOPMENT), PkgVersion.PKG.dot(Pkg.NAME).endsWith(PkgService.SUFFIX_PKG_SOURCE)).notExp()).orderBy(PkgVersion.CREATE_TIMESTAMP.desc()).limit(specification.getLimit());
if (null != specification.getPkgNames()) {
objectSelect.and(PkgVersion.PKG.dot(Pkg.NAME).in(specification.getPkgNames()));
}
ObjectContext context = serverRuntime.newContext();
NaturalLanguage naturalLanguage = deriveNaturalLanguage(context, specification);
List<PkgVersion> pkgVersions = objectSelect.select(context);
return pkgVersions.stream().map(pv -> {
SyndEntry entry = new SyndEntryImpl();
entry.setPublishedDate(pv.getCreateTimestamp());
entry.setUpdatedDate(pv.getModifyTimestamp());
entry.setUri(URI_PREFIX + Hashing.sha1().hashUnencodedChars(String.format("%s_::_%s_::_%s", this.getClass().getCanonicalName(), pv.getPkg().getName(), pv.toVersionCoordinates().toString())).toString());
{
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl).pathSegment("#!", "pkg");
pv.appendPathSegments(builder);
entry.setLink(builder.build().toUriString());
}
ResolvedPkgVersionLocalization resolvedPkgVersionLocalization = pkgLocalizationService.resolvePkgVersionLocalization(context, pv, null, naturalLanguage);
entry.setTitle(messageSource.getMessage("feed.createdPkgVersion.atom.title", new Object[] { Optional.ofNullable(resolvedPkgVersionLocalization.getTitle()).orElse(pv.getPkg().getName()), pv.toVersionCoordinates().toString() }, new Locale(naturalLanguage.getCode())));
{
SyndContent content = new SyndContentImpl();
content.setType(MediaType.PLAIN_TEXT_UTF_8.type());
content.setValue(resolvedPkgVersionLocalization.getSummary());
entry.setDescription(content);
}
return entry;
}).collect(Collectors.toList());
}
return Collections.emptyList();
}
use of org.haiku.haikudepotserver.feed.model.FeedSpecification in project haikudepotserver by haiku.
the class FeedServiceImpl method generateUrl.
/**
* <p>Given a specification for a feed, this method will generate a URL that external users can query in order
* to get that feed.</p>
*/
@Override
public String generateUrl(FeedSpecification specification) {
Preconditions.checkNotNull(specification);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl).path(PATH_ROOT + "/pkg.atom");
if (null != specification.getNaturalLanguageCode()) {
builder.queryParam(KEY_NATURALLANGUAGECODE, specification.getNaturalLanguageCode());
}
if (null != specification.getLimit()) {
builder.queryParam(KEY_LIMIT, specification.getLimit().toString());
}
if (null != specification.getSupplierTypes()) {
builder.queryParam(KEY_TYPES, String.join(",", specification.getSupplierTypes().stream().map(FeedSpecification.SupplierType::name).collect(Collectors.toList())));
}
if (null != specification.getPkgNames()) {
// split on hyphens because hyphens are not allowed in package names
builder.queryParam(KEY_PKGNAMES, String.join("-", specification.getPkgNames()));
}
return builder.build().toString();
}
use of org.haiku.haikudepotserver.feed.model.FeedSpecification in project haikudepotserver by haiku.
the class FeedController method generate.
@RequestMapping(value = "{pathBase:pkg\\.}{" + FeedServiceImpl.KEY_EXTENSION + ":atom|rss}", method = RequestMethod.GET)
public void generate(HttpServletResponse response, @PathVariable(value = FeedServiceImpl.KEY_EXTENSION) String extension, @RequestParam(value = FeedServiceImpl.KEY_NATURALLANGUAGECODE, required = false) String naturalLanguageCode, @RequestParam(value = FeedServiceImpl.KEY_PKGNAMES, required = false) String pkgNames, @RequestParam(value = FeedServiceImpl.KEY_LIMIT, required = false) Integer limit, @RequestParam(value = FeedServiceImpl.KEY_TYPES, required = false) String types) throws IOException, FeedException {
Preconditions.checkNotNull(response);
if (null == limit || limit > MAX_LIMIT) {
limit = DEFAULT_LIMIT;
}
FeedSpecification.FeedType feedType = tryDeriveFeedTypeByExtension(extension).orElseThrow(() -> new IllegalStateException("unable to derive the feed type from [" + extension + "]"));
FeedSpecification specification = new FeedSpecification();
specification.setFeedType(feedType);
specification.setLimit(limit > MAX_LIMIT ? MAX_LIMIT : limit);
specification.setNaturalLanguageCode(!Strings.isNullOrEmpty(naturalLanguageCode) ? naturalLanguageCode : NaturalLanguage.CODE_ENGLISH);
if (Strings.isNullOrEmpty(types)) {
specification.setSupplierTypes(ImmutableList.copyOf(FeedSpecification.SupplierType.values()));
} else {
specification.setSupplierTypes(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(types).stream().map(FeedSpecification.SupplierType::valueOf).collect(Collectors.toList()));
}
if (Strings.isNullOrEmpty(pkgNames)) {
specification.setPkgNames(null);
} else {
// split on hyphens because hyphens are not allowed in package names
specification.setPkgNames(Splitter.on('-').trimResults().omitEmptyStrings().splitToList(pkgNames));
}
SyndFeed feed = feedCache.getUnchecked(specification);
response.setContentType(feedType.getContentType());
Writer writer = response.getWriter();
SyndFeedOutput syndFeedOutput = new SyndFeedOutput();
syndFeedOutput.output(feed, writer);
writer.close();
}
Aggregations