Author: [email protected] Date: Wed May 23 11:33:45 2012 New Revision: 2383 Log: Initial AMS populator
Added: trunk/amdatu-ams-populator/ trunk/amdatu-ams-populator/LICENSE trunk/amdatu-ams-populator/NOTICE trunk/amdatu-ams-populator/pom.xml trunk/amdatu-ams-populator/src/ trunk/amdatu-ams-populator/src/main/ trunk/amdatu-ams-populator/src/main/java/ trunk/amdatu-ams-populator/src/main/java/org/ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsDistribution.java trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsFeature.java trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsPopulator.java Added: trunk/amdatu-ams-populator/LICENSE ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/LICENSE Wed May 23 11:33:45 2012 @@ -0,0 +1,202 @@ + + 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. Added: trunk/amdatu-ams-populator/NOTICE ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/NOTICE Wed May 23 11:33:45 2012 @@ -0,0 +1,19 @@ +Amdatu Core Useradmin filestorage +Copyright 2010, 2011 The Amdatu Foundation + +I. Included Software + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). +Licensed under the Apache License 2.0. + +II. Used Software + +This product uses software developed at +The OSGi Alliance (http://www.osgi.org/). +Copyright (c) OSGi Alliance (2000, 2007). +Licensed under the Apache License 2.0. + + +III. License Summary +- Apache License 2.0 Added: trunk/amdatu-ams-populator/pom.xml ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/pom.xml Wed May 23 11:33:45 2012 @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2010, 2011 The Amdatu Foundation + + 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.verning 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.amdatu</groupId> + <artifactId>amdatu</artifactId> + <version>6-RC2</version> + </parent> + <artifactId>org.amdatu.ams.populator</artifactId> + <version>0.3.0-SNAPSHOT</version> + <packaging>bundle</packaging> + <name>Amdatu Development - AMS populator</name> + + <properties> + <org.amdatu.ace.version>1.0.0-RC1</org.amdatu.ace.version> + </properties> + + <repositories> + <repository> + <id>amdatu.releases</id> + <name>Amdatu Release Repository</name> + <url>http://repository.amdatu.org/releases</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + + <dependencies> + <dependency> + <groupId>org.amdatu.ace</groupId> + <artifactId>org.amdatu.ace.client</artifactId> + <version>${org.amdatu.ace.version}</version> + <scope>compile</scope> + </dependency> + </dependencies> + + <build> + <defaultGoal>package</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <configuration> + <instructions> + <Main-Class>org.amdatu.ams.populator.AmsPopulator</Main-Class> + <Embed-Dependency>*;scope=compile;inline=true</Embed-Dependency> + <Embed-Transitive>true</Embed-Transitive> + </instructions> + </configuration> + </plugin> + </plugins> + </build> +</project> Added: trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsDistribution.java ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsDistribution.java Wed May 23 11:33:45 2012 @@ -0,0 +1,81 @@ +package org.amdatu.ams.populator; + +import org.amdatu.ace.client.AceClientException; +import org.amdatu.ace.client.AceClientWorkspace; +import org.amdatu.ace.client.model.Distribution; +import org.amdatu.ace.client.model.DistributionBuilder; +import org.amdatu.ace.client.model.Feature2Distribution; +import org.amdatu.ace.client.model.Feature2DistributionBuilder; + +import java.util.HashMap; +import java.util.Map; + +public class AmsDistribution { + // Distributions are hard coded for now + private static final String[] DISTRIBUTIONS = new String[] {"demo-auth", "demo-opensocial", "demo-cassandra"}; + private static final Map<String[], String> F2D = new HashMap<String[], String>(); + + static { + F2D.put(new String[] {"core", "web", "auth"}, "demo-auth"); + F2D.put(new String[] {"core", "web", "auth", "opensocial"}, "demo-opensocial"); + F2D.put(new String[] {"core", "web", "auth-nostorage", "opensocial-nostorage", "cassandra"}, "demo-cassandra"); + } + + private AceClientWorkspace m_workspace; + + public AmsDistribution(AceClientWorkspace workspace) { + m_workspace = workspace; + } + + public void install() throws AceClientException { + System.out.println("Installing distributions"); + + // Step 1. Create the distribution + try { + createDistribution(); + } + catch (AceClientException e) { + // Ignore for now, see AMDATUMGMNT-13 + } + + // Step 2. Associate features with distributions + associate(); + + System.out.println("Distributions installed successfully"); + } + + private void createDistribution() throws AceClientException { + // Check if the distribution exists (see AMDATUMGMNT-13) + // Feature f = m_workspace.getResource(Distribution.class, name); + + // Create the distribution + for (String distName : DISTRIBUTIONS) { + Distribution distribution = new DistributionBuilder() + .setName(distName) + .setDescription(distName) + .build(); + m_workspace.createResource(distribution); + } + } + + private void associate() throws AceClientException { + for (String[] features : F2D.keySet()) { + for (String feature : features) { + Feature2Distribution feature2Distribution = + new Feature2DistributionBuilder() + .setLeftCardinality("2147483647") + .setLeftEndpoint("(" + org.amdatu.ace.client.model.Feature.ATTR_NAME + "=" + feature + ")") + .setRightEndpoint( + "(" + org.amdatu.ace.client.model.Distribution.ATTR_NAME + "=" + F2D.get(features) + ")") + .build(); + try { + m_workspace.createResource(feature2Distribution); + } + catch (AceClientException e) { + System.err.println("Failed to associate feature '" + feature + "' with distribution '" + + F2D.get(features) + "'"); + } + } + } + } +} Added: trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsFeature.java ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsFeature.java Wed May 23 11:33:45 2012 @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2010-2012 The Amdatu Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.amdatu.ams.populator; + +import static org.amdatu.ace.client.model.Artifact.ATTR_BUNDLE_SYMBOLICNAME; +import static org.amdatu.ace.client.model.Artifact.ATTR_CONFIG_FILENAME; +import static org.amdatu.ace.client.model.Feature.ATTR_NAME; + +import org.amdatu.ace.client.AceClientException; +import org.amdatu.ace.client.AceClientWorkspace; +import org.amdatu.ace.client.model.Artifact; +import org.amdatu.ace.client.model.Artifact2Feature; +import org.amdatu.ace.client.model.Artifact2FeatureBuilder; +import org.amdatu.ace.client.model.ArtifactBuilder; +import org.amdatu.ace.client.model.Feature; +import org.amdatu.ace.client.model.FeatureBuilder; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.Attributes; +import java.util.jar.JarInputStream; + +import org.osgi.framework.Constants; + +public class AmsFeature { + // A bundle + private static final String DEPLOYMENT_PROVIDES_RESOURCE_PROCESSOR = "Deployment-ProvidesResourceProcessor"; + private static final String TENANT_PID_KEY = "org.amdatu.tenant.pid"; + + private File m_directory; + private String m_featureName; + private AceClientWorkspace m_workspace; + + private String m_tenantProcessorPid; + private String m_configProcessorPid; + + private List<String> m_symbolicNames = new ArrayList<String>(); + private List<String> m_configNames = new ArrayList<String>(); + + public AmsFeature(File dir, AceClientWorkspace workspace) { + m_directory = dir; + m_featureName = dir.getName(); + m_workspace = workspace; + } + + public void install() throws AceClientException { + System.out.println("Installing feature '" + m_directory.getName() + "'"); + + // Step 1. Create the feature + try { + createFeature(); + } + catch (AceClientException e) { + // Ignore for now, see AMDATUMGMNT-13 + } + + // Step 2. Upload artifacts the client and OBR + uploadArtifacts(); + + // Step 3. Associate artifacts with the feature + associate(); + + System.out.println("Feature '" + m_directory.getName() + "' installed successfully"); + } + + private void createFeature() throws AceClientException { + // Check if the feature exists (see AMDATUMGMNT-13) + // Feature f = m_workspace.getResource(Feature.class, name); + + // Create the feature + Feature feature = new FeatureBuilder() + .setName(m_featureName) + .setDescription(m_featureName) + .build(); + m_workspace.createResource(feature); + } + + private void uploadArtifacts() { + for (File file : m_directory.listFiles()) { + // Case 1: .jar files (OSGi bundles) + if (file.getName().endsWith(".jar")) { + try { + System.out.println("Installing bundle '" + file.getName() + "'"); + installBundle(file); + } + catch (IOException e) { + System.err.println("Could not read '" + file.getName() + "'"); + } + catch (AceClientException e) { + System.err.println("Could not install '" + file.getName() + "'"); + } + } + + // Case 2: .xml files (OSGi config) + if (file.getName().endsWith(".xml")) { + try { + System.out.println("Installing config '" + file.getName() + "'"); + installConfig(file); + } + catch (IOException e) { + System.err.println("Could not read '" + file.getName() + "'"); + } + catch (AceClientException e) { + System.err.println("Could not install '" + file.getName() + "'"); + } + } + } + } + + private void installBundle(File file) throws IOException, AceClientException { + JarInputStream jar = null; + try { + jar = new JarInputStream(new FileInputStream(file)); + Attributes attr = jar.getManifest().getMainAttributes(); + ArtifactBuilder builder = new ArtifactBuilder() + .isBundle() + .setUrl(file.toURI().toString()) + .setName(attr.getValue(Constants.BUNDLE_NAME)) + .setDescription(attr.getValue(Constants.BUNDLE_DESCRIPTION)) + .setBundleName(attr.getValue(Constants.BUNDLE_NAME)) + .setBundleSymbolicName(attr.getValue(Constants.BUNDLE_SYMBOLICNAME)) + .setBundleVersion(attr.getValue(Constants.BUNDLE_VERSION)); + String conf = attr.getValue(DEPLOYMENT_PROVIDES_RESOURCE_PROCESSOR); + if (conf != null) { + builder.setAttribute(DEPLOYMENT_PROVIDES_RESOURCE_PROCESSOR, conf); + setResourceProcessor(conf); + } + m_symbolicNames.add(attr.getValue(Constants.BUNDLE_SYMBOLICNAME)); + Artifact artifact = builder.build(); + m_workspace.createResource(artifact); + } + finally { + if (jar != null) { + jar.close(); + } + } + } + + private void setResourceProcessor(String conf) { + if (conf.contains("tenant")) { + if (m_tenantProcessorPid != null) { + throw new IllegalStateException("Only one resource processor per type allowed"); + } + m_tenantProcessorPid = conf; + } + else { + if (m_configProcessorPid != null) { + throw new IllegalStateException("Only one resource processor per type allowed"); + } + m_configProcessorPid = conf; + } + } + + private void installConfig(File file) throws IOException, AceClientException { + String fileName = file.getName().substring(file.getName().lastIndexOf('/') + 1); + String name = "config " + fileName.substring(0, Math.min(fileName.lastIndexOf('.'), fileName.length())); + ArtifactBuilder builder = + new ArtifactBuilder() + .isConfig() + .setUrl(file.toURI().toString()) + .setConfigFileName(file.getName()) + .setName(name) + .setProcessorPid(m_configProcessorPid); + if (name.endsWith(".tenant")) { + builder.setProcessorPid(m_tenantProcessorPid); + builder.setAttribute("mimetype", "application/vnd.amdatu.tenantconf"); + builder.setAttribute(TENANT_PID_KEY, getTenantPid(file)); + } + m_configNames.add(file.getName()); + Artifact artifact = builder.build(); + m_workspace.createResource(artifact); + } + + private String getTenantPid(File file) throws IOException { + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + String line; + while ((line = br.readLine()) != null) { + line = line.replace(" ", ""); + if (line.startsWith(TENANT_PID_KEY)) { + return line.substring(line.indexOf('=') + 1); + } + } + } + catch (Exception e) { + System.err.println("Could not retrieve tenant pid for tenant config: '" + file.getName() + "'"); + } + finally { + if (br != null) { + br.close(); + } + } + return null; + } + + private void associate() throws AceClientException { + for (String symbolicName : m_symbolicNames) { + Artifact2Feature artifact2Feature = + new Artifact2FeatureBuilder() + .setLeftCardinality("2147483647") + .setLeftEndpoint("(" + ATTR_BUNDLE_SYMBOLICNAME + "=" + symbolicName + ")") + .setRightEndpoint("(" + ATTR_NAME + "=" + m_featureName + ")") + .build(); + m_workspace.createResource(artifact2Feature); + } + + for (String configName : m_configNames) { + Artifact2Feature artifact2Feature = + new Artifact2FeatureBuilder() + .setLeftCardinality("2147483647") + .setLeftEndpoint("(" + ATTR_CONFIG_FILENAME + "=" + configName + ")") + .setRightEndpoint("(" + ATTR_NAME + "=" + m_featureName + ")") + .build(); + m_workspace.createResource(artifact2Feature); + } + } +} Added: trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsPopulator.java ============================================================================== --- (empty file) +++ trunk/amdatu-ams-populator/src/main/java/org/amdatu/ams/populator/AmsPopulator.java Wed May 23 11:33:45 2012 @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2010-2012 The Amdatu Foundation + * + * 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. + */ +/* + * Copyright (c) 2010-2012 The Amdatu Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.amdatu.ams.populator; + +import org.amdatu.ace.client.AceClient; +import org.amdatu.ace.client.AceClientException; +import org.amdatu.ace.client.AceClientWorkspace; +import org.amdatu.ace.client.model.AbstractResource; +import org.amdatu.ace.client.model.Artifact; +import org.amdatu.ace.client.model.Artifact2Feature; +import org.amdatu.ace.client.model.Distribution; +import org.amdatu.ace.client.model.Feature; +import org.amdatu.ace.client.model.Feature2Distribution; + +import java.io.File; + +// @checkstyle:off +public class AmsPopulator { +// @checkstyle:on + + // The relative directory holding the features. Folder name is the name of the feature, all bundles and XML files + // contained by it are associated with the feature + private static final String FEATURES_DIR = "features"; + + private static final Class<?>[] RESOURCE_CLASSES = new Class<?>[] { + Artifact.class, + Artifact2Feature.class, + Feature.class, + Feature2Distribution.class, + Distribution.class}; + + // AMS endpoints + private static final String CLIENT_ENDPOINT = "http://localhost:8080/client/work"; + + // Instance variables + private AceClient m_client; + private AceClientWorkspace m_workspace; + + // private static final URL OBR_ENDPOINT = new URL("http://localhost:8080/obr"); + + public static void main(String[] args) { + try { + AmsPopulator populator = new AmsPopulator(); + + // Remove the complete existing population + populator.clear(); + + // Populate + populator.populate(); + } + catch (AceClientException e) { + System.err.println("Could not connect to AMS at '" + CLIENT_ENDPOINT + "'"); + } + + } + + public AmsPopulator() throws AceClientException { + m_client = new AceClient(CLIENT_ENDPOINT); + } + + @SuppressWarnings("unchecked") + public <T extends AbstractResource> void clear() { + try { + System.out.println("Clearing AMS..."); + m_workspace = m_client.createNewWorkspace(); + for (Class<?> resourceClass : RESOURCE_CLASSES) { + T[] resources = m_workspace.getResources((Class<T>) resourceClass); + for (T resource : resources) { + m_workspace.deleteResource(resource); + } + } + + m_workspace.commit(); + m_workspace.remove(); + System.out.println("AMS cleared successfully"); + } + catch (AceClientException e) { + System.err.println("Failed to clear AMS"); + } + } + + public void populate() throws AceClientException { + System.out.println("Populating AMS..."); + m_workspace = m_client.createNewWorkspace(); + + File featuresDir = new File(FEATURES_DIR); + for (File featureDir : featuresDir.listFiles()) { + AmsFeature feature = new AmsFeature(featureDir, m_workspace); + try { + feature.install(); + } + catch (AceClientException e) { + System.err.println("Could not install feature '" + featureDir.getName() + "'"); + } + } + + // Install the distributions + new AmsDistribution(m_workspace).install(); + + m_workspace.commit(); + m_workspace.remove(); + System.out.println("AMS populated successfully"); + } + +} _______________________________________________ Amdatu-commits mailing list [email protected] http://lists.amdatu.org/mailman/listinfo/amdatu-commits
