blob: fcb17c954f26e9af7b81b88434ff64a5cddadb9a [file] [log] [blame]
jaegonkim6a7b5242018-09-12 23:09:42 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.workflow.impl;
17
18import com.google.common.collect.ImmutableList;
19import com.google.common.collect.ImmutableSet;
20import com.google.common.collect.Sets;
jaegonkim6a7b5242018-09-12 23:09:42 +090021import org.onlab.util.KryoNamespace;
Ray Milkeydf521292018-10-04 15:13:33 -070022import org.osgi.service.component.annotations.Activate;
23import org.osgi.service.component.annotations.Component;
24import org.osgi.service.component.annotations.Deactivate;
25import org.osgi.service.component.annotations.Reference;
26import org.osgi.service.component.annotations.ReferenceCardinality;
27import org.slf4j.Logger;
jaegonkim6a7b5242018-09-12 23:09:42 +090028import org.onosproject.core.ApplicationId;
29import org.onosproject.core.CoreService;
30import org.onosproject.workflow.api.AbstractWorkflow;
31import org.onosproject.workflow.api.ImmutableListWorkflow;
32import org.onosproject.workflow.api.Workflow;
33import org.onosproject.workflow.api.WorkflowAttribute;
34import org.onosproject.workflow.api.WorkflowStore;
35import org.onosproject.net.group.GroupEvent;
36import org.onosproject.net.group.GroupStoreDelegate;
37import org.onosproject.store.AbstractStore;
38import org.onosproject.store.serializers.KryoNamespaces;
39import org.onosproject.store.service.EventuallyConsistentMap;
40import org.onosproject.store.service.StorageService;
41import org.onosproject.store.service.WallClockTimestamp;
jaegonkim6a7b5242018-09-12 23:09:42 +090042
43import java.net.URI;
44import java.util.Collection;
45import java.util.HashSet;
46import java.util.Set;
47import java.util.concurrent.TimeUnit;
48import java.util.List;
49
50import static org.slf4j.LoggerFactory.getLogger;
51
Ray Milkeydf521292018-10-04 15:13:33 -070052@Component(immediate = true, service = WorkflowStore.class)
jaegonkim6a7b5242018-09-12 23:09:42 +090053public class ECWorkFlowStore
54 extends AbstractStore<GroupEvent, GroupStoreDelegate> implements WorkflowStore {
55
56 private final Logger log = getLogger(getClass());
57
Ray Milkeydf521292018-10-04 15:13:33 -070058 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jaegonkim6a7b5242018-09-12 23:09:42 +090059 protected CoreService coreService;
60
Ray Milkeydf521292018-10-04 15:13:33 -070061 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jaegonkim6a7b5242018-09-12 23:09:42 +090062 protected StorageService storageService;
63
64 private ApplicationId appId;
65 private EventuallyConsistentMap<URI, Workflow> workflowStore;
66 private Set<ClassLoader> classloaders = Sets.newConcurrentHashSet();
67
68 @Activate
69 public void activate() {
70
71 appId = coreService.registerApplication("org.onosproject.nfconfig");
72 log.info("appId=" + appId);
73
74 KryoNamespace.Builder workflowSerializer = KryoNamespace.newBuilder()
75 .register(KryoNamespaces.API)
76 .register(URI.class)
77 .register(Workflow.class)
78 .register(AbstractWorkflow.class)
79 .register(ImmutableListWorkflow.class)
80 .register(List.class)
81 .register(ImmutableList.class)
82 .register(Class.class)
83 .register(WorkflowAttribute.class)
84 .register(Set.class)
85 .register(ImmutableSet.class)
86 .register(HashSet.class);
87
88 workflowStore = storageService.<URI, Workflow>eventuallyConsistentMapBuilder()
89 .withName("workflow-workplaceStore")
90 .withSerializer(workflowSerializer)
91 .withAntiEntropyPeriod(5, TimeUnit.SECONDS)
92 .withTimestampProvider((k, v) -> new WallClockTimestamp())
93 .withTombstonesDisabled()
94 .build();
95
96 classloaders.add(this.getClass().getClassLoader());
97
98 log.info("Started");
99 }
100
101 @Deactivate
102 public void deactivate() {
103 workflowStore.destroy();
104
105 log.info("Stopped");
106 }
107
108 @Override
109 public void register(Workflow workflow) {
110 workflowStore.put(workflow.id(), workflow);
111 }
112
113 @Override
114 public void unregister(URI id) {
115 workflowStore.remove(id);
116 }
117
118 @Override
119 public Workflow get(URI id) {
120 return workflowStore.get(id);
121 }
122
123 @Override
124 public Collection<Workflow> getAll() {
125 return workflowStore.values();
126 }
127
128 @Override
129 public void registerLocal(ClassLoader loader) {
130 classloaders.add(loader);
131 }
132
133 @Override
134 public void unregisterLocal(ClassLoader loader) {
135 classloaders.remove(loader);
136 }
137
138 @Override
139 public Class getClass(String name) throws ClassNotFoundException {
140 for (ClassLoader loader : classloaders) {
141 Class cl = null;
142 try {
143 cl = loader.loadClass(name);
144 } catch (ClassNotFoundException e) {
145 // do nothing
146 }
147 if (cl != null) {
148 return cl;
149 }
150 }
151 throw new ClassNotFoundException(name);
152 }
153}