DefaultArtifactManager.java
001 /*
002  * Copyright 2009-2012 the original author or authors.
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 
017 package org.codehaus.griffon.runtime.core;
018 
019 import griffon.core.ArtifactInfo;
020 import griffon.core.GriffonApplication;
021 import groovy.util.ConfigObject;
022 import groovy.util.ConfigSlurper;
023 import org.slf4j.Logger;
024 import org.slf4j.LoggerFactory;
025 
026 import java.io.IOException;
027 import java.lang.reflect.Modifier;
028 import java.net.URL;
029 import java.util.*;
030 
031 import static org.codehaus.griffon.runtime.util.GriffonApplicationHelper.loadClass;
032 
033 /**
034  * Default implementation of {@code ArtifactManager}.
035  *
036  @author Andres Almiray
037  @since 0.9.2
038  */
039 public class DefaultArtifactManager extends AbstractArtifactManager {
040     private static final Logger LOG = LoggerFactory.getLogger(DefaultArtifactManager.class);
041 
042     public DefaultArtifactManager(GriffonApplication app) {
043         super(app);
044     }
045 
046     protected Map<String, List<ArtifactInfo>> doLoadArtifactMetadata() {
047         Map<String, List<ArtifactInfo>> artifacts = new LinkedHashMap<String, List<ArtifactInfo>>();
048         try {
049             Enumeration<URL> urls = getApp().getClass().getClassLoader().getResources("META-INF/griffon-artifacts.properties");
050             ConfigSlurper slurper = new ConfigSlurper();
051             while (urls.hasMoreElements()) {
052                 processURL(urls.nextElement(), slurper, artifacts);
053             }
054         catch (IOException e) {
055             throw new IllegalArgumentException(e);
056         }
057 
058         return artifacts;
059     }
060 
061     private void processURL(URL url, ConfigSlurper slurper, Map<String, List<ArtifactInfo>> artifacts) {
062         Properties p = new Properties();
063         try {
064             p.load(url.openStream());
065         catch (IOException e) {
066             return;
067         }
068 
069         ConfigObject config = slurper.parse(p);
070         if (LOG.isDebugEnabled()) {
071             LOG.debug("Loading artifact definitions from " + url);
072         }
073 
074         for (Object key : config.keySet()) {
075             String type = key.toString();
076             String classes = (Stringconfig.get(type);
077             if (classes.startsWith("'"&& classes.endsWith("'")) {
078                 classes = classes.substring(1, classes.length() 1);
079             }
080             String[] classNames = classes.split(",");
081             if (LOG.isDebugEnabled()) {
082                 LOG.debug("Artifacts of type '" + type + "' = " + classNames.length);
083             }
084 
085             List<ArtifactInfo> list = artifacts.get(type);
086             if (list == null) {
087                 list = new ArrayList<ArtifactInfo>();
088                 artifacts.put(type, list);
089             }
090 
091             for (String className : classNames) {
092                 try {
093                     Class clazz = loadClass(className);
094                     if (Modifier.isAbstract(clazz.getModifiers())) continue;
095                     ArtifactInfo info = new ArtifactInfo(clazz, type);
096                     if (!list.contains(info)) list.add(info);
097                 catch (ClassNotFoundException e) {
098                     throw new IllegalArgumentException(e);
099                 }
100             }
101         }
102     }
103 }