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


Reply via email to