Return-Path: X-Original-To: apmail-ace-commits-archive@www.apache.org Delivered-To: apmail-ace-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1F25710E14 for ; Tue, 7 May 2013 10:25:44 +0000 (UTC) Received: (qmail 9805 invoked by uid 500); 7 May 2013 10:25:44 -0000 Delivered-To: apmail-ace-commits-archive@ace.apache.org Received: (qmail 9766 invoked by uid 500); 7 May 2013 10:25:43 -0000 Mailing-List: contact commits-help@ace.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ace.apache.org Delivered-To: mailing list commits@ace.apache.org Received: (qmail 9699 invoked by uid 99); 7 May 2013 10:25:41 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 May 2013 10:25:41 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 May 2013 10:25:37 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5BC7823889F7; Tue, 7 May 2013 10:25:17 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1479841 [1/3] - in /ace/trunk: org.apache.ace.agent.itest/ org.apache.ace.agent.itest/.settings/ org.apache.ace.agent.itest/resources/ org.apache.ace.agent.itest/src/ org.apache.ace.agent.itest/src/org/ org.apache.ace.agent.itest/src/org/a... Date: Tue, 07 May 2013 10:25:15 -0000 To: commits@ace.apache.org From: bramk@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130507102517.5BC7823889F7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: bramk Date: Tue May 7 10:25:13 2013 New Revision: 1479841 URL: http://svn.apache.org/r1479841 Log: ACE-347 First drop of redesigned agent Added: ace/trunk/org.apache.ace.agent/ ace/trunk/org.apache.ace.agent.itest/ ace/trunk/org.apache.ace.agent.itest/.classpath ace/trunk/org.apache.ace.agent.itest/.gitignore ace/trunk/org.apache.ace.agent.itest/.project ace/trunk/org.apache.ace.agent.itest/.settings/ ace/trunk/org.apache.ace.agent.itest/.settings/org.eclipse.jdt.core.prefs ace/trunk/org.apache.ace.agent.itest/bnd.bnd ace/trunk/org.apache.ace.agent.itest/build.xml ace/trunk/org.apache.ace.agent.itest/resources/ ace/trunk/org.apache.ace.agent.itest/resources/twoagentsconfig.properties ace/trunk/org.apache.ace.agent.itest/src/ ace/trunk/org.apache.ace.agent.itest/src/org/ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ManagementAgentTest.java ace/trunk/org.apache.ace.agent/.classpath ace/trunk/org.apache.ace.agent/.project ace/trunk/org.apache.ace.agent/.settings/ ace/trunk/org.apache.ace.agent/.settings/org.eclipse.jdt.core.prefs ace/trunk/org.apache.ace.agent/README ace/trunk/org.apache.ace.agent/bnd.bnd ace/trunk/org.apache.ace.agent/build.xml ace/trunk/org.apache.ace.agent/src/ ace/trunk/org.apache.ace.agent/src/org/ ace/trunk/org.apache.ace.agent/src/org/apache/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/Constants.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ManagementAgent.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryImpl.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentials.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentialsFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployer.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployerFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTask.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTaskFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceImpl.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentUpdateTask.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentUpdateTaskFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/discovery/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/discovery/PropertyBasedDiscoveryFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/identification/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/identification/IdentifierBasedIdentificationFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/identification/IfconfigIdentification.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/identification/PropertyBasedIdentificationFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/identification/ifconfigBasedIdentificationFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/Activator.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/ManagementAgentFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/impl/StaticConfigurationHandler.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogImpl.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogStoreFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogStoreImpl.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogSyncTask.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/logging/LogSyncTaskFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/packageinfo ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/spi/ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/spi/ComponentFactory.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/spi/ComponentFactoryBase.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/spi/OneComponentFactoryBase.java ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/spi/packageinfo Added: ace/trunk/org.apache.ace.agent.itest/.classpath URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/.classpath?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/.classpath (added) +++ ace/trunk/org.apache.ace.agent.itest/.classpath Tue May 7 10:25:13 2013 @@ -0,0 +1,7 @@ + + + + + + + Added: ace/trunk/org.apache.ace.agent.itest/.gitignore URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/.gitignore?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/.gitignore (added) +++ ace/trunk/org.apache.ace.agent.itest/.gitignore Tue May 7 10:25:13 2013 @@ -0,0 +1,2 @@ +/bin/ +/generated/ Added: ace/trunk/org.apache.ace.agent.itest/.project URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/.project?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/.project (added) +++ ace/trunk/org.apache.ace.agent.itest/.project Tue May 7 10:25:13 2013 @@ -0,0 +1,23 @@ + + + org.apache.ace.agent.itest + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + Added: ace/trunk/org.apache.ace.agent.itest/.settings/org.eclipse.jdt.core.prefs URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/.settings/org.eclipse.jdt.core.prefs?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/.settings/org.eclipse.jdt.core.prefs (added) +++ ace/trunk/org.apache.ace.agent.itest/.settings/org.eclipse.jdt.core.prefs Tue May 7 10:25:13 2013 @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 Added: ace/trunk/org.apache.ace.agent.itest/bnd.bnd URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/bnd.bnd?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/bnd.bnd (added) +++ ace/trunk/org.apache.ace.agent.itest/bnd.bnd Tue May 7 10:25:13 2013 @@ -0,0 +1,19 @@ +Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase} +-runbundles: org.mockito.mockito-all,\ + org.apache.ace.agent;version=latest,\ + org.apache.ace.test;version=latest,\ + org.apache.felix.dependencymanager,\ + osgi.cmpn +Private-Package: org.apache.ace.agent.itest +-runee: JavaSE-1.6 +-runvm: -ea +-runfw: org.apache.felix.framework +-buildpath: osgi.core;version='[4.2,5)',\ + osgi.cmpn,\ + junit.osgi,\ + org.mockito.mockito-all,\ + org.apache.ace.agent;version=latest,\ + org.apache.ace.test;version=latest +-runsystempackages: sun.reflect +Import-Package: org.apache.ace.agent,\ + * \ No newline at end of file Added: ace/trunk/org.apache.ace.agent.itest/build.xml URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/build.xml?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/build.xml (added) +++ ace/trunk/org.apache.ace.agent.itest/build.xml Tue May 7 10:25:13 2013 @@ -0,0 +1,7 @@ + + + + + + + Added: ace/trunk/org.apache.ace.agent.itest/resources/twoagentsconfig.properties URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/resources/twoagentsconfig.properties?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/resources/twoagentsconfig.properties (added) +++ ace/trunk/org.apache.ace.agent.itest/resources/twoagentsconfig.properties Tue May 7 10:25:13 2013 @@ -0,0 +1,49 @@ + +# +# Basic single Management Agent + +agents=007,009 +serverurl=http://localhost:8080 +logstores=auditlog +#logstores.auditlog.sync=false + +authentication.baseURL=http://localhost:8080 + +# +# Multiple agents example - All configuration properties can be scoped to agent identifier +# to overrule default. +# +# agents=target-1,target-2 +# serverurl=http://localhost:8080 +# logstores=auditlog +# target-2.serverurl=http://otherhost:8080 +# target-2.logstores=auditlog + +# +# Component factories - Used to instantiate the the agent service components. These +# are instantiated by the management agent factory when a new agent is configured and +# may be specified per agent. All classes MUST be on the bundle classpath. +# +# No need to specify default list +factories= org.apache.ace.agent.identification.IdentifierBasedIdentificationFactory, \ + org.apache.ace.agent.discovery.PropertyBasedDiscoveryFactory,\ + org.apache.ace.agent.logging.LogFactory,\ + org.apache.ace.agent.logging.LogStoreFactory,\ + org.apache.ace.agent.logging.LogSyncTaskFactory,\ + org.apache.ace.agent.deployment.DeploymentServiceFactory,\ + org.apache.ace.agent.deployment.DeploymentAdminDeployerFactory,\ + org.apache.ace.agent.deployment.DeploymentCheckTaskFactory,\ + org.apache.ace.agent.deployment.DeploymentUpdateTaskFactory,\ + org.apache.ace.agent.connection.ConnectionFactoryFactory + +# +# Extension activators - Additional extension activators to be started at startup. These +# are handled by the static configuration handler once, before configuring agents, and +# can not be changed at runtime. All classes MUST be on the bundle classpath. +# +# No need to specify default list +activators= org.apache.ace.connectionfactory.impl.Activator, \ + org.apache.ace.scheduler.Activator,\ + org.apache.felix.deploymentadmin.Activator,\ + org.apache.ace.consolelogger.Activator + \ No newline at end of file Added: ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ManagementAgentTest.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ManagementAgentTest.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ManagementAgentTest.java (added) +++ ace/trunk/org.apache.ace.agent.itest/src/org/apache/ace/agent/itest/ManagementAgentTest.java Tue May 7 10:25:13 2013 @@ -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.ace.agent.itest; + +import java.util.Dictionary; +import java.util.Hashtable; + +import junit.framework.Assert; + +import org.apache.ace.agent.ManagementAgent; +import org.apache.ace.it.IntegrationTestBase; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleException; +import org.osgi.framework.Constants; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.service.cm.ManagedServiceFactory; +import org.osgi.service.deploymentadmin.DeploymentAdmin; + +/** + * Integration test for Management Agent Configuration + * + */ +public class ManagementAgentTest extends IntegrationTestBase { + + /** + * One basic agent using CM API + * + */ + public void testSimpleAgentConfiguration() throws Exception { + + assertAgentDown("007"); + + // agent factory should be up + ManagedServiceFactory factory = getService(ManagedServiceFactory.class, "(" + Constants.SERVICE_PID + "=" + org.apache.ace.agent.Constants.FACTORY_PID + ")"); + Assert.assertNotNull(factory); + + // configure an agent + Dictionary config = new Hashtable(); + config.put("agent", "007"); + config.put("serverurl", "http://localhost:8080"); + config.put("logstores", "auditlog"); + factory.updated("test", config); + + assertAgentUp("007"); + + factory.deleted("test"); + + assertAgentDown("007"); + } + + /** + * Two basic agents using static config + * + */ + public void testTwoAgentsConfigurationFile() throws Exception { + + assertAgentDown("007"); + assertAgentDown("009"); + + System.setProperty(org.apache.ace.agent.Constants.FACTORY_PID, "resources/twoagentsconfig.properties"); + restartBundle("org.apache.ace.agent"); + + assertAgentUp("007"); + assertAgentUp("009"); + + System.setProperty(org.apache.ace.agent.Constants.FACTORY_PID, ""); + restartBundle("org.apache.ace.agent"); + + assertAgentDown("007"); + assertAgentDown("009"); + } + + private void assertAgentUp(String agentId) throws InvalidSyntaxException { + + String agentFilter = "(agent=" + agentId + ")"; + + ManagementAgent agent = getService(ManagementAgent.class, agentFilter); + assertNotNull(agent); + + ServiceReference[] references = m_bundleContext.getAllServiceReferences("org.apache.ace.identification.Identification", "(agent=007)"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences("org.apache.ace.discovery.Discovery", agentFilter); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences("org.apache.ace.deployment.Deployment", agentFilter); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences("org.apache.ace.deployment.service.DeploymentService", agentFilter); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences("org.apache.ace.log.Log", "(&" + agentFilter + "(name=auditlog))"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences("org.apache.ace.log.target.store.LogStore", "(&" + agentFilter + "(name=auditlog))"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences(Runnable.class.getName(), "(&" + agentFilter + "(name=auditlog))"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences(Runnable.class.getName(), "(&" + agentFilter + "(taskName=DeploymentUpdateTask))"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences(Runnable.class.getName(), "(&" + agentFilter + "(taskName=DeploymentCheckTask))"); + assertNotNull(references); + assertEquals(1, references.length); + + references = m_bundleContext.getAllServiceReferences(Runnable.class.getName(), "(&" + agentFilter + "(taskName=LogSyncTask)(name=auditlog))"); + assertNotNull(references); + assertEquals(1, references.length); + } + + private void assertAgentDown(String agentId) throws InvalidSyntaxException { + String agentFilter = "(agent=" + agentId + ")"; + ServiceReference[] references = m_bundleContext.getAllServiceReferences(ManagementAgent.class.getName(), agentFilter); + assertNull(references); + } + + private void restartBundle(String bsn) throws BundleException { + for (Bundle bundle : m_bundleContext.getBundles()) { + if (bundle.getSymbolicName().equals(bsn)) { + bundle.stop(); + bundle.start(); + } + } + } +} Added: ace/trunk/org.apache.ace.agent/.classpath URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/.classpath?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/.classpath (added) +++ ace/trunk/org.apache.ace.agent/.classpath Tue May 7 10:25:13 2013 @@ -0,0 +1,7 @@ + + + + + + + Added: ace/trunk/org.apache.ace.agent/.project URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/.project?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/.project (added) +++ ace/trunk/org.apache.ace.agent/.project Tue May 7 10:25:13 2013 @@ -0,0 +1,23 @@ + + + org.apache.ace.agent + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + Added: ace/trunk/org.apache.ace.agent/.settings/org.eclipse.jdt.core.prefs URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/.settings/org.eclipse.jdt.core.prefs?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/.settings/org.eclipse.jdt.core.prefs (added) +++ ace/trunk/org.apache.ace.agent/.settings/org.eclipse.jdt.core.prefs Tue May 7 10:25:13 2013 @@ -0,0 +1,71 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning Added: ace/trunk/org.apache.ace.agent/README URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/README?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/README (added) +++ ace/trunk/org.apache.ace.agent/README Tue May 7 10:25:13 2013 @@ -0,0 +1,19 @@ +Management Agent redesign (ACE-347) + + +Notes: + +* Switched to factory SPI approach for pluggability/extensions. +* Removed export package atributes / cleaned up bundle contents. +* Assembled most target specific business logic code in project. +* Supports configuration through single config file (as well as CM api). +* Supports clean multiple agent configuration (if we want to keep it). + + TODOs: + + * Cleanup assembled code and parent projects + * More config options + * More (i)testing + * Create launcher project + * Create run-agent project + * Replace ace executor with a executorservice \ No newline at end of file Added: ace/trunk/org.apache.ace.agent/bnd.bnd URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/bnd.bnd?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/bnd.bnd (added) +++ ace/trunk/org.apache.ace.agent/bnd.bnd Tue May 7 10:25:13 2013 @@ -0,0 +1,85 @@ +Bundle-Activator: org.apache.ace.agent.impl.Activator +Bundle-Version: 1.0.0 + +-buildpath: osgi.core,\ + osgi.cmpn,\ + org.apache.felix.dependencymanager,\ + org.apache.felix.deploymentadmin,\ + org.apache.ace.connectionfactory;version=latest,\ + org.apache.ace.consolelogger;version=latest,\ + org.apache.ace.log.target;version=latest,\ + org.apache.ace.log.target.store.impl;version=latest,\ + org.apache.ace.range.api;version=latest,\ + org.apache.ace.log.api;version=latest,\ + org.apache.ace.log.listener;version=latest,\ + org.apache.ace.discovery.api;version=latest,\ + org.apache.ace.discovery.property;version=latest,\ + org.apache.ace.identification.api;version=latest,\ + org.apache.ace.identification.property;version=latest,\ + org.apache.ace.deployment.api;version=latest,\ + org.apache.ace.deployment.deploymentadmin;version=latest,\ + org.apache.ace.deployment.task.base;version=latest,\ + org.apache.ace.deployment.task;version=latest,\ + org.apache.ace.scheduler.impl;version=latest,\ + commons-codec;version=1.4,\ + org.apache.ace.scheduler.api;version=latest + +# +# Embedding all required api and implementation packages to ensure that the +# Management Agent can run in any plain vanilla framework. +# +Private-Package: org.apache.ace.agent.connection,\ + org.apache.felix.dm,\ + org.apache.felix.dm.tracker,\ + org.apache.felix.dm.tracker,\ + org.apache.ace.agent.spi,\ + org.osgi.service.log,\ + org.osgi.service.useradmin,\ + org.apache.ace.agent,\ + org.apache.ace.agent.spi,\ + org.apache.ace.deployment,\ + org.apache.ace.log.util,\ + org.apache.ace.deployment.service,\ + org.apache.ace.discovery,\ + org.apache.ace.identification,\ + org.apache.ace.log,\ + org.apache.ace.log.target.store,\ + org.apache.ace.log.target.task,\ + org.apache.ace.range,\ + org.apache.ace.scheduler,\ + org.apache.ace.agent.identification,\ + org.apache.ace.consolelogger,\ + org.apache.ace.connectionfactory.impl,\ + org.apache.ace.connectionfactory,\ + org.apache.ace.agent.logging,\ + org.apache.ace.agent.impl,\ + org.apache.ace.agent.deployment,\ + org.apache.ace.agent.discovery,\ + org.apache.ace.log.target,\ + org.apache.felix.dm.impl,\ + org.apache.felix.dm.impl.dependencies,\ + org.apache.felix.dm.impl.index,\ + org.apache.felix.dm.impl.metatype,\ + org.apache.felix.deploymentadmin;-split-package:=first,\ + org.apache.felix.deploymentadmin.spi;-split-package:=first,\ + org.osgi.service.metatype;-split-package:=first,\ + org.osgi.util.tracker;-split-package:=first,\ + org.apache.commons.codec;-split-package:=first,\ + org.apache.commons.codec.binary;-split-package:=first + +# +# Exporting deploymentadmin and (some) compendium services so resource processors +# can wire up to the management agent. As bnd will generate the appropriate imports +# this should not lead to any conflicts with deployment packages. +# +# We could consider exposing all compendium packages by default in this way? +# +Export-Package: org.osgi.service.deploymentadmin;version=1.0;-split-package:=first,\ + org.osgi.service.deploymentadmin.spi;version=1.0;-split-package:=first,\ + org.osgi.service.event;version=1.2,\ + org.osgi.service.cm;version=1.3,\ + org.apache.ace.agent + +# +# +Import-Package: * \ No newline at end of file Added: ace/trunk/org.apache.ace.agent/build.xml URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/build.xml?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/build.xml (added) +++ ace/trunk/org.apache.ace.agent/build.xml Tue May 7 10:25:13 2013 @@ -0,0 +1,4 @@ + + + + Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/Constants.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/Constants.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/Constants.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/Constants.java Tue May 7 10:25:13 2013 @@ -0,0 +1,28 @@ +/* + * 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.ace.agent; + +/** + * Compile time constants for the bundle. Only located in the API package for development time visbility. + * + */ +public interface Constants { + + String FACTORY_PID = "org.apache.ace.managementagent.factory"; +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ManagementAgent.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ManagementAgent.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ManagementAgent.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/ManagementAgent.java Tue May 7 10:25:13 2013 @@ -0,0 +1,28 @@ +/* + * 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.ace.agent; + +/** + * TODO implement or remove? The question is whether we want to expose a single API to the rest of the environment to + * allow client bundles to do deploy/log stuff. + * + */ +public interface ManagementAgent { + +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryFactory.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryFactory.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryFactory.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryFactory.java Tue May 7 10:25:13 2013 @@ -0,0 +1,82 @@ +/* + * 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.ace.agent.connection; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; +import java.util.Properties; + +import org.apache.ace.agent.connection.UrlCredentialsFactory.MissingValueException; +import org.apache.ace.agent.spi.OneComponentFactoryBase; +import org.apache.ace.connectionfactory.ConnectionFactory; +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.log.LogService; + +/** + * Creates a {@link ConnectionFactory} service component with a {@link ConnectionFactoryImpl} implementation. + * + */ +public class ConnectionFactoryFactory extends OneComponentFactoryBase { + + // FIXME This could all be much nicer if we can refactor connectionfactory code some more. Note that at present this + // only support one credential mapping per agent. + private final static String[] AUTH_PROPERTIES = new String[] { + UrlCredentialsFactory.KEY_AUTH_BASE_URL, + UrlCredentialsFactory.KEY_AUTH_KEYSTORE_FILE, + UrlCredentialsFactory.KEY_AUTH_KEYSTORE_PASS, + UrlCredentialsFactory.KEY_AUTH_TRUSTSTORE_FILE, + UrlCredentialsFactory.KEY_AUTH_TRUSTSTORE_PASS, + UrlCredentialsFactory.KEY_AUTH_TYPE, + UrlCredentialsFactory.KEY_AUTH_USER_NAME, + UrlCredentialsFactory.KEY_AUTH_USER_PASSWORD }; + + @Override + public Component createComponent(BundleContext context, DependencyManager manager, LogService logService, Map configuration) throws ConfigurationException { + + Properties properties = getAgentproperties(configuration); + properties.put("impl.type", "jdk"); + + String baseUrl = configuration.get(UrlCredentialsFactory.KEY_AUTH_BASE_URL); + UrlCredentials credentials = null; + if (baseUrl != null && !"".equals(baseUrl)) { + Dictionary urlCredentials = new Hashtable(); + for (String authProp : AUTH_PROPERTIES) { + if (configuration.get(authProp) != null) { + urlCredentials.put(authProp, configuration.get(authProp)); + } + } + + try { + credentials = UrlCredentialsFactory.getCredentials(urlCredentials); + } + catch (MissingValueException e) { + throw new ConfigurationException("authorization", e.getMessage(), e); + } + } + + return manager.createComponent() + .setInterface(ConnectionFactory.class.getName(), properties) + .setImplementation(new ConnectionFactoryImpl(credentials)) + .add(manager.createServiceDependency().setService(LogService.class).setRequired(false)); + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryImpl.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryImpl.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryImpl.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/ConnectionFactoryImpl.java Tue May 7 10:25:13 2013 @@ -0,0 +1,256 @@ +/* + * 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.ace.agent.connection; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Map; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; + +import org.apache.ace.agent.connection.UrlCredentials.AuthType; +import org.apache.ace.agent.connection.UrlCredentialsFactory.MissingValueException; +import org.apache.ace.connectionfactory.ConnectionFactory; +import org.apache.commons.codec.binary.Base64; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.cm.ManagedServiceFactory; +import org.osgi.service.useradmin.User; + +// FIXME This is a temporary modified copy of the org.apache.ace.connectionfactory.impl because it is private and does not +// expose a convenient api for non CM configuration. +// +// * added a constructor with credential param + +/** + * Provides a default implementation for {@link ConnectionFactory} based on the standard java.net + * implementation of {@link URLConnection}. + */ +public class ConnectionFactoryImpl implements ConnectionFactory, ManagedServiceFactory { + + public static final String FACTORY_PID = "org.apache.ace.connectionfactory"; + + private static final String HTTP_HEADER_AUTHORIZATION = "Authorization"; + + private final Map m_credentialMapping; + + /** + * Creates a new {@link ConnectionFactoryImpl}. + */ + public ConnectionFactoryImpl() { + m_credentialMapping = new HashMap(); + } + + public ConnectionFactoryImpl(UrlCredentials credentials) { + m_credentialMapping = new HashMap(); + if (credentials != null) { + m_credentialMapping.put("static", credentials); + } + } + + /** + * {@inheritDoc} + */ + public URLConnection createConnection(URL url) throws IOException { + if (url == null) { + throw new IllegalArgumentException("URL cannot be null!"); + } + + URLConnection conn = url.openConnection(); + + UrlCredentials creds = getCredentials(url); + if (creds != null) { + supplyCredentials(conn, creds); + } + + return conn; + } + + /** + * {@inheritDoc} + */ + public URLConnection createConnection(URL url, User user) throws IOException { + if (url == null) { + throw new IllegalArgumentException("URL cannot be null!"); + } + if (user == null) { + throw new IllegalArgumentException("User cannot be null!"); + } + + URLConnection conn = url.openConnection(); + + UrlCredentials creds = getCredentials(url); + if (creds != null) { + // TODO apply user! + supplyCredentials(conn, creds); + } + + return conn; + } + + /** + * {@inheritDoc} + */ + public void deleted(String pid) { + synchronized (m_credentialMapping) { + m_credentialMapping.remove(pid); + } + } + + /** + * {@inheritDoc} + */ + public String getName() { + return "HTTP Connection Factory"; + } + + /** + * {@inheritDoc} + */ + public void updated(String pid, Dictionary properties) throws ConfigurationException { + UrlCredentials creds; + synchronized (m_credentialMapping) { + creds = m_credentialMapping.get(pid); + } + + try { + creds = UrlCredentialsFactory.getCredentials(properties); + + synchronized (m_credentialMapping) { + m_credentialMapping.put(pid, creds); + } + } + catch (MissingValueException e) { + throw new ConfigurationException(e.getProperty(), e.getMessage()); + } + } + + /** + * Returns the credentials to access the given URL. + * + * @param url + * the URL to find the credentials for, cannot be null. + * @return a {@link UrlCredentials} instance for the given URL, or null if none were found, or if none + * were necessary. + */ + final UrlCredentials getCredentials(URL url) { + Collection creds; + synchronized (m_credentialMapping) { + creds = new ArrayList(m_credentialMapping.values()); + } + + for (UrlCredentials c : creds) { + if (c.matches(url)) { + return c; + } + } + + return null; + } + + /** + * Returns the authorization header for HTTP Basic Authentication. + * + * @param values + * the credential values to supply, cannot be null and should be an array of two elements. + * @return a string that denotes the basic authentication header ("Basic " + encoded credentials), never + * null. + */ + final String getBasicAuthCredentials(Object[] values) { + if ((values == null) || values.length < 2) { + throw new IllegalArgumentException("Insufficient credentials passed: expected 2 values!"); + } + + StringBuilder sb = new StringBuilder(); + if (values[0] instanceof String) { + sb.append((String) values[0]); + } + else if (values[0] instanceof byte[]) { + sb.append(new String((byte[]) values[0])); + } + sb.append(':'); + if (values[1] instanceof String) { + sb.append((String) values[1]); + } + else if (values[1] instanceof byte[]) { + sb.append(new String((byte[]) values[1])); + } + + return "Basic " + new String(Base64.encodeBase64(sb.toString().getBytes())); + } + + /** + * Applies basic authentication to the given connection, if it is a {@link HttpURLConnection}. + * + * @param conn + * the connection to apply basic authentication to; + * @param values + * the credentials to apply. + */ + private void applyBasicAuthentication(URLConnection conn, Object[] values) { + if (conn instanceof HttpURLConnection) { + conn.setRequestProperty(HTTP_HEADER_AUTHORIZATION, getBasicAuthCredentials(values)); + } + } + + /** + * Applies the use of client certificates to the given connection, if it a {@link HttpsURLConnection}. + * + * @param conn + * the connection to apply client certs to; + * @param values + * the credentials to apply. + */ + private void applyClientCertificate(URLConnection conn, Object[] values) { + if (conn instanceof HttpsURLConnection) { + ((HttpsURLConnection) conn).setSSLSocketFactory(((SSLContext) values[0]).getSocketFactory()); + } + } + + /** + * Supplies the actual credentials to the given {@link URLConnection}. + * + * @param conn + * the connection to supply the credentials to, cannot be null; + * @param urlCreds + * the URL credentials to supply, cannot be null. + * @throws IOException + * in case of I/O problems. + */ + private void supplyCredentials(URLConnection conn, UrlCredentials urlCreds) throws IOException { + final AuthType type = urlCreds.getType(); + final Object[] creds = urlCreds.getCredentials(); + + if (AuthType.BASIC.equals(type)) { + applyBasicAuthentication(conn, creds); + } + else if (AuthType.CLIENT_CERT.equals(type)) { + applyClientCertificate(conn, creds); + } + else if (!AuthType.NONE.equals(type)) { + throw new IllegalArgumentException("Unknown authentication type: " + type); + } + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentials.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentials.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentials.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentials.java Tue May 7 10:25:13 2013 @@ -0,0 +1,149 @@ +/* + * 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.ace.agent.connection; + +import java.net.URL; +import java.util.Arrays; + +//FIXME This is a temporary modified copy of the org.apache.ace.connectionfactory.impl because it is private and does not +//expose a convenient api for non CM configuration. + +/** + * Small container for holding URL credentials. + */ +final class UrlCredentials { + + static enum AuthType { + /** Indicates no authentication. */ + NONE, + /** Indicates basic HTTP authentication. */ + BASIC, + /** Indicates the use of client certificates. */ + CLIENT_CERT; + } + + private final AuthType m_type; + private final URL m_baseURL; + private final Object[] m_credentials; + + /** + * Creates a new, anonymous, {@link UrlCredentials} instance. + * + * @param baseURL the base URL for which to apply the credentials, cannot be null. + */ + public UrlCredentials(URL baseURL) { + this(AuthType.NONE, baseURL); + } + + /** + * Creates a new {@link UrlCredentials} instance. + * + * @param type the authentication type to use for the authentication of the URL, cannot be null; + * @param baseURL the base URL for which to apply the credentials, cannot be null; + * @param credentials the credentials to use, cannot be null, but may be empty. + */ + public UrlCredentials(AuthType type, URL baseURL, Object... credentials) { + if (type == null) { + throw new IllegalArgumentException("Type cannot be null!"); + } + if (baseURL == null) { + throw new IllegalArgumentException("BaseURL cannot be null!"); + } + m_type = type; + m_baseURL = baseURL; + m_credentials = (credentials == null) ? new Object[0] : credentials.clone(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + + UrlCredentials other = (UrlCredentials) obj; + if (m_type != other.m_type) { + return false; + } + if (!m_baseURL.equals(other.m_baseURL)) { + return false; + } + if (!Arrays.equals(m_credentials, other.m_credentials)) { + return false; + } + return true; + } + + /** + * Returns whether or not the given URL can be mapped to our own base URL. + * + * @param url the URL to map, may be null in which case false will be returned. + * @return true if the given URL maps to our base URL, false otherwise. + */ + public boolean matches(URL url) { + if (url == null) { + return false; + } + + String baseURL = m_baseURL.toExternalForm(); + return url.toExternalForm().startsWith(baseURL); + } + + /** + * Returns the credentials for a URL. + * + * @return the credentials, never null. + */ + public Object[] getCredentials() { + return m_credentials.clone(); + } + + /** + * Returns the authentication type. + * + * @return the type of authentication to use. + */ + public AuthType getType() { + return m_type; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((m_type == null) ? 0 : m_type.hashCode()); + result = prime * result + ((m_baseURL == null) ? 0 : m_baseURL.hashCode()); + result = prime * result + Arrays.hashCode(m_credentials); + return result; + } + + /** + * @return the base URL these credentials apply to, cannot be null. + */ + final URL getBaseURL() { + return m_baseURL; + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentialsFactory.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentialsFactory.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentialsFactory.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/connection/UrlCredentialsFactory.java Tue May 7 10:25:13 2013 @@ -0,0 +1,299 @@ +/* + * 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.ace.agent.connection; + +import java.io.Closeable; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.util.Dictionary; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; + +import org.apache.ace.agent.connection.UrlCredentials.AuthType; + +//FIXME This is a temporary modified copy of the org.apache.ace.connectionfactory.impl because it is private and does not +//expose a convenient api for non CM configuration. + +/** + * Provides a helper class for obtaining access credentials from a dictionary. + */ +final class UrlCredentialsFactory { + + public static final class MissingValueException extends RuntimeException { + private final String m_property; + + /** + * @param property + * the name of the missing property; + * @param message + * the message explaining the missing property. + */ + public MissingValueException(String property) { + this(property, "No value for " + property + " given!"); + } + + /** + * @param property + * the name of the missing property; + * @param message + * the message explaining the missing property. + */ + public MissingValueException(String property, String message) { + super(message); + m_property = property; + } + + /** + * Returns the name of the missing property. + * + * @return the property name, never null. + */ + public String getProperty() { + return m_property; + } + } + + public static final String KEY_AUTH_BASE_URL = "authentication.baseURL"; + public static final String KEY_AUTH_TYPE = "authentication.type"; + public static final String KEY_AUTH_USER_NAME = "authentication.user.name"; + public static final String KEY_AUTH_USER_PASSWORD = "authentication.user.password"; + public static final String KEY_AUTH_KEYSTORE_FILE = "authentication.keystore.file"; + public static final String KEY_AUTH_KEYSTORE_PASS = "authentication.keystore.storepass"; + public static final String KEY_AUTH_TRUSTSTORE_FILE = "authentication.truststore.file"; + public static final String KEY_AUTH_TRUSTSTORE_PASS = "authentication.truststore.storepass"; + + /** + * Not used. + */ + private UrlCredentialsFactory() { + // Nop + } + + /** + * @param props + * the properties to take the access credentials from. + * @throws MissingValueException + * in case the given properties is missing values. + */ + public static UrlCredentials getCredentials(Dictionary props) throws MissingValueException { + return getCredentials(props, ""); + } + + /** + * @param props + * the properties to take the access credentials from; + * @param prefix + * the prefix to use to lookup the correct values in the given dictionary. + * @throws MissingValueException + * in case the given properties is missing values. + */ + public static UrlCredentials getCredentials(Dictionary props, String prefix) throws MissingValueException { + if (props == null) { + throw new IllegalArgumentException("Properties cannot be null!"); + } + if (prefix == null) { + throw new IllegalArgumentException("Prefix cannot be null!"); + } + + AuthType type; + URL baseURL; + Object[] creds; + + String baseUrlValue = getStringProperty(props, prefix.concat(KEY_AUTH_BASE_URL)); + if (baseUrlValue == null) { + throw new MissingValueException(KEY_AUTH_BASE_URL); + } + + try { + baseURL = new URL(baseUrlValue); + } + catch (MalformedURLException e) { + throw new MissingValueException(KEY_AUTH_BASE_URL, "Invalid base URL!"); + } + + String authType = getStringProperty(props, prefix.concat(KEY_AUTH_TYPE), "none"); + try { + type = AuthType.valueOf(authType.toUpperCase()); + } + catch (Exception e) { + throw new IllegalArgumentException("Unsupported authentication type: " + authType); + } + + if (AuthType.NONE.equals(type)) { + creds = new Object[0]; + } + else if (AuthType.BASIC.equals(type)) { + String userName = getStringProperty(props, prefix.concat(KEY_AUTH_USER_NAME)); + if (userName == null) { + throw new MissingValueException(prefix.concat(KEY_AUTH_USER_NAME)); + } + + String password = getStringProperty(props, prefix.concat(KEY_AUTH_USER_PASSWORD)); + if (password == null) { + throw new MissingValueException(prefix.concat(KEY_AUTH_USER_PASSWORD)); + } + + creds = new Object[] { userName, password }; + } + else if (AuthType.CLIENT_CERT.equals(type)) { + String keystoreFile = getStringProperty(props, prefix.concat(KEY_AUTH_KEYSTORE_FILE)); + String keystorePass = getStringProperty(props, prefix.concat(KEY_AUTH_KEYSTORE_PASS)); + if ((keystoreFile != null) && (keystorePass == null)) { + throw new MissingValueException(prefix.concat(KEY_AUTH_KEYSTORE_PASS)); + } + if ((keystoreFile == null) && (keystorePass != null)) { + throw new MissingValueException(prefix.concat(KEY_AUTH_KEYSTORE_FILE)); + } + + String truststoreFile = getStringProperty(props, prefix.concat(KEY_AUTH_TRUSTSTORE_FILE)); + String truststorePass = getStringProperty(props, prefix.concat(KEY_AUTH_TRUSTSTORE_PASS)); + if ((truststoreFile != null) && (truststorePass == null)) { + throw new MissingValueException(prefix.concat(KEY_AUTH_TRUSTSTORE_PASS)); + } + if ((truststoreFile == null) && (truststorePass != null)) { + throw new MissingValueException(prefix.concat(KEY_AUTH_TRUSTSTORE_FILE)); + } + + if ((keystoreFile == null) && (truststoreFile == null)) { + try { + // No configuration given; use the system-wide defaults... + creds = new Object[] { SSLContext.getDefault() }; + } + catch (Exception e) { + throw new IllegalArgumentException("Failed to obtain SSL context!", e); + } + } + else { + try { + KeyManager[] keyManagers = getKeyManagerFactory(keystoreFile, keystorePass); + TrustManager[] trustManagers = getTrustManagerFactory(truststoreFile, truststorePass); + + SSLContext context = SSLContext.getInstance("TLS"); + context.init(keyManagers, trustManagers, new SecureRandom()); + + creds = new Object[] { context }; + } + catch (Exception e) { + throw new IllegalArgumentException("Failed to load keystore!", e); + } + } + } + else { + throw new IllegalArgumentException("Invalid/unhandled authentication type: " + authType); + } + + return new UrlCredentials(type, baseURL, creds); + } + + private static String getStringProperty(Dictionary dict, String key) { + Object value = dict.get(key); + if (value instanceof String) { + return (String) value; + } + else if (value instanceof byte[]) { + return new String((byte[]) value); + } + return null; + } + + private static String getStringProperty(Dictionary dict, String key, String defaultValue) { + String value = getStringProperty(dict, key); + return (value == null) ? defaultValue : value; + } + + /** + * @param keystoreFile + * @param storePass + * @return + * @throws IOException + * @throws GeneralSecurityException + */ + private static KeyManager[] getKeyManagerFactory(String keystoreFile, String storePass) throws IOException, GeneralSecurityException { + if (keystoreFile == null) { + return null; + } + + InputStream keyInput = null; + try { + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + + keyInput = new FileInputStream(keystoreFile); + + keyStore.load(keyInput, storePass.toCharArray()); + + keyManagerFactory.init(keyStore, storePass.toCharArray()); + return keyManagerFactory.getKeyManagers(); + } + finally { + closeSafely(keyInput); + } + } + + /** + * @param truststoreFile + * @param storePass + * @return + * @throws IOException + * @throws GeneralSecurityException + */ + private static TrustManager[] getTrustManagerFactory(String truststoreFile, String storePass) throws IOException, GeneralSecurityException { + if (truststoreFile == null) { + return null; + } + + InputStream trustInput = null; + try { + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + + trustInput = new FileInputStream(truststoreFile); + + trustStore.load(trustInput, storePass.toCharArray()); + + trustManagerFactory.init(trustStore); + return trustManagerFactory.getTrustManagers(); + } + finally { + closeSafely(trustInput); + } + } + + private static void closeSafely(Closeable resource) { + try { + if (resource != null) { + resource.close(); + } + } + catch (IOException e) { + // Ignore; nothing we can/will do... + } + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployer.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployer.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployer.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployer.java Tue May 7 10:25:13 2013 @@ -0,0 +1,60 @@ +/* + * 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.ace.agent.deployment; + +import java.io.InputStream; +import org.apache.ace.deployment.Deployment; +import org.osgi.framework.Version; +import org.osgi.service.deploymentadmin.DeploymentAdmin; +import org.osgi.service.deploymentadmin.DeploymentPackage; +import org.osgi.service.log.LogService; + +/** + * Implementation of the DeploymentService interface that uses the DeploymentAdmin + * to deploy components. + */ +public class DeploymentAdminDeployer implements Deployment { + private volatile LogService m_log; /* will be injected by dependencymanager */ + private volatile DeploymentAdmin m_admin; /* will be injected by dependencymanager */ + + public String getName(Object object) throws IllegalArgumentException { + if (!(object instanceof DeploymentPackage)) { + throw new IllegalArgumentException("Argument is not a DeploymentPackage"); + } + return ((DeploymentPackage) object).getName(); + } + + public Version getVersion(Object object) throws IllegalArgumentException { + if (!(object instanceof DeploymentPackage)) { + throw new IllegalArgumentException("Argument is not a DeploymentPackage"); + } + return ((DeploymentPackage) object).getVersion(); + } + + public Object install(InputStream inputStream) throws Exception { + DeploymentPackage deploymentPackage = m_admin.installDeploymentPackage(inputStream); + m_log.log(LogService.LOG_INFO, "Deployment Package installed: name=" + deploymentPackage.getName() + " version=" + deploymentPackage.getVersion()); + return deploymentPackage; + } + + public Object[] list() { + // DeploymentAdmin spec says this call should never return null + return m_admin.listDeploymentPackages(); + } +} \ No newline at end of file Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployerFactory.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployerFactory.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployerFactory.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentAdminDeployerFactory.java Tue May 7 10:25:13 2013 @@ -0,0 +1,47 @@ +/* + * 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.ace.agent.deployment; + +import java.util.Map; + +import org.apache.ace.agent.spi.OneComponentFactoryBase; +import org.apache.ace.deployment.Deployment; +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.deploymentadmin.DeploymentAdmin; +import org.osgi.service.log.LogService; + +/** + * Creates a {@link Deployment} service component with a {@link DeploymentAdminDeployer} implementation. + * + */ +public class DeploymentAdminDeployerFactory extends OneComponentFactoryBase { + + @Override + public Component createComponent(BundleContext context, DependencyManager manager, LogService logService, Map configuration) throws ConfigurationException { + + return manager.createComponent() + .setInterface(Deployment.class.getName(), getAgentproperties(configuration)) + .setImplementation(DeploymentAdminDeployer.class) + .add(manager.createServiceDependency().setService(DeploymentAdmin.class).setRequired(true)) + .add(manager.createServiceDependency().setService(LogService.class).setRequired(false)); + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTask.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTask.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTask.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTask.java Tue May 7 10:25:13 2013 @@ -0,0 +1,89 @@ +/* + * 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.ace.agent.deployment; + +import java.net.MalformedURLException; +import java.util.Dictionary; +import java.util.Properties; + +import org.apache.ace.deployment.service.DeploymentService; +import org.osgi.framework.Version; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventAdmin; +import org.osgi.service.log.LogService; + +//FIXME This is a of the org.apache.ace.deployment it is private and may be better located here. + +/** + * Task that checks for a new version and sends out an event if there is a new version. It does not actually + * download or install it. + */ +public class DeploymentCheckTask implements Runnable { + + private static final String TOPIC_UPDATE_AVAILABLE = "org/apache/ace/deployment/UPDATEAVAILABLE"; + + private volatile LogService m_log; + private volatile EventAdmin m_eventAdmin; + private volatile DeploymentService m_service; + + /** + * When run a check is made if a higher version is available on the remote. If so, send out an event. + */ + public void run() { + try { + Version localVersion = m_service.getHighestLocalVersion(); + Version remoteVersion = m_service.getHighestRemoteVersion(); + + if (remoteVersion == null) { + // expected if there's no discovered ps or relay server + // ACE-220: lower log level; not of real interest... + m_log.log(LogService.LOG_DEBUG, "Highest remote: unknown / Highest local: " + localVersion); + return; + } + + // ACE-220: lower log level; not of real interest... + m_log.log(LogService.LOG_DEBUG, "Highest remote: " + remoteVersion + " / Highest local: " + localVersion); + + if ((remoteVersion != null) && ((localVersion == null) || (remoteVersion.compareTo(localVersion) > 0))) { + m_eventAdmin.postEvent(createEvent(localVersion, remoteVersion)); + } + } + catch (MalformedURLException e) { + m_log.log(LogService.LOG_ERROR, "Error creating endpoint url", e); + } + catch (Exception e) { + m_log.log(LogService.LOG_ERROR, "Error checking for update", e); + } + } + + /** + * Creates an event for notifying listeners that a new version can be installed. + * + * @param localVersion the highest local version; + * @param remoteVersion the higest remote version. + * @return a new {@link Event} instance, never null. + */ + private Event createEvent(Version localVersion, Version remoteVersion) { + Properties properties = new Properties(); + properties.put("deploymentpackage.localversion", ((localVersion == null) ? Version.emptyVersion : localVersion)); + properties.put("deploymentpackage.remoteversion", remoteVersion); + + return new Event(TOPIC_UPDATE_AVAILABLE, (Dictionary) properties); + } +} \ No newline at end of file Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTaskFactory.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTaskFactory.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTaskFactory.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentCheckTaskFactory.java Tue May 7 10:25:13 2013 @@ -0,0 +1,53 @@ +/* + * 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.ace.agent.deployment; + +import java.util.Map; +import java.util.Properties; + +import org.apache.ace.agent.spi.OneComponentFactoryBase; +import org.apache.ace.deployment.service.DeploymentService; +import org.apache.ace.scheduler.constants.SchedulerConstants; +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.log.LogService; + +/** + * Creates a executor whiteboard {@link Runnable} service component with a {@link DeploymentCheckTask} implementation. + * + */ +public class DeploymentCheckTaskFactory extends OneComponentFactoryBase { + + @Override + public Component createComponent(BundleContext context, DependencyManager manager, LogService logService, Map configuration) throws ConfigurationException { + + Properties properties = getAgentproperties(configuration); + properties.put(SchedulerConstants.SCHEDULER_NAME_KEY, DeploymentCheckTask.class.getSimpleName()); + properties.put(SchedulerConstants.SCHEDULER_DESCRIPTION_KEY, "Task that checks for updates of artifacts installed on this target with the server."); + properties.put(SchedulerConstants.SCHEDULER_RECIPE, 2000); + + return manager.createComponent() + .setInterface(Runnable.class.getName(), properties) + .setImplementation(new DeploymentCheckTask()) + .add(manager.createServiceDependency().setService(DeploymentService.class, getAgentFilter(configuration, null)).setRequired(true)) + .add(manager.createServiceDependency().setService(LogService.class).setRequired(false)); + } +} Added: ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceFactory.java URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceFactory.java?rev=1479841&view=auto ============================================================================== --- ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceFactory.java (added) +++ ace/trunk/org.apache.ace.agent/src/org/apache/ace/agent/deployment/DeploymentServiceFactory.java Tue May 7 10:25:13 2013 @@ -0,0 +1,55 @@ +/* + * 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.ace.agent.deployment; + +import java.util.Map; + +import org.apache.ace.agent.spi.OneComponentFactoryBase; +import org.apache.ace.connectionfactory.ConnectionFactory; +import org.apache.ace.deployment.Deployment; +import org.apache.ace.deployment.service.DeploymentService; +import org.apache.ace.discovery.Discovery; +import org.apache.ace.identification.Identification; +import org.apache.felix.dm.Component; +import org.apache.felix.dm.DependencyManager; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.event.EventAdmin; +import org.osgi.service.log.LogService; + +/** + * Creates a {@link DeploymentService} service component with a {@link DeploymentServiceImpl} implementation. + * + */ +public class DeploymentServiceFactory extends OneComponentFactoryBase { + + @Override + public Component createComponent(BundleContext context, DependencyManager manager, LogService logService, Map configuration) throws ConfigurationException { + + return manager.createComponent() + .setInterface(DeploymentService.class.getName(), getAgentproperties(configuration)) + .setImplementation(new DeploymentServiceImpl()) + .add(manager.createServiceDependency().setService(Identification.class, getAgentFilter(configuration, null)).setRequired(true)) + .add(manager.createServiceDependency().setService(Discovery.class, getAgentFilter(configuration, null)).setRequired(true)) + .add(manager.createServiceDependency().setService(Deployment.class, getAgentFilter(configuration, null)).setRequired(true)) + .add(manager.createServiceDependency().setService(ConnectionFactory.class, getAgentFilter(configuration, null)).setRequired(true)) + .add(manager.createServiceDependency().setService(EventAdmin.class).setRequired(false)) + .add(manager.createServiceDependency().setService(LogService.class).setRequired(false)); + } +}