001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020
021 package org.apache.geronimo.gjndi.binding;
022
023 import java.util.HashMap;
024 import java.util.Map;
025 import java.util.regex.Matcher;
026 import java.util.regex.Pattern;
027
028 import javax.naming.Name;
029 import javax.naming.NamingException;
030
031 import org.apache.commons.logging.Log;
032 import org.apache.commons.logging.LogFactory;
033 import org.apache.geronimo.gbean.AbstractName;
034 import org.apache.geronimo.gbean.AbstractNameQuery;
035 import org.apache.geronimo.gbean.GBeanInfo;
036 import org.apache.geronimo.gbean.GBeanInfoBuilder;
037 import org.apache.geronimo.gjndi.KernelContextGBean;
038 import org.apache.geronimo.kernel.Kernel;
039 import org.apache.geronimo.kernel.repository.Artifact;
040
041 /**
042 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
043 */
044 public class GBeanFormatBinding extends KernelContextGBean {
045 protected static final Log log = LogFactory.getLog(GBeanFormatBinding.class);
046 private static final Pattern PATTERN = Pattern.compile("(\\{)(\\w+)(})");
047
048 protected final String format;
049 protected final Pattern namePattern;
050
051 public GBeanFormatBinding(String format, String namePattern, String nameInNamespace, AbstractNameQuery abstractNameQuery, Kernel kernel) throws NamingException {
052 super(nameInNamespace, abstractNameQuery, kernel);
053 this.format = format;
054 if (namePattern != null && namePattern.length() > 0) {
055 this.namePattern = Pattern.compile(namePattern);
056 } else {
057 this.namePattern = null;
058 }
059 }
060
061 @Override
062 protected Name createBindingName(AbstractName abstractName, Object value) throws NamingException {
063 String name = abstractName.getNameProperty("name");
064 if (namePattern != null) {
065 Matcher matcher = namePattern.matcher(name);
066 if (!matcher.matches()) {
067 return null;
068 }
069 }
070 Map<String, String> map = new HashMap<String, String>(abstractName.getName());
071 Artifact artifact = abstractName.getArtifact();
072 map.put("groupId", artifact.getGroupId());
073 map.put("artifactId", artifact.getArtifactId());
074 map.put("version", artifact.getVersion().toString());
075 map.put("type", artifact.getType());
076 String fullName = format(format, map);
077 return getNameParser().parse(fullName);
078 }
079
080 static String format(String input, Map<String, String> map) {
081 Matcher matcher = PATTERN.matcher(input);
082 StringBuffer buf = new StringBuffer();
083 while (matcher.find()) {
084 String key = matcher.group(2);
085 String value = map.get(key);
086 matcher.appendReplacement(buf, value);
087 }
088 matcher.appendTail(buf);
089 return buf.toString();
090 }
091
092 public static final GBeanInfo GBEAN_INFO;
093
094 static {
095 GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(GBeanFormatBinding.class, KernelContextGBean.GBEAN_INFO, "Context");
096 builder.addAttribute("format", String.class, true);
097 builder.addAttribute("namePattern", String.class, true);
098 builder.setConstructor(new String[]{"format", "namePattern", "nameInNamespace", "abstractNameQuery", "kernel"});
099 GBEAN_INFO = builder.getBeanInfo();
100 }
101
102 public static GBeanInfo getGBeanInfo() {
103 return GBEAN_INFO;
104 }
105
106 }