001// -------------------------------------------------------------------------------- 002// Copyright 2002-2026 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.model.control.forum.server.indexer; 018 019import com.echothree.model.control.core.common.MimeTypeUsageTypes; 020import com.echothree.model.control.forum.server.analyzer.ForumMessageAnalyzer; 021import com.echothree.model.control.forum.server.control.ForumControl; 022import com.echothree.model.control.index.common.IndexConstants; 023import com.echothree.model.control.index.common.IndexFieldVariations; 024import com.echothree.model.control.index.common.IndexFields; 025import com.echothree.model.control.index.server.indexer.BaseIndexer; 026import com.echothree.model.control.index.server.indexer.FieldTypes; 027import com.echothree.model.data.core.server.entity.EntityInstance; 028import com.echothree.model.data.forum.server.entity.ForumMessage; 029import com.echothree.model.data.index.server.entity.Index; 030import com.echothree.util.server.message.ExecutionErrorAccumulator; 031import javax.enterprise.context.Dependent; 032import javax.inject.Inject; 033import org.apache.lucene.analysis.Analyzer; 034import org.apache.lucene.document.Document; 035import org.apache.lucene.document.Field; 036import org.apache.lucene.document.LongPoint; 037import org.apache.lucene.document.SortedDocValuesField; 038import org.apache.lucene.util.BytesRef; 039 040@Dependent 041public class ForumMessageIndexer 042 extends BaseIndexer<ForumMessage> { 043 044 @Inject 045 ForumControl forumControl; 046 047 @Override 048 public BaseIndexer<ForumMessage> setup(final ExecutionErrorAccumulator eea, final Index index) { 049 return super.setup(eea, index); 050 } 051 052 @Override 053 protected Analyzer getAnalyzer() { 054 return new ForumMessageAnalyzer(eea, language, entityType, entityAliasTypes, entityAttributes, tagScopes); 055 } 056 057 @Override 058 protected ForumMessage getEntity(final EntityInstance entityInstance) { 059 return forumControl.getForumMessageByEntityInstance(entityInstance); 060 } 061 062 @Override 063 protected Document convertToDocument(final EntityInstance entityInstance, final ForumMessage forumMessage) { 064 var forumMessageDetail = forumMessage.getLastDetail(); 065 var forumThread = forumMessageDetail.getForumThread(); 066 var forumForumThreads = forumControl.getForumForumThreadsByForumThread(forumThread); 067 var forumMessageTypePartTypes = forumControl.getForumMessageTypePartTypesByForumMessageTypeAndIncludeInIndex(forumMessageDetail.getForumMessageType()); 068 069 var document = newDocumentWithEntityInstanceFields(entityInstance, forumMessage.getPrimaryKey()); 070 071 document.add(new Field(IndexFields.forumMessageName.name(), forumMessageDetail.getForumMessageName(), FieldTypes.NOT_STORED_TOKENIZED)); 072 document.add(new Field(IndexFields.forumThreadName.name(), forumThread.getLastDetail().getForumThreadName(), FieldTypes.NOT_STORED_TOKENIZED)); 073 document.add(new LongPoint(IndexFields.postedTime.name(), forumMessageDetail.getPostedTime())); 074 075 forumMessageTypePartTypes.stream().map((forumMessageTypePartType) -> forumMessageTypePartType.getForumMessagePartType()).forEach((forumMessagePartType) -> { 076 var forumMessagePart = forumControl.getBestForumMessagePart(forumMessage, forumMessagePartType, language); 077 if (forumMessagePart != null) { 078 var mimeTypeUsageType = forumMessagePartType.getMimeTypeUsageType(); 079 080 if(mimeTypeUsageType == null) { 081 var forumMessagePartTypeName = forumMessagePartType.getForumMessagePartTypeName(); 082 var string = forumControl.getForumStringMessagePart(forumMessagePart).getString(); 083 084 document.add(new Field(forumMessagePartTypeName, string, FieldTypes.NOT_STORED_TOKENIZED)); 085 document.add(new SortedDocValuesField(forumMessagePartTypeName + IndexConstants.INDEX_FIELD_VARIATION_SEPARATOR + IndexFieldVariations.sortable.name(), 086 new BytesRef(string))); 087 } else { 088 var mimeTypeUsageTypeName = mimeTypeUsageType.getMimeTypeUsageTypeName(); 089 090 if(mimeTypeUsageTypeName.equals(MimeTypeUsageTypes.TEXT.name())) { 091 var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 092 093 // TODO: mime type conversion to text/plain happens here 094 document.add(new Field(forumMessagePartType.getForumMessagePartTypeName(), forumClobMessagePart.getClob(), FieldTypes.NOT_STORED_TOKENIZED)); 095 } // Others are not supported at this time, DOCUMENT probably should be. 096 } 097 } 098 }); 099 100 if(forumForumThreads.size() > 0) { 101 var forumNames = new StringBuilder(); 102 103 forumForumThreads.forEach((forumForumThread) -> { 104 if(forumNames.length() > 0) { 105 forumNames.append(' '); 106 } 107 108 forumNames.append(forumForumThread.getForum().getLastDetail().getForumName()); 109 }); 110 111 document.add(new Field(IndexFields.forumNames.name(), forumNames.toString(), FieldTypes.NOT_STORED_NOT_TOKENIZED)); 112 } 113 114 return document; 115 } 116 117}