001    /**
002     * Copyright 2010-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community 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.opensource.org/licenses/ecl2.php
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    package org.codehaus.mojo.license;
017    
018    import java.io.File;
019    import java.net.MalformedURLException;
020    import java.net.URL;
021    import java.text.MessageFormat;
022    import java.util.Comparator;
023    import java.util.List;
024    
025    import org.apache.maven.artifact.Artifact;
026    import org.apache.maven.model.Resource;
027    import org.apache.maven.project.MavenProject;
028    
029    /**
030     * Mojo helper methods.
031     *
032     * @author tchemit <chemit@codelutin.com>
033     * @since 1.0
034     */
035    public class MojoHelper {
036    
037        /**
038         * Add the directory as a resource of the given project.
039         *
040         * @param dir
041         *            the directory to add
042         * @param project
043         *            the project to update
044         * @param includes
045         *            the includes of the resource
046         * @return {@code true} if the resources was added (not already existing)
047         */
048        public static boolean addResourceDir(File dir, MavenProject project, String... includes) {
049            List<?> resources = project.getResources();
050            return addResourceDir(dir, project, resources, includes);
051        }
052    
053        /**
054         * Add the directory as a resource in the given resource list.
055         *
056         * @param dir
057         *            the directory to add
058         * @param project
059         *            the project involved
060         * @param resources
061         *            the list of existing resources
062         * @param includes
063         *            includes of the new resources
064         * @return {@code true} if the resource was added (not already existing)
065         */
066        public static boolean addResourceDir(File dir, MavenProject project, List<?> resources, String... includes) {
067            String newresourceDir = dir.getAbsolutePath();
068            boolean shouldAdd = true;
069            for (Object o : resources) {
070                Resource r = (Resource) o;
071                if (!r.getDirectory().equals(newresourceDir)) {
072                    continue;
073                }
074    
075                for (String i : includes) {
076                    if (!r.getIncludes().contains(i)) {
077                        r.addInclude(i);
078                    }
079                }
080                shouldAdd = false;
081                break;
082            }
083            if (shouldAdd) {
084                Resource r = new Resource();
085                r.setDirectory(newresourceDir);
086                for (String i : includes) {
087                    if (!r.getIncludes().contains(i)) {
088                        r.addInclude(i);
089                    }
090                }
091                project.addResource(r);
092            }
093            return shouldAdd;
094        }
095    
096        public static Comparator<MavenProject> newMavenProjectComparator() {
097            return new Comparator<MavenProject>() {
098                @Override
099                public int compare(MavenProject o1, MavenProject o2) {
100    
101                    String id1 = getArtifactId(o1.getArtifact());
102                    String id2 = getArtifactId(o2.getArtifact());
103                    return id1.compareTo(id2);
104                }
105            };
106    
107        }
108    
109        static final protected double[] timeFactors = { 1000000, 1000, 60, 60, 24 };
110    
111        static final protected String[] timeUnites = { "ns", "ms", "s", "m", "h", "d" };
112    
113        static public String convertTime(long value) {
114            return convert(value, timeFactors, timeUnites);
115        }
116    
117        static public String convert(long value, double[] factors, String[] unites) {
118            long sign = value == 0 ? 1 : value / Math.abs(value);
119            int i = 0;
120            double tmp = Math.abs(value);
121            while (i < factors.length && i < unites.length && tmp > factors[i]) {
122                tmp = tmp / factors[i++];
123            }
124    
125            tmp *= sign;
126            String result;
127            result = MessageFormat.format("{0,number,0.###}{1}", tmp, unites[i]);
128            return result;
129        }
130    
131        /**
132         * suffix a given {@code baseUrl} with the given {@code suffix}
133         *
134         * @param baseUrl
135         *            base url to use
136         * @param suffix
137         *            suffix to add
138         * @return the new url
139         * @throws IllegalArgumentException
140         *             if malformed url.
141         */
142        public static URL getUrl(URL baseUrl, String suffix) throws IllegalArgumentException {
143            String url = baseUrl.toString() + "/" + suffix;
144            try {
145                return new URL(url);
146            } catch (MalformedURLException ex) {
147                throw new IllegalArgumentException("could not obtain url " + url, ex);
148            }
149        }
150    
151        public static String getArtifactId(Artifact artifact) {
152            StringBuilder sb = new StringBuilder();
153            sb.append(artifact.getGroupId());
154            sb.append("--");
155            sb.append(artifact.getArtifactId());
156            sb.append("--");
157            sb.append(artifact.getVersion());
158            return sb.toString();
159        }
160    
161        public static String getArtifactName(MavenProject project) {
162            StringBuilder sb = new StringBuilder();
163            if (project.getName().startsWith("Unnamed -")) {
164    
165                // as in Maven 3, let's use the artifact id
166                sb.append(project.getArtifactId());
167            } else {
168                sb.append(project.getName());
169            }
170            sb.append(" (");
171            sb.append(project.getGroupId());
172            sb.append(":");
173            sb.append(project.getArtifactId());
174            sb.append(":");
175            sb.append(project.getVersion());
176            sb.append(" - ");
177            String url = project.getUrl();
178            sb.append(url == null ? "no url defined" : url);
179            sb.append(")");
180    
181            return sb.toString();
182        }
183    }