001    package jp.osdl.jbento2.report;
002    
003    import java.io.BufferedWriter;
004    import java.io.File;
005    import java.io.FileWriter;
006    import java.util.ArrayList;
007    import java.util.Collections;
008    import java.util.Comparator;
009    import java.util.HashMap;
010    import java.util.HashSet;
011    import java.util.Iterator;
012    import java.util.List;
013    import java.util.Map;
014    import java.util.Set;
015    import java.util.regex.Matcher;
016    import java.util.regex.Pattern;
017    
018    import jp.osdl.jbento2.PathUtils;
019    import jp.osdl.jbento2.RegexNameFileFilter;
020    
021    import org.apache.commons.io.FileUtils;
022    import org.apache.commons.io.IOUtils;
023    import org.apache.commons.io.filefilter.FileFilterUtils;
024    import org.apache.velocity.Template;
025    import org.apache.velocity.VelocityContext;
026    import org.apache.velocity.app.Velocity;
027    
028    public class MachineDetailBuilder extends AbstractReportBuilder {
029        public MachineDetailBuilder(File dataDir, File destDir, File destRootDir) {
030            super(dataDir, destDir, destRootDir);
031        }
032    
033        public void execute() throws Exception {
034            buildSampleDetail();
035        }
036    
037        private void buildSampleDetail() throws Exception {
038    
039            List machineNames = getMachineNames();
040    
041            Iterator ite = machineNames.iterator();
042    
043            while (ite.hasNext()) {
044                String machineName = (String) ite.next();
045    
046                VelocityContext context = new VelocityContext();
047    
048                context.put("title", "Resource of " + machineName);
049                context.put("relativeRoot", getRelativeRoot());
050                context.put("relativePath", getRelativePath());
051    
052                Map resources = new HashMap();
053    
054                resources.put("cpu", getResourceImages(machineName
055                        + ".*\\.[uP]\\..*\\.png"));
056                resources.put("mem",
057                        getResourceImages(machineName + ".*\\.r\\.png"));
058                resources.put("swap", getResourceImages(machineName
059                        + ".*\\.W\\..*\\.png"));
060                resources.put("net", getResourceImagesAsTag(machineName
061                        + ".*\\.n(.*)\\.png"));
062                resources.put("gc", getResourceImages(machineName
063                        + ".*\\.gc\\..*\\.png"));
064    
065                context.put("resources", resources);
066    
067                BufferedWriter writer = null;
068                try {
069                    Template template = Velocity
070                            .getTemplate("jp/osdl/jbento2/report/machineDetail.vm");
071    
072                    writer = new BufferedWriter(new FileWriter(new File(
073                            getDestDir(), machineName + ".html")));
074                    template.merge(context, writer);
075                    writer.flush();
076                } finally {
077                    IOUtils.closeQuietly(writer);
078                }
079            }
080    
081        }
082    
083        public List getResourceImages(String regex) {
084            List images = new ArrayList();
085            Iterator ite = FileUtils.iterateFiles(getDataDir(),
086                    new RegexNameFileFilter(regex), FileFilterUtils
087                            .trueFileFilter());
088            while (ite.hasNext()) {
089                File f = (File) ite.next();
090                images.add(PathUtils.calculateRelativePath(getDataDir(), f));
091            }
092    
093            Collections.sort(images);
094            return images;
095        }
096    
097        public List getResourceImagesAsTag(String regex) {
098            List images = new ArrayList();
099            Iterator ite = FileUtils.iterateFiles(getDataDir(),
100                    new RegexNameFileFilter(regex), FileFilterUtils
101                            .trueFileFilter());
102            Pattern pattern = Pattern.compile(regex);
103            while (ite.hasNext()) {
104                File f = (File) ite.next();
105                Matcher matcher = pattern.matcher(f.getName());
106                if (matcher.matches() && matcher.groupCount() > 0) {
107                    Map item = new HashMap();
108                    String tag = matcher.group(1);
109                    item.put("tag", tag);
110                    item.put("img", PathUtils
111                            .calculateRelativePath(getDataDir(), f));
112                    images.add(item);
113                }
114            }
115    
116            Collections.sort(images, new Comparator() {
117                public int compare(Object arg0, Object arg1) {
118                    return ((String) ((Map) arg0).get("tag"))
119                            .compareTo((String) ((Map) arg1).get("tag"));
120                }
121            });
122            return images;
123        }
124    
125        public List getMachineNames() {
126            Set machineNames = new HashSet();
127            String regex = "([^\\.]*)\\..*\\.png";
128            String[] files = getDataDir().list();
129            Pattern pattern = Pattern.compile(regex);
130            for (int i = 0; i < files.length; i++) {
131                Matcher matcher = pattern.matcher(files[i]);
132                if (matcher.matches()) {
133                    machineNames.add(matcher.group(1));
134                }
135            }
136            List result = new ArrayList();
137            result.addAll(machineNames);
138            Collections.sort(result);
139            return result;
140        }
141    }