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.SystemEventConstants;
027 import com.liferay.portal.model.User;
028 import com.liferay.portal.service.ServiceContext;
029 import com.liferay.portlet.asset.AssetTagException;
030 import com.liferay.portlet.asset.DuplicateTagException;
031 import com.liferay.portlet.asset.model.AssetEntry;
032 import com.liferay.portlet.asset.model.AssetTag;
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.portlet.social.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
065 @Override
066 public AssetTag addTag(
067 long userId, long groupId, String name,
068 ServiceContext serviceContext)
069 throws PortalException {
070
071
072
073 User user = userPersistence.findByPrimaryKey(userId);
074
075 long tagId = counterLocalService.increment();
076
077 AssetTag tag = assetTagPersistence.create(tagId);
078
079 tag.setUuid(serviceContext.getUuid());
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 return tag;
100 }
101
102
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
159 @Override
160 public List<AssetTag> checkTags(long userId, long groupId, String[] names)
161 throws PortalException {
162
163 Group group = groupPersistence.findByPrimaryKey(groupId);
164
165 return checkTags(userId, group, names);
166 }
167
168
178 @Override
179 public AssetTag decrementAssetCount(long tagId, long classNameId)
180 throws PortalException {
181
182 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
183
184 tag.setAssetCount(Math.max(0, tag.getAssetCount() - 1));
185
186 assetTagPersistence.update(tag);
187
188 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
189
190 return tag;
191 }
192
193
200 @Override
201 public void deleteGroupTags(long groupId) throws PortalException {
202 List<AssetTag> tags = getGroupTags(groupId);
203
204 for (AssetTag tag : tags) {
205 assetTagLocalService.deleteTag(tag);
206 }
207 }
208
209
215 @Override
216 @SystemEvent(type = SystemEventConstants.TYPE_DELETE)
217 public void deleteTag(AssetTag tag) throws PortalException {
218
219
220
221 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
222 tag.getTagId());
223
224
225
226 assetTagPersistence.remove(tag);
227
228
229
230 assetTagStatsLocalService.deleteTagStatsByTagId(tag.getTagId());
231
232
233
234 assetEntryLocalService.reindex(entries);
235 }
236
237
244 @Override
245 public void deleteTag(long tagId) throws PortalException {
246 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
247
248 assetTagLocalService.deleteTag(tag);
249 }
250
251
259 @Override
260 public AssetTag fetchTag(long groupId, String name) {
261 return assetTagPersistence.fetchByG_N(groupId, name);
262 }
263
264
270 @Override
271 public List<AssetTag> getEntryTags(long entryId) {
272 return assetEntryPersistence.getAssetTags(entryId);
273 }
274
275
281 @Override
282 public List<AssetTag> getGroupsTags(long[] groupIds) {
283 List<AssetTag> groupsTags = new ArrayList<>();
284
285 for (long groupId : groupIds) {
286 List<AssetTag> groupTags = getGroupTags(groupId);
287
288 groupsTags.addAll(groupTags);
289 }
290
291 return groupsTags;
292 }
293
294
300 @Override
301 public List<AssetTag> getGroupTags(long groupId) {
302 return assetTagPersistence.findByGroupId(groupId);
303 }
304
305
313 @Override
314 public List<AssetTag> getGroupTags(long groupId, int start, int end) {
315 return assetTagPersistence.findByGroupId(groupId, start, end);
316 }
317
318
324 @Override
325 public int getGroupTagsCount(long groupId) {
326 return assetTagPersistence.countByGroupId(groupId);
327 }
328
329 @Override
330 public List<AssetTag> getSocialActivityCounterOffsetTags(
331 long groupId, String socialActivityCounterName, int startOffset,
332 int endOffset) {
333
334 int startPeriod = SocialCounterPeriodUtil.getStartPeriod(startOffset);
335 int endPeriod = SocialCounterPeriodUtil.getEndPeriod(endOffset);
336
337 return getSocialActivityCounterPeriodTags(
338 groupId, socialActivityCounterName, startPeriod, endPeriod);
339 }
340
341 @Override
342 public List<AssetTag> getSocialActivityCounterPeriodTags(
343 long groupId, String socialActivityCounterName, int startPeriod,
344 int endPeriod) {
345
346 int offset = SocialCounterPeriodUtil.getOffset(endPeriod);
347
348 int periodLength = SocialCounterPeriodUtil.getPeriodLength(offset);
349
350 return assetTagFinder.findByG_N_S_E(
351 groupId, socialActivityCounterName, startPeriod, endPeriod,
352 periodLength);
353 }
354
355
363 @Override
364 public AssetTag getTag(long tagId) throws PortalException {
365 return assetTagPersistence.findByPrimaryKey(tagId);
366 }
367
368
376 @Override
377 public AssetTag getTag(long groupId, String name) throws PortalException {
378 return assetTagPersistence.findByG_N(groupId, name);
379 }
380
381
388 @Override
389 public long[] getTagIds(long groupId, String[] names) {
390 List<Long> tagIds = new ArrayList<>(names.length);
391
392 for (String name : names) {
393 AssetTag tag = fetchTag(groupId, name);
394
395 if (tag == null) {
396 continue;
397 }
398
399 tagIds.add(tag.getTagId());
400 }
401
402 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
403 }
404
405
412 @Override
413 public long[] getTagIds(long[] groupIds, String name) {
414 List<Long> tagIds = new ArrayList<>(groupIds.length);
415
416 for (long groupId : groupIds) {
417 AssetTag tag = fetchTag(groupId, name);
418
419 if (tag == null) {
420 continue;
421 }
422
423 tagIds.add(tag.getTagId());
424 }
425
426 return ArrayUtil.toArray(tagIds.toArray(new Long[tagIds.size()]));
427 }
428
429
436 @Override
437 public long[] getTagIds(long[] groupIds, String[] names) {
438 long[] tagsIds = new long[0];
439
440 for (long groupId : groupIds) {
441 tagsIds = ArrayUtil.append(tagsIds, getTagIds(groupId, names));
442 }
443
444 return tagsIds;
445 }
446
447
452 @Override
453 public String[] getTagNames() {
454 return getTagNames(getTags());
455 }
456
457
464 @Override
465 public String[] getTagNames(long classNameId, long classPK) {
466 return getTagNames(getTags(classNameId, classPK));
467 }
468
469
476 @Override
477 public String[] getTagNames(String className, long classPK) {
478 return getTagNames(getTags(className, classPK));
479 }
480
481
486 @Override
487 public List<AssetTag> getTags() {
488 return assetTagPersistence.findAll();
489 }
490
491
498 @Override
499 public List<AssetTag> getTags(long classNameId, long classPK) {
500 AssetEntry entry = assetEntryPersistence.fetchByC_C(
501 classNameId, classPK);
502
503 if (entry == null) {
504 return Collections.emptyList();
505 }
506
507 return assetEntryPersistence.getAssetTags(entry.getEntryId());
508 }
509
510 @Override
511 public List<AssetTag> getTags(long groupId, long classNameId, String name) {
512 return assetTagFinder.findByG_C_N(
513 groupId, classNameId, name, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
514 null);
515 }
516
517 @Override
518 public List<AssetTag> getTags(
519 long groupId, long classNameId, String name, int start, int end) {
520
521 return assetTagFinder.findByG_C_N(
522 groupId, classNameId, name, start, end, null);
523 }
524
525
532 @Override
533 @ThreadLocalCachable
534 public List<AssetTag> getTags(String className, long classPK) {
535 long classNameId = classNameLocalService.getClassNameId(className);
536
537 return getTags(classNameId, classPK);
538 }
539
540 @Override
541 public int getTagsSize(long groupId, long classNameId, String name) {
542 return assetTagFinder.countByG_C_N(groupId, classNameId, name);
543 }
544
545
554 @Override
555 public boolean hasTag(long groupId, String name) {
556 AssetTag tag = fetchTag(groupId, name);
557
558 if (tag != null) {
559 return true;
560 }
561
562 return false;
563 }
564
565
575 @Override
576 public AssetTag incrementAssetCount(long tagId, long classNameId)
577 throws PortalException {
578
579 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
580
581 tag.setAssetCount(tag.getAssetCount() + 1);
582
583 assetTagPersistence.update(tag);
584
585 assetTagStatsLocalService.updateTagStats(tagId, classNameId);
586
587 return tag;
588 }
589
590
599 @Override
600 public void mergeTags(long fromTagId, long toTagId) throws PortalException {
601 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
602 fromTagId);
603
604 assetTagPersistence.addAssetEntries(toTagId, entries);
605
606 deleteTag(fromTagId);
607
608 for (AssetEntry entry : entries) {
609 incrementAssetCount(toTagId, entry.getClassNameId());
610 }
611 }
612
613
622 @Override
623 public List<AssetTag> search(
624 long groupId, String name, int start, int end) {
625
626 return search(new long[] {groupId}, name, start, end);
627 }
628
629
638 @Override
639 public List<AssetTag> search(
640 long[] groupIds, String name, int start, int end) {
641
642 return assetTagPersistence.findByG_LikeN(
643 groupIds, name, start, end, new AssetTagNameComparator());
644 }
645
646 @Override
647 public AssetTag updateTag(
648 long userId, long tagId, String name, ServiceContext serviceContext)
649 throws PortalException {
650
651
652
653 AssetTag tag = assetTagPersistence.findByPrimaryKey(tagId);
654
655 String oldName = tag.getName();
656
657 name = name.trim();
658 name = StringUtil.toLowerCase(name);
659
660 if (!name.equals(tag.getName()) && hasTag(tag.getGroupId(), name)) {
661 throw new DuplicateTagException(
662 "A tag with the name " + name + " already exists");
663 }
664
665 if (!tag.getName().equals(name)) {
666 AssetTag existingAssetTag = fetchTag(tag.getGroupId(), name);
667
668 if ((existingAssetTag != null) &&
669 (existingAssetTag.getTagId() != tagId)) {
670
671 throw new DuplicateTagException(
672 "A tag with the name " + name + " already exists");
673 }
674 }
675
676 validate(name);
677
678 tag.setName(name);
679
680 assetTagPersistence.update(tag);
681
682
683
684 if (!oldName.equals(name)) {
685 List<AssetEntry> entries = assetTagPersistence.getAssetEntries(
686 tag.getTagId());
687
688 assetEntryLocalService.reindex(entries);
689 }
690
691 return tag;
692 }
693
694 protected String[] getTagNames(List<AssetTag>tags) {
695 return ListUtil.toArray(tags, AssetTag.NAME_ACCESSOR);
696 }
697
698 protected void validate(String name) throws PortalException {
699 if (!AssetUtil.isValidWord(name)) {
700 throw new AssetTagException(
701 StringUtil.merge(
702 AssetUtil.INVALID_CHARACTERS, StringPool.SPACE),
703 AssetTagException.INVALID_CHARACTER);
704 }
705 }
706
707 }