X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.rpmfactory%2Fsrc%2Forg%2Fargeo%2Fslc%2Frpmfactory%2Fcore%2FRpmSpecFile.java;fp=org.argeo.slc.rpmfactory%2Fsrc%2Forg%2Fargeo%2Fslc%2Frpmfactory%2Fcore%2FRpmSpecFile.java;h=c9132f93fa85cddd1eb11dc9045ce46498511889;hb=825d60c5348dbe3f5be25b0bccf7bdebfe694219;hp=0000000000000000000000000000000000000000;hpb=5e991fff5cba01858dcc5747a27e637325bc5c8e;p=gpl%2Fargeo-jcr.git diff --git a/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java b/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java new file mode 100644 index 0000000..c9132f9 --- /dev/null +++ b/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/RpmSpecFile.java @@ -0,0 +1,110 @@ +package org.argeo.slc.rpmfactory.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RpmSpecFile { + private Path specFile; + + private String name; + private String version; + private String release; + private Map sources = new HashMap(); + private Map patches = new HashMap(); + + public RpmSpecFile(Path specFile) { + this.specFile = specFile; + parseSpecFile(); + } + + public void init() { + parseSpecFile(); + } + + protected void parseSpecFile() { + try { + List lines = (List) Files.readAllLines(specFile); + + lines: for (String line : lines) { + int indexSemiColon = line.indexOf(':'); + if (indexSemiColon <= 0) + continue lines; + String directive = line.substring(0, indexSemiColon).trim(); + String value = line.substring(indexSemiColon + 1).trim(); + if ("name".equals(directive.toLowerCase())) + name = value; + else if ("version".equals(directive.toLowerCase())) + version = value; + else if ("release".equals(directive.toLowerCase())) + release = value; + else if (directive.toLowerCase().startsWith("source")) + sources.put(directive, interpret(value)); + else if (directive.toLowerCase().startsWith("patch")) + patches.put(directive, interpret(value)); + } + + } catch (IOException e) { + throw new RuntimeException("Cannot parse spec file " + specFile, e); + } + } + + protected String interpret(String value) { + StringBuffer buf = new StringBuffer(value.length()); + StringBuffer currKey = null; + boolean mayBeKey = false; + chars: for (char c : value.toCharArray()) { + if (c == '%') + mayBeKey = true; + else if (c == '{') { + if (mayBeKey) + currKey = new StringBuffer(); + } else if (c == '}') { + if (currKey == null) + continue chars; + String key = currKey.toString(); + if ("name".equals(key.toLowerCase())) + buf.append(name); + else if ("version".equals(key.toLowerCase())) + buf.append(version); + else + buf.append("%{").append(key).append('}'); + currKey = null; + } else { + if (currKey != null) + currKey.append(c); + else + buf.append(c); + } + } + return buf.toString(); + } + + public Path getSpecFile() { + return specFile; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public String getRelease() { + return release; + } + + public Map getSources() { + return sources; + } + + public Map getPatches() { + return patches; + } + +}