X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.support%2Fsrc%2Forg%2Fargeo%2Fslc%2Flib%2Flinux%2Frpmfactory%2FRpmSpecFile.java;fp=org.argeo.slc.support%2Fsrc%2Forg%2Fargeo%2Fslc%2Flib%2Flinux%2Frpmfactory%2FRpmSpecFile.java;h=f2486549cd1279a542e1d9b4ca04a8b1b386b2db;hb=b9505fef5ba8186433e903e9de3c73c17bdf6562;hp=0000000000000000000000000000000000000000;hpb=04ef2e4533e909122a560a5cb6499fa62bac82ec;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.support/src/org/argeo/slc/lib/linux/rpmfactory/RpmSpecFile.java b/org.argeo.slc.support/src/org/argeo/slc/lib/linux/rpmfactory/RpmSpecFile.java new file mode 100644 index 000000000..f2486549c --- /dev/null +++ b/org.argeo.slc.support/src/org/argeo/slc/lib/linux/rpmfactory/RpmSpecFile.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.lib.linux.rpmfactory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.Resource; + +public class RpmSpecFile { + private Resource specFile; + + private String name; + private String version; + private String release; + private Map sources = new HashMap(); + private Map patches = new HashMap(); + + public RpmSpecFile(Resource specFile) { + this.specFile = specFile; + parseSpecFile(); + } + + public void init() { + parseSpecFile(); + } + + @SuppressWarnings("unchecked") + protected void parseSpecFile() { + try { + List lines = (List) IOUtils.readLines(specFile + .getInputStream()); + + 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 Resource 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; + } + +}