blob: e00dfb481397cf0eb30a384ed01a443c68456992 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.apache.camel.catalog.connector;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* A memory based {@link ConnectorDataStore}
*/
public class MemoryConnectorDataStore implements ConnectorDataStore {
private Set<ConnectorDetails> store = new CopyOnWriteArraySet<>();
@Override
public void addConnector(ConnectorDto dto, String connectorJson, String connectorSchemaJson, String componentSchemaJson) {
ConnectorDetails entry = new ConnectorDetails(dto, connectorJson, connectorSchemaJson, componentSchemaJson);
// remove in case we are updating the connector
store.remove(entry);
store.add(entry);
}
@Override
public boolean hasConnector(ConnectorDto dto) {
return store.contains(new ConnectorDetails(dto, null, null, null));
}
@Override
public void removeConnector(ConnectorDto dto) {
store.remove(new ConnectorDetails(dto, null, null, null));
}
@Override
public List<ConnectorDto> findConnector(String filter, boolean latestVersionOnly) {
final List<ConnectorDto> answer = new ArrayList<>();
if (filter != null && !filter.isEmpty()) {
// search ignore case
filter = filter.toLowerCase(Locale.US);
for (ConnectorDetails detail : store) {
ConnectorDto dto = detail.getDto();
if (dto.getName().toLowerCase(Locale.US).contains(filter)) {
answer.add(dto);
} else if (dto.getDescription().toLowerCase(Locale.US).contains(filter)) {
answer.add(dto);
} else if (dto.getGroupId().toLowerCase(Locale.US).contains(filter)) {
answer.add(dto);
} else if (dto.getArtifactId().toLowerCase(Locale.US).contains(filter)) {
answer.add(dto);
} else if (dto.getVersion().toLowerCase(Locale.US).contains(filter)) {
answer.add(dto);
} else {
String labels = dto.getLabels();
if (labels != null) {
String[] arr = labels.split(",");
for (String lab : arr) {
lab = lab.toLowerCase(Locale.US);
if (lab.contains(filter)) {
answer.add(dto);
break;
}
}
}
}
}
} else {
store.forEach(d -> answer.add(d.getDto()));
}
// filter only latest version
if (latestVersionOnly && answer.size() > 1) {
// sort first
answer.sort(Comparator.comparing(ConnectorDto::getMavenGav));
// keep only latest in each group
List<ConnectorDto> unique = new ArrayList<>();
ConnectorDto prev = null;
for (ConnectorDto dto : answer) {
if (prev == null
|| (prev.getGroupId().equals(dto.getGroupId())
&& prev.getArtifactId().equals(dto.getArtifactId()))) {
prev = dto;
} else {
unique.add(prev);
prev = dto;
}
}
if (prev != null) {
// special for last element
unique.add(prev);
}
return unique;
}
return answer;
}
@Override
public String connectorJSon(ConnectorDto dto) {
return store.stream().filter(d -> d.getDto().equals(dto)).findFirst().orElse(null).getConnectorJson();
}
@Override
public String connectorSchemaJSon(ConnectorDto dto) {
return store.stream().filter(d -> d.getDto().equals(dto)).findFirst().orElse(null).getConnectorSchemaJson();
}
@Override
public String componentSchemaJSon(ConnectorDto dto) {
return store.stream().filter(d -> d.getDto().equals(dto)).findFirst().orElse(null).getComponentSchemaJson();
}
/**
* Entry holding the connector details
*/
private static final class ConnectorDetails {
private ConnectorDto dto;
private String connectorJson;
private String connectorSchemaJson;
private String componentSchemaJson;
ConnectorDetails(ConnectorDto dto, String connectorJson, String connectorSchemaJson, String componentSchemaJson) {
this.dto = dto;
this.connectorJson = connectorJson;
this.connectorSchemaJson = connectorSchemaJson;
this.componentSchemaJson = componentSchemaJson;
}
ConnectorDto getDto() {
return dto;
}
String getConnectorJson() {
return connectorJson;
}
String getConnectorSchemaJson() {
return connectorSchemaJson;
}
String getComponentSchemaJson() {
return componentSchemaJson;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ConnectorDetails entry = (ConnectorDetails) o;
return dto.equals(entry.dto);
}
@Override
public int hashCode() {
return dto.hashCode();
}
}
}