blob: cd7df77e31fd57518a3184d8f888dd26e07c2067 [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;
21import org.apache.felix.scr.annotations.Activate;
22import org.apache.felix.scr.annotations.Component;
23import org.apache.felix.scr.annotations.Deactivate;
24import org.apache.felix.scr.annotations.Reference;
25import org.apache.felix.scr.annotations.ReferenceCardinality;
26import org.apache.felix.scr.annotations.Service;
27import org.onlab.util.KryoNamespace;
28import 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;
42import org.slf4j.Logger;
43
44import java.net.URI;
45import java.util.Collection;
46import java.util.HashSet;
47import java.util.Set;
48import java.util.concurrent.TimeUnit;
49import java.util.List;
50
51import static org.slf4j.LoggerFactory.getLogger;
52
53@Component(immediate = true)
54@Service
55public class ECWorkFlowStore
56 extends AbstractStore<GroupEvent, GroupStoreDelegate> implements WorkflowStore {
57
58 private final Logger log = getLogger(getClass());
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected CoreService coreService;
62
63 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
64 protected StorageService storageService;
65
66 private ApplicationId appId;
67 private EventuallyConsistentMap<URI, Workflow> workflowStore;
68 private Set<ClassLoader> classloaders = Sets.newConcurrentHashSet();
69
70 @Activate
71 public void activate() {
72
73 appId = coreService.registerApplication("org.onosproject.nfconfig");
74 log.info("appId=" + appId);
75
76 KryoNamespace.Builder workflowSerializer = KryoNamespace.newBuilder()
77 .register(KryoNamespaces.API)
78 .register(URI.class)
79 .register(Workflow.class)
80 .register(AbstractWorkflow.class)
81 .register(ImmutableListWorkflow.class)
82 .register(List.class)
83 .register(ImmutableList.class)
84 .register(Class.class)
85 .register(WorkflowAttribute.class)
86 .register(Set.class)
87 .register(ImmutableSet.class)
88 .register(HashSet.class);
89
90 workflowStore = storageService.<URI, Workflow>eventuallyConsistentMapBuilder()
91 .withName("workflow-workplaceStore")
92 .withSerializer(workflowSerializer)
93 .withAntiEntropyPeriod(5, TimeUnit.SECONDS)
94 .withTimestampProvider((k, v) -> new WallClockTimestamp())
95 .withTombstonesDisabled()
96 .build();
97
98 classloaders.add(this.getClass().getClassLoader());
99
100 log.info("Started");
101 }
102
103 @Deactivate
104 public void deactivate() {
105 workflowStore.destroy();
106
107 log.info("Stopped");
108 }
109
110 @Override
111 public void register(Workflow workflow) {
112 workflowStore.put(workflow.id(), workflow);
113 }
114
115 @Override
116 public void unregister(URI id) {
117 workflowStore.remove(id);
118 }
119
120 @Override
121 public Workflow get(URI id) {
122 return workflowStore.get(id);
123 }
124
125 @Override
126 public Collection<Workflow> getAll() {
127 return workflowStore.values();
128 }
129
130 @Override
131 public void registerLocal(ClassLoader loader) {
132 classloaders.add(loader);
133 }
134
135 @Override
136 public void unregisterLocal(ClassLoader loader) {
137 classloaders.remove(loader);
138 }
139
140 @Override
141 public Class getClass(String name) throws ClassNotFoundException {
142 for (ClassLoader loader : classloaders) {
143 Class cl = null;
144 try {
145 cl = loader.loadClass(name);
146 } catch (ClassNotFoundException e) {
147 // do nothing
148 }
149 if (cl != null) {
150 return cl;
151 }
152 }
153 throw new ClassNotFoundException(name);
154 }
155}