/** * * Copyright * 2009-2015 Jayway Products AB * 2016-2017 Föreningen Sambruk * * Licensed under AGPL, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/agpl.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package se.streamsource.streamflow.web.application.contact; import org.qi4j.api.injection.scope.Structure; import org.qi4j.api.mixin.Mixins; import org.qi4j.api.query.Query; import org.qi4j.api.service.ServiceComposite; import org.qi4j.api.structure.Module; import org.qi4j.api.value.ValueBuilder; import se.streamsource.streamflow.api.workspace.cases.contact.ContactAddressDTO; import se.streamsource.streamflow.api.workspace.cases.contact.ContactDTO; import se.streamsource.streamflow.api.workspace.cases.contact.ContactEmailDTO; import se.streamsource.streamflow.api.workspace.cases.contact.ContactPhoneDTO; import se.streamsource.streamflow.server.plugin.contact.ContactEmailValue; import se.streamsource.streamflow.server.plugin.contact.ContactList; import se.streamsource.streamflow.server.plugin.contact.ContactLookup; import se.streamsource.streamflow.server.plugin.contact.ContactPhoneValue; import se.streamsource.streamflow.server.plugin.contact.ContactValue; import se.streamsource.streamflow.web.domain.structure.caze.Contacts; /** * JAVADOC */ @Mixins(StreamflowContactLookupService.Mixin.class) public interface StreamflowContactLookupService extends ServiceComposite, ContactLookup { class Mixin implements ContactLookup { @Structure Module module; public ContactList lookup( ContactValue contactTemplate ) { StringBuilder queryString = new StringBuilder(); boolean argumentFound = false; if (!contactTemplate.name().get().equals( "" )) { queryString.append( "name:\"" ).append( contactTemplate.name().get() ).append( "\" " ); argumentFound = true; } if (!contactTemplate.contactId().get().equals( "" )) { queryString.append( "contactId:\"" ).append( contactTemplate.contactId().get() ).append( "\" " ); argumentFound = true; } if (contactTemplate.phoneNumbers().get().size() > 0) { argumentFound = true; queryString.append( "phoneNumber:(" ); String or = ""; for (ContactPhoneValue phone : contactTemplate.phoneNumbers().get()) { queryString.append( or ).append( "\"" ).append( phone.phoneNumber().get() ).append( "\"" ); or = " OR "; } queryString.append( ") " ); } if (contactTemplate.emailAddresses().get().size() > 0) { argumentFound = true; queryString.append( "emailAddress:(" ); String or = ""; for (ContactEmailValue email : contactTemplate.emailAddresses().get()) { queryString.append( or ).append( "\"" ).append( email.emailAddress().get() ).append( "\"" ); or = " OR "; } queryString.append( ") " ); } ValueBuilder<ContactList> listBuilder = module.valueBuilderFactory().newValueBuilder(ContactList.class); if (argumentFound) { queryString.append( "type:se.streamsource.streamflow.web.domain.entity.caze.CaseEntity " ); queryString.append( "!status:DRAFT" ); Query<Contacts.Data> cases = module.queryBuilderFactory() .newNamedQuery(Contacts.Data.class, module.unitOfWorkFactory().currentUnitOfWork(), "solrquery").setVariable( "query", queryString.toString() ); ContactDTO contactSearchCriteria = module.valueBuilderFactory().newValueFromJSON(ContactDTO.class, contactTemplate.toJSON()); for (Contacts.Data contact : cases) { for (ContactDTO contactValue : contact.contacts().get()) { if (!contactValue.equals( contactSearchCriteria )) { boolean matched = true; if (contact.contacts().get().size() > 1) { matched = matchSearchResultWithQuery( contactSearchCriteria, contactValue ); } if (matched) { listBuilder.prototype().contacts().get().add( module.valueBuilderFactory().newValueFromJSON(ContactValue.class, contactValue.toJSON()) ); } } } } } return listBuilder.newInstance(); } private boolean matchSearchResultWithQuery( ContactDTO criteria, ContactDTO result ) { if (!criteria.name().get().isEmpty() && result.name().get().toLowerCase().contains( criteria.name().get().toLowerCase() )) { return true; } if (!criteria.phoneNumbers().get().isEmpty()) { for (ContactPhoneDTO phone : result.phoneNumbers().get()) { if (!criteria.phoneNumbers().get().get( 0 ).phoneNumber().get().isEmpty() && phone.phoneNumber().get().contains( criteria.phoneNumbers().get().get( 0 ).phoneNumber().get() )) return true; } } if (!criteria.addresses().get().isEmpty()) { for (ContactAddressDTO address : result.addresses().get()) { if (!criteria.addresses().get().get( 0 ).address().get().isEmpty() && address.address().get().toLowerCase().contains( criteria.addresses().get().get( 0 ).address().get().toLowerCase() )) return true; } } if (!criteria.emailAddresses().get().isEmpty()) { for (ContactEmailDTO email : result.emailAddresses().get()) { if (!criteria.emailAddresses().get().get( 0 ).emailAddress().get().isEmpty() && email.emailAddress().get().toLowerCase().contains( criteria.emailAddresses().get().get( 0 ).emailAddress().get().toLowerCase() )) return true; } } if (!criteria.contactId().get().isEmpty() && result.contactId().get().toLowerCase().contains( criteria.contactId().get().toLowerCase() )) { return true; } return false; } } }