Working RPM Factory with proxy.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Jun 2013 20:47:50 +0000 (20:47 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 2 Jun 2013 20:47:50 +0000 (20:47 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6325 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

24 files changed:
demo/log4j.properties
demo/slc_demo_rcp.properties
doc/site/site.xml
modules/org.argeo.slc.server.repo.webapp/WEB-INF/maven-servlet.xml
modules/org.argeo.slc.server.repo.webapp/WEB-INF/osgi.xml
modules/org.argeo.slc.server.repo.webapp/WEB-INF/rpm-servlet.xml [new file with mode: 0644]
modules/org.argeo.slc.server.repo.webapp/WEB-INF/web.xml
modules/org.argeo.slc.server.repo.webapp/pom.xml
modules/org.argeo.slc.server.repo/META-INF/spring/repo-osgi.xml
modules/org.argeo.slc.server.repo/META-INF/spring/services.xml
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/MavenProxyService.java [new file with mode: 0644]
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java [new file with mode: 0644]
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java [deleted file]
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java [deleted file]
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmProxyService.java
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/RpmRepository.java
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java [new file with mode: 0644]
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java [new file with mode: 0644]
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmBuildEnvironment.java [new file with mode: 0644]
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmProxyServiceImpl.java
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java [new file with mode: 0644]
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java [new file with mode: 0644]
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmBuilder.java [deleted file]
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmRepoInit.java [deleted file]

index d89c9579736bc1637aec26ced26ad2342f6adc7b..e062f742129c1d32a2cd7a4a406a94454e40cc86 100644 (file)
@@ -11,7 +11,7 @@ log4j.logger.org.argeo.server.webextender.TomcatDeployer=WARN
 #log4j.logger.org.springframework.security=DEBUG
 #log4j.logger.org.apache.jackrabbit=DEBUG
 #log4j.logger.org.apache.jackrabbit.spi2dav=DEBUG
-log4j.logger.org.apache.jackrabbit.core.query.QueryImpl=DEBUG
+#log4j.logger.org.apache.jackrabbit.core.query.QueryImpl=DEBUG
 
 log4j.logger.org.apache.coyote=INFO
 log4j.logger.org.apache.catalina.core.ContainerBase=INFO
@@ -29,5 +29,5 @@ log4j.appender.console.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss} %-5p %m [%
 # development appender
 log4j.appender.development=org.apache.log4j.ConsoleAppender
 log4j.appender.development.layout=org.apache.log4j.PatternLayout
-#log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%16.16t] %5p %m (%F:%L) %c%n
-log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p %m [%16.16t] %c%n
+log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%16.16t] %5p %m (%F:%L) %c%n
+#log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} %5p %m [%16.16t] %c%n
index 4cc6ad222b8a91e7925d22a3ac753479119771b2..808f43ffe6bd2531967fc5015bd020f6db44ae6d 100644 (file)
@@ -11,6 +11,7 @@ org.argeo.slc.server.repo,\
 argeo.osgi.start.5=org.argeo.server.catalina.start,\
 org.springframework.osgi.web.extender,\
 org.argeo.jackrabbit.webapp,\
+org.argeo.slc.server.repo.webapp,\
 
 slc.executionModules=org.argeo.slc.demo.ant,\
 org.argeo.slc.demo.basic,\
@@ -18,7 +19,6 @@ org.argeo.slc.demo.minimal,\
 
 eclipse.application=org.argeo.slc.client.rcp.application
 org.argeo.security.ui.initialPerspective=org.argeo.slc.client.ui.slcExecutionPerspective
-#org.argeo.security.ui.initialPerspective=org.argeo.slc.client.ui.dist.distributionPerspective
 
 log4j.configuration=file:../../log4j.properties
 
index ec2bd28db388ebdf152dd24efdeaccde6e57d152..aa8ebfd0f533c1984fa4068d486742a6595e08b2 100644 (file)
@@ -26,8 +26,8 @@
                        <item name="Home" href="${project.url}/index.html" />
                        <!--<item name="Getting Started" href="${project.url}/gettingStarted.html" />-->
                        <!--<item name="FAQ" href="${project.url}/faq.html" />-->
-                       <item name="API (Javadoc)" href="${project.url}/apidocs/index.html" target="argeo_slc_javadoc" />
-                       <item name="Browse Code" href="${project.url}/xref/index.html" target="argeo_slc_code" />
+                       <item name="API (Javadoc)" href="${project.url}/apidocs/index.html" />
+                       <item name="Browse Code" href="${project.url}/xref/index.html" />
                        <item name="FIXMEs / TODOs" href="${project.url}/taglist.html" />
                </menu>
                <!--
index 520280804b0e382780a328731ecd217a813f7b69..4ed9eb6bda8a2b3418989e30b50b6fe69839793b 100644 (file)
        </bean>
 
        <bean id="mavenProxyServlet" class="org.argeo.jcr.mvc.ResourceProxyServlet">
-               <property name="jcrSession" ref="jcrSession" />
                <property name="proxy" ref="mavenProxy" />
        </bean>
-
-       <bean id="jcrSession" class="org.argeo.security.jcr.SecureThreadBoundSession">
-               <property name="workspace" value="localrepo" />
-               <property name="repository" ref="jcrRepository" />
-       </bean>
 </beans>
\ No newline at end of file
index d0468b0a39dc18bc8e5c85a25c8a8a4980d2314c..af8b4407ea6a26c5da8fe941662e3c40e35bc4b8 100644 (file)
@@ -8,7 +8,7 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">\r
 \r
-       <!-- REFRENCES -->\r
+       <!-- REFERENCES -->\r
        <!-- Security -->\r
        <reference id="authenticationManager"\r
                interface="org.springframework.security.AuthenticationManager" />\r
@@ -18,6 +18,7 @@
                filter="(argeo.jcr.repository.alias=java)" />\r
 \r
        <!-- Maven -->\r
-       <reference id="mavenProxy" interface="org.argeo.slc.repo.maven.proxy.MavenProxyService" />\r
+       <reference id="mavenProxy" interface="org.argeo.slc.repo.MavenProxyService" />\r
+       <reference id="rpmProxy" interface="org.argeo.slc.rpmfactory.RpmProxyService" />\r
 \r
 </beans:beans>
\ No newline at end of file
diff --git a/modules/org.argeo.slc.server.repo.webapp/WEB-INF/rpm-servlet.xml b/modules/org.argeo.slc.server.repo.webapp/WEB-INF/rpm-servlet.xml
new file mode 100644 (file)
index 0000000..adb909a
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
+       ">
+
+       <bean
+               class="org.springframework.web.servlet.handler.SimpleServletPostProcessor" />
+
+       <bean id="servletHandler"
+               class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />
+
+       <bean id="handlerMapping"
+               class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
+               <property name="mappings">
+                       <props>
+                               <prop key="*">rpmProxyServlet</prop>
+                       </props>
+               </property>
+       </bean>
+
+       <bean id="rpmProxyServlet" class="org.argeo.jcr.mvc.ResourceProxyServlet">
+               <property name="proxy" ref="rpmProxy" />
+       </bean>
+</beans>
\ No newline at end of file
index 3899789d6625e7fbac360944a1198fd9402d41f1..3f58e7dde685e3b86875a5b3e93609bd2f29407f 100644 (file)
@@ -2,9 +2,9 @@
 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-    </welcome-file-list>
+       <welcome-file-list>
+               <welcome-file>index.jsp</welcome-file>
+       </welcome-file-list>
 
        <display-name>Argeo SLC Repo Webapp</display-name>
 
                <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
        </context-param>
 
+       <!-- RPM -->
+       <servlet>
+               <servlet-name>rpm</servlet-name>
+               <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+               <init-param>
+                       <param-name>contextClass</param-name>
+                       <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
+               </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+       <servlet-mapping>
+               <servlet-name>rpm</servlet-name>
+               <url-pattern>/rpm/*</url-pattern>
+       </servlet-mapping>
+
        <!-- Maven -->
-<!--   <servlet> -->
-<!--           <servlet-name>maven</servlet-name> -->
-<!--           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -->
-<!--           <init-param> -->
-<!--                   <param-name>contextClass</param-name> -->
-<!--                   <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value> -->
-<!--           </init-param> -->
-<!--           <load-on-startup>1</load-on-startup> -->
-<!--   </servlet> -->
-<!--   <servlet-mapping> -->
-<!--           <servlet-name>maven</servlet-name> -->
-<!--           <url-pattern>/maven/*</url-pattern> -->
-<!--   </servlet-mapping> -->
+       <!-- <servlet> -->
+       <!-- <servlet-name>maven</servlet-name> -->
+       <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -->
+       <!-- <init-param> -->
+       <!-- <param-name>contextClass</param-name> -->
+       <!-- <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value> -->
+       <!-- </init-param> -->
+       <!-- <load-on-startup>1</load-on-startup> -->
+       <!-- </servlet> -->
+       <!-- <servlet-mapping> -->
+       <!-- <servlet-name>maven</servlet-name> -->
+       <!-- <url-pattern>/maven/*</url-pattern> -->
+       <!-- </servlet-mapping> -->
 
        <!-- Security -->
        <filter>
index 86f5ffbd75136debec9eb424920ff7e639b5f17f..18e399100beee28b2a47a091ac3bda06d60d2f87 100644 (file)
@@ -1,4 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.slc</groupId>
@@ -27,7 +28,8 @@
                                                        org.argeo.security.core,
                                                        org.argeo.security.jcr,
                                                        org.argeo.slc.aether.spring,
-                                                       org.argeo.slc.repo.maven.proxy,
+                                                       org.argeo.slc.repo,
+                                                       org.argeo.slc.rpmfactory,
                                                        org.springframework.osgi.web.context.support,
                                                        org.springframework.security,
                                                        org.springframework.security.context,
index fc2362c89745ea9874216b433d90aa9e77a27aa8..71f7a5d44a4231fb5b68871d6e4f4fea02a7b757 100644 (file)
@@ -12,6 +12,9 @@
        <reference id="authenticationManager"\r
                interface="org.springframework.security.AuthenticationManager" />\r
 \r
+       <set id="defaultRpmRepositories" cardinality="0..N"\r
+               interface="org.argeo.slc.rpmfactory.RpmRepository" />\r
+\r
        <!-- SERVICES -->\r
        <service ref="javaRepository" interface="javax.jcr.Repository">\r
                <service-properties>\r
@@ -34,7 +37,8 @@
                </service-properties>\r
        </service>\r
 \r
-       <service ref="mavenProxyService" interface="org.argeo.slc.repo.maven.proxy.MavenProxyService" />\r
+       <service ref="mavenProxyService" interface="org.argeo.slc.repo.MavenProxyService" />\r
+       <service ref="rpmProxyService" interface="org.argeo.slc.rpmfactory.RpmProxyService" />\r
 \r
        <!-- LABEL -->\r
        <beans:bean class="org.argeo.security.core.OsgiModuleLabel">\r
index 71c2f2a3eb845457c54190541e2da0349299942c..06560aebcc7c47802bc95361ed32a0c3311f04e2 100644 (file)
                </property>
        </bean>
 
-       <bean id="mavenProxyService" class="org.argeo.slc.repo.maven.proxy.MavenProxyServiceImpl"
+       <!--Caching Proxy Services -->
+       <bean id="mavenProxyService" class="org.argeo.slc.repo.maven.MavenProxyServiceImpl"
                init-method="init" destroy-method="destroy">
                <property name="jcrRepository" ref="javaRepository" />
                <property name="defaultRepositories" ref="defaultMavenRepositories" />
        </bean>
 
+       <bean id="rpmProxyService" class="org.argeo.slc.rpmfactory.core.RpmProxyServiceImpl"
+               init-method="init" destroy-method="destroy">
+               <property name="jcrRepository" ref="rpmRepository" />
+               <property name="defaultRepositories" ref="defaultRpmRepositories" />
+       </bean>
+
 </beans>
\ No newline at end of file
diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/MavenProxyService.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/MavenProxyService.java
new file mode 100644 (file)
index 0000000..8df4a53
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * 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.repo;
+
+import org.argeo.jcr.proxy.ResourceProxy;
+
+/** Marker interface (useful for OSGi servcies references), maybe extended later */
+public interface MavenProxyService extends ResourceProxy {
+}
diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenProxyServiceImpl.java
new file mode 100644 (file)
index 0000000..87ee867
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * 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.repo.maven;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.proxy.AbstractUrlProxy;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.MavenProxyService;
+import org.argeo.slc.repo.RepoConstants;
+import org.sonatype.aether.repository.RemoteRepository;
+
+/** Synchronises the node repository with remote Maven repositories */
+public class MavenProxyServiceImpl extends AbstractUrlProxy implements
+               MavenProxyService, ArgeoNames, SlcNames {
+       private final static Log log = LogFactory
+                       .getLog(MavenProxyServiceImpl.class);
+
+       private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
+
+       /** Initialises the artifacts area. */
+       @Override
+       protected void beforeInitSessionSave(Session session)
+                       throws RepositoryException {
+               JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
+               Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
+                               RepoConstants.PROXIED_REPOSITORIES);
+               for (RemoteRepository repository : defaultRepositories) {
+                       if (!proxiedRepositories.hasNode(repository.getId())) {
+                               Node proxiedRepository = proxiedRepositories.addNode(repository
+                                               .getId());
+                               proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
+                               JcrUtils.urlToAddressProperties(proxiedRepository,
+                                               repository.getUrl());
+                               // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
+                               proxiedRepository.setProperty(SLC_TYPE,
+                                               repository.getContentType());
+                       }
+               }
+       }
+
+       /**
+        * Retrieve and add this file to the repository
+        */
+       @Override
+       protected Node retrieve(Session session, String path) {
+               try {
+                       if (session.hasPendingChanges())
+                               throw new SlcException("Session has pending changed");
+                       Node node = null;
+                       for (Node proxiedRepository : getBaseUrls(session)) {
+                               String baseUrl = JcrUtils
+                                               .urlFromAddressProperties(proxiedRepository);
+                               node = proxyUrl(session, baseUrl, path);
+                               if (node != null) {
+                                       node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
+                                       Node origin = node
+                                                       .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
+                                       origin.setProperty(SLC_PROXY, proxiedRepository);
+                                       JcrUtils.urlToAddressProperties(origin, baseUrl + path);
+                                       if (log.isDebugEnabled())
+                                               log.debug("Imported " + baseUrl + path + " to " + node);
+                                       return node;
+                               }
+                       }
+                       if (log.isDebugEnabled())
+                               log.warn("No proxy found for " + path);
+                       return null;
+               } catch (Exception e) {
+                       throw new SlcException("Cannot proxy " + path, e);
+               }
+       }
+
+       protected synchronized List<Node> getBaseUrls(Session session)
+                       throws RepositoryException {
+               List<Node> baseUrls = new ArrayList<Node>();
+               for (NodeIterator nit = session.getNode(
+                               RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
+                       Node proxiedRepository = nit.nextNode();
+                       baseUrls.add(proxiedRepository);
+               }
+               return baseUrls;
+       }
+
+       public void setDefaultRepositories(
+                       List<RemoteRepository> defaultRepositories) {
+               this.defaultRepositories = defaultRepositories;
+       }
+}
diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java
deleted file mode 100644 (file)
index c5f179e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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.repo.maven.proxy;
-
-import org.argeo.jcr.proxy.ResourceProxy;
-
-/** Marker interface (useful for OSGi servcies references), maybe extended later */
-public interface MavenProxyService extends ResourceProxy {
-}
diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java
deleted file mode 100644 (file)
index 5f87f24..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.repo.maven.proxy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.proxy.AbstractUrlProxy;
-import org.argeo.slc.SlcException;
-import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
-import org.argeo.slc.repo.RepoConstants;
-import org.sonatype.aether.repository.RemoteRepository;
-
-/** Synchronizes the node repository with remote Maven repositories */
-public class MavenProxyServiceImpl extends AbstractUrlProxy implements
-               MavenProxyService, ArgeoNames, SlcNames {
-       private final static Log log = LogFactory
-                       .getLog(MavenProxyServiceImpl.class);
-
-       private List<RemoteRepository> defaultRepositories = new ArrayList<RemoteRepository>();
-
-       private String artifactsBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
-
-       /** Inititalizes the artifacts area. */
-       @Override
-       protected void beforeInitSessionSave(Session session)
-                       throws RepositoryException {
-               JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
-               Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
-                               RepoConstants.PROXIED_REPOSITORIES);
-               for (RemoteRepository repository : defaultRepositories) {
-                       if (!proxiedRepositories.hasNode(repository.getId())) {
-                               Node proxiedRepository = proxiedRepositories.addNode(repository
-                                               .getId());
-                               proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
-                               JcrUtils.urlToAddressProperties(proxiedRepository,
-                                               repository.getUrl());
-                               // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
-                               proxiedRepository.setProperty(SLC_TYPE,
-                                               repository.getContentType());
-                       }
-               }
-       }
-
-       /**
-        * Retrieve and add this file to the repository
-        */
-       @Override
-       protected Node retrieve(Session session, String path) {
-               try {
-                       if (session.hasPendingChanges())
-                               throw new SlcException("Session has pending changed");
-                       Node node = null;
-                       for (Node proxiedRepository : getBaseUrls(session)) {
-                               String baseUrl = JcrUtils
-                                               .urlFromAddressProperties(proxiedRepository);
-                               node = proxyUrl(session, baseUrl, path);
-                               if (node != null) {
-                                       node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
-                                       Node origin = node
-                                                       .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
-                                       origin.setProperty(SLC_PROXY, proxiedRepository);
-                                       JcrUtils.urlToAddressProperties(origin, baseUrl + path);
-                                       if (log.isDebugEnabled())
-                                               log.debug("Imported " + baseUrl + path + " to " + node);
-                                       return node;
-                               }
-                       }
-                       if (log.isDebugEnabled())
-                               log.warn("No proxy found for " + path);
-                       return null;
-               } catch (Exception e) {
-                       throw new SlcException("Cannot proxy " + path, e);
-               }
-       }
-
-       protected synchronized List<Node> getBaseUrls(Session session)
-                       throws RepositoryException {
-               List<Node> baseUrls = new ArrayList<Node>();
-               for (NodeIterator nit = session.getNode(
-                               RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
-                       Node proxiedRepository = nit.nextNode();
-                       baseUrls.add(proxiedRepository);
-               }
-               return baseUrls;
-       }
-
-       /** The JCR path where this file could be found */
-       public String getNodePath(String path) {
-               if (artifactsBasePath.equals(RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH))
-                       return path;
-               else
-                       return artifactsBasePath + path;
-       }
-
-       public void setDefaultRepositories(
-                       List<RemoteRepository> defaultRepositories) {
-               this.defaultRepositories = defaultRepositories;
-       }
-
-       public void setArtifactsBasePath(String artifactsBasePath) {
-               this.artifactsBasePath = artifactsBasePath;
-       }
-
-}
index bd59838ee927afe9c8af5deb4334bfb4b3172a89..8f86253b691a6a3dcc54bd58634fe81c03e7d472 100644 (file)
@@ -17,6 +17,6 @@ package org.argeo.slc.rpmfactory;
 
 import org.argeo.jcr.proxy.ResourceProxy;
 
-/** Marker interface (useful for OSGi servcies references), maybe extended later */
+/** Marker interface (useful for OSGi services references), may be extended later */
 public interface RpmProxyService extends ResourceProxy {
 }
index d15940bccc47d4ed092c9d799bf2b922438a822f..24d7c727c581fd4a273dbb6dc63042d115274d01 100644 (file)
@@ -1,5 +1,6 @@
 package org.argeo.slc.rpmfactory;
 
+/** A YUM compatible repository of RPM packages. */
 public interface RpmRepository {
        public String getId();
 
diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/AbstractRpmRepository.java
new file mode 100644 (file)
index 0000000..19418b6
--- /dev/null
@@ -0,0 +1,28 @@
+package org.argeo.slc.rpmfactory.core;
+
+import org.argeo.slc.rpmfactory.RpmRepository;
+
+/** Common method to RPM repositories. */
+public abstract class AbstractRpmRepository implements RpmRepository {
+       private String id;
+       private String url;
+
+       @Override
+       public String getId() {
+               return id;
+       }
+
+       @Override
+       public String getUrl() {
+               return url;
+       }
+
+       public void setId(String id) {
+               this.id = id;
+       }
+
+       public void setUrl(String url) {
+               this.url = url;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java
new file mode 100644 (file)
index 0000000..a085a9d
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * 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.rpmfactory.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.exec.Executor;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.core.execution.tasks.SystemCall;
+
+/** Rebuild an SRPM in mock. (Historical) Replaces the build-mock.sh script. */
+public class BuildInMock implements Runnable {
+       private final static Log log = LogFactory.getLog(BuildInMock.class);
+
+       /** Mock flavour provided by the EPEL repository */
+       public final static String EPEL = "EPEL";
+       /** Mock flavour provided by CentOS until v5 */
+       public final static String CENTOS = "CENTOS";
+
+       public final static String NOARCH = "noarch";
+
+       private String mockVar = "/var/lib/mock";
+
+       private String mockFlavour = EPEL;
+       private String mockConfig = null;
+
+       private String repository;
+       private String release = null;
+       private String level = null;
+       private String arch = NOARCH;
+
+       private String rpmPackage = null;
+
+       private Boolean mkdirs = true;
+
+       private RpmBuildEnvironment buildEnvironment;
+       private Executor executor;
+
+       private String debuginfoDirName = "debuginfo";
+
+       public void run() {
+               // TODO check if caller is in mock group
+
+               String cfgId = repository + "-" + release + "-" + arch;
+               String cfg = mockConfig != null ? mockConfig : "slc/" + cfgId;
+
+               // prepare mock call
+               SystemCall mock = new SystemCall();
+               if (arch != null)
+                       mock.arg("setarch").arg(arch);
+               mock.arg("mock");
+               if (mockFlavour.equals(EPEL))
+                       mock.arg("-v");
+               else if (mockFlavour.equals(CENTOS))
+                       mock.arg("--debug");
+               if (arch != null)
+                       mock.arg("--arch=" + arch);
+               mock.arg("-r").arg(cfg);
+
+               mock.arg("--scm-enable");
+               mock.arg("--scm-option").arg("package=" + rpmPackage);
+
+               mock.setLogCommand(true);
+
+               // mock command execution
+               mock.setExecutor(executor);
+               mock.run();
+
+               // File repoDir = new File(buildEnvironment.getStagingBase() + "/"
+               // + repository + "/" + level + "/" + release);
+               File repoDir = new File(buildEnvironment.getStagingBase() + "/"
+                               + repository + "-" + release + "-staging");
+               File srpmDir = new File(repoDir, "SRPMS");
+               if (mkdirs)
+                       srpmDir.mkdirs();
+               File archDir = null;
+               File debuginfoDir = null;
+               if (!arch.equals(NOARCH)) {
+                       archDir = new File(repoDir, arch);
+                       debuginfoDir = new File(archDir, debuginfoDirName);
+                       debuginfoDir.mkdirs();
+               }
+
+               // copy RPMs
+               Set<File> reposToRecreate = new HashSet<File>();
+               File resultDir = new File(mockVar + "/" + cfgId + "/result");
+               rpms: for (File file : resultDir.listFiles()) {
+                       if (file.isDirectory())
+                               continue rpms;
+
+                       File[] targetDirs;
+                       if (file.getName().contains(".src.rpm"))
+                               targetDirs = new File[] { srpmDir };
+                       else if (file.getName().contains("-debuginfo-"))
+                               targetDirs = new File[] { debuginfoDir };
+                       else if (!arch.equals(NOARCH)
+                                       && file.getName().contains("." + arch + ".rpm"))
+                               targetDirs = new File[] { archDir };
+                       else if (file.getName().contains(".noarch.rpm")) {
+                               List<File> dirs = new ArrayList<File>();
+                               for (String arch : buildEnvironment.getArchs())
+                                       dirs.add(new File(repoDir, arch));
+                               targetDirs = dirs.toArray(new File[dirs.size()]);
+                       } else if (file.getName().contains(".rpm"))
+                               throw new SlcException("Don't know where to copy " + file);
+                       else {
+                               if (log.isTraceEnabled())
+                                       log.trace("Skip " + file);
+                               continue rpms;
+                       }
+
+                       reposToRecreate.addAll(Arrays.asList(targetDirs));
+                       copyToDirs(file, targetDirs);
+               }
+
+               // recreate changed repos
+               for (File repoToRecreate : reposToRecreate) {
+                       SystemCall createrepo = new SystemCall();
+                       createrepo.arg("createrepo");
+                       // sqllite db
+                       createrepo.arg("-d");
+                       // debuginfo
+                       if (!repoToRecreate.getName().equals(debuginfoDirName))
+                               createrepo.arg("-x").arg(debuginfoDirName + "/*");
+                       // quiet
+                       createrepo.arg("-q");
+                       createrepo.arg(repoToRecreate.getAbsolutePath());
+
+                       createrepo.setExecutor(executor);
+                       createrepo.run();
+                       log.info("Updated repo " + repoToRecreate);
+               }
+       }
+
+       protected void copyToDirs(File file, File[] dirs) {
+               for (File dir : dirs) {
+                       try {
+                               FileUtils.copyFileToDirectory(file, dir);
+                               if (log.isDebugEnabled())
+                                       log.debug(file + " => " + dir);
+                       } catch (IOException e) {
+                               throw new SlcException("Cannot copy " + file + " to " + dir, e);
+                       }
+               }
+       }
+
+       public void setMockFlavour(String mockFlavour) {
+               this.mockFlavour = mockFlavour;
+       }
+
+       public void setMockConfig(String mockConfig) {
+               this.mockConfig = mockConfig;
+       }
+
+       public void setRepository(String repo) {
+               this.repository = repo;
+       }
+
+       public void setRelease(String release) {
+               this.release = release;
+       }
+
+       public void setLevel(String level) {
+               this.level = level;
+       }
+
+       public void setArch(String arch) {
+               this.arch = arch;
+       }
+
+       public void setRpmPackage(String rpmPackage) {
+               this.rpmPackage = rpmPackage;
+       }
+
+       public void setMockVar(String mockVar) {
+               this.mockVar = mockVar;
+       }
+
+       public void setMkdirs(Boolean mkdirs) {
+               this.mkdirs = mkdirs;
+       }
+
+       public void setBuildEnvironment(RpmBuildEnvironment buildEnvironment) {
+               this.buildEnvironment = buildEnvironment;
+       }
+
+       public void setExecutor(Executor executor) {
+               this.executor = executor;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmBuildEnvironment.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmBuildEnvironment.java
new file mode 100644 (file)
index 0000000..ebdf1de
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * 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.rpmfactory.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+import org.argeo.slc.SlcException;
+
+/**
+ * Defines a build environment. This information is typically used by other
+ * components performing the various actions related to RPM build.
+ */
+public class RpmBuildEnvironment {
+       static String defaultMacroFiles = "/usr/lib/rpm/macros:/usr/lib/rpm/ia32e-linux/macros:/usr/lib/rpm/redhat/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/ia32e-linux/macros:~/.rpmmacros";
+
+       private Map<String, String> rpmmacros = new HashMap<String, String>();
+
+       private List<String> archs = new ArrayList<String>();
+
+       private String stagingBase = "/mnt/slc/repos/rpm";
+
+       /** Write (topdir)/rpmmacros and (topdir)/rpmrc */
+       public void writeRpmbuildConfigFiles(File topdir) {
+               writeRpmbuildConfigFiles(topdir, new File(topdir, "rpmmacros"),
+                               new File(topdir, "rpmrc"));
+       }
+
+       public void writeRpmbuildConfigFiles(File topdir, File rpmmacroFile,
+                       File rpmrcFile) {
+               try {
+                       List<String> macroLines = new ArrayList<String>();
+                       macroLines.add("%_topdir " + topdir.getCanonicalPath());
+                       for (String macroKey : rpmmacros.keySet()) {
+                               macroLines.add(macroKey + " " + rpmmacros.get(macroKey));
+                       }
+                       FileUtils.writeLines(rpmmacroFile, macroLines);
+
+                       List<String> rpmrcLines = new ArrayList<String>();
+                       rpmrcLines.add("include: /usr/lib/rpm/rpmrc");
+                       rpmrcLines.add("macrofiles: " + defaultMacroFiles + ":"
+                                       + rpmmacroFile.getCanonicalPath());
+                       FileUtils.writeLines(rpmrcFile, rpmrcLines);
+               } catch (IOException e) {
+                       throw new SlcException("Cannot write rpmbuild config files", e);
+               }
+
+       }
+
+       public Map<String, String> getRpmmacros() {
+               return rpmmacros;
+       }
+
+       public void setRpmmacros(Map<String, String> rpmmacros) {
+               this.rpmmacros = rpmmacros;
+       }
+
+       public String getDefaultMacroFiles() {
+               return defaultMacroFiles;
+       }
+
+       public void setDefaultMacroFiles(String defaultMacroFiles) {
+               this.defaultMacroFiles = defaultMacroFiles;
+       }
+
+       public void setArchs(List<String> archs) {
+               this.archs = archs;
+       }
+
+       public List<String> getArchs() {
+               return archs;
+       }
+
+       public String getStagingBase() {
+               return stagingBase;
+       }
+
+       public void setStagingBase(String stagingBase) {
+               this.stagingBase = stagingBase;
+       }
+}
index 72958ba0a045437d99e67a54748025ab630c91af..14d399c2743dff3c49a7d012d76ac584ce5a1aec 100644 (file)
  */
 package org.argeo.slc.rpmfactory.core;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -32,98 +30,87 @@ import org.argeo.jcr.proxy.AbstractUrlProxy;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
-import org.argeo.slc.repo.RepoConstants;
 import org.argeo.slc.rpmfactory.RpmProxyService;
 import org.argeo.slc.rpmfactory.RpmRepository;
 
-/** Synchronizes the node repository with remote Maven repositories */
+/** Synchronises the node repository with remote Maven repositories */
 public class RpmProxyServiceImpl extends AbstractUrlProxy implements
                RpmProxyService, ArgeoNames, SlcNames {
-       private final static Log log = LogFactory
-                       .getLog(RpmProxyServiceImpl.class);
+       private final static Log log = LogFactory.getLog(RpmProxyServiceImpl.class);
 
-       private List<RpmRepository> defaultRepositories = new ArrayList<RpmRepository>();
-
-       private String artifactsBasePath = RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH;
-
-       /** Inititalizes the artifacts area. */
-       @Override
-       protected void beforeInitSessionSave(Session session)
-                       throws RepositoryException {
-               JcrUtils.mkdirsSafe(session, RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH);
-               Node proxiedRepositories = JcrUtils.mkdirsSafe(session,
-                               RepoConstants.PROXIED_REPOSITORIES);
-               for (RpmRepository repository : defaultRepositories) {
-                       if (!proxiedRepositories.hasNode(repository.getId())) {
-                               Node proxiedRepository = proxiedRepositories.addNode(repository
-                                               .getId());
-                               proxiedRepository.addMixin(NodeType.MIX_REFERENCEABLE);
-                               JcrUtils.urlToAddressProperties(proxiedRepository,
-                                               repository.getUrl());
-                               // proxiedRepository.setProperty(SLC_URL, repository.getUrl());
-                               // proxiedRepository.setProperty(SLC_TYPE,
-                               // repository.getContentType());
-                       }
-               }
-       }
+       private Set<RpmRepository> defaultRepositories = new HashSet<RpmRepository>();
 
        /**
         * Retrieve and add this file to the repository
         */
        @Override
        protected Node retrieve(Session session, String path) {
+               StringBuilder relativePathBuilder = new StringBuilder();
+               String repoId = extractRepoId(path, relativePathBuilder);
+               String relativePath = relativePathBuilder.toString();
+
+               RpmRepository sourceRepo = null;
+               for (Iterator<RpmRepository> reposIt = defaultRepositories.iterator(); reposIt
+                               .hasNext();) {
+                       RpmRepository rpmRepo = reposIt.next();
+                       if (rpmRepo.getId().equals(repoId)) {
+                               sourceRepo = rpmRepo;
+                               break;
+                       }
+               }
+
+               if (sourceRepo == null)
+                       throw new SlcException("No RPM repository found for " + path);
+
                try {
-                       if (session.hasPendingChanges())
-                               throw new SlcException("Session has pending changed");
-                       Node node = null;
-                       for (Node proxiedRepository : getBaseUrls(session)) {
-                               String baseUrl = JcrUtils
-                                               .urlFromAddressProperties(proxiedRepository);
-                               node = proxyUrl(session, baseUrl, path);
-                               if (node != null) {
-                                       node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
-                                       Node origin = node
-                                                       .addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
-                                       origin.setProperty(SLC_PROXY, proxiedRepository);
-                                       JcrUtils.urlToAddressProperties(origin, baseUrl + path);
-                                       if (log.isDebugEnabled())
-                                               log.debug("Imported " + baseUrl + path + " to " + node);
-                                       return node;
-                               }
+                       // if (session.hasPendingChanges())
+                       // throw new SlcException("Session has pending changed");
+                       String baseUrl = sourceRepo.getUrl();
+                       String remoteUrl = baseUrl + relativePath;
+                       Node node = proxyUrl(session, remoteUrl, path);
+                       if (node != null) {
+                               node.addMixin(SlcTypes.SLC_KNOWN_ORIGIN);
+                               Node origin;
+                               if (!node.hasNode(SLC_ORIGIN))
+                                       origin = node.addNode(SLC_ORIGIN, SlcTypes.SLC_PROXIED);
+                               else
+                                       origin = node.getNode(SLC_ORIGIN);
+                               // origin.setProperty(SLC_PROXY, sourceRepo.getId());
+                               JcrUtils.urlToAddressProperties(origin, remoteUrl);
+
+                               if (log.isDebugEnabled())
+                                       log.debug("Imported " + remoteUrl + " to " + node);
+                               return node;
                        }
-                       if (log.isDebugEnabled())
-                               log.warn("No proxy found for " + path);
-                       return null;
                } catch (Exception e) {
                        throw new SlcException("Cannot proxy " + path, e);
                }
+               JcrUtils.discardQuietly(session);
+               throw new SlcException("No proxy found for " + path);
        }
 
-       protected synchronized List<Node> getBaseUrls(Session session)
-                       throws RepositoryException {
-               List<Node> baseUrls = new ArrayList<Node>();
-               for (NodeIterator nit = session.getNode(
-                               RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit.hasNext();) {
-                       Node proxiedRepository = nit.nextNode();
-                       baseUrls.add(proxiedRepository);
+       /** Returns the first token of the path */
+       protected String extractRepoId(String path, StringBuilder relativePath) {
+               StringBuilder workspace = new StringBuilder();
+               StringBuilder buf = workspace;
+               for (int i = 1; i < path.length(); i++) {
+                       char c = path.charAt(i);
+                       if (c == '/') {
+                               buf = relativePath;
+                       }
+                       buf.append(c);
                }
-               return baseUrls;
+               return workspace.toString();
        }
 
-       /** The JCR path where this file could be found */
-       public String getNodePath(String path) {
-               if (artifactsBasePath.equals(RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH))
-                       return path;
-               else
-                       return artifactsBasePath + path;
+       @Override
+       protected Boolean shouldUpdate(Session clientSession, String nodePath) {
+               if (nodePath.contains("/repodata/"))
+                       return true;
+               return super.shouldUpdate(clientSession, nodePath);
        }
 
-       public void setDefaultRepositories(List<RpmRepository> defaultRepositories) {
+       public void setDefaultRepositories(Set<RpmRepository> defaultRepositories) {
                this.defaultRepositories = defaultRepositories;
        }
-
-       public void setArtifactsBasePath(String artifactsBasePath) {
-               this.artifactsBasePath = artifactsBasePath;
-       }
-
 }
diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmSpecFile.java
new file mode 100644 (file)
index 0000000..4b4db3b
--- /dev/null
@@ -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.rpmfactory.core;
+
+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<String, String> sources = new HashMap<String, String>();
+       private Map<String, String> patches = new HashMap<String, String>();
+
+       public RpmSpecFile(Resource specFile) {
+               this.specFile = specFile;
+               parseSpecFile();
+       }
+
+       public void init() {
+               parseSpecFile();
+       }
+
+       @SuppressWarnings("unchecked")
+       protected void parseSpecFile() {
+               try {
+                       List<String> lines = (List<String>) 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<String, String> getSources() {
+               return sources;
+       }
+
+       public Map<String, String> getPatches() {
+               return patches;
+       }
+
+}
diff --git a/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java b/runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/ThirdPartyRpmRepository.java
new file mode 100644 (file)
index 0000000..3e366e2
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.slc.rpmfactory.core;
+
+/**
+ * A repository of third party RPMs used for the build. RPM used by the builds
+ * will be cached within the system.
+ */
+public class ThirdPartyRpmRepository extends AbstractRpmRepository {
+
+}
diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmBuilder.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmBuilder.java
deleted file mode 100644 (file)
index 613a8c4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 org.freecompany.redline.Builder;
-
-public class RpmBuilder {
-       private Builder builder;
-
-       public void run() {
-       }
-}
diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmRepoInit.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/lib/linux/rpmfactory/RpmRepoInit.java
deleted file mode 100644 (file)
index c920354..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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;
-
-/** Initialize a repository factory. */
-public class RpmRepoInit implements Runnable {
-
-       public void run() {
-               // TODO Auto-generated method stub
-
-       }
-
-}