001
014
015 package com.liferay.portlet.asset.service.impl;
016
017 import com.liferay.asset.kernel.exception.AssetTagException;
018 import com.liferay.asset.kernel.exception.DuplicateTagException;
019 import com.liferay.asset.kernel.model.AssetEntry;
020 import com.liferay.asset.kernel.model.AssetTag;
021 import com.liferay.portal.kernel.cache.thread.local.ThreadLocalCachable;
022 import com.liferay.portal.kernel.dao.orm.QueryUtil;
023 import com.liferay.portal.kernel.exception.PortalException;
024 import com.liferay.portal.kernel.model.Group;
025 import com.liferay.portal.kernel.model.SystemEventConstants;
026 import com.liferay.portal.kernel.model.User;
027 import com.liferay.portal.kernel.service.ServiceContext;
028 import com.liferay.portal.kernel.systemevent.SystemEvent;
029 import com.liferay.portal.kernel.util.ArrayUtil;
030 import com.liferay.portal.kernel.util.ListUtil;
031 import com.liferay.portal.kernel.util.StringPool;
032 import com.liferay.portal.kernel.util.StringUtil;
033 import com.liferay.portlet.asset.service.base.AssetTagLocalServiceBaseImpl;
034 import com.liferay.portlet.asset.util.AssetUtil;
035 import com.liferay.portlet.asset.util.comparator.AssetTagNameComparator;
036 import com.liferay.social.kernel.util.SocialCounterPeriodUtil;
037
038 import java.util.ArrayList;
039 import java.util.Collections;
040 import java.util.List;
041
042
051 public class AssetTagLocalServiceImpl extends AssetTagLocalServiceBaseImpl {
052
053
063 @Override
064 public AssetTag addTag(
065 long userId, long groupId, String name,
066 ServiceContext serviceContext)
067 throws PortalException {
068
069
070
071 User user = userPersistence.findByPrimaryKey(userId);
072
073 long tagId = counterLocalService.increment();
074
075 AssetTag tag = assetTagPersistence.create(tagId);
076
077 tag.setUuid(serviceContext.getUuid());
078 tag.setGroupId(groupId);
079 tag.setCompanyId(user.getCompanyId());
080 tag.setUserId(user.getUserId());
081 tag.setUserName(user.getFullName());
082
083 name = name.trim();
084 name = StringUtil.toLowerCase(name);
085
086 if (hasTag(groupId, name)) {
087 throw new DuplicateTagException(
088 "A tag with the name " + name + " already exists");
089 }
090
091 validate(name);
092
093 tag.setName(name);
094
095 assetTagPersistence.update(tag);
096
097
098
099 resourceLocalService.addModelResources(tag, serviceContext);
100
101 return tag;
102 }
103
104
119 @Override
120 public List<AssetTag> checkTags(long userId, Group group, String[] names)
121 throws PortalException {
122
123 List<AssetTag> tags = new ArrayList<>();
124
125 for (String name : names) {
126 AssetTag tag = fetchTag(group.getGroupId(), name);
127
128 if (tag == null) {
129 ServiceContext serviceContext = new ServiceContext();
130
131 serviceContext.setAddGroupPermissions(true);
132 serviceContext.setAddGuestPermissions(true);
133 serviceContext.setScopeGroupId(group.getGroupId());
134
135 tag = addTag(userId, group.getGroupId(), name, serviceContext);
136 }
137
138 if (tag != null) {
139 tags.add(tag);
140 }
141 }
142
143 return tags;
144 }
145
146
157 @Override
158 public List<AssetTag> checkTags(long userId, long groupId, String[] names)
159 throws PortalException {
160
161 Group group = groupPersistence.findByPrimaryKey(groupId);
162
163 return checkTags(userId, group, names);
164 }
165
166
174 @Override
175 public AssetTag decrementAssetCount(long tagId, long classNameId)
176 throws PortalException {
177
178 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
179
180 tag.setAssetCount(Math.max(0, tag.getAssetCount() - 1));
181
182 assetTagPersistence.update(tag);
183
184 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
185
186 return tag;
187 }
188
189
195 @Override
196 public void deleteGroupTags(long groupId) throws PortalException {
197 List<AssetTag> tags = getGroupTags(groupId);
198
199 for (AssetTag tag : tags) {
200 assetTagLocalService.deleteTag(tag);
201 }
202 }
203
204
209 @Override
210 @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
211 public void deleteTag(AssetTag tag) throws PortalException {
212
213
214
215 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
216 tag.getTagId());
217
218
219
220 assetTagPersistence.remove(tag);
221
222
223
224 assetTagStatsLocalService.deleteTagStatsByTagId(tag.getTagId());
225
226
227
228 assetEntryLocalService.reindex(entries);
229 }
230
231
236 @Override
237 public void deleteTag(long tagId) throws PortalException {
238 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
239
240 assetTagLocalService.deleteTag(tag);
241 }
242
243
251 @Override
252 public AssetTag fetchTag(long groupId, String name) {
253 return assetTagPersistence.fetchByG_N(groupId, name);
254 }
255
256
262 @Override
263 public List<AssetTag> getEntryTags(long entryId) {
264 return assetEntryPersistence.getAssetTags(entryId);
265 }
266
267
273 @Override
274 public List<AssetTag> getGroupsTags(long[] groupIds) {
275 List<AssetTag> groupsTags = new ArrayList<>();
276
277 for (long groupId : groupIds) {
278 List<AssetTag> groupTags = getGroupTags(groupId);
279
280 groupsTags.addAll(groupTags);
281 }
282
283 return groupsTags;
284 }
285
286
292 @Override
293 public List<AssetTag> getGroupTags(long groupId) {
294 return assetTagPersistence.findByGroupId(groupId);
295 }
296
297
305 @Override
306 public List<AssetTag> getGroupTags(long groupId, int start, int end) {
307 return assetTagPersistence.findByGroupId(groupId, start, end);
308 }
309
310
316 @Override
317 public int getGroupTagsCount(long groupId) {
318 return assetTagPersistence.countByGroupId(groupId);
319 }
320
321 @Override
322 public List<AssetTag> getSocialActivityCounterOffsetTags(
323 long groupId, String socialActivityCounterName, int startOffset,
324 int endOffset) {
325
326 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
327 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
328
329 return getSocialActivityCounterPeriodTags(
330 groupId, socialActivityCounterName, startPeriod, endPeriod);
331 }
332
333 @Override
334 public List<AssetTag> getSocialActivityCounterPeriodTags(
335 long groupId, String socialActivityCounterName, int startPeriod,
336 int endPeriod) {
337
338 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
339
340 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
341
342 return assetTagFinder.findByG_N_S_E(
343 groupId, socialActivityCounterName, startPeriod, endPeriod,
344 periodLength);
345 }
346
347
353 @Override
354 public AssetTag getTag(long tagId) throws PortalException {
355 return assetTagPersistence.findByPrimaryKey(tagId);
356 }
357
358
365 @Override
366 public AssetTag getTag(long groupId, String name) throws PortalException {
367 return assetTagPersistence.findByG_N(groupId, name);
368 }
369
370
377 @Override
378 public long[] getTagIds(long groupId, String[] names) {
379 List<Long> tagIds = new ArrayList<>(names.length);
380
381 for (String name : names) {
382 AssetTag tag = fetchTag(groupId, name);
383
384 if (tag == null) {
385 continue;
386 }
387
388 tagIds.add(tag.getTagId());
389 }
390
391 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
392 }
393
394
401 @Override
402 public long[] getTagIds(long[] groupIds, String name) {
403 List<Long> tagIds = new ArrayList<>(groupIds.length);
404
405 for (long groupId : groupIds) {
406 AssetTag tag = fetchTag(groupId, name);
407
408 if (tag == null) {
409 continue;
410 }
411
412 tagIds.add(tag.getTagId());
413 }
414
415 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
416 }
417
418
425 @Override
426 public long[] getTagIds(long[] groupIds, String[] names) {
427 long[] tagsIds = new long[0];
428
429 for (long groupId : groupIds) {
430 tagsIds = ArrayUtil.append(tagsIds, getTagIds(groupId, names));
431 }
432
433 return tagsIds;
434 }
435
436
441 @Override
442 public String[] getTagNames() {
443 return getTagNames(getTags());
444 }
445
446
453 @Override
454 public String[] getTagNames(long classNameId, long classPK) {
455 return getTagNames(getTags(classNameId, classPK));
456 }
457
458
465 @Override
466 public String[] getTagNames(String className, long classPK) {
467 return getTagNames(getTags(className, classPK));
468 }
469
470
475 @Override
476 public List<AssetTag> getTags() {
477 return assetTagPersistence.findAll();
478 }
479
480
487 @Override
488 public List<AssetTag> getTags(long classNameId, long classPK) {
489 AssetEntry entry = assetEntryPersistence.fetchByC_C(
490 classNameId, classPK);
491
492 if (entry == null) {
493 return Collections.emptyList();
494 }
495
496 return assetEntryPersistence.getAssetTags(entry.getEntryId());
497 }
498
499 @Override
500 public List<AssetTag> getTags(long groupId, long classNameId, String name) {
501 return assetTagFinder.findByG_C_N(
502 groupId, classNameId, name, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
503 null);
504 }
505
506 @Override
507 public List<AssetTag> getTags(
508 long groupId, long classNameId, String name, int start, int end) {
509
510 return assetTagFinder.findByG_C_N(
511 groupId, classNameId, name, start, end, null);
512 }
513
514
521 @Override
522 @ThreadLocalCachable
523 public List<AssetTag> getTags(String className, long classPK) {
524 long classNameId = classNameLocalService.getClassNameId(className);
525
526 return getTags(classNameId, classPK);
527 }
528
529 @Override
530 public int getTagsSize(long groupId, long classNameId, String name) {
531 return assetTagFinder.countByG_C_N(groupId, classNameId, name);
532 }
533
534
543 @Override
544 public boolean hasTag(long groupId, String name) {
545 AssetTag tag = fetchTag(groupId, name);
546
547 if (tag != null) {
548 return true;
549 }
550
551 return false;
552 }
553
554
562 @Override
563 public AssetTag incrementAssetCount(long tagId, long classNameId)
564 throws PortalException {
565
566 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
567
568 tag.setAssetCount(tag.getAssetCount() + 1);
569
570 assetTagPersistence.update(tag);
571
572 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
573
574 return tag;
575 }
576
577
585 @Override
586 public void mergeTags(long fromTagId, long toTagId) throws PortalException {
587 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
588 fromTagId);
589
590 assetTagPersistence.addAssetEntries(toTagId, entries);
591
592 deleteTag(fromTagId);
593
594 for (AssetEntry entry : entries) {
595 incrementAssetCount(toTagId, entry.getClassNameId());
596 }
597 }
598
599
608 @Override
609 public List<AssetTag> search(
610 long groupId, String name, int start, int end) {
611
612 return search(new long[] {groupId}, name, start, end);
613 }
614
615
624 @Override
625 public List<AssetTag> search(
626 long[] groupIds, String name, int start, int end) {
627
628 return assetTagPersistence.findByG_LikeN(
629 groupIds, name, start, end, new AssetTagNameComparator());
630 }
631
632 @Override
633 public AssetTag updateTag(
634 long userId, long tagId, String name, ServiceContext serviceContext)
635 throws PortalException {
636
637
638
639 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
640
641 String oldName = tag.getName();
642
643 name = name.trim();
644 name = StringUtil.toLowerCase(name);
645
646 if (!name.equals(tag.getName()) && hasTag(tag.getGroupId(), name)) {
647 throw new DuplicateTagException(
648 "A tag with the name " + name + " already exists");
649 }
650
651 if (!tag.getName().equals(name)) {
652 AssetTag existingAssetTag = fetchTag(tag.getGroupId(), name);
653
654 if ((existingAssetTag != null) &&
655 (existingAssetTag.getTagId() != tagId)) {
656
657 throw new DuplicateTagException(
658 "A tag with the name " + name + " already exists");
659 }
660 }
661
662 validate(name);
663
664 tag.setName(name);
665
666 assetTagPersistence.update(tag);
667
668
669
670 if (!oldName.equals(name)) {
671 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
672 tag.getTagId());
673
674 assetEntryLocalService.reindex(entries);
675 }
676
677 return tag;
678 }
679
680 protected String[] getTagNames(List<AssetTag>tags) {
681 return ListUtil.toArray(tags, AssetTag.NAME_ACCESSOR);
682 }
683
684 protected void validate(String name) throws PortalException {
685 if (!AssetUtil.isValidWord(name)) {
686 throw new AssetTagException(
687 StringUtil.merge(
688 AssetUtil.INVALID_CHARACTERS, StringPool.SPACE),
689 AssetTagException.INVALID_CHARACTER);
690 }
691 }
692
693 }