/* * 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 de.unioninvestment.eai.portal.portlet.crud.config.visitor; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import de.unioninvestment.eai.portal.portlet.crud.config.DatabaseQueryConfig; import de.unioninvestment.eai.portal.portlet.crud.config.DatabaseTableConfig; import de.unioninvestment.eai.portal.portlet.crud.config.GroovyScript; import de.unioninvestment.eai.portal.portlet.crud.config.QueryConfig; import de.unioninvestment.eai.portal.portlet.crud.config.ScriptConfig; /** * Eine Visitor Implementierung, die aus einer Konfiguration die Namen aller * verwendeten Datenquellen extrahiert und in einem Set bereitstellt. * * @author Frank Hardy (Codecentric AG) */ public class DatasourceNameCollectingVisitor implements ConfigurationVisitor { private static final Pattern DATASOURCE_NAME_FINDER_PATTERN = Pattern .compile("\\bsql\\s*\\(\\s*[\\\"'](\\w+)[\\\"']\\s*\\)"); private final Set<String> datasourceNames = new HashSet<String>(); @Override public void visit(Object element) { if (element instanceof QueryConfig) { this.visitQueryConfig((QueryConfig) element); } else if (element instanceof DatabaseTableConfig) { this.visitDatabaseTableConfig((DatabaseTableConfig) element); } else if (element instanceof DatabaseQueryConfig) { this.visitDatabaseQueryConfig((DatabaseQueryConfig) element); } else if (element instanceof ScriptConfig) { this.visitScriptConfig((ScriptConfig) element); } } @Override public void visitAfter(Object element) { // Nothing to do! } /** * @return die eingesammelten Namen der in der Konfiguration verwendeten * Datenquellen. */ public Set<String> getDatasourceNames() { return this.datasourceNames; } private void visitQueryConfig(QueryConfig config) { this.addDataSourceName(config.getDatasource()); } private void visitDatabaseQueryConfig(DatabaseQueryConfig config) { this.addDataSourceName(config.getDatasource()); } private void visitDatabaseTableConfig(DatabaseTableConfig config) { this.addDataSourceName(config.getDatasource()); } private void addDataSourceName(String name) { if (name != null && !name.isEmpty()) { this.datasourceNames.add(name); } } private void visitScriptConfig(ScriptConfig config) { GroovyScript script = config.getValue(); if (script != null && script.getSource() != null) { Matcher datasourceNameFinder = DATASOURCE_NAME_FINDER_PATTERN .matcher(script.getSource()); while (datasourceNameFinder.find()) { this.addDataSourceName(datasourceNameFinder.group(1)); } } } }