001
014
015 package com.liferay.portlet.asset.service.impl;
016
017 import com.liferay.portal.kernel.cache.ThreadLocalCachable;
018 import com.liferay.portal.kernel.dao.orm.QueryUtil;
019 import com.liferay.portal.kernel.exception.PortalException;
020 import com.liferay.portal.kernel.systemevent.SystemEvent;
021 import com.liferay.portal.kernel.util.ArrayUtil;
022 import com.liferay.portal.kernel.util.ListUtil;
023 import com.liferay.portal.kernel.util.StringPool;
024 import com.liferay.portal.kernel.util.StringUtil;
025 import com.liferay.portal.model.Group;
026 import com.liferay.portal.model.ResourceConstants;
027 import com.liferay.portal.model.SystemEventConstants;
028 import com.liferay.portal.model.User;
029 import com.liferay.portal.service.ServiceContext;
030 import com.liferay.portlet.asset.AssetTagException;
031 import com.liferay.portlet.asset.DuplicateTagException;
032 import com.liferay.portlet.asset.model.AssetEntry;
033 import com.liferay.portlet.asset.model.AssetTag;
034 import com.liferay.portlet.asset.service.base.AssetTagLocalServiceBaseImpl;
035 import com.liferay.portlet.asset.util.AssetUtil;
036 import com.liferay.portlet.asset.util.comparator.AssetTagNameComparator;
037 import com.liferay.portlet.social.util.SocialCounterPeriodUtil;
038
039 import java.util.ArrayList;
040 import java.util.Collections;
041 import java.util.List;
042
043
052 public class AssetTagLocalServiceImpl extends AssetTagLocalServiceBaseImpl {
053
054
066 @Override
067 public AssetTag addTag(
068 long userId, long groupId, String name,
069 ServiceContext serviceContext)
070 throws PortalException {
071
072
073
074 User user = userPersistence.findByPrimaryKey(userId);
075
076 long tagId = counterLocalService.increment();
077
078 AssetTag tag = assetTagPersistence.create(tagId);
079
080 tag.setGroupId(groupId);
081 tag.setCompanyId(user.getCompanyId());
082 tag.setUserId(user.getUserId());
083 tag.setUserName(user.getFullName());
084
085 name = name.trim();
086 name = StringUtil.toLowerCase(name);
087
088 if (hasTag(groupId, name)) {
089 throw new DuplicateTagException(
090 "A tag with the name " + name + " already exists");
091 }
092
093 validate(name);
094
095 tag.setName(name);
096
097 assetTagPersistence.update(tag);
098
099
100
101 if (serviceContext.isAddGroupPermissions() ||
102 serviceContext.isAddGuestPermissions()) {
103
104 addTagResources(
105 tag, serviceContext.isAddGroupPermissions(),
106 serviceContext.isAddGuestPermissions());
107 }
108 else {
109 addTagResources(
110 tag, serviceContext.getGroupPermissions(),
111 serviceContext.getGuestPermissions());
112 }
113
114 return tag;
115 }
116
117
126 @Override
127 public void addTagResources(
128 AssetTag tag, boolean addGroupPermissions,
129 boolean addGuestPermissions)
130 throws PortalException {
131
132 resourceLocalService.addResources(
133 tag.getCompanyId(), tag.getGroupId(), tag.getUserId(),
134 AssetTag.class.getName(), tag.getTagId(), false,
135 addGroupPermissions, addGuestPermissions);
136 }
137
138
147 @Override
148 public void addTagResources(
149 AssetTag tag, String[] groupPermissions, String[] guestPermissions)
150 throws PortalException {
151
152 resourceLocalService.addModelResources(
153 tag.getCompanyId(), tag.getGroupId(), tag.getUserId(),
154 AssetTag.class.getName(), tag.getTagId(), groupPermissions,
155 guestPermissions);
156 }
157
158
175 @Override
176 public List<AssetTag> checkTags(long userId, Group group, String[] names)
177 throws PortalException {
178
179 List<AssetTag> tags = new ArrayList<>();
180
181 for (String name : names) {
182 AssetTag tag = fetchTag(group.getGroupId(), name);
183
184 if (tag == null) {
185 ServiceContext serviceContext = new ServiceContext();
186
187 serviceContext.setAddGroupPermissions(true);
188 serviceContext.setAddGuestPermissions(true);
189 serviceContext.setScopeGroupId(group.getGroupId());
190
191 tag = addTag(userId, group.getGroupId(), name, serviceContext);
192 }
193
194 if (tag != null) {
195 tags.add(tag);
196 }
197 }
198
199 return tags;
200 }
201
202
215 @Override
216 public List<AssetTag> checkTags(long userId, long groupId, String[] names)
217 throws PortalException {
218
219 Group group = groupPersistence.findByPrimaryKey(groupId);
220
221 return checkTags(userId, group, names);
222 }
223
224
234 @Override
235 public AssetTag decrementAssetCount(long tagId, long classNameId)
236 throws PortalException {
237
238 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
239
240 tag.setAssetCount(Math.max(0, tag.getAssetCount() - 1));
241
242 assetTagPersistence.update(tag);
243
244 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
245
246 return tag;
247 }
248
249
256 @Override
257 public void deleteGroupTags(long groupId) throws PortalException {
258 List<AssetTag> tags = getGroupTags(groupId);
259
260 for (AssetTag tag : tags) {
261 assetTagLocalService.deleteTag(tag);
262 }
263 }
264
265
271 @Override
272 @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
273 public void deleteTag(AssetTag tag) throws PortalException {
274
275
276
277 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
278 tag.getTagId());
279
280
281
282 assetTagPersistence.remove(tag);
283
284
285
286 resourceLocalService.deleteResource(
287 tag.getCompanyId(), AssetTag.class.getName(),
288 ResourceConstants.SCOPE_INDIVIDUAL, tag.getTagId());
289
290
291
292 assetEntryLocalService.reindex(entries);
293 }
294
295
302 @Override
303 public void deleteTag(long tagId) throws PortalException {
304 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
305
306 assetTagLocalService.deleteTag(tag);
307 }
308
309
317 @Override
318 public AssetTag fetchTag(long groupId, String name) {
319 return assetTagPersistence.fetchByG_N(groupId, name);
320 }
321
322
328 @Override
329 public List<AssetTag> getEntryTags(long entryId) {
330 return assetEntryPersistence.getAssetTags(entryId);
331 }
332
333
339 @Override
340 public List<AssetTag> getGroupsTags(long[] groupIds) {
341 List<AssetTag> groupsTags = new ArrayList<>();
342
343 for (long groupId : groupIds) {
344 List<AssetTag> groupTags = getGroupTags(groupId);
345
346 groupsTags.addAll(groupTags);
347 }
348
349 return groupsTags;
350 }
351
352
358 @Override
359 public List<AssetTag> getGroupTags(long groupId) {
360 return assetTagPersistence.findByGroupId(groupId);
361 }
362
363
371 @Override
372 public List<AssetTag> getGroupTags(long groupId, int start, int end) {
373 return assetTagPersistence.findByGroupId(groupId, start, end);
374 }
375
376
382 @Override
383 public int getGroupTagsCount(long groupId) {
384 return assetTagPersistence.countByGroupId(groupId);
385 }
386
387 @Override
388 public List<AssetTag> getSocialActivityCounterOffsetTags(
389 long groupId, String socialActivityCounterName, int startOffset,
390 int endOffset) {
391
392 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
393 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
394
395 return getSocialActivityCounterPeriodTags(
396 groupId, socialActivityCounterName, startPeriod, endPeriod);
397 }
398
399 @Override
400 public List<AssetTag> getSocialActivityCounterPeriodTags(
401 long groupId, String socialActivityCounterName, int startPeriod,
402 int endPeriod) {
403
404 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
405
406 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
407
408 return assetTagFinder.findByG_N_S_E(
409 groupId, socialActivityCounterName, startPeriod, endPeriod,
410 periodLength);
411 }
412
413
421 @Override
422 public AssetTag getTag(long tagId) throws PortalException {
423 return assetTagPersistence.findByPrimaryKey(tagId);
424 }
425
426
434 @Override
435 public AssetTag getTag(long groupId, String name) throws PortalException {
436 return assetTagPersistence.findByG_N(groupId, name);
437 }
438
439
446 @Override
447 public long[] getTagIds(long groupId, String[] names) {
448 List<Long> tagIds = new ArrayList<>(names.length);
449
450 for (String name : names) {
451 AssetTag tag = fetchTag(groupId, name);
452
453 if (tag == null) {
454 continue;
455 }
456
457 tagIds.add(tag.getTagId());
458 }
459
460 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
461 }
462
463
470 @Override
471 public long[] getTagIds(long[] groupIds, String name) {
472 List<Long> tagIds = new ArrayList<>(groupIds.length);
473
474 for (long groupId : groupIds) {
475 AssetTag tag = fetchTag(groupId, name);
476
477 if (tag == null) {
478 continue;
479 }
480
481 tagIds.add(tag.getTagId());
482 }
483
484 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
485 }
486
487
494 @Override
495 public long[] getTagIds(long[] groupIds, String[] names) {
496 long[] tagsIds = new long[0];
497
498 for (long groupId : groupIds) {
499 tagsIds = ArrayUtil.append(tagsIds, getTagIds(groupId, names));
500 }
501
502 return tagsIds;
503 }
504
505
510 @Override
511 public String[] getTagNames() {
512 return getTagNames(getTags());
513 }
514
515
522 @Override
523 public String[] getTagNames(long classNameId, long classPK) {
524 return getTagNames(getTags(classNameId, classPK));
525 }
526
527
534 @Override
535 public String[] getTagNames(String className, long classPK) {
536 return getTagNames(getTags(className, classPK));
537 }
538
539
544 @Override
545 public List<AssetTag> getTags() {
546 return assetTagPersistence.findAll();
547 }
548
549
556 @Override
557 public List<AssetTag> getTags(long classNameId, long classPK) {
558 AssetEntry entry = assetEntryPersistence.fetchByC_C(
559 classNameId, classPK);
560
561 if (entry == null) {
562 return Collections.emptyList();
563 }
564
565 return assetEntryPersistence.getAssetTags(entry.getEntryId());
566 }
567
568 @Override
569 public List<AssetTag> getTags(long groupId, long classNameId, String name) {
570 return assetTagFinder.findByG_C_N(
571 groupId, classNameId, name, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
572 null);
573 }
574
575 @Override
576 public List<AssetTag> getTags(
577 long groupId, long classNameId, String name, int start, int end) {
578
579 return assetTagFinder.findByG_C_N(
580 groupId, classNameId, name, start, end, null);
581 }
582
583
590 @Override
591 @ThreadLocalCachable
592 public List<AssetTag> getTags(String className, long classPK) {
593 long classNameId = classNameLocalService.getClassNameId(className);
594
595 return getTags(classNameId, classPK);
596 }
597
598 @Override
599 public int getTagsSize(long groupId, long classNameId, String name) {
600 return assetTagFinder.countByG_C_N(groupId, classNameId, name);
601 }
602
603
612 @Override
613 public boolean hasTag(long groupId, String name) {
614 AssetTag tag = fetchTag(groupId, name);
615
616 if (tag != null) {
617 return true;
618 }
619
620 return false;
621 }
622
623
633 @Override
634 public AssetTag incrementAssetCount(long tagId, long classNameId)
635 throws PortalException {
636
637 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
638
639 tag.setAssetCount(tag.getAssetCount() + 1);
640
641 assetTagPersistence.update(tag);
642
643 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
644
645 return tag;
646 }
647
648
657 @Override
658 public void mergeTags(long fromTagId, long toTagId) throws PortalException {
659 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
660 fromTagId);
661
662 assetTagPersistence.addAssetEntries(toTagId, entries);
663
664 deleteTag(fromTagId);
665 }
666
667
676 @Override
677 public List<AssetTag> search(
678 long groupId, String name, int start, int end) {
679
680 return search(new long[] {groupId}, name, start, end);
681 }
682
683
692 @Override
693 public List<AssetTag> search(
694 long[] groupIds, String name, int start, int end) {
695
696 return assetTagPersistence.findByG_LikeN(
697 groupIds, name, start, end, new AssetTagNameComparator());
698 }
699
700 @Override
701 public AssetTag updateTag(
702 long userId, long tagId, String name, ServiceContext serviceContext)
703 throws PortalException {
704
705
706
707 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
708
709 String oldName = tag.getName();
710
711 name = name.trim();
712 name = StringUtil.toLowerCase(name);
713
714 if (!name.equals(tag.getName()) && hasTag(tag.getGroupId(), name)) {
715 throw new DuplicateTagException(
716 "A tag with the name " + name + " already exists");
717 }
718
719 if (!tag.getName().equals(name)) {
720 AssetTag existingAssetTag = fetchTag(tag.getGroupId(), name);
721
722 if ((existingAssetTag != null) &&
723 (existingAssetTag.getTagId() != tagId)) {
724
725 throw new DuplicateTagException(
726 "A tag with the name " + name + " already exists");
727 }
728 }
729
730 validate(name);
731
732 tag.setName(name);
733
734 assetTagPersistence.update(tag);
735
736
737
738 if (!oldName.equals(name)) {
739 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
740 tag.getTagId());
741
742 assetEntryLocalService.reindex(entries);
743 }
744
745 return tag;
746 }
747
748 protected String[] getTagNames(List<AssetTag>tags) {
749 return ListUtil.toArray(tags, AssetTag.NAME_ACCESSOR);
750 }
751
752 protected void validate(String name) throws PortalException {
753 if (!AssetUtil.isValidWord(name)) {
754 throw new AssetTagException(
755 StringUtil.merge(
756 AssetUtil.INVALID_CHARACTERS, StringPool.SPACE),
757 AssetTagException.INVALID_CHARACTER);
758 }
759 }
760
761 }