1 package org.opendaylight.neutron.transcriber;
3 import java.lang.reflect.Method;
5 import java.util.concurrent.ExecutionException;
7 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
8 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
9 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
10 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
11 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
13 import org.opendaylight.yangtools.yang.binding.DataObject;
14 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
18 import com.google.common.base.Preconditions;
19 import com.google.common.util.concurrent.CheckedFuture;
21 public abstract class AbstractNeutronInterface<T extends DataObject,S> implements AutoCloseable {
22 private static final Logger LOGGER = LoggerFactory.getLogger(AbstractNeutronInterface.class);
23 private static final int DEDASHED_UUID_LENGTH = 32;
24 private static final int DEDASHED_UUID_START = 0;
25 private static final int DEDASHED_UUID_DIV1 = 8;
26 private static final int DEDASHED_UUID_DIV2 = 12;
27 private static final int DEDASHED_UUID_DIV3 = 16;
28 private static final int DEDASHED_UUID_DIV4 = 20;
30 private DataBroker db;
32 AbstractNeutronInterface(ProviderContext providerContext) {
33 this.db = providerContext.getSALService(DataBroker.class);
36 public DataBroker getDataBroker() {
40 protected abstract InstanceIdentifier<T> createInstanceIdentifier(T item);
42 protected abstract T toMd(S neutronObject);
44 protected abstract T toMd(String uuid);
46 protected boolean addMd(S neutronObject) {
47 // TODO think about adding existence logic
48 WriteTransaction transaction = getDataBroker().newWriteOnlyTransaction();
49 T item = toMd(neutronObject);
50 InstanceIdentifier<T> iid = createInstanceIdentifier(item);
51 transaction.put(LogicalDatastoreType.CONFIGURATION, iid, item,true);
52 CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
55 } catch (InterruptedException | ExecutionException e) {
56 LOGGER.warn("Transation failed ",e);
62 protected boolean updateMd(S neutronObject) {
63 WriteTransaction transaction = getDataBroker().newWriteOnlyTransaction();
64 T item = toMd(neutronObject);
65 InstanceIdentifier<T> iid = createInstanceIdentifier(item);
66 transaction.put(LogicalDatastoreType.CONFIGURATION, iid, item,true);
67 CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
70 } catch (InterruptedException | ExecutionException e) {
71 LOGGER.warn("Transation failed ",e);
77 protected boolean removeMd(T item) {
78 WriteTransaction transaction = getDataBroker().newWriteOnlyTransaction();
79 InstanceIdentifier<T> iid = createInstanceIdentifier(item);
80 transaction.delete(LogicalDatastoreType.CONFIGURATION, iid);
81 CheckedFuture<Void, TransactionCommitFailedException> future = transaction.submit();
85 protected Uuid toUuid(String uuid) {
86 Preconditions.checkNotNull(uuid);
89 result = new Uuid(uuid);
90 } catch(IllegalArgumentException e) {
91 // OK... someone didn't follow RFC 4122... lets try this the hard way
92 String dedashed = uuid.replace("-", "");
93 if(dedashed.length() == DEDASHED_UUID_LENGTH) {
94 String redashed = dedashed.substring(DEDASHED_UUID_START, DEDASHED_UUID_DIV1)
96 + dedashed.substring(DEDASHED_UUID_DIV1, DEDASHED_UUID_DIV2)
98 + dedashed.substring(DEDASHED_UUID_DIV2, DEDASHED_UUID_DIV3)
100 + dedashed.substring(DEDASHED_UUID_DIV3, DEDASHED_UUID_DIV4)
102 + dedashed.substring(DEDASHED_UUID_DIV4, DEDASHED_UUID_LENGTH);
103 result = new Uuid(redashed);
111 // this method uses reflection to update an object from it's delta.
113 protected boolean overwrite(Object target, Object delta) {
114 Method[] methods = target.getClass().getMethods();
116 for(Method toMethod: methods){
117 if(toMethod.getDeclaringClass().equals(target.getClass())
118 && toMethod.getName().startsWith("set")){
120 String toName = toMethod.getName();
121 String fromName = toName.replace("set", "get");
124 Method fromMethod = delta.getClass().getMethod(fromName);
125 Object value = fromMethod.invoke(delta, (Object[])null);
127 toMethod.invoke(target, value);
129 } catch (Exception e) {
130 LOGGER.error("Error in overwrite", e);
139 public void close() throws Exception {
140 // TODO Auto-generated method stub