Added: felix/trunk/sigil/sigil-builder/site.xml URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/site.xml?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/site.xml (added) +++ felix/trunk/sigil/sigil-builder/site.xml Mon Jul 13 13:25:46 2009 @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +--> +<site> + <category-def name="Sigil" label="Sigil Core"> + <description> + Sigil is an SDK for developing applications to be deployed on the Newton framework (http://newton.codecauldron.org) + </description> + </category-def> +</site>
Added: felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/Feature.java URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/Feature.java?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/Feature.java (added) +++ felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/Feature.java Mon Jul 13 13:25:46 2009 @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.cauldron.sigil.build; + +class Feature { + String id, version, url; + String[] categories; +} Added: felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/FindBundlesTask.java URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/FindBundlesTask.java?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/FindBundlesTask.java (added) +++ felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/FindBundlesTask.java Mon Jul 13 13:25:46 2009 @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.cauldron.sigil.build; + +import java.io.File; +import java.io.FilenameFilter; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.osgi.framework.Version; + +public class FindBundlesTask extends Task { + + private File dir; + private String symbolicName; + private String property; + + public File getDir() { + return dir; + } + + public void setDir(File dir) { + this.dir = dir; + } + + public String getSymbolicName() { + return symbolicName; + } + + public void setSymbolicName(String symbolicName) { + this.symbolicName = symbolicName; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + @Override + public void execute() throws BuildException { + System.out.println("Searching " + dir + " for bundle '" + symbolicName + "'"); + final String prefix = symbolicName + "_"; + String[] files = dir.list(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.startsWith(prefix); + } + }); + if (files == null) + files = new String[0]; + + System.out.println("Found " + files.length + " file(s) starting with " + symbolicName); + + Version highest = null; + for (String filename : files) { + System.out.println("Testing " + filename); + // Drop the prefix + int startIndex = prefix.length(); + + // Drop the ".jar" suffix if present + int endIndex = filename.length(); + if (filename.toLowerCase().endsWith(".jar")) { + endIndex -= 4; + } + + String versionString = filename.substring(startIndex, endIndex); + System.out.println("Version string is '" + versionString + "'"); + + Version version = new Version(versionString); + if (highest == null || version.compareTo(highest) > 0) { + highest = version; + } + } + + if (highest == null) { + throw new BuildException("No matches for symbolic name '" + + symbolicName + "'"); + } + + getProject().setNewProperty(property, highest.toString()); + } + +} Added: felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatureContentHandler.java URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatureContentHandler.java?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatureContentHandler.java (added) +++ felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatureContentHandler.java Mon Jul 13 13:25:46 2009 @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.cauldron.sigil.build; + +import java.util.List; + +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +class SiteInsertFeatureContentHandler implements ContentHandler { + + private final ContentHandler output; + private final List<org.cauldron.sigil.build.Feature> featureList; + + public SiteInsertFeatureContentHandler(ContentHandler output, + List<Feature> featureList) { + this.output = output; + this.featureList = featureList; + } + + public void characters(char[] ch, int start, int length) throws SAXException { + output.characters(ch, start, length); + } + + public void endDocument() throws SAXException { + output.endDocument(); + } + + public void endElement(String uri, String localName, String name) throws SAXException { + output.endElement(uri, localName, name); + } + + public void endPrefixMapping(String prefix) throws SAXException { + output.endPrefixMapping(prefix); + } + + public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { + //output.ignorableWhitespace(ch, start, length); + } + + public void processingInstruction(String target, String data) throws SAXException { + output.processingInstruction(target, data); + } + + public void setDocumentLocator(Locator locator) { + output.setDocumentLocator(locator); + } + + public void skippedEntity(String name) throws SAXException { + output.skippedEntity(name); + } + + public void startDocument() throws SAXException { + output.startDocument(); + } + + public void startElement(String uri, String localName, String name, Attributes atts) + throws SAXException { + output.startElement(uri, localName, name, atts); + + if("site".equals(name)) { + for (Feature feature : featureList) { + AttributesImpl featureAtts = new AttributesImpl(); + featureAtts.addAttribute("", "", "url", "CDATA", feature.url); + featureAtts.addAttribute("", "", "id", "CDATA", feature.id); + featureAtts.addAttribute("", "", "version", "CDATA", feature.version); + output.startElement("", "", "feature", featureAtts); + + for (int i = 0; i < feature.categories.length; i++) { + AttributesImpl categoryAtts = new AttributesImpl(); + categoryAtts.addAttribute("", "", "name", "CDATA", feature.categories[i]); + output.startElement("", "", "category", categoryAtts); + output.endElement("", "", "category"); + } + + output.endElement("", "", "feature"); + } + } + } + + public void startPrefixMapping(String prefix, String uri) throws SAXException { + output.startPrefixMapping(prefix, uri); + } + +} Added: felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatures.java URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatures.java?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatures.java (added) +++ felix/trunk/sigil/sigil-builder/src/org/cauldron/sigil/build/SiteInsertFeatures.java Mon Jul 13 13:25:46 2009 @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.cauldron.sigil.build; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; +import javax.xml.transform.stream.StreamResult; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +public class SiteInsertFeatures extends Task { + + private File siteXmlFile; + private String features; + private String versionPropPrefix; + private String categoryPropPrefix; + + public File getSiteXmlFile() { + return siteXmlFile; + } + public void setSiteXmlFile(File siteXmlFile) { + this.siteXmlFile = siteXmlFile; + } + public String getFeatures() { + return features; + } + public void setFeatures(String features) { + this.features = features; + } + public String getVersionPropPrefix() { + return versionPropPrefix; + } + public void setVersionPropPrefix(String versionPropPrefix) { + this.versionPropPrefix = versionPropPrefix; + } + public String getCategoryPropPrefix() { + return categoryPropPrefix; + } + public void setCategoryPropPrefix(String categoryPropPrefix) { + this.categoryPropPrefix = categoryPropPrefix; + } + + @Override + public void execute() throws BuildException { + Project project = getProject(); + + List<Feature> featureList = new ArrayList<Feature>(); + StringTokenizer tokenizer = new StringTokenizer(features, ","); + while(tokenizer.hasMoreTokens()) { + Feature feature = new Feature(); + feature.id = tokenizer.nextToken().trim(); + + // Find the version property + String versionProp; + if(versionPropPrefix == null) { + versionProp = feature.id; + } else { + versionProp = versionPropPrefix + "." + feature.id; + } + feature.version = project.getProperty(versionProp); + + // Find the categories for this feature + feature.categories = new String[0]; + if(categoryPropPrefix != null) { + String categoriesStr = project.getProperty(categoryPropPrefix + "." + feature.id); + if(categoriesStr != null) { + StringTokenizer categoriesTokenizer = new StringTokenizer(categoriesStr, ","); + feature.categories = new String[categoriesTokenizer.countTokens()]; + for(int i=0; i<feature.categories.length; i++) { + feature.categories[i] = categoriesTokenizer.nextToken(); + } + } + } + + if(feature.version != null) { + feature.url = "features/" + feature.id + "_" + feature.version + ".jar"; + featureList.add(feature); + } else { + System.out.println("Skipping feature " + feature.id); + } + } + + if(!siteXmlFile.isFile()) { + throw new BuildException(siteXmlFile + " does not exist or is not a normal file"); + } + try { + // Generate new XML into a temporary file + File tempFile = File.createTempFile("tmp", ".xml", siteXmlFile.getParentFile()); + tempFile.deleteOnExit(); + + SAXTransformerFactory transformerFactory = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); + TransformerHandler transformerHandler = transformerFactory.newTransformerHandler(); + transformerHandler.setResult(new StreamResult(tempFile)); + + SAXParserFactory parserFactory = SAXParserFactory.newInstance(); + SAXParser parser = parserFactory.newSAXParser(); + + SiteInsertFeatureContentHandler contentHandler = new SiteInsertFeatureContentHandler(transformerHandler, featureList); + + XMLReader reader = parser.getXMLReader(); + reader.setContentHandler(contentHandler); + reader.parse(new InputSource(new FileInputStream(siteXmlFile))); + + // Backup original file + File backup = new File(siteXmlFile.getParentFile(), siteXmlFile.getName() + ".bak"); + copyFile(siteXmlFile, backup); + + // Replace original file + copyFile(tempFile, siteXmlFile); + + } catch (IOException e) { + throw new BuildException(e); + } catch (TransformerConfigurationException e) { + throw new BuildException(e); + } catch (IllegalArgumentException e) { + throw new BuildException(e); + } catch (TransformerFactoryConfigurationError e) { + throw new BuildException(e); + } catch (ParserConfigurationException e) { + throw new BuildException(e); + } catch (SAXException e) { + throw new BuildException(e); + } + } + + private void copyFile(File source, File dest) throws IOException { + FileInputStream in = null; + FileOutputStream out = null; + try { + in = new FileInputStream(source); + out = new FileOutputStream(dest); + + byte[] buffer = new byte[1024]; + + int read; + while((read = in.read(buffer, 0, 1024)) > -1) { + out.write(buffer, 0, read); + } + } finally { + try { if(in != null) in.close(); } catch(IOException e) {} + try { if(out != null) out.close(); } catch(IOException e) {} + } + + } +} Added: felix/trunk/sigil/sigil-builder/template.user.properties URL: http://svn.apache.org/viewvc/felix/trunk/sigil/sigil-builder/template.user.properties?rev=793581&view=auto ============================================================================== --- felix/trunk/sigil/sigil-builder/template.user.properties (added) +++ felix/trunk/sigil/sigil-builder/template.user.properties Mon Jul 13 13:25:46 2009 @@ -0,0 +1,14 @@ +# +source.dir=${basedir}/.. + +# +target.platform=/path/to/target + +# path to eclipse sdk +eclipse.install.dir=/path/to/sdk/eclipse + +# The URL of the Update Site, for insertion into each feature.xml +updateUrl=http://sigil.codecauldron.org/update-site-nightly + +# The path to an Update Site directory on the local filesystem +updateSiteDir=/opt/development/sigil-trunk/update-site-nightly
