Return-Path: X-Original-To: apmail-ode-commits-archive@www.apache.org Delivered-To: apmail-ode-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 DD66617C9E for ; Fri, 6 Nov 2015 10:50:56 +0000 (UTC) Received: (qmail 84150 invoked by uid 500); 6 Nov 2015 10:50:56 -0000 Delivered-To: apmail-ode-commits-archive@ode.apache.org Received: (qmail 84066 invoked by uid 500); 6 Nov 2015 10:50:56 -0000 Mailing-List: contact commits-help@ode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ode.apache.org Delivered-To: mailing list commits@ode.apache.org Received: (qmail 83703 invoked by uid 99); 6 Nov 2015 10:50:56 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Nov 2015 10:50:56 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 5EDB9E0A3C; Fri, 6 Nov 2015 10:50:56 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sathwik@apache.org To: commits@ode.apache.org Date: Fri, 06 Nov 2015 10:51:05 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [10/30] ode git commit: minor changes minor changes Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/0afb7c4d Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/0afb7c4d Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/0afb7c4d Branch: refs/heads/ODE-563 Commit: 0afb7c4d6268ff3bcc99620e4926e0c7ab61d78d Parents: 9cb7582 Author: suba Authored: Mon Jun 22 21:29:19 2015 +0530 Committer: suba Committed: Mon Jun 22 21:29:19 2015 +0530 ---------------------------------------------------------------------- .../ode/axis2/deploy/DeploymentPoller.java | 2 + .../ode/axis2/service/DeploymentWebService.java | 5 +- .../apache/ode/bpel/clapi/ClusterManager.java | 9 ++++ .../bpel/clapi/ProcessStoreClusterEvent.java | 57 ++++++++++++++++++++ .../bpel/clapi/ProcessStoreDeployedEvent.java | 18 ++----- .../bpel/clapi/ProcessStoreUndeployedEvent.java | 16 ++---- .../ode/store/ClusterProcessStoreImpl.java | 31 +++-------- .../org/apache/ode/store/ProcessStoreImpl.java | 51 ++++++------------ .../hazelcast/HazelcastClusterImpl.java | 41 +++++++------- dependencies.rb | 2 +- 10 files changed, 126 insertions(+), 106 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/axis2/src/main/java/org/apache/ode/axis2/deploy/DeploymentPoller.java ---------------------------------------------------------------------- diff --git a/axis2/src/main/java/org/apache/ode/axis2/deploy/DeploymentPoller.java b/axis2/src/main/java/org/apache/ode/axis2/deploy/DeploymentPoller.java index 9964af0..ed84f35 100644 --- a/axis2/src/main/java/org/apache/ode/axis2/deploy/DeploymentPoller.java +++ b/axis2/src/main/java/org/apache/ode/axis2/deploy/DeploymentPoller.java @@ -346,6 +346,8 @@ public class DeploymentPoller { */ private boolean pollerTryLock(String key) { if(clusterEnabled) { + ClusterManager cm = _odeServer.getBpelServer().getContexts().clusterManager; + cm.putIfAbsent(key,key); return _odeServer.getBpelServer().getContexts().clusterManager.tryLock(key); } else return true; http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/axis2/src/main/java/org/apache/ode/axis2/service/DeploymentWebService.java ---------------------------------------------------------------------- diff --git a/axis2/src/main/java/org/apache/ode/axis2/service/DeploymentWebService.java b/axis2/src/main/java/org/apache/ode/axis2/service/DeploymentWebService.java index 89c5a63..66221dc 100644 --- a/axis2/src/main/java/org/apache/ode/axis2/service/DeploymentWebService.java +++ b/axis2/src/main/java/org/apache/ode/axis2/service/DeploymentWebService.java @@ -45,6 +45,7 @@ import org.apache.axiom.om.OMText; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPFactory; import org.apache.axis2.AxisFault; +import org.apache.ode.bpel.clapi.ClusterManager; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.AxisOperation; @@ -386,7 +387,9 @@ public class DeploymentWebService { */ private boolean lock(String key) { if(clusterEnabled) { - return _odeServer.getBpelServer().getContexts().clusterManager.lock(key); + ClusterManager cm = _odeServer.getBpelServer().getContexts().clusterManager; + cm.putIfAbsent(key,key); + return cm.lock(key); } else return true; } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ClusterManager.java ---------------------------------------------------------------------- diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ClusterManager.java b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ClusterManager.java index df4342e..fab2bac 100644 --- a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ClusterManager.java +++ b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ClusterManager.java @@ -67,4 +67,13 @@ public interface ClusterManager { * @param event */ void publishProcessStoreEvent(Object event); + + /** + * Check whether the map has a value for given key, if absent put the value to map + * @param key + * @param keyVal + */ + void putIfAbsent(String key, String keyVal); + + } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreClusterEvent.java ---------------------------------------------------------------------- diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreClusterEvent.java b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreClusterEvent.java new file mode 100644 index 0000000..a396f6f --- /dev/null +++ b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreClusterEvent.java @@ -0,0 +1,57 @@ +/* + * 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.ode.bpel.clapi; + +import java.io.Serializable; + +public abstract class ProcessStoreClusterEvent implements Serializable { + protected static final long serialVersionUID = 1L; + + private String deploymentUnit; + + protected String info ; + + private String uuid; + + public ProcessStoreClusterEvent(String deploymentUnit) { + this.deploymentUnit = deploymentUnit; + } + + @Override + public String toString() { + return "{ProcessStoreClusterEvent#" + deploymentUnit +"}"; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getUuid() { + return uuid; + } + + public String getDuName() { + return deploymentUnit; + } + + public String getInfo() { + return info; + } + +} http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreDeployedEvent.java ---------------------------------------------------------------------- diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreDeployedEvent.java b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreDeployedEvent.java index a623d47..c7cbb23 100644 --- a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreDeployedEvent.java +++ b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreDeployedEvent.java @@ -18,23 +18,15 @@ */ package org.apache.ode.bpel.clapi; -import java.io.Serializable; +public class ProcessStoreDeployedEvent extends ProcessStoreClusterEvent { -public class ProcessStoreDeployedEvent implements Serializable { - private static final long serialVersionUID = 1L; - - public final String deploymentUnit; - - public final String info; - - public ProcessStoreDeployedEvent(String deploymentUnit) { - this.info = "Deployment Event"; - this.deploymentUnit = deploymentUnit; + public ProcessStoreDeployedEvent(String deploymentUnit) { + super(deploymentUnit); + info = "Deploy Event"; } @Override public String toString() { - return "{ProcessStoreDeployedEvent#" + deploymentUnit +"}"; + return "{ProcessStoreDeployedEvent#" + getDuName() +"}"; } - } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreUndeployedEvent.java ---------------------------------------------------------------------- diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreUndeployedEvent.java b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreUndeployedEvent.java index 347312f..d4f5a49 100644 --- a/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreUndeployedEvent.java +++ b/bpel-api/src/main/java/org/apache/ode/bpel/clapi/ProcessStoreUndeployedEvent.java @@ -18,23 +18,15 @@ */ package org.apache.ode.bpel.clapi; -import java.io.Serializable; - -public class ProcessStoreUndeployedEvent implements Serializable { - private static final long serialVersionUID = 1L; - - public final String deploymentUnit; - - public final String info; +public class ProcessStoreUndeployedEvent extends ProcessStoreClusterEvent { public ProcessStoreUndeployedEvent(String deploymentUnit) { - this.info = "Undeployment Event"; - this.deploymentUnit = deploymentUnit; + super(deploymentUnit); + info = "Undeploy Event"; } @Override public String toString() { - return "{ProcessStoreUndeployedEvent#" + deploymentUnit +"}"; + return "{ProcessStoreUndeployedEvent#" + getDuName() +"}"; } - } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-store/src/main/java/org/apache/ode/store/ClusterProcessStoreImpl.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/ClusterProcessStoreImpl.java b/bpel-store/src/main/java/org/apache/ode/store/ClusterProcessStoreImpl.java index 551fd72..117eab0 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/ClusterProcessStoreImpl.java +++ b/bpel-store/src/main/java/org/apache/ode/store/ClusterProcessStoreImpl.java @@ -37,7 +37,6 @@ import java.util.regex.Pattern; public class ClusterProcessStoreImpl extends ProcessStoreImpl{ private static final Log __log = LogFactory.getLog(ClusterProcessStoreImpl.class); - private final Map loaded = new HashMap(); private ClusterManager _clusterManager; private ProcessStoreDeployedEvent deployedEvent; private ProcessStoreUndeployedEvent undeployedEvent; @@ -50,10 +49,6 @@ public class ClusterProcessStoreImpl extends ProcessStoreImpl{ public Collection deploy(final File deploymentUnitDirectory) { Collection deployed = super.deploy(deploymentUnitDirectory); - Map _processes = getProcessesMap(); - for (QName key : deployed) { - loaded.put(key,_processes.get(key)); - } publishProcessStoreDeployedEvent(deploymentUnitDirectory.getName()); return deployed; } @@ -64,13 +59,13 @@ public class ClusterProcessStoreImpl extends ProcessStoreImpl{ } public void publishService(final String duName) { - final ArrayList confs = new ArrayList();; + final ArrayList confs = new ArrayList(); ProcessState state = ProcessState.ACTIVE; Pattern duNamePattern = getPreviousPackageVersionPattern(duName); - for (QName key : loaded.keySet()) { - ProcessConfImpl pconf = loaded.get(key); + for (QName key : _processes.keySet()) { + ProcessConfImpl pconf = _processes.get(key); Matcher matcher = duNamePattern.matcher(pconf.getPackage()); if (matcher.matches() && pconf.getState().equals(state)) { pconf.setState(ProcessState.RETIRED); @@ -85,7 +80,7 @@ public class ClusterProcessStoreImpl extends ProcessStoreImpl{ if (dudao != null) { List load = load(dudao); for(ProcessConfImpl p : load) { - loaded.put(p.getProcessId(),p); + _processes.put(p.getProcessId(),p); } confs.addAll(load); } @@ -105,23 +100,11 @@ public class ClusterProcessStoreImpl extends ProcessStoreImpl{ } } - private Pattern getPreviousPackageVersionPattern(String duName) { - String[] nameParts = duName.split("/"); - /* Replace the version number (if any) with regexp to match any version number */ - nameParts[0] = nameParts[0].replaceAll("([-\\Q.\\E](\\d)+)?\\z", ""); - nameParts[0] += "([-\\Q.\\E](\\d)+)?"; - StringBuilder duNameRegExp = new StringBuilder(duName.length() * 2); - for (int i = 0, n = nameParts.length; i < n; i++) { - if (i > 0) duNameRegExp.append("/"); - duNameRegExp.append(nameParts[i]); - } - Pattern duNamePattern = Pattern.compile(duNameRegExp.toString()); - return duNamePattern; - } + public Collection undeploy(final File dir) { Collection undeployed = super.undeploy(dir); - loaded.keySet().removeAll(undeployed); + _processes.keySet().removeAll(undeployed); publishProcessStoreUndeployedEvent(dir.getName()); return undeployed; } @@ -138,7 +121,7 @@ public class ClusterProcessStoreImpl extends ProcessStoreImpl{ */ public Collection undeployProcesses(final String duName) { Collection undeployed = super.undeployProcesses(duName); - loaded.keySet().removeAll(undeployed); + _processes.keySet().removeAll(undeployed); return undeployed; } } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java ---------------------------------------------------------------------- diff --git a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java index 77afe5a..0658b66 100644 --- a/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java +++ b/bpel-store/src/main/java/org/apache/ode/store/ProcessStoreImpl.java @@ -71,7 +71,7 @@ public class ProcessStoreImpl implements ProcessStore { private final CopyOnWriteArrayList _listeners = new CopyOnWriteArrayList(); - private Map _processes = new HashMap(); + protected Map _processes = new HashMap(); private Map _deploymentUnits = new HashMap(); @@ -333,18 +333,9 @@ public class ProcessStoreImpl implements ProcessStore { * "AbsenceRequest-2/AbsenceRequest.ode" and setRetirePackage() will be called accordingly. */ private void retirePreviousPackageVersions(DeploymentUnitDir du) { - //retire all the other versions of the same DU - String[] nameParts = du.getName().split("/"); - /* Replace the version number (if any) with regexp to match any version number */ - nameParts[0] = nameParts[0].replaceAll("([-\\Q.\\E](\\d)+)?\\z", ""); - nameParts[0] += "([-\\Q.\\E](\\d)+)?"; - StringBuilder duNameRegExp = new StringBuilder(du.getName().length() * 2); - for (int i = 0, n = nameParts.length; i < n; i++) { - if (i > 0) duNameRegExp.append("/"); - duNameRegExp.append(nameParts[i]); - } - Pattern duNamePattern = Pattern.compile(duNameRegExp.toString()); + Pattern duNamePattern = getPreviousPackageVersionPattern(du.getName()); + for (String deployedDUname : _deploymentUnits.keySet()) { Matcher matcher = duNamePattern.matcher(deployedDUname); if (matcher.matches()) { @@ -371,26 +362,7 @@ public class ProcessStoreImpl implements ProcessStore { __log.error("Error synchronizing with data store; " + duName + " may be reappear after restart!"); } - Collection undeployed = Collections.emptyList(); - DeploymentUnitDir du; - _rw.writeLock().lock(); - try { - du = _deploymentUnits.remove(duName); - if (du != null) { - undeployed = toPids(du.getProcessNames(), du.getVersion()); - } - - for (QName pn : undeployed) { - fireEvent(new ProcessStoreEvent(ProcessStoreEvent.Type.UNDEPLOYED, pn, du.getName())); - __log.info(__msgs.msgProcessUndeployed(pn)); - } - - _processes.keySet().removeAll(undeployed); - } finally { - _rw.writeLock().unlock(); - } - - return undeployed; + return undeployProcesses(duName); } public Collection getPackages() { @@ -900,8 +872,19 @@ public class ProcessStoreImpl implements ProcessStore { } } - protected Map getProcessesMap() { - return _processes; + protected Pattern getPreviousPackageVersionPattern(String duName) { + //retire all the other versions of the same DU + String[] nameParts = duName.split("/"); + /* Replace the version number (if any) with regexp to match any version number */ + nameParts[0] = nameParts[0].replaceAll("([-\\Q.\\E](\\d)+)?\\z", ""); + nameParts[0] += "([-\\Q.\\E](\\d)+)?"; + StringBuilder duNameRegExp = new StringBuilder(duName.length() * 2); + for (int i = 0, n = nameParts.length; i < n; i++) { + if (i > 0) duNameRegExp.append("/"); + duNameRegExp.append(nameParts[i]); + } + Pattern duNamePattern = Pattern.compile(duNameRegExp.toString()); + return duNamePattern; } protected Collection undeployProcesses(final String duName) { http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/clustering/src/main/java/org/apache/ode/clustering/hazelcast/HazelcastClusterImpl.java ---------------------------------------------------------------------- diff --git a/clustering/src/main/java/org/apache/ode/clustering/hazelcast/HazelcastClusterImpl.java b/clustering/src/main/java/org/apache/ode/clustering/hazelcast/HazelcastClusterImpl.java index beba779..42a3169 100644 --- a/clustering/src/main/java/org/apache/ode/clustering/hazelcast/HazelcastClusterImpl.java +++ b/clustering/src/main/java/org/apache/ode/clustering/hazelcast/HazelcastClusterImpl.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.clapi.ClusterManager; +import org.apache.ode.bpel.clapi.ProcessStoreClusterEvent; import org.apache.ode.bpel.clapi.ProcessStoreDeployedEvent; import org.apache.ode.bpel.clapi.ProcessStoreUndeployedEvent; import org.apache.ode.store.ClusterProcessStoreImpl; @@ -43,7 +44,6 @@ public class HazelcastClusterImpl implements ClusterManager { private HazelcastInstance _hazelcastInstance; private boolean isMaster = false; private Member leader; - private Member eventInitiator; private IMap lock_map; private ITopic clusterMessageTopic; private ClusterProcessStoreImpl _clusterProcessStore; @@ -81,27 +81,23 @@ public class HazelcastClusterImpl implements ClusterManager { } } + public void putIfAbsent(String key, String keyVal) { + lock_map.putIfAbsent(key, keyVal); + } + public boolean lock(String key) { - lock_map.putIfAbsent(key, key); lock_map.lock(key); - boolean state = lock_map.isLocked(key); - __log.info("ThreadID:" + Thread.currentThread().getId() + " duLocked value for " + key + " file" + " after locking: " + state); - return state; + __log.info("ThreadID:" + Thread.currentThread().getId() + " duLocked value for " + key + " file" + " after locking: " + true); + return true; } public boolean unlock(String key) { lock_map.unlock(key); - try { - Thread.sleep(10); - } catch (InterruptedException e) { - } - boolean state = lock_map.isLocked(key); - __log.info("ThreadID:" + Thread.currentThread().getId() + " duLocked value for " + key + " file" + " after unlocking: " + state); - return state; + __log.info("ThreadID:" + Thread.currentThread().getId() + " duLocked value for " + key + " file" + " after unlocking: " + false); + return true; } public boolean tryLock(String key) { - lock_map.putIfAbsent(key, key); boolean state = lock_map.tryLock(key); __log.info("ThreadID:" + Thread.currentThread().getId() + " duLocked value for " + key + " file" + " after locking: " + state); return state; @@ -125,8 +121,11 @@ public class HazelcastClusterImpl implements ClusterManager { } public void publishProcessStoreEvent(Object event) { - eventInitiator = _hazelcastInstance.getCluster().getLocalMember(); - clusterMessageTopic.publish(event); + if (event instanceof ProcessStoreClusterEvent) { + ProcessStoreClusterEvent e = (ProcessStoreClusterEvent) event; + e.setUuid(_hazelcastInstance.getCluster().getLocalMember().getUuid()); + clusterMessageTopic.publish(e); + } } @@ -141,21 +140,21 @@ public class HazelcastClusterImpl implements ClusterManager { if (message instanceof ProcessStoreDeployedEvent) { ProcessStoreDeployedEvent event = (ProcessStoreDeployedEvent) message; - if (_hazelcastInstance.getCluster().getLocalMember() != eventInitiator) { - String duName = event.deploymentUnit; + if (_hazelcastInstance.getCluster().getLocalMember().getUuid() != event.getUuid()) { + String duName = event.getDuName(); __log.info("Receive deployment msg to " + _hazelcastInstance.getCluster().getLocalMember() + " for " + duName); _clusterProcessStore.publishService(duName); - } else eventInitiator = null; + } } else if (message instanceof ProcessStoreUndeployedEvent) { ProcessStoreUndeployedEvent event = (ProcessStoreUndeployedEvent) message; - if (_hazelcastInstance.getCluster().getLocalMember() != eventInitiator) { - String duName = event.deploymentUnit; + if (_hazelcastInstance.getCluster().getLocalMember().getUuid() != event.getUuid()) { + String duName = event.getDuName(); __log.info("Receive undeployment msg to " + _hazelcastInstance.getCluster().getLocalMember() + " for " + duName); _clusterProcessStore.undeployProcesses(duName); - } else eventInitiator = null; + } } } http://git-wip-us.apache.org/repos/asf/ode/blob/0afb7c4d/dependencies.rb ---------------------------------------------------------------------- diff --git a/dependencies.rb b/dependencies.rb index 33da5e4..f85e38a 100644 --- a/dependencies.rb +++ b/dependencies.rb @@ -75,7 +75,7 @@ GERONIMO = struct( :transaction =>"org.apache.geronimo.components:geronimo-transaction:jar:2.0.1", :connector =>"org.apache.geronimo.components:geronimo-connector:jar:2.0.1" ) -HAZELCAST ="com.hazelcast:hazelcast:jar:3.4.2" +HAZELCAST ="com.hazelcast:hazelcast:jar:3.5" HIBERNATE = [ "org.hibernate:hibernate-core:jar:3.3.2.GA", "javassist:javassist:jar:3.9.0.GA", "antlr:antlr:jar:2.7.6", "asm:asm:jar:3.3.1", "cglib:cglib:jar:2.2", "net.sf.ehcache:ehcache:jar:1.2.3" ] HSQLDB = "hsqldb:hsqldb:jar:1.8.0.7"