Skip to main content
summaryrefslogtreecommitdiffstats
blob: e1be00f9bc92f6f4170cf5c2cbd1b9d3c4c4cf19 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
 * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.common.model;

import org.eclipse.net4j.util.concurrent.Worker;

import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EPackage;

import java.util.Map.Entry;

/**
 * @author Eike Stepper
 * @since 2.0
 */
public class CDOPackageRegistryPopulator extends Worker
{
  public static final int DEFAULT_SOURCE_POLL_INTERVAL = 5000;

  private long sourcePollInterval = DEFAULT_SOURCE_POLL_INTERVAL;

  private EPackage.Registry source;

  private CDOPackageRegistry target;

  public CDOPackageRegistryPopulator(CDOPackageRegistry target)
  {
    this(EPackage.Registry.INSTANCE, target);
  }

  public CDOPackageRegistryPopulator(EPackage.Registry source, CDOPackageRegistry target)
  {
    this.source = source;
    this.target = target;
  }

  public EPackage.Registry getSource()
  {
    return source;
  }

  public CDOPackageRegistry getTarget()
  {
    return target;
  }

  public long getSourcePollInterval()
  {
    return sourcePollInterval;
  }

  public void setSourcePollInterval(long sourcePollInterval)
  {
    this.sourcePollInterval = sourcePollInterval;
  }

  @Override
  protected void work(WorkContext context) throws Exception
  {
    doWork();
    context.nextWork(getSourcePollInterval());
  }

  protected void doWork()
  {
    populate(getSource(), getTarget());
  }

  @Override
  protected void doActivate() throws Exception
  {
    doWork();
    super.doActivate();
  }

  public static boolean populate(CDOPackageRegistry target)
  {
    return populate(EPackage.Registry.INSTANCE, target);
  }

  public static boolean populate(EPackage.Registry source, CDOPackageRegistry target)
  {
    boolean populated = false;
    while (populateFirstMatch(source, target))
    {
      populated = true;
    }

    return populated;
  }

  private static boolean populateFirstMatch(EPackage.Registry source, CDOPackageRegistry target)
  {
    for (Entry<String, Object> entry : source.entrySet())
    {
      String nsURI = entry.getKey();
      if (!target.containsKey(nsURI))
      {
        target.put(nsURI, new Descriptor(source, nsURI));
        return true;
      }
    }

    return false;
  }

  /**
   * @author Eike Stepper
   */
  public static class Descriptor implements EPackage.Descriptor
  {
    private EPackage.Registry source;

    private String nsURI;

    public Descriptor(EPackage.Registry source, String nsURI)
    {
      this.source = source;
      this.nsURI = nsURI;
    }

    public EPackage.Registry getSource()
    {
      return source;
    }

    public String getNsURI()
    {
      return nsURI;
    }

    public EFactory getEFactory()
    {
      return source.getEFactory(nsURI);
    }

    public EPackage getEPackage()
    {
      return source.getEPackage(nsURI);
    }
  }
}

Back to the top