[maven-release-plugin] copy for tag maven-bundle-plugin-1.0.5

git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@832334 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
antelder 2009-11-03 08:08:44 +00:00
parent 675a76fbf6
commit 22c1738bc1
21 changed files with 7644 additions and 0 deletions

View file

@ -0,0 +1,205 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

View file

@ -0,0 +1,6 @@
Apache Tuscany Maven Bundle Plugin
Copyright (c) 2005 - 2009 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

View file

@ -0,0 +1,72 @@
A Maven plugin used by the Tuscany SCA project that can build an OSGi bundle for a
project's third-party dependencies, generate a directory containing OSGi bundles
for all the project's module dependencies, and create Eclipse project files
(.project, .classpath etc) to configure the Eclipse PDE environment for a project.
To build, from the top maven-bundle-plugin run maven:
mvn
or once all the dependencies have been downloaded and a succesful build run use:
mvn clean install -o
So as to avoid the Tuscany SCA project using SNAPSHOT dependencies any changes
to this module should be released and the Tuscany SCA project updated to use
the newly released version.
To release this module:
mvn release:prepare
followed by:
mvn release:perform
That will automatically create an SVN tag from the release, update the version
numbers in the pom.xml files in the trunk and tag, and deploy the artifacts to the
staging repository defined by the <deploy.altRepository> in your Maven settings.xml.
While running it will prompt you for the names for the tag, release version etc.
Note: there seem to be issues with having empty folders in the src tree which causes
release:prepare to fail, not sure why but deleting the empty folder fixes the
problem. You can do "mvn release:rollback" to undo a failed release.
In your maven settings.xml file you must have a server defined named "apache.releases",
and a profile named "release". For example:
<servers>
...
<server>
<id>apache.releases</id>
<username>antelder</username>
<privateKey>\ant\id_dsa</privateKey>
<passphrase>xxx</passphrase>
<directoryPermissions>775</directoryPermissions>
<filePermissions>664</filePermissions>
</server>
</servers>
<profiles>
...
<profile>
<id>release</id>
<properties>
<gpg.passphrase>...</gpg.passphrase>
<deploy.altRepository>apache.releases::default::scp://people.apache.org/home/antelder/public_html/tuscany/maven-bundle-plugin-1.0</deploy.altRepository>
</properties>
</profile>
</profiles>
Call a vote to release the module, eg: http://apache.markmail.org/message/6jnlfxbx7uklt5nv
After a successful vote copy the staging artifacts to the live repository, eg:
cp -p -v -R maven-bundle-plugin-1.0/org/apache/tuscany/maven/plugins/ /x1/www/people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/tuscany/maven/plugins

View file

@ -0,0 +1,40 @@
Apache Tuscany Maven Bundle Plugin 1.0.5 Release Notes
======================================================
- Filter out system packages in export from non-bundle jars such as xerces, xalan or saxon to avoid package conflicts.
This now means Tuscany can be used with Apache Felix
Apache Tuscany Maven Bundle Plugin 1.0.4 Release Notes
======================================================
- Add compile dependencies to the .classpath file if it doesn't supply any packages to the OSGi import. This maks this plugin more closer to the mvn eclipse:eclipse behavior.
- Exclude the project itself from the resolution so that it can be built offline
- Add support to include different versions of 3rd party jars into the distribution if it is omitted by a lower version in maven
- Check the partial attr to decide if the bundle needs to be required
- Don't generate Import-Package header for the 3rd party jars so that either local package is used if there are split packages
- Add the option to generate a gateway bundle that aggregates split packages and export them
- Fix svn:eol-style and svn:keywords properties for java/xml files
- Add import statement for the generated MF
- Upgrade to Equinox 3.5
Apache Tuscany Maven Bundle Plugin 1.0.3 Release Notes
======================================================
Apache Tuscany Maven Bundle Plugin 1.0.2 Release Notes
======================================================
Apache Tuscany Maven Bundle Plugin 1.0.1 Release Notes
======================================================
TUSCANY-2877: Introducing a generic Eclipse-BuddyPolicy header for the bundles generated from dependent artifacts would be helpful
TUSCANY-2876: In artifact aggrations, artifactMemebers is misspelled and may lead to error prone configurations
TUSCANY-2873: Wrapping of non-OSGi components creates versions that may makes no-sense
TUSCANY-2872: Maven Bundle Plugin throws NPE when a dependent non-OSGI jar has no manifest
r747530: Use the equinox as the osgi dependency
Apache Tuscany Maven Bundle Plugin 1.0 Release Notes
====================================================
Initial release

View file

@ -0,0 +1,312 @@
<?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.
-->
<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.apache</groupId>
<artifactId>apache</artifactId>
<version>4</version>
</parent>
<groupId>org.apache.tuscany.maven.plugins</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<packaging>maven-plugin</packaging>
<name>Apache Tuscany Maven OSGi Bundle Plugin</name>
<version>1.0.5</version>
<scm>
<connection>scm:svn:http://svn.apache.org/repos/asf/tuscany/maven-plugins/tags/maven-bundle-plugin-1.0.5</connection>
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/tuscany/maven-plugins/tags/maven-bundle-plugin-1.0.5</developerConnection>
<url>scm:svn:https://svn.apache.org/repos/asf/tuscany/maven-plugins/tags/maven-bundle-plugin-1.0.5</url>
</scm>
<distributionManagement>
<repository>
<id>apache.releases</id>
<name>Apache Release Distribution Repository</name>
<url>scp://people.apache.org/www/people.apache.org/repo/m2-ibiblio-rsync-repository</url>
</repository>
<snapshotRepository>
<id>apache.snapshots</id>
<name>Apache Development Snapshot Repository</name>
<url>scp://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
<uniqueVersion>false</uniqueVersion>
</snapshotRepository>
</distributionManagement>
<repositories>
<!-- Apache SNAPSHOT repository for unreleased artifacts -->
<repository>
<id>apache.snapshots</id>
<name>Apache SNAPSHOT Repository</name>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<!-- Tuscany repository to hold artifacts that are not published in the public maven repos -->
<repository>
<id>tuscany.repo</id>
<name>Tuscany Maven 2.x Repository</name>
<url>http://svn.apache.org/repos/asf/tuscany/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- Apache repository for artifacts released by Apache TLP projects -->
<pluginRepository>
<id>apache</id>
<name>Apache Repository</name>
<url>http://people.apache.org/repo/m2-ibiblio-rsync-repository</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<!-- Apache SNAPSHOT repository for unreleased artifacts -->
<pluginRepository>
<id>apache.snapshots</id>
<name>Apache SNAPSHOT Repository</name>
<url>http://people.apache.org/repo/m2-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
<configuration>
<altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
<plugin>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.0-alpha-4</version>
<executions>
<execution>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>deploy</id>
<build>
<defaultGoal>deploy</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>2.0.8</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-settings</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-dependency-tree</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>osgi</artifactId>
<version>3.4.0-v20080605-1900</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>.</directory>
<targetPath>META-INF</targetPath>
<filtering>true</filtering>
<includes>
<include>LICENSE</include>
<include>NOTICE</include>
</includes>
</resource>
</resources>
<pluginManagement>
<plugins>
<!-- compiler plugin configuration -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<!-- jar plugin configuration -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifestEntries>
<Extension-Name>${project.artifactId}</Extension-Name>
<Specification-Title>${name}</Specification-Title>
<Specification-Vendor>The Apache Software Foundation</Specification-Vendor>
<Specification-Version>${version}</Specification-Version>
<Implementation-Title>${name}</Implementation-Title>
<Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
<Implementation-Vendor>The Apache Software Foundation</Implementation-Vendor>
<Implementation-Version>${version}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- surefire plugin configuration -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<includes>
<include>**/*TestCase.java</include>
</includes>
<reportFormat>brief</reportFormat>
<useFile>false</useFile>
<forkMode>once</forkMode>
<argLine>-ea -Xmx256m</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-8</version>
<configuration>
<tagBase>https://svn.apache.org/repos/asf/tuscany/maven-plugins/tags</tagBase>
<useReleaseProfile>false</useReleaseProfile>
<preparationGoals>clean install</preparationGoals>
<goals>deploy</goals>
<arguments>-Prelease,deploy</arguments>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View file

@ -0,0 +1,72 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.artifact.Artifact;
public class ArtifactAggregation {
private String symbolicName;
private String version;
private List<ArtifactMember> artifactMembers = new ArrayList<ArtifactMember>();
private transient List<Artifact> artifacts = new ArrayList<Artifact>();
public List<Artifact> getArtifacts() {
return artifacts;
}
public String getSymbolicName() {
return symbolicName;
}
public void setSymbolicName(String symbolicName) {
this.symbolicName = symbolicName;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public List<ArtifactMember> getArtifactMembers() {
return artifactMembers;
}
public void setArtifactMembers(List<ArtifactMember> artifacts) {
this.artifactMembers = artifacts;
}
public String toString() {
return symbolicName + ";version=\"" + version + "\"\n" + artifactMembers;
}
public boolean matches(Artifact artifact) {
for(ArtifactMember m: artifactMembers) {
if(m.matches(artifact)) {
return true;
}
}
return false;
}
}

View file

@ -0,0 +1,37 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import java.io.File;
/**
*
*/
public class ArtifactManifest extends ArtifactMember {
private File manifestFile;
public File getManifestFile() {
return manifestFile;
}
public void setManifestFile(File manifestFile) {
this.manifestFile = manifestFile;
}
}

View file

@ -0,0 +1,61 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import org.apache.maven.artifact.Artifact;
public class ArtifactMember {
private String groupId;
private String artifactId;
private String version;
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getArtifactId() {
return artifactId;
}
public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String toString() {
return groupId + ":" + artifactId + ":" + version;
}
public boolean matches(Artifact artifact) {
return groupId.equals(artifact.getGroupId()) && (artifactId == null || artifactId.equals("")
|| artifactId.equals("*") || artifactId.equals(artifact.getArtifactId()))
&& (version == null || version.equals("") || version.equals("*") || version.equals(artifact.getVersion()));
}
}

View file

@ -0,0 +1,639 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import static org.osgi.framework.Constants.BUNDLE_CLASSPATH;
import static org.osgi.framework.Constants.BUNDLE_MANIFESTVERSION;
import static org.osgi.framework.Constants.BUNDLE_NAME;
import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME;
import static org.osgi.framework.Constants.BUNDLE_VERSION;
import static org.osgi.framework.Constants.DYNAMICIMPORT_PACKAGE;
import static org.osgi.framework.Constants.EXPORT_PACKAGE;
import static org.osgi.framework.Constants.IMPORT_PACKAGE;
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.eclipse.osgi.framework.internal.core.Constants;
import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
import org.eclipse.osgi.util.ManifestElement;
import org.osgi.framework.Version;
/**
* Common functions used by the plugin.
*
* @version $Rev$ $Date$
*/
public final class BundleUtil {
static final String META_INF_SERVICES = "META-INF.services;partial=true;mandatory:=partial";
private final static Logger logger = Logger.getLogger(BundleUtil.class.getName());
/**
* Returns the name of a bundle, or null if the given file is not a bundle.
*
* @param file
* @return
* @throws IOException
*/
public static String getBundleSymbolicName(File file) throws IOException {
Manifest manifest = getManifest(file);
return getBundleSymbolicName(manifest);
}
static String getBundleSymbolicName(Manifest manifest) {
if (manifest == null) {
return null;
}
String bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME);
if (bundleName == null) {
return bundleName;
}
int sc = bundleName.indexOf(';');
if (sc != -1) {
bundleName = bundleName.substring(0, sc);
}
return bundleName;
}
static Manifest getManifest(File file) throws IOException {
if (!file.exists()) {
return null;
}
Manifest manifest = null;
if (file.isDirectory()) {
File mf = new File(file, "META-INF/MANIFEST.MF");
if (mf.isFile()) {
InputStream is = new FileInputStream(mf);
manifest = new Manifest(new FileInputStream(mf));
is.close();
}
} else {
JarFile jar = new JarFile(file, false);
manifest = jar.getManifest();
jar.close();
}
return manifest;
}
/**
* Generate a Bundle manifest for a set of JAR files.
*
* @param jarFiles
* @param name
* @param symbolicName
* @param version
* @param dir
* @return
* @throws IllegalStateException
*/
static Manifest libraryManifest(Set<File> jarFiles, String name, String symbolicName, String version, String dir)
throws IllegalStateException {
return libraryManifest(jarFiles, name, symbolicName, version, dir, null, null);
}
/**
* Generate a Bundle manifest for a set of JAR files.
*
* @param jarFiles
* @param name
* @param symbolicName
* @param version
* @param dir
* @param buddyPolicy
* @param env
* @return
* @throws IllegalStateException
*/
static Manifest libraryManifest(Set<File> jarFiles, String name, String symbolicName, String version, String dir, String buddyPolicy, String env)
throws IllegalStateException {
try {
// List exported packages and bundle classpath entries
StringBuffer classpath = new StringBuffer();
Set<String> exportedPackages = new HashSet<String>();
for (File jarFile : jarFiles) {
if (!jarFile.exists()) {
logger.warning(jarFile + " doesn't exist.");
continue;
}
addPackages(jarFile, exportedPackages, version);
if (dir != null) {
classpath.append(dir).append("/");
}
classpath.append(jarFile.getName());
classpath.append(",");
}
if (env == null) {
env = "JavaSE-1.6";
}
Set<String> sysPackages = getSystemPackages(env);
// Generate export-package and import-package declarations
StringBuffer exports = new StringBuffer();
StringBuffer imports = new StringBuffer();
Set<String> pkgs = new HashSet<String>();
for (String export : exportedPackages) {
String packageName = packageName(export);
if (!pkgs.contains(packageName) && !sysPackages.contains(packageName)) {
// Add corresponding import declaration
if (!"META-INF.services".equals(packageName)) {
imports.append(export);
imports.append(',');
}
pkgs.add(packageName);
exports.append(export);
exports.append(',');
} else {
logger.warning("Duplicate or system package skipped: " + export);
}
}
// Create a manifest
Manifest manifest = new Manifest();
Attributes attributes = manifest.getMainAttributes();
attributes.putValue("Manifest-Version", "1.0");
attributes.putValue(BUNDLE_MANIFESTVERSION, "2");
attributes.putValue(BUNDLE_SYMBOLICNAME, symbolicName);
attributes.putValue(BUNDLE_NAME, name);
attributes.putValue(BUNDLE_VERSION, version);
// The system bundle has incomplete javax.transaction* packages exported
attributes.putValue(DYNAMICIMPORT_PACKAGE, "javax.transaction;version=\"1.1\",javax.transaction.xa;version=\"1.1\",*");
if (buddyPolicy != null && buddyPolicy.length() > 0){
attributes.putValue("Eclipse-BuddyPolicy", buddyPolicy);
}
if (exports.length() > 1) {
attributes.putValue(EXPORT_PACKAGE, exports.substring(0, exports.length() - 1));
}
/*
if (imports.length() > 1) {
attributes.putValue(IMPORT_PACKAGE, imports.substring(0, imports.length() - 1));
}
*/
if (classpath.length() > 1) {
attributes.putValue(BUNDLE_CLASSPATH, classpath.substring(0, classpath.length() - 1));
}
return manifest;
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* Write a bundle manifest.
*
* @param manifest
* @param out
* @throws IOException
*/
static void write(Manifest manifest, OutputStream out) throws IOException {
DataOutputStream dos = new DataOutputStream(out);
Attributes attributes = manifest.getMainAttributes();
write(attributes, "Manifest-Version", dos);
write(attributes, BUNDLE_MANIFESTVERSION, dos);
write(attributes, BUNDLE_SYMBOLICNAME, dos);
write(attributes, BUNDLE_NAME, dos);
write(attributes, BUNDLE_VERSION, dos);
write(attributes, DYNAMICIMPORT_PACKAGE, dos);
write(attributes, BUNDLE_CLASSPATH, dos);
write(attributes, IMPORT_PACKAGE, dos);
write(attributes, EXPORT_PACKAGE, dos);
write(attributes, "Eclipse-BuddyPolicy", dos);
dos.flush();
}
/**
* Add packages to be exported out of a JAR file.
*
* @param jarFile
* @param packages
* @throws IOException
*/
private static void addPackages(File jarFile, Set<String> packages, String version) throws IOException {
// if (getBundleSymbolicName(jarFile) == null) {
String ver = ";version=" + version;
addAllPackages(jarFile, packages, ver);
// } else {
// addExportedPackages(jarFile, packages);
// }
}
/**
* Write manifest attributes.
*
* @param attributes
* @param key
* @param dos
* @throws IOException
*/
private static void write(Attributes attributes, String key, DataOutputStream dos) throws IOException {
String value = attributes.getValue(key);
if (value == null) {
return;
}
StringBuffer line = new StringBuffer();
line.append(key);
line.append(": ");
line.append(new String(value.getBytes("UTF8")));
line.append("\r\n");
int l = line.length();
if (l > 72) {
for (int i = 70; i < l - 2;) {
line.insert(i, "\r\n ");
i += 72;
l += 3;
}
}
dos.writeBytes(line.toString());
}
/**
* Strip an OSGi export, only retain the package name and version.
*
* @param export
* @return
*/
private static String stripExport(String export) {
int sc = export.indexOf(';');
if (sc == -1) {
return export;
}
String base = export.substring(0, sc);
int v = export.indexOf("version=");
if (v != -1) {
sc = export.indexOf(';', v + 1);
if (sc != -1) {
return base + ";" + export.substring(v, sc);
} else {
return base + ";" + export.substring(v);
}
} else {
return base;
}
}
/**
* Add all the packages out of a JAR.
*
* @param jarFile
* @param packages
* @param version
* @throws IOException
*/
private static void addAllPackages(File jarFile, Set<String> packages, String version) throws IOException {
ZipInputStream is = new ZipInputStream(new FileInputStream(jarFile));
ZipEntry entry;
while ((entry = is.getNextEntry()) != null) {
String entryName = entry.getName();
// Export split packages for META-INF/services
if(entryName.startsWith("META-INF/services/")) {
packages.add(META_INF_SERVICES);
}
if (!entry.isDirectory() && entryName != null
&& entryName.length() > 0
&& !entryName.startsWith(".")
&& entryName.endsWith(".class") // Exclude resources from Export-Package
&& entryName.lastIndexOf("/") > 0
&& Character.isJavaIdentifierStart(entryName.charAt(0))) {
String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.');
if (!pkg.endsWith(".enum")) {
packages.add(pkg + version);
}
}
}
is.close();
}
private static Set<String> getSystemPackages(String env) throws IOException {
Set<String> sysPackages = new HashSet<String>();
InputStream is = BundleUtil.class.getResourceAsStream("/" + env + ".profile");
if (is != null) {
Properties props = new Properties();
props.load(is);
String pkgs = (String)props.get("org.osgi.framework.system.packages");
if (pkgs != null) {
for (String p : pkgs.split(",")) {
sysPackages.add(p.trim());
}
}
}
return sysPackages;
}
/**
* Returns the name of the exported package in the given export.
* @param export
* @return
*/
private static String packageName(String export) {
int sc = export.indexOf(';');
if (sc != -1) {
export = export.substring(0, sc);
}
return export;
}
/**
* Add the packages exported by a bundle.
*
* @param file
* @param packages
* @return
* @throws IOException
*/
public static Set<String> getExportedPackages(File file) throws IOException {
if (!file.exists()) {
return Collections.emptySet();
}
Set<String> packages = new HashSet<String>();
Manifest manifest = getManifest(file);
// Read the export-package declaration and get a list of the packages available in a JAR
String bundleName = null;
String exports = null;
if (manifest != null) {
exports = manifest.getMainAttributes().getValue(EXPORT_PACKAGE);
bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME);
}
if (bundleName == null) {
Set<String> allPackages = new HashSet<String>();
addAllPackages(file, allPackages, "");
for (String p : allPackages) {
packages.add(packageName(p));
}
return packages;
}
packages.addAll(parsePackages(exports));
return packages;
}
public static Set<String> getImportedPackages(File file) throws IOException {
if (!file.exists()) {
return Collections.emptySet();
}
Manifest manifest = getManifest(file);
// Read the export-package declaration and get a list of the packages available in a JAR
String bundleName = null;
String imports = null;
if (manifest != null) {
imports = manifest.getMainAttributes().getValue(IMPORT_PACKAGE);
bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME);
if (imports != null && bundleName != null) {
return parsePackages(imports);
}
}
return Collections.emptySet();
}
private static Set<String> parsePackages(String header) {
if (header == null) {
return Collections.emptySet();
}
Set<String> packages = new HashSet<String>();
// Parse the export-package declaration, and extract the individual packages
StringBuffer buffer = new StringBuffer();
boolean q = false;
for (int i = 0, n = header.length(); i < n; i++) {
char c = header.charAt(i);
if (c == '\"') {
q = !q;
}
if (!q) {
if (c == ',') {
// Add the exported package to the set, after making sure it really exists in
// the JAR
String export = buffer.toString();
packages.add(packageName(export));
buffer = new StringBuffer();
continue;
}
}
buffer.append(c);
}
if (buffer.length() != 0) {
String export = buffer.toString();
packages.add(packageName(export));
}
return packages;
}
/**
* Convert the maven version into OSGi version
* @param mavenVersion
* @return
*/
static String osgiVersion(String mavenVersion) {
ArtifactVersion ver = new OSGIArtifactVersion(mavenVersion);
String qualifer = ver.getQualifier();
if (qualifer != null) {
StringBuffer buf = new StringBuffer(qualifer);
for (int i = 0; i < buf.length(); i++) {
char c = buf.charAt(i);
if (Character.isLetterOrDigit(c) || c == '-' || c == '_') {
// Keep as-is
} else {
buf.setCharAt(i, '_');
}
}
qualifer = buf.toString();
}
Version osgiVersion =
new Version(ver.getMajorVersion(), ver.getMinorVersion(), ver.getIncrementalVersion(), qualifer);
String version = osgiVersion.toString();
return version;
}
private static String J2SE = "J2SE-";
private static String JAVASE = "JavaSE-";
private static String PROFILE_EXT = ".profile";
private static URL findInSystemBundle(String entry) {
ClassLoader loader = BundleUtil.class.getClassLoader();
return loader == null ? ClassLoader.getSystemResource(entry) : loader.getResource(entry);
}
private static URL findNextBestProfile(String javaEdition, Version javaVersion) {
URL result = null;
int minor = javaVersion.getMinor();
do {
result = findInSystemBundle(javaEdition + javaVersion.getMajor() + "." + minor + PROFILE_EXT);
minor = minor - 1;
} while (result == null && minor > 0);
return result;
}
private static Properties findVMProfile(Properties properties) {
Properties result = new Properties();
// Find the VM profile name using J2ME properties
String j2meConfig = properties.getProperty(Constants.J2ME_MICROEDITION_CONFIGURATION);
String j2meProfiles = properties.getProperty(Constants.J2ME_MICROEDITION_PROFILES);
String vmProfile = null;
String javaEdition = null;
Version javaVersion = null;
if (j2meConfig != null && j2meConfig.length() > 0 && j2meProfiles != null && j2meProfiles.length() > 0) {
// save the vmProfile based off of the config and profile
// use the last profile; assuming that is the highest one
String[] j2meProfileList = ManifestElement.getArrayFromList(j2meProfiles, " ");
if (j2meProfileList != null && j2meProfileList.length > 0)
vmProfile = j2meConfig + '_' + j2meProfileList[j2meProfileList.length - 1];
} else {
// No J2ME properties; use J2SE properties
// Note that the CDC spec appears not to require VM implementations to set the
// javax.microedition properties!! So we will try to fall back to the
// java.specification.name property, but this is pretty ridiculous!!
String javaSpecVersion = properties.getProperty("java.specification.version");
// set the profile and EE based off of the java.specification.version
// TODO We assume J2ME Foundation and J2SE here. need to support other profiles J2EE ...
if (javaSpecVersion != null) {
StringTokenizer st = new StringTokenizer(javaSpecVersion, " _-");
javaSpecVersion = st.nextToken();
String javaSpecName = properties.getProperty("java.specification.name");
if ("J2ME Foundation Specification".equals(javaSpecName))
vmProfile = "CDC-" + javaSpecVersion + "_Foundation-" + javaSpecVersion; //$NON-NLS-2$
else {
// look for JavaSE if 1.6 or greater; otherwise look for J2SE
Version v16 = new Version("1.6");
javaEdition = J2SE;
try {
javaVersion = new Version(javaSpecVersion);
if (v16.compareTo(javaVersion) <= 0)
javaEdition = JAVASE;
} catch (IllegalArgumentException e) {
// do nothing
}
vmProfile = javaEdition + javaSpecVersion;
}
}
}
URL url = null;
// check for the java profile property for a url
String propJavaProfile = FrameworkProperties.getProperty(Constants.OSGI_JAVA_PROFILE);
if (propJavaProfile != null)
try {
// we assume a URL
url = new URL(propJavaProfile);
} catch (MalformedURLException e1) {
// try using a relative path in the system bundle
url = findInSystemBundle(propJavaProfile);
}
if (url == null && vmProfile != null) {
// look for a profile in the system bundle based on the vm profile
String javaProfile = vmProfile + PROFILE_EXT;
url = findInSystemBundle(javaProfile);
if (url == null)
url = getNextBestProfile(javaEdition, javaVersion);
}
if (url == null)
// the profile url is still null then use the osgi min profile in OSGi by default
url = findInSystemBundle("OSGi_Minimum-1.1.profile");
if (url != null) {
InputStream in = null;
try {
in = url.openStream();
result.load(new BufferedInputStream(in));
} catch (IOException e) {
// TODO consider logging ...
} finally {
if (in != null)
try {
in.close();
} catch (IOException ee) {
// do nothing
}
}
}
// set the profile name if it does not provide one
if (result.getProperty(Constants.OSGI_JAVA_PROFILE_NAME) == null)
if (vmProfile != null)
result.put(Constants.OSGI_JAVA_PROFILE_NAME, vmProfile.replace('_', '/'));
else
// last resort; default to the absolute minimum profile name for the framework
result.put(Constants.OSGI_JAVA_PROFILE_NAME, "OSGi/Minimum-1.1");
return result;
}
public static void loadVMProfile(Properties properties) {
Properties profileProps = findVMProfile(properties);
String systemExports = properties.getProperty(Constants.OSGI_FRAMEWORK_SYSTEM_PACKAGES);
// set the system exports property using the vm profile; only if the property is not already set
if (systemExports == null) {
systemExports = profileProps.getProperty(Constants.OSGI_FRAMEWORK_SYSTEM_PACKAGES);
if (systemExports != null)
properties.put(Constants.OSGI_FRAMEWORK_SYSTEM_PACKAGES, systemExports);
}
// set the org.osgi.framework.bootdelegation property according to the java profile
String type = properties.getProperty(Constants.OSGI_JAVA_PROFILE_BOOTDELEGATION); // a null value means ignore
String profileBootDelegation = profileProps.getProperty(Constants.OSGI_BOOTDELEGATION);
if (Constants.OSGI_BOOTDELEGATION_OVERRIDE.equals(type)) {
if (profileBootDelegation == null)
properties.remove(Constants.OSGI_BOOTDELEGATION); // override with a null value
else
properties.put(Constants.OSGI_BOOTDELEGATION, profileBootDelegation); // override with the profile value
} else if (Constants.OSGI_BOOTDELEGATION_NONE.equals(type))
properties.remove(Constants.OSGI_BOOTDELEGATION); // remove the bootdelegation property in case it was set
// set the org.osgi.framework.executionenvironment property according to the java profile
if (properties.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT) == null) {
// get the ee from the java profile; if no ee is defined then try the java profile name
String ee =
profileProps.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT, profileProps
.getProperty(Constants.OSGI_JAVA_PROFILE_NAME));
if (ee != null)
properties.put(Constants.FRAMEWORK_EXECUTIONENVIRONMENT, ee);
}
}
private static URL getNextBestProfile(String javaEdition, Version javaVersion) {
if (javaVersion == null || (javaEdition != J2SE && javaEdition != JAVASE))
return null; // we cannot automatically choose the next best profile unless this is a J2SE or JavaSE vm
URL bestProfile = findNextBestProfile(javaEdition, javaVersion);
if (bestProfile == null && javaEdition == JAVASE)
// if this is a JavaSE VM then search for a lower J2SE profile
bestProfile = findNextBestProfile(J2SE, javaVersion);
return bestProfile;
}
}

View file

@ -0,0 +1,219 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import java.util.StringTokenizer;
import org.apache.maven.artifact.versioning.ArtifactVersion;
public class OSGIArtifactVersion implements ArtifactVersion {
private Integer buildNumber;
private Integer incrementalVersion;
private Integer majorVersion;
private Integer minorVersion;
private String qualifier;
private String unparsed;
public OSGIArtifactVersion(String version) {
parseVersion(version);
}
public int compareTo(Object o) {
ArtifactVersion otherVersion = (ArtifactVersion)o;
int result = getMajorVersion() - otherVersion.getMajorVersion();
if (result == 0) {
result = getMinorVersion() - otherVersion.getMinorVersion();
}
if (result == 0) {
result = getIncrementalVersion() - otherVersion.getIncrementalVersion();
}
if (result == 0) {
if (this.qualifier != null) {
String otherQualifier = otherVersion.getQualifier();
if (otherQualifier != null) {
if ((this.qualifier.length() > otherQualifier.length()) && this.qualifier
.startsWith(otherQualifier)) {
// here, the longer one that otherwise match is
// considered older
result = -1;
} else if ((this.qualifier.length() < otherQualifier.length()) && otherQualifier
.startsWith(this.qualifier)) {
// here, the longer one that otherwise match is
// considered older
result = 1;
} else {
result = this.qualifier.compareTo(otherQualifier);
}
} else {
// otherVersion has no qualifier but we do - that's newer
result = -1;
}
} else if (otherVersion.getQualifier() != null) {
// otherVersion has a qualifier but we don't, we're newer
result = 1;
} else {
result = getBuildNumber() - otherVersion.getBuildNumber();
}
}
return result;
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (false == (other instanceof ArtifactVersion)) {
return false;
}
return 0 == compareTo(other);
}
public int getBuildNumber() {
return this.buildNumber != null ? this.buildNumber.intValue() : 0;
}
public int getIncrementalVersion() {
return this.incrementalVersion != null ? this.incrementalVersion.intValue() : 0;
}
public int getMajorVersion() {
return this.majorVersion != null ? this.majorVersion.intValue() : 0;
}
public int getMinorVersion() {
return this.minorVersion != null ? this.minorVersion.intValue() : 0;
}
public String getQualifier() {
return this.qualifier;
}
@Override
public int hashCode() {
int result = 1229;
result = 1223 * result + getMajorVersion();
result = 1223 * result + getMinorVersion();
result = 1223 * result + getIncrementalVersion();
result = 1223 * result + getBuildNumber();
if (null != getQualifier()) {
result = 1223 * result + getQualifier().hashCode();
}
return result;
}
public final void parseVersion(String version) {
this.unparsed = version;
int index = version.indexOf("-");
String part1;
String part2 = null;
if (index < 0) {
part1 = version;
} else {
part1 = version.substring(0, index);
part2 = version.substring(index + 1);
}
if (part2 != null) {
try {
if ((part2.length() == 1) || !part2.startsWith("0")) {
this.buildNumber = Integer.valueOf(part2);
} else {
this.qualifier = part2;
}
} catch (NumberFormatException e) {
this.qualifier = part2;
}
}
if ((part1.indexOf(".") < 0) && !part1.startsWith("0")) {
try {
this.majorVersion = Integer.valueOf(part1);
} catch (NumberFormatException e) {
// qualifier is the whole version, including "-"
this.qualifier = version;
this.buildNumber = null;
}
} else {
StringTokenizer tok = new StringTokenizer(part1, ".");
String s;
if (tok.hasMoreTokens()) {
s = tok.nextToken();
try {
this.majorVersion = Integer.valueOf(s);
if (tok.hasMoreTokens()) {
s = tok.nextToken();
try {
this.minorVersion = Integer.valueOf(s);
if (tok.hasMoreTokens()) {
s = tok.nextToken();
try {
this.incrementalVersion = Integer.valueOf(s);
} catch (NumberFormatException e) {
this.qualifier = s;
}
}
} catch (NumberFormatException e) {
this.qualifier = s;
}
}
} catch (NumberFormatException e) {
this.qualifier = s;
}
}
if (tok.hasMoreTokens()) {
StringBuffer qualifier = new StringBuffer(this.qualifier != null ? this.qualifier : "");
qualifier.append(tok.nextToken());
while (tok.hasMoreTokens()) {
qualifier.append("_");
qualifier.append(tok.nextToken());
}
this.qualifier = qualifier.toString();
}
}
}
@Override
public String toString() {
return this.unparsed;
}
}

View file

@ -0,0 +1,152 @@
/*
* 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.apache.tuscany.maven.bundle.plugin;
import static org.apache.tuscany.maven.bundle.plugin.BundleUtil.write;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.Manifest;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
/**
* A Maven plugin that builds an OSGi bundle for the project's third-party dependencies.
*
* @version $Rev$ $Date$
* @goal assemble-thirdparty-bundle
* @phase generate-resources
* @requiresDependencyResolution test
* @description Build an OSGi bundle for the project's third party dependencies
*/
public class ThirdPartyBundleBuildMojo extends AbstractMojo {
/**
* The project to build the bundle for.
*
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
/**
* The bundle symbolic name
*
* @parameter
*/
private String symbolicName;
public void execute() throws MojoExecutionException {
Log log = getLog();
String projectGroupId = project.getGroupId();
Set<File> jarFiles = new HashSet<File>();
for (Object o : project.getArtifacts()) {
Artifact artifact = (Artifact)o;
if (!(Artifact.SCOPE_COMPILE.equals(artifact.getScope()) || Artifact.SCOPE_RUNTIME.equals(artifact
.getScope()))) {
if (log.isDebugEnabled()) {
log.debug("Skipping artifact: " + artifact);
}
continue;
}
if (!"jar".equals(artifact.getType())) {
continue;
}
if (projectGroupId.equals(artifact.getGroupId())) {
continue;
}
if (log.isDebugEnabled()) {
log.debug("Artifact: " + artifact);
}
String bundleName = null;
try {
bundleName = BundleUtil.getBundleSymbolicName(artifact.getFile());
} catch (IOException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
if (bundleName == null || true) {
if (artifact.getFile().exists()) {
log.info("Adding third party jar: " + artifact);
jarFiles.add(artifact.getFile());
} else {
log.warn("Third party jar not found: " + artifact);
}
}
}
try {
String version = BundleUtil.osgiVersion(project.getVersion());
Manifest mf = BundleUtil.libraryManifest(jarFiles, project.getName(), symbolicName, version, "lib");
File file = new File(project.getBasedir(), "META-INF");
file.mkdir();
file = new File(file, "MANIFEST.MF");
if (log.isDebugEnabled()) {
log.debug("Generating " + file);
}
FileOutputStream fos = new FileOutputStream(file);
write(mf, fos);
fos.close();
File lib = new File(project.getBasedir(), "lib");
if (lib.isDirectory()) {
for (File c : lib.listFiles()) {
c.delete();
}
}
lib.mkdir();
byte[] buf = new byte[4096];
for (File jar : jarFiles) {
File jarFile = new File(lib, jar.getName());
if (log.isDebugEnabled()) {
log.debug("Copying " + jar + " to " + jarFile);
}
FileInputStream in = new FileInputStream(jar);
FileOutputStream out = new FileOutputStream(jarFile);
for (;;) {
int len = in.read(buf);
if (len > 0) {
out.write(buf, 0, len);
} else {
break;
}
}
in.close();
out.close();
}
} catch (Exception e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
}

View file

@ -0,0 +1,635 @@
/*
* 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.apache.tuscany.maven.plugin.eclipse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.eclipse.Constants;
import org.apache.maven.plugin.eclipse.EclipseSourceDir;
import org.apache.maven.plugin.eclipse.Messages;
import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
import org.apache.maven.plugin.ide.IdeDependency;
import org.apache.maven.plugin.ide.IdeUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
import org.codehaus.plexus.util.xml.XMLWriter;
/**
* Writes eclipse .classpath file.
*
* @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
* @author <a href="mailto:kenney@neonics.com">Kenney Westerhof</a>
* @author <a href="mailto:fgiust@apache.org">Fabrizio Giustina</a>
* @version $Id: EclipseClasspathWriter.java 750073 2009-03-04 16:55:01Z aheritier $
*/
public class EclipseClasspathWriter
extends AbstractEclipseWriter
{
/**
*
*/
private static final String ORG_ECLIPSE_AJDT_INPATH = "org.eclipse.ajdt.inpath";
/**
*
*/
private static final String ORG_ECLIPSE_AJDT_ASPECTPATH = "org.eclipse.ajdt.aspectpath";
/**
*
*/
private static final String NAME = "name";
/**
*
*/
private static final String VALUE = "value";
/**
*
*/
private static final String ATTRIBUTE = "attribute";
/**
*
*/
private static final String ATTRIBUTES = "attributes";
/**
* Eclipse build path variable M2_REPO
*/
protected static final String M2_REPO = "M2_REPO"; //$NON-NLS-1$
/**
* Attribute for sourcepath.
*/
private static final String ATTR_SOURCEPATH = "sourcepath"; //$NON-NLS-1$
/**
* Attribute for output.
*/
private static final String ATTR_OUTPUT = "output"; //$NON-NLS-1$
/**
* Attribute for path.
*/
private static final String ATTR_PATH = "path"; //$NON-NLS-1$
/**
* Attribute for kind - Container (con), Variable (var)..etc.
*/
private static final String ATTR_KIND = "kind"; //$NON-NLS-1$
/**
* Attribute value for kind: var
*/
private static final String ATTR_VAR = "var"; //$NON-NLS-1$
/**
* Attribute value for kind: lib
*/
private static final String ATTR_LIB = "lib"; //$NON-NLS-1$
/**
* Attribute value for kind: src
*/
private static final String ATTR_SRC = "src"; //$NON-NLS-1$
/**
* Attribute name for source file includes in a path.
*/
private static final String ATTR_INCLUDING = "including";
/**
* Attribute name for source file excludes in a path.
*/
private static final String ATTR_EXCLUDING = "excluding";
/**
* Element for classpathentry.
*/
private static final String ELT_CLASSPATHENTRY = "classpathentry"; //$NON-NLS-1$
/**
* Element for classpath.
*/
private static final String ELT_CLASSPATH = "classpath"; //$NON-NLS-1$
/**
* File name that stores project classpath settings.
*/
private static final String FILE_DOT_CLASSPATH = ".classpath"; //$NON-NLS-1$
/**
* @see org.apache.maven.plugin.eclipse.writers.EclipseWriter#write()
*/
public void write()
throws MojoExecutionException
{
Writer w;
try
{
w =
new OutputStreamWriter( new FileOutputStream( new File( config.getEclipseProjectDirectory(),
FILE_DOT_CLASSPATH ) ), "UTF-8" );
}
catch ( IOException ex )
{
throw new MojoExecutionException( Messages.getString( "EclipsePlugin.erroropeningfile" ), ex ); //$NON-NLS-1$
}
XMLWriter writer = new PrettyPrintXMLWriter( w );
writer.startElement( ELT_CLASSPATH );
String defaultOutput =
IdeUtils.toRelativeAndFixSeparator( config.getProjectBaseDir(), config.getBuildOutputDirectory(), false );
// ----------------------------------------------------------------------
// Source roots and resources
// ----------------------------------------------------------------------
// List<EclipseSourceDir>
List specialSources = new ArrayList();
// Map<String,List<EclipseSourceDir>>
Map byOutputDir = new HashMap();
for ( int j = 0; j < config.getSourceDirs().length; j++ )
{
EclipseSourceDir dir = config.getSourceDirs()[j];
// List<EclipseSourceDir>
List byOutputDirs = (List) byOutputDir.get( dir.getOutput() );
if ( byOutputDirs == null )
{
// ArrayList<EclipseSourceDir>
byOutputDir.put( dir.getOutput() == null ? defaultOutput : dir.getOutput(), byOutputDirs =
new ArrayList() );
}
byOutputDirs.add( dir );
}
for ( int j = 0; j < config.getSourceDirs().length; j++ )
{
EclipseSourceDir dir = config.getSourceDirs()[j];
log.debug( "Processing " + ( dir.isResource() ? "re" : "" ) + "source " + dir.getPath() + ": output="
+ dir.getOutput() + "; default output=" + defaultOutput );
boolean isSpecial = false;
// handle resource with nested output folders
if ( dir.isResource() )
{
// Check if the output is a subdirectory of the default output,
// and if the default output has any sources that copy there.
if ( dir.getOutput() != null // resource output dir is set
&& !dir.getOutput().equals( defaultOutput ) // output dir is not default target/classes
&& dir.getOutput().startsWith( defaultOutput ) // ... but is nested
&& byOutputDir.get( defaultOutput ) != null // ???
&& !( (List) byOutputDir.get( defaultOutput ) ).isEmpty() // ???
)
{
// do not specify as source since the output will be nested. Instead, mark
// it as a todo, and handle it with a custom build.xml file later.
log.debug( "Marking as special to prevent output folder nesting: " + dir.getPath() + " (output="
+ dir.getOutput() + ")" );
isSpecial = true;
specialSources.add( dir );
}
}
writer.startElement( ELT_CLASSPATHENTRY );
writer.addAttribute( ATTR_KIND, "src" ); //$NON-NLS-1$
writer.addAttribute( ATTR_PATH, dir.getPath() );
if ( !isSpecial && dir.getOutput() != null && !defaultOutput.equals( dir.getOutput() ) )
{
writer.addAttribute( ATTR_OUTPUT, dir.getOutput() );
}
String includes = dir.getInclude();
if ( !dir.isResource() )
{
// automatically include java files only: eclipse doesn't have the concept of a source only directory so it
// will try to include non-java files found in maven source dirs
includes = StringUtils.isEmpty( includes ) ? "**/*.java" : includes + "|**/*.java";
}
if ( StringUtils.isNotEmpty( includes ) )
{
writer.addAttribute( ATTR_INCLUDING, includes );
}
String excludes = dir.getExclude();
if ( dir.isResource() )
{
// automatically exclude java files: eclipse doesn't have the concept of resource directory so it will
// try to compile any java file found in maven resource dirs
excludes = StringUtils.isEmpty( excludes ) ? "**/*.java" : excludes + "|**/*.java";
}
if ( StringUtils.isNotEmpty( excludes ) )
{
writer.addAttribute( ATTR_EXCLUDING, excludes );
}
writer.endElement();
}
/*
// handle the special sources.
if ( !specialSources.isEmpty() )
{
log.info( "Creating maven-eclipse.xml Ant file to handle resources" );
try
{
Writer buildXmlWriter =
new OutputStreamWriter( new FileOutputStream( new File( config.getEclipseProjectDirectory(),
"maven-eclipse.xml" ) ), "UTF-8" );
PrettyPrintXMLWriter buildXmlPrinter = new PrettyPrintXMLWriter( buildXmlWriter );
buildXmlPrinter.startElement( "project" );
buildXmlPrinter.addAttribute( "default", "copy-resources" );
buildXmlPrinter.startElement( "target" );
buildXmlPrinter.addAttribute( NAME, "init" );
// initialize filtering tokens here
buildXmlPrinter.endElement();
buildXmlPrinter.startElement( "target" );
buildXmlPrinter.addAttribute( NAME, "copy-resources" );
buildXmlPrinter.addAttribute( "depends", "init" );
for ( Iterator it = specialSources.iterator(); it.hasNext(); )
{
// TODO: merge source dirs on output path+filtering to reduce
// <copy> tags for speed.
EclipseSourceDir dir = (EclipseSourceDir) it.next();
buildXmlPrinter.startElement( "copy" );
buildXmlPrinter.addAttribute( "todir", dir.getOutput() );
buildXmlPrinter.addAttribute( "filtering", "" + dir.isFiltering() );
buildXmlPrinter.startElement( "fileset" );
buildXmlPrinter.addAttribute( "dir", dir.getPath() );
if ( dir.getInclude() != null )
{
buildXmlPrinter.addAttribute( "includes", dir.getInclude() );
}
if ( dir.getExclude() != null )
{
buildXmlPrinter.addAttribute( "excludes", dir.getExclude() );
}
buildXmlPrinter.endElement();
buildXmlPrinter.endElement();
}
buildXmlPrinter.endElement();
buildXmlPrinter.endElement();
IOUtil.close( buildXmlWriter );
}
catch ( IOException e )
{
throw new MojoExecutionException( "Cannot create " + config.getEclipseProjectDirectory()
+ "/maven-eclipse.xml", e );
}
log.info( "Creating external launcher file" );
// now create the launcher
new EclipseAntExternalLaunchConfigurationWriter().init( log, config, "Maven_Ant_Builder.launch",
"maven-eclipse.xml" ).write();
// finally add it to the project writer.
config.getBuildCommands().add(
new BuildCommand(
"org.eclipse.ui.externaltools.ExternalToolBuilder",
"LaunchConfigHandle",
"<project>/"
+ EclipseLaunchConfigurationWriter.FILE_DOT_EXTERNAL_TOOL_BUILDERS
+ "Maven_Ant_Builder.launch" ) );
}
*/
// ----------------------------------------------------------------------
// The default output
// ----------------------------------------------------------------------
writer.startElement( ELT_CLASSPATHENTRY );
writer.addAttribute( ATTR_KIND, ATTR_OUTPUT );
writer.addAttribute( ATTR_PATH, defaultOutput );
writer.endElement();
Set addedDependencies = new HashSet();
// TODO if (..magic property equals orderDependencies..)
// ----------------------------------------------------------------------
// Java API dependencies that may complete the classpath container so must
// be declared BEFORE so that container access rules don't fail
// ----------------------------------------------------------------------
IdeDependency[] depsToWrite = config.getDepsOrdered();
for ( int j = 0; j < depsToWrite.length; j++ )
{
IdeDependency dep = depsToWrite[j];
if ( dep.isJavaApi() )
{
String depId = getDependencyId( dep );
if ( !addedDependencies.contains( depId ) )
{
addDependency( writer, dep );
addedDependencies.add( depId );
}
}
}
// ----------------------------------------------------------------------
// The dependencies
// ----------------------------------------------------------------------
for ( int j = 0; j < depsToWrite.length; j++ )
{
IdeDependency dep = depsToWrite[j];
if ( dep.isAddedToClasspath() )
{
String depId = getDependencyId( dep );
/* avoid duplicates in the classpath for artifacts with different types (like ejbs or test-jars) */
if ( !addedDependencies.contains( depId ) )
{
addDependency( writer, dep );
addedDependencies.add( depId );
}
}
}
// ----------------------------------------------------------------------
// Container classpath entries
// ----------------------------------------------------------------------
for ( Iterator it = config.getClasspathContainers().iterator(); it.hasNext(); )
{
writer.startElement( ELT_CLASSPATHENTRY );
writer.addAttribute( ATTR_KIND, "con" ); //$NON-NLS-1$
writer.addAttribute( ATTR_PATH, (String) it.next() );
writer.endElement(); // name
}
writer.endElement();
IOUtil.close( w );
}
private String getDependencyId( IdeDependency dep )
{
String depId =
dep.getGroupId() + ":" + dep.getArtifactId() + ":" + dep.getClassifier() + ":" + dep.getVersion();
if ( dep.isReferencedProject() )
{
// This dependency will be refered as an eclipse project
depId = dep.getEclipseProjectName();
}
return depId;
}
protected void addDependency( XMLWriter writer, IdeDependency dep )
throws MojoExecutionException
{
String path;
String kind;
String sourcepath = null;
String javadocpath = null;
// [rfeng] Force to non-PDE mode
boolean pdeMode = false;
if ( dep.isReferencedProject() && !pdeMode )
{
path = "/" + dep.getEclipseProjectName(); //$NON-NLS-1$
kind = ATTR_SRC;
}
else if ( dep.isReferencedProject() && pdeMode )
{
// don't do anything, referenced projects are automatically handled by eclipse in PDE builds
return;
}
else
{
File artifactPath = dep.getFile();
if ( artifactPath == null )
{
log.error( Messages.getString( "EclipsePlugin.artifactpathisnull", dep.getId() ) ); //$NON-NLS-1$
return;
}
if ( dep.isSystemScoped() )
{
path = IdeUtils.toRelativeAndFixSeparator( config.getEclipseProjectDirectory(), artifactPath, false );
if ( log.isDebugEnabled() )
{
log.debug( Messages.getString( "EclipsePlugin.artifactissystemscoped", //$NON-NLS-1$
new Object[] { dep.getArtifactId(), path } ) );
}
kind = ATTR_LIB;
}
else
{
File localRepositoryFile = new File( config.getLocalRepository().getBasedir() );
// if the dependency is not provided and the plugin runs in "pde mode", the dependency is
// added to the Bundle-Classpath:
if ( pdeMode && ( dep.isProvided() || dep.isOsgiBundle() ) )
{
return;
}
else if ( pdeMode && !dep.isProvided() && !dep.isTestDependency() )
{
// path for link created in .project, not to the actual file
path = dep.getFile().getName();
kind = ATTR_LIB;
}
// running in PDE mode and the dependency is provided means, that it is provided by
// the target platform. This case is covered by adding the plugin container
else
{
String fullPath = artifactPath.getPath();
String relativePath =
IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, new File( fullPath ), false );
if ( !new File( relativePath ).isAbsolute() )
{
path = M2_REPO + "/" //$NON-NLS-1$
+ relativePath;
kind = ATTR_VAR; //$NON-NLS-1$
}
else
{
path = relativePath;
kind = ATTR_LIB;
}
}
if ( dep.getSourceAttachment() != null )
{
if ( ATTR_VAR.equals( kind ) )
{
sourcepath =
M2_REPO
+ "/" //$NON-NLS-1$
+ IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, dep.getSourceAttachment(),
false );
}
else
{
// source archive must be referenced with the full path, we can't mix a lib with a variable
sourcepath = IdeUtils.getCanonicalPath( dep.getSourceAttachment() );
}
}
if ( dep.getJavadocAttachment() != null )
{
// NB eclipse (3.1) doesn't support variables in javadoc paths, so we need to add the
// full path for the maven repo
javadocpath =
StringUtils.replace( IdeUtils.getCanonicalPath( dep.getJavadocAttachment() ), "\\", "/" ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
// Skip aspectj libraries since they are in the container.
if ( ( config.getAjdtVersion() != 0 ) && dep.getArtifactId().toLowerCase().startsWith( "aspectj" ) )
{
return;
}
writer.startElement( ELT_CLASSPATHENTRY );
writer.addAttribute( ATTR_KIND, kind );
writer.addAttribute( ATTR_PATH, path );
if ( sourcepath != null )
{
writer.addAttribute( ATTR_SOURCEPATH, sourcepath );
}
boolean attributeElemOpen = false;
if ( javadocpath != null )
{
if ( !attributeElemOpen )
{
writer.startElement( ATTRIBUTES ); //$NON-NLS-1$
attributeElemOpen = true;
}
writer.startElement( ATTRIBUTE ); //$NON-NLS-1$
writer.addAttribute( VALUE, "jar:" + new File( javadocpath ).toURI() + "!/" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
writer.addAttribute( NAME, "javadoc_location" ); //$NON-NLS-1$ //$NON-NLS-2$
writer.endElement();
}
if ( Constants.PROJECT_PACKAGING_WAR.equals( this.config.getPackaging() ) && config.getWtpapplicationxml()
&& kind.equals( ATTR_VAR ) && !dep.isTestDependency() && !dep.isProvided()
&& !dep.isSystemScopedOutsideProject( this.config.getProject() ) )
{
if ( !attributeElemOpen )
{
writer.startElement( ATTRIBUTES ); //$NON-NLS-1$
attributeElemOpen = true;
}
writer.startElement( ATTRIBUTE ); //$NON-NLS-1$
writer.addAttribute( VALUE, "/WEB-INF/lib" ); //$NON-NLS-1$ //$NON-NLS-2$
writer.addAttribute( NAME, "org.eclipse.jst.component.dependency" ); //$NON-NLS-1$ //$NON-NLS-2$
writer.endElement();
}
if ( dep.isAjdtDependency() && ( config.getAjdtVersion() >= 1.5 ) )
{
if ( !attributeElemOpen )
{
writer.startElement( ATTRIBUTES ); //$NON-NLS-1$
attributeElemOpen = true;
}
writer.startElement( ATTRIBUTE ); //$NON-NLS-1$
writer.addAttribute( NAME, ORG_ECLIPSE_AJDT_ASPECTPATH ); //$NON-NLS-1$ //$NON-NLS-2$
writer.addAttribute( VALUE, Boolean.TRUE.toString() ); //$NON-NLS-1$ //$NON-NLS-2$
writer.endElement();
}
if ( dep.isAjdtWeaveDependency() && ( config.getAjdtVersion() >= 1.5 ) )
{
if ( !attributeElemOpen )
{
writer.startElement( ATTRIBUTES ); //$NON-NLS-1$
attributeElemOpen = true;
}
writer.startElement( ATTRIBUTE ); //$NON-NLS-1$
writer.addAttribute( NAME, ORG_ECLIPSE_AJDT_INPATH ); //$NON-NLS-1$ //$NON-NLS-2$
writer.addAttribute( VALUE, Boolean.TRUE.toString() ); //$NON-NLS-1$ //$NON-NLS-2$
writer.endElement();
}
if ( attributeElemOpen )
{
writer.endElement();
}
writer.endElement();
}
}

View file

@ -0,0 +1,208 @@
/*
* 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.apache.tuscany.maven.plugin.eclipse;
import java.io.File;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.eclipse.Constants;
import org.apache.maven.plugin.eclipse.EclipseConfigFile;
import org.apache.maven.plugin.ide.IdeUtils;
/**
* Deletes the .project, .classpath, .wtpmodules files and .settings folder used by Eclipse.
*
* @goal clean
*/
public class EclipseCleanMojo
extends AbstractMojo
{
/**
* Definition file for Eclipse Web Tools project.
*/
private static final String FILE_DOT_WTPMODULES = ".wtpmodules"; //$NON-NLS-1$
/**
* Classpath definition file for an Eclipse Java project.
*/
private static final String FILE_DOT_CLASSPATH = ".classpath"; //$NON-NLS-1$
/**
* Project definition file for an Eclipse Project.
*/
private static final String FILE_DOT_PROJECT = ".project"; //$NON-NLS-1$
/**
* Web Project definition file for Eclipse Web Tools Project (Release 1.0x).
*/
private static final String DIR_DOT_SETTINGS = ".settings"; //$NON-NLS-1$
/**
* File name where the WTP component settings will be stored - WTP 1.0 name.
*/
private static final String FILE_DOT_COMPONENT = ".settings/.component"; //$NON-NLS-1$
/**
* File name where the WTP component settings will be stored - WTP 1.5 name.
*/
private static final String FILE_DOT_COMPONENT_15 = ".settings/org.eclipse.wst.common.component"; //$NON-NLS-1$
/**
* File name where Eclipse Project's Facet configuration will be stored.
*/
private static final String FILE_FACET_CORE_XML = ".settings/org.eclipse.wst.common.project.facet.core.xml"; //$NON-NLS-1$
/**
* General project preferences.
*/
private static final String FILE_ECLIPSE_JDT_CORE_PREFS = ".settings/org.eclipse.jdt.core.prefs"; //$NON-NLS-1$
/**
* AJDT preferences.
*/
private static final String FILE_AJDT_PREFS = ".settings/org.eclipse.ajdt.ui.prefs"; //$NON-NLS-1$
/**
* Packaging for the current project.
*
* @parameter expression="${project.packaging}"
*/
private String packaging;
/**
* The root directory of the project
*
* @parameter expression="${basedir}"
*/
private File basedir;
/**
* Skip the operation when true.
*
* @parameter expression="${eclipse.skip}" default-value="false"
*/
private boolean skip;
/**
* additional generic configuration files for eclipse
*
* @parameter
*/
private EclipseConfigFile[] additionalConfig;
/**
* @see org.apache.maven.plugin.AbstractMojo#execute()
*/
public void execute()
throws MojoExecutionException
{
if ( skip )
{
return;
}
if ( Constants.PROJECT_PACKAGING_POM.equals( this.packaging ) )
{
return;
}
delete( new File( basedir, FILE_DOT_PROJECT ) );
delete( new File( basedir, FILE_DOT_CLASSPATH ) );
delete( new File( basedir, FILE_DOT_WTPMODULES ) );
delete( new File( basedir, FILE_DOT_COMPONENT ) );
delete( new File( basedir, FILE_DOT_COMPONENT_15 ) );
delete( new File( basedir, FILE_FACET_CORE_XML ) );
delete( new File( basedir, FILE_ECLIPSE_JDT_CORE_PREFS ) );
delete( new File( basedir, FILE_AJDT_PREFS ) );
File settingsDir = new File( basedir, DIR_DOT_SETTINGS );
if ( settingsDir.exists() && settingsDir.isDirectory() && settingsDir.list().length == 0 )
{
delete( settingsDir );
}
if ( additionalConfig != null )
{
for ( int i = 0; i < additionalConfig.length; i++ )
{
delete( new File( basedir, additionalConfig[i].getName() ) );
}
}
cleanExtras();
}
protected void cleanExtras()
throws MojoExecutionException
{
// extension point.
}
/**
* Delete a file, handling log messages and exceptions
*
* @param f File to be deleted
* @throws MojoExecutionException only if a file exists and can't be deleted
*/
protected void delete( File f )
throws MojoExecutionException
{
IdeUtils.delete( f, getLog() );
}
/**
* Getter for <code>basedir</code>.
*
* @return Returns the basedir.
*/
public File getBasedir()
{
return this.basedir;
}
/**
* Setter for <code>basedir</code>.
*
* @param basedir The basedir to set.
*/
public void setBasedir( File basedir )
{
this.basedir = basedir;
}
/**
* @return the packaging
*/
public String getPackaging()
{
return this.packaging;
}
/**
* @param packaging the packaging to set
*/
public void setPackaging( String packaging )
{
this.packaging = packaging;
}
}

View file

@ -0,0 +1,357 @@
/*
* 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.apache.tuscany.maven.plugin.eclipse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.eclipse.BuildCommand;
import org.apache.maven.plugin.eclipse.Messages;
import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
import org.apache.maven.plugin.ide.IdeDependency;
import org.apache.maven.plugin.ide.IdeUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
import org.codehaus.plexus.util.xml.XMLWriter;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* Writes eclipse .project file.
*
* @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
* @author <a href="mailto:kenney@neonics.com">Kenney Westerhof</a>
* @author <a href="mailto:fgiust@apache.org">Fabrizio Giustina</a>
* @version $Id: EclipseProjectWriter.java 728546 2008-12-21 22:56:51Z bentmann $
*/
public class EclipseProjectWriter
extends AbstractEclipseWriter
{
private static final String ELT_NAME = "name"; //$NON-NLS-1$
private static final String ELT_BUILD_COMMAND = "buildCommand"; //$NON-NLS-1$
private static final String ELT_BUILD_SPEC = "buildSpec"; //$NON-NLS-1$
private static final String ELT_NATURE = "nature"; //$NON-NLS-1$
private static final String ELT_NATURES = "natures"; //$NON-NLS-1$
private static final String FILE_DOT_PROJECT = ".project"; //$NON-NLS-1$
/**
* Constant for links to files.
*/
private static final int LINK_TYPE_FILE = 1;
/**
* Constant for links to directories.
*/
private static final int LINK_TYPE_DIRECTORY = 2;
/**
* @see org.apache.tuscany.sca.maven.plugin.eclipse.writers.EclipseWriter#write()
*/
public void write()
throws MojoExecutionException
{
Set projectnatures = new LinkedHashSet();
Set buildCommands = new LinkedHashSet();
File dotProject = new File( config.getEclipseProjectDirectory(), FILE_DOT_PROJECT );
if ( dotProject.exists() )
{
log.info( Messages.getString( "EclipsePlugin.keepexisting", dotProject.getAbsolutePath() ) ); //$NON-NLS-1$
// parse existing file in order to keep manually-added entries
Reader reader = null;
try
{
reader = new InputStreamReader( new FileInputStream( dotProject ), "UTF-8" );
Xpp3Dom dom = Xpp3DomBuilder.build( reader );
Xpp3Dom naturesElement = dom.getChild( ELT_NATURES );
if ( naturesElement != null )
{
Xpp3Dom[] existingNatures = naturesElement.getChildren( ELT_NATURE );
for ( int j = 0; j < existingNatures.length; j++ )
{
// adds all the existing natures
projectnatures.add( existingNatures[j].getValue() );
}
}
Xpp3Dom buildSpec = dom.getChild( ELT_BUILD_SPEC );
if ( buildSpec != null )
{
Xpp3Dom[] existingBuildCommands = buildSpec.getChildren( ELT_BUILD_COMMAND );
for ( int j = 0; j < existingBuildCommands.length; j++ )
{
Xpp3Dom buildCommandName = existingBuildCommands[j].getChild( ELT_NAME );
if ( buildCommandName != null )
{
buildCommands.add( new BuildCommand( existingBuildCommands[j] ) );
}
}
}
}
catch ( XmlPullParserException e )
{
log.warn( Messages.getString( "EclipsePlugin.cantparseexisting", dotProject.getAbsolutePath() ) ); //$NON-NLS-1$
}
catch ( IOException e )
{
log.warn( Messages.getString( "EclipsePlugin.cantparseexisting", dotProject.getAbsolutePath() ) ); //$NON-NLS-1$
}
finally
{
IOUtil.close( reader );
}
}
// adds new entries after the existing ones
for ( Iterator iter = config.getProjectnatures().iterator(); iter.hasNext(); )
{
projectnatures.add( iter.next() );
}
for ( Iterator iter = config.getBuildCommands().iterator(); iter.hasNext(); )
{
buildCommands.add( (BuildCommand) iter.next() );
}
Writer w;
try
{
w = new OutputStreamWriter( new FileOutputStream( dotProject ), "UTF-8" );
}
catch ( IOException ex )
{
throw new MojoExecutionException( Messages.getString( "EclipsePlugin.erroropeningfile" ), ex ); //$NON-NLS-1$
}
XMLWriter writer = new PrettyPrintXMLWriter( w );
writer.startElement( "projectDescription" ); //$NON-NLS-1$
writer.startElement( ELT_NAME );
writer.writeText( config.getEclipseProjectName() );
writer.endElement();
// TODO: this entire element might be dropped if the comment is null.
// but as the maven1 eclipse plugin does it, it's better to be safe than sorry
// A eclipse developer might want to look at this.
writer.startElement( "comment" ); //$NON-NLS-1$
if ( config.getProject().getDescription() != null )
{
writer.writeText( config.getProject().getDescription() );
}
writer.endElement();
writer.startElement( "projects" ); //$NON-NLS-1$
// referenced projects should not be added for plugins
if ( !config.isPde() )
{
List duplicates = new ArrayList();
for ( int j = 0; j < config.getDepsOrdered().length; j++ )
{
IdeDependency dep = config.getDepsOrdered()[j];
// Avoid duplicates entries when same project is refered using multiple types
// (ejb, test-jar ...)
if ( dep.isReferencedProject() && !duplicates.contains( dep.getEclipseProjectName() ) )
{
writer.startElement( "project" ); //$NON-NLS-1$
writer.writeText( dep.getEclipseProjectName() );
writer.endElement();
duplicates.add( dep.getEclipseProjectName() );
}
}
}
writer.endElement(); // projects
writer.startElement( ELT_BUILD_SPEC );
for ( Iterator it = buildCommands.iterator(); it.hasNext(); )
{
( (BuildCommand) it.next() ).print( writer );
}
writer.endElement(); // buildSpec
writer.startElement( ELT_NATURES );
for ( Iterator it = projectnatures.iterator(); it.hasNext(); )
{
writer.startElement( ELT_NATURE );
writer.writeText( (String) it.next() );
writer.endElement(); // name
}
writer.endElement(); // natures
/*
boolean addLinks = !config.getProjectBaseDir().equals( config.getEclipseProjectDirectory() );
if ( addLinks || ( config.isPde() && config.getDepsOrdered().length > 0 ) )
{
writer.startElement( "linkedResources" ); //$NON-NLS-1$
if ( addLinks )
{
addFileLink( writer, config.getProjectBaseDir(), config.getEclipseProjectDirectory(),
config.getProject().getFile() );
addSourceLinks( writer, config.getProjectBaseDir(), config.getEclipseProjectDirectory(),
config.getProject().getCompileSourceRoots() );
addResourceLinks( writer, config.getProjectBaseDir(), config.getEclipseProjectDirectory(),
config.getProject().getBuild().getResources() );
addSourceLinks( writer, config.getProjectBaseDir(), config.getEclipseProjectDirectory(),
config.getProject().getTestCompileSourceRoots() );
addResourceLinks( writer, config.getProjectBaseDir(), config.getEclipseProjectDirectory(),
config.getProject().getBuild().getTestResources() );
}
if ( config.isPde() )
{
for ( int j = 0; j < config.getDepsOrdered().length; j++ )
{
IdeDependency dep = config.getDepsOrdered()[j];
if ( dep.isAddedToClasspath() && !dep.isProvided() && !dep.isReferencedProject() &&
!dep.isTestDependency() && !dep.isOsgiBundle() )
{
String name = dep.getFile().getName();
addLink( writer, name, StringUtils.replace( IdeUtils.getCanonicalPath( dep.getFile() ), "\\",
"/" ), LINK_TYPE_FILE );
}
}
}
writer.endElement(); // linkedResources
}
*/
writer.endElement(); // projectDescription
IOUtil.close( w );
}
private void addFileLink( XMLWriter writer, File projectBaseDir, File basedir, File file )
throws MojoExecutionException
{
if ( file.isFile() )
{
String name = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, file, true );
String location = IdeUtils.getCanonicalPath( file ).replaceAll( "\\\\", "/" ); //$NON-NLS-1$ //$NON-NLS-2$
addLink( writer, name, location, LINK_TYPE_FILE );
}
else
{
log.warn( Messages.getString( "EclipseProjectWriter.notafile", file ) ); //$NON-NLS-1$
}
}
private void addSourceLinks( XMLWriter writer, File projectBaseDir, File basedir, List sourceRoots )
throws MojoExecutionException
{
for ( Iterator it = sourceRoots.iterator(); it.hasNext(); )
{
String sourceRootString = (String) it.next();
File sourceRoot = new File( sourceRootString );
if ( sourceRoot.isDirectory() )
{
String name = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, sourceRoot, true );
String location = IdeUtils.getCanonicalPath( sourceRoot ).replaceAll( "\\\\", "/" ); //$NON-NLS-1$ //$NON-NLS-2$
addLink( writer, name, location, LINK_TYPE_DIRECTORY );
}
}
}
private void addResourceLinks( XMLWriter writer, File projectBaseDir, File basedir, List sourceRoots )
throws MojoExecutionException
{
for ( Iterator it = sourceRoots.iterator(); it.hasNext(); )
{
String resourceDirString = ( (Resource) it.next() ).getDirectory();
File resourceDir = new File( resourceDirString );
if ( resourceDir.isDirectory() )
{
String name = IdeUtils.toRelativeAndFixSeparator( projectBaseDir, resourceDir, true );
String location = IdeUtils.getCanonicalPath( resourceDir ).replaceAll( "\\\\", "/" ); //$NON-NLS-1$ //$NON-NLS-2$
addLink( writer, name, location, LINK_TYPE_DIRECTORY );
}
}
}
/**
* @param writer
* @param name
* @param location
*/
private void addLink( XMLWriter writer, String name, String location, int type )
{
writer.startElement( "link" ); //$NON-NLS-1$
writer.startElement( ELT_NAME );
writer.writeText( name );
writer.endElement(); // name
writer.startElement( "type" ); //$NON-NLS-1$
writer.writeText( Integer.toString( type ) );
writer.endElement(); // type
writer.startElement( "location" ); //$NON-NLS-1$
writer.writeText( location );
writer.endElement(); // location
writer.endElement(); // link
}
}

View file

@ -0,0 +1,68 @@
/*
* 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.apache.tuscany.maven.plugin.eclipse;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* @author <a href="mailto:fgiust@users.sourceforge.net">Fabrizio Giustina</a>
* @version $Id: Messages.java 728546 2008-12-21 22:56:51Z bentmann $
*/
public class Messages
{
private static final String BUNDLE_NAME = "org.apache.tuscany.maven.plugin.eclipse.messages"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
private Messages()
{
}
public static String getString( String key )
{
try
{
return RESOURCE_BUNDLE.getString( key );
}
catch ( MissingResourceException e )
{
return '!' + key + '!';
}
}
public static String getString( String key, Object[] params )
{
try
{
return MessageFormat.format( RESOURCE_BUNDLE.getString( key ), params );
}
catch ( MissingResourceException e )
{
return '!' + key + '!';
}
}
public static String getString( String key, Object param )
{
return getString( key, new Object[] { param } );
}
}

View file

@ -0,0 +1,205 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

View file

@ -0,0 +1,5 @@
Copyright (c) 2005 - 2009 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

View file

@ -0,0 +1,81 @@
EclipsePlugin.missingpom=There must be a POM in the current working directory for the Eclipse plugin to work.
EclipsePlugin.pompackaging=Not running eclipse plugin goal for pom project
EclipsePlugin.notadir=Not a directory: "{0}"
EclipsePlugin.cantcreatedir=Can't create directory "{0}"
EclipsePlugin.erroropeningfile=Exception while opening file.
EclipsePlugin.cantwritetofile=Unable to write to file: {0}
EclipsePlugin.cantfindresource=Unable to resolve resource location: {0}
EclipsePlugin.cantreadfile=Unable to read file: {0}
EclipsePlugin.keepexisting=File {0} already exists.\n Additional settings will be preserved, run mvn eclipse:clean if you want old settings to be removed.
EclipsePlugin.cantparseexisting=Unable to parse existing file: {0}. Settings will not be preserved.
EclipsePlugin.wrote=Wrote Eclipse project for "{0}" to {1}.
EclipsePlugin.missingelement=Missing element from the project descriptor: "{0}"
EclipsePlugin.artifactpathisnull=The artifact path was null. Artifact id: {0}
EclipsePlugin.artifactissystemscoped=The artifact has scope 'system'. Artifact id: {0}. System path: {1}
EclipsePlugin.unsupportedwtp=Unsupported WTP version: {0}. This plugin currently supports only the following versions: {1}.
EclipsePlugin.wtpversion=Adding support for WTP version {0}.
EclipsePlugin.missingjrecontainer=You did specify a list of classpath containers without the base org.eclipse.jdt.launching.JRE_CONTAINER.\n If you specify custom classpath containers you should also add org.eclipse.jdt.launching.JRE_CONTAINER to the list
EclipsePlugin.deprecatedpar=Plugin parameter "{0}" is deprecated, please use "{1}"
EclipsePlugin.foundadir={0} is a directory, ignoring.
EclipsePlugin.workspace=Using Eclipse Workspace: {0}
EclipsePlugin.cantcanonicalize=Can't canonicalize system path: {0}
EclipsePlugin.unchangedmanifest=Not writing Manifest file as it is unchanged: {0}
EclipsePlugin.invalidvminworkspace=Workspace defines a VM that does not contain a valid jre/lib/rt.jar: {0}
EclipseSettingsWriter.wrotesettings=Wrote settings to {0}
EclipseSettingsWriter.cannotcreatesettings=Cannot create settings file
EclipseSettingsWriter.errorwritingsettings=Error writing settings file
EclipseSettingsWriter.usingdefaults=Not writing settings - defaults suffice
EclipseProjectWriter.notafile=Not adding a file link to {0}; it is not a file
EclipseCleanMojo.failedtodelete=Failed to delete {0} file: {0}
EclipseCleanMojo.nofilefound=No {0} file found
EclipseCleanMojo.deletingFile=Deleting file: {0}
EclipseCleanMojo.deletingDirectory=Deleting directory: {0}
EclipseOSGiManifestWriter.nomanifestfile=The references manifest file doesn't exist, plugin dependencies will not be updated: {0}
Rad6LibCopier.cantdeletefile=Failed to delete file: {0}
MyEclipseSpringBeansWriter.baseDirDoesNotExist=The (basedir) path declared in the project's dependencies doesn't exist: {0}
EclipseToMavenMojo.eclipseDirectoryPrompt=Eclipse directory?
EclipseToMavenMojo.errorreadingfromstandardinput=Unable to read from standard input
EclipseToMavenMojo.directoydoesnotexist=Directory {0} doesn't exists
EclipseToMavenMojo.plugindirectorydoesnotexist=Plugin directory {0} doesn't exists
EclipseToMavenMojo.remoterepositorydeployto=Will deploy artifacts to remote repository {0}
EclipseToMavenMojo.processingfile=Processing file {0}
EclipseToMavenMojo.processingplugin=Processing {0} of {1}
EclipseToMavenMojo.skippingfile=Skipping file {0}
EclipseToMavenMojo.unabletoresolveversionrange=Unable to resolve version range for dependency {0} in project {1}
EclipseToMavenMojo.unabletoaccessjar=Unable to access jar {0}
EclipseToMavenMojo.plugindoesnothavemanifest=Plugin {0} does not have a manifest; skipping..
EclipseToMavenMojo.unabletoreadbundlefrommanifest=Unable to read bundle name/version from manifest, skipping...
EclipseToMavenMojo.errorprocessingplugin=Error processing plugin {0}
EclipseToMavenMojo.errorwritingtemporarypom=Error writing temporary pom file: {0}
EclipseToMavenMojo.errordeployartifacttorepository=Unable to deploy artifact to repository.
EclipseToMavenMojo.errorinstallartifacttorepository=Unable to install artifact to repository.
EclipseToMavenMojo.errorgettingjarfileforplugin=Error getting the jar file for plugin {0}
EclipseToMavenMojo.invalidsyntaxforrepository=Invalid syntax for repository.
EclipseToMavenMojo.invalidremoterepositorysyntax=Invalid syntax for remote repository. Use "id::layout::url".
EclipseToMavenMojo.cannotfindrepositorylayout=Cannot find repository layout: {0}
EclipseToMavenMojo.missingversionforbundle=Missing version for bundle {0}, assuming any version > 0
AbstractIdeSupportMojo.sourcesnotavailable=\n Sources for some artifacts are not available.\n List of artifacts without a source archive:
AbstractIdeSupportMojo.sourcesnotdownloaded=\n Sources for some artifacts are not available.\n Please run the same goal with the -DdownloadSources=true parameter in order to check remote repositories for sources.\n List of artifacts without a source archive:
AbstractIdeSupportMojo.sourcesmissingitem=\n o {0}
AbstractIdeSupportMojo.javadocnotavailable=\n Javadoc for some artifacts is not available.\n List of artifacts without a javadoc archive:
AbstractIdeSupportMojo.javadocnotdownloaded=\n Javadoc for some artifacts is not available.\n Please run the same goal with the -DdownloadJavadocs=true parameter in order to check remote repositories for javadoc.\n List of artifacts without a javadoc archive:
AbstractIdeSupportMojo.javadocmissingitem=\n o {0}
AbstractIdeSupportMojo.artifactresolution=An error occurred during dependency resolution of the following artifact:\n {0}:{1}:{2}\nCaused by: {3}
AbstractIdeSupportMojo.artifactdownload=An error occurred during dependency resolution.\n Failed to retrieve {0}:{1}-{2}\nCaused by: {3}
AbstractIdeSupportMojo.unabletoparseversion={0}: unable to parse version '{1}' for dependency '{2}': {3}
AbstractIdeSupportMojo.failedtocreatenotavailablemarkerfile=Error creating not available file {0}
AbstractIdeSupportMojo.creatednotavailablemarkerfile=Not available marker file created: {0}
AbstractIdeSupportMojo.unabletodeletenotavailablemarkerfile=Unable to delete marker file: {0}
IdeUtils.errorresolving=Error resolving {0} artifact. Artifact id: {1} (Message: {2})
RemoveCacheMojo.checking=Checking cache for not available markers
RemoveCacheMojo.complete=Done