[jboss-svn-commits] JBL Code SVN: r35002 - in labs/jbossrules/trunk: drools-flow-core/src/main/java/org/drools/process/instance/impl and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Sep 3 11:46:07 EDT 2010
Author: atoulme
Date: 2010-09-03 11:46:07 -0400 (Fri, 03 Sep 2010)
New Revision: 35002
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java
Removed:
labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java
labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java
labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java
Log:
move the default work items classes back to drools-core to avoid OSGi conflicts
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java (from rev 34989, labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -0,0 +1,143 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.process.instance.impl;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.drools.WorkingMemory;
+import org.drools.runtime.process.ProcessInstance;
+import org.drools.process.instance.WorkItem;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.runtime.process.WorkItemHandler;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class DefaultWorkItemManager implements WorkItemManager, Externalizable {
+
+ private static final long serialVersionUID = 510l;
+
+ private long workItemCounter;
+ private Map<Long, WorkItem> workItems = new ConcurrentHashMap<Long, WorkItem>();
+ private WorkingMemory workingMemory;
+ private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
+
+ public DefaultWorkItemManager(WorkingMemory workingMemory) {
+ this.workingMemory = workingMemory;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ workItemCounter = in.readLong();
+ workItems = (Map<Long, WorkItem>)in.readObject();
+ workingMemory = (WorkingMemory)in.readObject();
+ workItemHandlers = (Map<String, WorkItemHandler>) in.readObject();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeLong(workItemCounter);
+ out.writeObject(workItems);
+ out.writeObject(workingMemory);
+ out.writeObject(workItemHandlers);
+ }
+
+ public void internalExecuteWorkItem(WorkItem workItem) {
+ ((WorkItemImpl) workItem).setId(++workItemCounter);
+ internalAddWorkItem(workItem);
+ WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+ if (handler != null) {
+ handler.executeWorkItem(workItem, this);
+ } else {
+ System.err.println("Could not find work item handler for " + workItem.getName());
+ }
+ }
+
+ public void internalAddWorkItem(WorkItem workItem) {
+ workItems.put(new Long(workItem.getId()), workItem);
+ // fix to reset workItemCounter after deserialization
+ if (workItem.getId() > workItemCounter) {
+ workItemCounter = workItem.getId();
+ }
+ }
+
+ public void internalAbortWorkItem(long id) {
+ WorkItemImpl workItem = (WorkItemImpl) workItems.get(new Long(id));
+ // work item may have been aborted
+ if (workItem != null) {
+ WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
+ if (handler != null) {
+ handler.abortWorkItem(workItem, this);
+ } else {
+ System.err.println("Could not find work item handler for " + workItem.getName());
+ }
+ workItems.remove(workItem.getId());
+ }
+ }
+
+ public Set<WorkItem> getWorkItems() {
+ return new HashSet<WorkItem>(workItems.values());
+ }
+
+ public WorkItem getWorkItem(long id) {
+ return workItems.get(id);
+ }
+
+ public void completeWorkItem(long id, Map<String, Object> results) {
+ WorkItem workItem = (WorkItem) workItems.get(new Long(id));
+ // work item may have been aborted
+ if (workItem != null) {
+ ((org.drools.process.instance.WorkItem) workItem).setResults(results);
+ ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance(workItem.getProcessInstanceId());
+ ((org.drools.process.instance.WorkItem) workItem).setState(WorkItem.COMPLETED);
+ // process instance may have finished already
+ if (processInstance != null) {
+ processInstance.signalEvent("workItemCompleted", workItem);
+ }
+ workItems.remove(new Long(id));
+ workingMemory.fireAllRules();
+ }
+ }
+
+ public void abortWorkItem(long id) {
+ WorkItemImpl workItem = (WorkItemImpl) workItems.get(new Long(id));
+ // work item may have been aborted
+ if (workItem != null) {
+ ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance(workItem.getProcessInstanceId());
+ workItem.setState(WorkItem.ABORTED);
+ // process instance may have finished already
+ if (processInstance != null) {
+ processInstance.signalEvent("workItemAborted", workItem);
+ }
+ workItems.remove(new Long(id));
+ workingMemory.fireAllRules();
+ }
+ }
+
+ public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
+ this.workItemHandlers.put(workItemName, handler);
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java (from rev 34989, labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -0,0 +1,40 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.process.instance.impl;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.WorkingMemory;
+import org.drools.process.instance.WorkItemManager;
+import org.drools.process.instance.WorkItemManagerFactory;
+
+public class DefaultWorkItemManagerFactory implements WorkItemManagerFactory, Externalizable {
+
+ public WorkItemManager createWorkItemManager(WorkingMemory workingMemory) {
+ return new DefaultWorkItemManager(workingMemory);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ }
+
+}
Copied: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java (from rev 34989, labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java)
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -0,0 +1,129 @@
+/**
+ * Copyright 2010 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.process.instance.impl;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.drools.process.instance.WorkItem;
+
+/**
+ *
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
+ */
+public class WorkItemImpl implements WorkItem, Serializable {
+
+ private static final long serialVersionUID = 510l;
+
+ private long id;
+ private String name;
+ private int state = 0;
+ private Map<String, Object> parameters = new HashMap<String, Object>();
+ private Map<String, Object> results = new HashMap<String, Object>();
+ private long processInstanceId;
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setState(int state) {
+ this.state = state;
+ }
+
+ public int getState() {
+ return state;
+ }
+
+ public void setParameters(Map<String, Object> parameters) {
+ this.parameters = parameters;
+ }
+
+ public void setParameter(String name, Object value) {
+ this.parameters.put(name, value);
+ }
+
+ public Object getParameter(String name) {
+ return parameters.get(name);
+ }
+
+ public Map<String, Object> getParameters() {
+ return parameters;
+ }
+
+ public void setResults(Map<String, Object> results) {
+ if (results != null) {
+ this.results = results;
+ }
+ }
+
+ public void setResult(String name, Object value) {
+ results.put(name, value);
+ }
+
+ public Object getResult(String name) {
+ return results.get(name);
+ }
+
+ public Map<String, Object> getResults() {
+ return results;
+ }
+
+ public void setProcessInstanceId(long processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ }
+
+ public long getProcessInstanceId() {
+ return processInstanceId;
+ }
+
+ public String toString() {
+ StringBuilder b = new StringBuilder("WorkItem ");
+ b.append(id);
+ b.append(" [name=");
+ b.append(name);
+ b.append(", state=");
+ b.append(state);
+ b.append(", processInstanceId=");
+ b.append(processInstanceId);
+ b.append(", parameters{");
+ for (Iterator<Map.Entry<String, Object>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
+ Map.Entry<String, Object> entry = iterator.next();
+ b.append(entry.getKey());
+ b.append("=");
+ b.append(entry.getValue());
+ if (iterator.hasNext()) {
+ b.append(", ");
+ }
+ }
+ b.append("}]");
+ return b.toString();
+ }
+}
Deleted: labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java 2010-09-03 15:25:19 UTC (rev 35001)
+++ labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManager.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -1,143 +0,0 @@
-/**
- * Copyright 2010 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.process.instance.impl;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.drools.WorkingMemory;
-import org.drools.process.instance.ProcessInstance;
-import org.drools.process.instance.WorkItem;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.runtime.process.WorkItemHandler;
-
-/**
- *
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class DefaultWorkItemManager implements WorkItemManager, Externalizable {
-
- private static final long serialVersionUID = 510l;
-
- private long workItemCounter;
- private Map<Long, WorkItem> workItems = new ConcurrentHashMap<Long, WorkItem>();
- private WorkingMemory workingMemory;
- private Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();
-
- public DefaultWorkItemManager(WorkingMemory workingMemory) {
- this.workingMemory = workingMemory;
- }
-
- @SuppressWarnings("unchecked")
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- workItemCounter = in.readLong();
- workItems = (Map<Long, WorkItem>)in.readObject();
- workingMemory = (WorkingMemory)in.readObject();
- workItemHandlers = (Map<String, WorkItemHandler>) in.readObject();
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- out.writeLong(workItemCounter);
- out.writeObject(workItems);
- out.writeObject(workingMemory);
- out.writeObject(workItemHandlers);
- }
-
- public void internalExecuteWorkItem(WorkItem workItem) {
- ((WorkItemImpl) workItem).setId(++workItemCounter);
- internalAddWorkItem(workItem);
- WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
- if (handler != null) {
- handler.executeWorkItem(workItem, this);
- } else {
- System.err.println("Could not find work item handler for " + workItem.getName());
- }
- }
-
- public void internalAddWorkItem(WorkItem workItem) {
- workItems.put(new Long(workItem.getId()), workItem);
- // fix to reset workItemCounter after deserialization
- if (workItem.getId() > workItemCounter) {
- workItemCounter = workItem.getId();
- }
- }
-
- public void internalAbortWorkItem(long id) {
- WorkItemImpl workItem = (WorkItemImpl) workItems.get(new Long(id));
- // work item may have been aborted
- if (workItem != null) {
- WorkItemHandler handler = (WorkItemHandler) this.workItemHandlers.get(workItem.getName());
- if (handler != null) {
- handler.abortWorkItem(workItem, this);
- } else {
- System.err.println("Could not find work item handler for " + workItem.getName());
- }
- workItems.remove(workItem.getId());
- }
- }
-
- public Set<WorkItem> getWorkItems() {
- return new HashSet<WorkItem>(workItems.values());
- }
-
- public WorkItem getWorkItem(long id) {
- return workItems.get(id);
- }
-
- public void completeWorkItem(long id, Map<String, Object> results) {
- WorkItem workItem = (WorkItem) workItems.get(new Long(id));
- // work item may have been aborted
- if (workItem != null) {
- ((org.drools.process.instance.WorkItem) workItem).setResults(results);
- ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance(workItem.getProcessInstanceId());
- ((org.drools.process.instance.WorkItem) workItem).setState(WorkItem.COMPLETED);
- // process instance may have finished already
- if (processInstance != null) {
- processInstance.signalEvent("workItemCompleted", workItem);
- }
- workItems.remove(new Long(id));
- workingMemory.fireAllRules();
- }
- }
-
- public void abortWorkItem(long id) {
- WorkItemImpl workItem = (WorkItemImpl) workItems.get(new Long(id));
- // work item may have been aborted
- if (workItem != null) {
- ProcessInstance processInstance = ( ProcessInstance ) workingMemory.getProcessInstance(workItem.getProcessInstanceId());
- workItem.setState(WorkItem.ABORTED);
- // process instance may have finished already
- if (processInstance != null) {
- processInstance.signalEvent("workItemAborted", workItem);
- }
- workItems.remove(new Long(id));
- workingMemory.fireAllRules();
- }
- }
-
- public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
- this.workItemHandlers.put(workItemName, handler);
- }
-
-}
Deleted: labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java 2010-09-03 15:25:19 UTC (rev 35001)
+++ labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/DefaultWorkItemManagerFactory.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -1,40 +0,0 @@
-/**
- * Copyright 2010 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.process.instance.impl;
-
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-
-import org.drools.WorkingMemory;
-import org.drools.process.instance.WorkItemManager;
-import org.drools.process.instance.WorkItemManagerFactory;
-
-public class DefaultWorkItemManagerFactory implements WorkItemManagerFactory, Externalizable {
-
- public WorkItemManager createWorkItemManager(WorkingMemory workingMemory) {
- return new DefaultWorkItemManager(workingMemory);
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
- }
-
- public void writeExternal(ObjectOutput out) throws IOException {
- }
-
-}
Deleted: labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java 2010-09-03 15:25:19 UTC (rev 35001)
+++ labs/jbossrules/trunk/drools-flow-core/src/main/java/org/drools/process/instance/impl/WorkItemImpl.java 2010-09-03 15:46:07 UTC (rev 35002)
@@ -1,129 +0,0 @@
-/**
- * Copyright 2010 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.drools.process.instance.impl;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.drools.process.instance.WorkItem;
-
-/**
- *
- * @author <a href="mailto:kris_verlaenen at hotmail.com">Kris Verlaenen</a>
- */
-public class WorkItemImpl implements WorkItem, Serializable {
-
- private static final long serialVersionUID = 510l;
-
- private long id;
- private String name;
- private int state = 0;
- private Map<String, Object> parameters = new HashMap<String, Object>();
- private Map<String, Object> results = new HashMap<String, Object>();
- private long processInstanceId;
-
- public void setId(long id) {
- this.id = id;
- }
-
- public long getId() {
- return id;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setState(int state) {
- this.state = state;
- }
-
- public int getState() {
- return state;
- }
-
- public void setParameters(Map<String, Object> parameters) {
- this.parameters = parameters;
- }
-
- public void setParameter(String name, Object value) {
- this.parameters.put(name, value);
- }
-
- public Object getParameter(String name) {
- return parameters.get(name);
- }
-
- public Map<String, Object> getParameters() {
- return parameters;
- }
-
- public void setResults(Map<String, Object> results) {
- if (results != null) {
- this.results = results;
- }
- }
-
- public void setResult(String name, Object value) {
- results.put(name, value);
- }
-
- public Object getResult(String name) {
- return results.get(name);
- }
-
- public Map<String, Object> getResults() {
- return results;
- }
-
- public void setProcessInstanceId(long processInstanceId) {
- this.processInstanceId = processInstanceId;
- }
-
- public long getProcessInstanceId() {
- return processInstanceId;
- }
-
- public String toString() {
- StringBuilder b = new StringBuilder("WorkItem ");
- b.append(id);
- b.append(" [name=");
- b.append(name);
- b.append(", state=");
- b.append(state);
- b.append(", processInstanceId=");
- b.append(processInstanceId);
- b.append(", parameters{");
- for (Iterator<Map.Entry<String, Object>> iterator = parameters.entrySet().iterator(); iterator.hasNext(); ) {
- Map.Entry<String, Object> entry = iterator.next();
- b.append(entry.getKey());
- b.append("=");
- b.append(entry.getValue());
- if (iterator.hasNext()) {
- b.append(", ");
- }
- }
- b.append("}]");
- return b.toString();
- }
-}
More information about the jboss-svn-commits
mailing list