1 package org
.argeo
.slc
.repo
.maven
;
3 import java
.io
.IOException
;
4 import java
.util
.Arrays
;
6 import java
.util
.jar
.Manifest
;
8 import javax
.jcr
.Binary
;
10 import javax
.jcr
.NodeIterator
;
11 import javax
.jcr
.Repository
;
12 import javax
.jcr
.RepositoryException
;
13 import javax
.jcr
.Session
;
14 import javax
.jcr
.query
.QueryManager
;
15 import javax
.jcr
.query
.QueryResult
;
16 import javax
.jcr
.query
.qom
.Ordering
;
17 import javax
.jcr
.query
.qom
.QueryObjectModel
;
18 import javax
.jcr
.query
.qom
.QueryObjectModelFactory
;
19 import javax
.jcr
.query
.qom
.Selector
;
21 import org
.apache
.commons
.logging
.Log
;
22 import org
.apache
.commons
.logging
.LogFactory
;
23 import org
.argeo
.jcr
.JcrUtils
;
24 import org
.argeo
.slc
.SlcException
;
25 import org
.argeo
.slc
.jcr
.SlcNames
;
26 import org
.argeo
.slc
.jcr
.SlcTypes
;
27 import org
.osgi
.framework
.Constants
;
30 * Migrate the distribution from 1.2 to 1.4 by cleaning naming and dependencies.
31 * The dependency to the SpringSource Enterprise Bundle repository is removed as
32 * well as theire naming convention. All third party are move to org.argeo.tp
33 * group IDs. Maven dependency for Eclipse artifacts don't use version ranges
34 * anymore. Verison constraints on javax.* packages are removed (since they lead
35 * to "use package conflicts" when Eclipse and Spring Security are used
38 public class Migration_01_03
implements Runnable
, SlcNames
{
39 private final static Log log
= LogFactory
.getLog(Migration_01_03
.class);
41 private Repository repository
;
42 private String sourceWorkspace
;
43 private String targetWorkspace
;
45 private Session sourceSession
;
46 private Session targetSession
;
48 private List
<String
> systemPackages
;
50 public void init() throws RepositoryException
{
51 sourceSession
= JcrUtils
.loginOrCreateWorkspace(repository
,
53 targetSession
= JcrUtils
.loginOrCreateWorkspace(repository
,
56 // works only in OSGi!!
57 systemPackages
= Arrays
.asList(System
.getProperty(
58 "org.osgi.framework.system.packages").split(","));
61 public void destroy() {
62 JcrUtils
.logoutQuietly(sourceSession
);
63 JcrUtils
.logoutQuietly(targetSession
);
67 log
.debug(System
.getProperty("org.osgi.framework.system.packages"));
69 NodeIterator sourceArtifacts
= listArtifactVersions(sourceSession
);
70 while (sourceArtifacts
.hasNext()) {
71 Node sourceArtifactNode
= sourceArtifacts
.nextNode();
72 if (log
.isTraceEnabled())
73 log
.trace(sourceArtifactNode
);
75 processSourceArtifactVersion(sourceArtifactNode
);
77 } catch (Exception e
) {
78 throw new SlcException("Cannot perform v1.3 migration from "
79 + sourceWorkspace
+ " to " + targetWorkspace
, e
);
83 protected void processSourceArtifactVersion(Node sourceArtifactNode
)
84 throws RepositoryException
, IOException
{
86 String sourceJarNodeName
= sourceArtifactNode
.getProperty(
87 SLC_ARTIFACT_ID
).getString()
89 + sourceArtifactNode
.getProperty(SLC_ARTIFACT_VERSION
)
90 .getString() + ".jar";
91 if (!sourceArtifactNode
.hasNode(sourceJarNodeName
))
92 throw new SlcException("Cannot find jar node for "
93 + sourceArtifactNode
);
94 Node sourceJarNode
= sourceArtifactNode
.getNode(sourceJarNodeName
);
97 Binary manifestBinary
= sourceJarNode
.getProperty(SLC_MANIFEST
)
99 Manifest sourceManifest
= new Manifest(manifestBinary
.getStream());
100 JcrUtils
.closeQuietly(manifestBinary
);
102 Boolean manifestModified
= false;
103 Manifest targetManifest
= new Manifest(sourceManifest
);
105 // transform symbolic name
106 String sourceSymbolicName
= sourceManifest
.getMainAttributes()
107 .getValue(Constants
.BUNDLE_SYMBOLICNAME
);
108 final String SPRING_SOURCE_PREFIX
= "com.springsource";
109 if (sourceSymbolicName
.startsWith(SPRING_SOURCE_PREFIX
)
110 && !sourceSymbolicName
.equals(SPRING_SOURCE_PREFIX
+ ".json")) {
111 String targetSymbolicName
= sourceSymbolicName
112 .substring(SPRING_SOURCE_PREFIX
.length() + 1);
113 if (log
.isDebugEnabled())
114 log
.debug("Renamed " + Constants
.BUNDLE_SYMBOLICNAME
+ " to "
115 + targetSymbolicName
+ " \t\tfrom "
116 + sourceSymbolicName
);
117 targetManifest
.getMainAttributes().putValue(
118 Constants
.BUNDLE_SYMBOLICNAME
, targetSymbolicName
);
119 manifestModified
= true;
122 // check fragment host
123 if (sourceManifest
.getMainAttributes().containsKey(
124 Constants
.FRAGMENT_HOST
)) {
125 String fragmentHost
= sourceManifest
.getMainAttributes().getValue(
126 Constants
.FRAGMENT_HOST
);
127 if (fragmentHost
.startsWith(SPRING_SOURCE_PREFIX
)
128 && !fragmentHost
.equals(SPRING_SOURCE_PREFIX
+ ".json")) {
129 String targetFragmentHost
= sourceSymbolicName
130 .substring(SPRING_SOURCE_PREFIX
.length() + 1);
131 if (log
.isDebugEnabled())
132 log
.debug("Renamed " + Constants
.FRAGMENT_HOST
+ " to "
133 + targetFragmentHost
+ " from " + fragmentHost
);
134 targetManifest
.getMainAttributes().putValue(
135 Constants
.FRAGMENT_HOST
, targetFragmentHost
);
136 manifestModified
= true;
140 // javax with versions
141 StringBuffer targetImportPackages
= new StringBuffer("");
142 NodeIterator sourceImportPackages
= sourceJarNode
.getNodes(SLC_
143 + Constants
.IMPORT_PACKAGE
);
144 Boolean importPackagesModified
= false;
145 while (sourceImportPackages
.hasNext()) {
146 Node importPackage
= sourceImportPackages
.nextNode();
147 String pkg
= importPackage
.getProperty(SLC_NAME
).getString();
148 targetImportPackages
.append(pkg
);
149 if (importPackage
.hasProperty(SLC_VERSION
)) {
150 String sourceVersion
= importPackage
.getProperty(SLC_VERSION
)
152 String targetVersion
= sourceVersion
;
153 if (systemPackages
.contains(pkg
)) {
154 if (!(sourceVersion
.trim().equals("0") || sourceVersion
155 .trim().equals("0.0.0"))) {
157 importPackagesModified
= true;
158 if (log
.isDebugEnabled())
159 log
.debug(sourceSymbolicName
160 + ": Nullify version of " + pkg
+ " from "
164 targetImportPackages
.append(";version=\"")
165 .append(targetVersion
).append("\"");
167 if (importPackage
.hasProperty(SLC_OPTIONAL
)) {
168 Boolean optional
= importPackage
.getProperty(SLC_OPTIONAL
)
171 targetImportPackages
.append(";resolution:=\"optional\"");
174 if (sourceImportPackages
.hasNext())
175 targetImportPackages
.append(",");
178 if (importPackagesModified
) {
179 targetManifest
.getMainAttributes().putValue(
180 Constants
.IMPORT_PACKAGE
, targetImportPackages
.toString());
181 manifestModified
= true;
184 if (!manifestModified
&& log
.isTraceEnabled()) {
185 log
.trace("MANIFEST of " + sourceSymbolicName
+ " was not modified");
193 static NodeIterator
listArtifactVersions(Session session
)
194 throws RepositoryException
{
195 QueryManager queryManager
= session
.getWorkspace().getQueryManager();
196 QueryObjectModelFactory factory
= queryManager
.getQOMFactory();
198 final String artifactVersionsSelector
= "artifactVersions";
199 Selector source
= factory
.selector(SlcTypes
.SLC_ARTIFACT_VERSION_BASE
,
200 artifactVersionsSelector
);
202 Ordering orderByArtifactId
= factory
.ascending(factory
.propertyValue(
203 artifactVersionsSelector
, SlcNames
.SLC_ARTIFACT_ID
));
204 Ordering
[] orderings
= { orderByArtifactId
};
206 QueryObjectModel query
= factory
.createQuery(source
, null, orderings
,
209 QueryResult result
= query
.execute();
210 return result
.getNodes();
213 public void setRepository(Repository repository
) {
214 this.repository
= repository
;
217 public void setSourceWorkspace(String sourceWorkspace
) {
218 this.sourceWorkspace
= sourceWorkspace
;
221 public void setTargetWorkspace(String targetWorkspace
) {
222 this.targetWorkspace
= targetWorkspace
;