package aQute.bnd.make;

import java.io.*;
import java.util.*;
import java.util.regex.*;

import aQute.bnd.build.*;
import aQute.bnd.service.*;
import aQute.lib.osgi.*;

public class MakeBnd implements MakePlugin, Constants {
    final static Pattern JARFILE = Pattern.compile("(.+)\\.(jar|ipa)");

    public Resource make(Builder builder, String destination,
            Map<String, String> argumentsOnMake) throws Exception {
        String type = (String) argumentsOnMake.get("type");
        if (!"bnd".equals(type))
            return null;

        String recipe = (String) argumentsOnMake.get("recipe");
        if (recipe == null) {
            builder.error("No recipe specified on a make instruction for "
                    + destination);
            return null;
        }
        File bndfile = builder.getFile(recipe);
        if (bndfile.isFile()) {
            // We do not use a parent because then we would
            // build ourselves again. So we can not blindly
            // inherit the properties.
            Builder bchild = builder.getSubBuilder();
            bchild.removeBundleSpecificHeaders();
            
            // We must make sure that we do not include ourselves again!
            bchild.setProperty(Analyzer.INCLUDE_RESOURCE, "");
            bchild.setProperty(Analyzer.INCLUDERESOURCE, "");
            bchild.setProperties(bndfile, builder.getBase());
            
            Jar jar = bchild.build();
            Jar dot = builder.getTarget();

            if (builder.hasSources()) {
                for (String key : jar.getResources().keySet()) {
                    if (key.startsWith("OSGI-OPT/src"))
                        dot.putResource(key, (Resource) jar.getResource(key));
                }
            }
            builder.getInfo(bchild, bndfile.getName() +": ");
            String debug = bchild.getProperty(DEBUG);
            if (Processor.isTrue(debug)) {
                if ( builder instanceof ProjectBuilder ) {
                    ProjectBuilder pb = (ProjectBuilder) builder;
                    File target = pb.getProject().getTarget();
                    String bsn = bchild.getBsn();
                    File output = new File(target, bsn+".jar");
                    jar.write(output);
                    pb.getProject().getWorkspace().changedFile(output);
                }
            }
            return new JarResource(jar);
        } else
            return null;
    }

}
