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}