mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
22.32.2012 defd1d1e034274940750de6da52a74656a9a9fdd
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
151
152
153
154
155
156
157
158
159
160
/*
 * The contents of this file are subject to the terms of the Common Development and
 * Distribution License (the License). You may not use this file except in compliance with the
 * License.
 *
 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
 * specific language governing permission and limitations under the License.
 *
 * When distributing Covered Software, include this CDDL Header Notice in each file and include
 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
 * Header, with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyrighted [year] [name of copyright owner]".
 *
 * Copyright © 2012 ForgeRock AS. All rights reserved.
 */
 
package org.forgerock.opendj.rest2ldap;
 
import java.util.HashMap;
import java.util.Map;
 
import org.forgerock.json.fluent.JsonValue;
import org.forgerock.json.resource.restlet.JsonResourceRestlet;
import org.forgerock.opendj.ldap.ConnectionFactory;
import org.forgerock.opendj.ldap.Connections;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.LDAPConnectionFactory;
import org.forgerock.opendj.ldap.requests.Requests;
import org.forgerock.resource.framework.JsonResourceProvider;
import org.forgerock.resource.framework.impl.ResourceInvoker;
import org.restlet.Application;
import org.restlet.Component;
import org.restlet.Request;
import org.restlet.Restlet;
import org.restlet.data.Protocol;
import org.restlet.routing.Router;
import org.restlet.routing.Template;
 
/**
 * Example
 */
public class Example {
 
    private static final String PATH_PROPERTY = "rest2ldap.restlet.path";
 
    private Application application = new Application();
    private final Router router = new Router();
    private HashMap<JsonResourceProvider, Restlet> restlets =
            new HashMap<JsonResourceProvider, Restlet>();
 
    protected synchronized void bindRestlet(Restlet restlet, Map<String, Object> properties) {
        Object path = properties.get(PATH_PROPERTY);
        if (path != null && path instanceof String) { // service is specified as
                                                      // internally routable
            attach((String) path, restlet);
        }
    }
 
    protected synchronized void unbindRestlet(Restlet restlet, Map<String, Object> properties) {
        Object path = properties.get(PATH_PROPERTY);
        if (path != null && path instanceof String) { // service is specified as
                                                      // internally routable
            detach(restlet);
        }
    }
 
    /**
     * Attaches a target Restlet to the Restlet router based on a given URI
     * prefix.
     *
     * @param path
     *            the path to attach it to.
     * @param restlet
     *            the restlet to route to if path matches.
     * @throws IllegalArgumentException
     *             if path does not begin with a '/' character.
     */
    public void attach(String path, Restlet restlet) {
        restlet.setContext(application.getContext());
        router.attach(path, restlet, Template.MODE_EQUALS);
        router.attach(path + (path.equals("/") ? "" : "/"), restlet, Template.MODE_STARTS_WITH);
    }
 
    /**
     * Remove a restlet from restlet router
     *
     * @param restlet
     *            the restlet to remove
     */
    public void detach(Restlet restlet) {
        router.detach(restlet); // all routes to restlet are removed
    }
 
    protected synchronized void bindJsonResource(JsonResourceProvider resource,
            Map<String, Object> properties) {
        Restlet restlet = new CustomRestlet(resource);
        restlets.put(resource, restlet);
        bindRestlet(restlet, properties);
    }
 
    protected synchronized void unbindJsonResource(JsonResourceProvider resource,
            Map<String, Object> properties) {
        Restlet restlet = restlets.get(resource);
        if (restlet != null) {
            unbindRestlet(restlet, properties);
            restlets.remove(resource);
        }
    }
 
    private class CustomRestlet extends JsonResourceRestlet {
        public CustomRestlet(JsonResourceProvider resource) {
            super(resource);
        }
 
        @Override
        public JsonValue newContext(Request request) {
            JsonValue result = super.newContext(request);
            JsonValue security = result.get("security");
            security.put("openidm-roles", request.getAttributes().get("openidm.roles"));
            return result;
        }
    }
 
    public void start() throws Exception {
        Component component = new Component();
 
        // Add http listener
        component.getServers().add(Protocol.HTTP, 8080);
        application.getTunnelService().setQueryTunnel(false); // query string
                                                              // purism
        application.setInboundRoot(router);
 
        // Attach the json resource at the root path
        Map<String, Object> props = new HashMap<String, Object>();
        props.put(PATH_PROPERTY, "");
 
        AttributeMapper mapper = new IdentityAttributeMapper().excludeAttribute("entryUUID", "etag");
        ConnectionFactory factory =
                Connections.newAuthenticatedConnectionFactory(new LDAPConnectionFactory(
                        "localhost", 1389), Requests.newSimpleBindRequest("cn=directory manager",
                        "password".toCharArray()));
        EntryContainer container =
                new EntryContainer(DN.valueOf("ou=people,dc=example,dc=com"), factory);
        LDAPResource resource = new LDAPResource(container, mapper);
        ResourceInvoker invoker = new ResourceInvoker();
        invoker.resource = resource;
        bindJsonResource(invoker, props);
 
        // Attach the sample application.
        component.getDefaultHost().attach("/example", application);
 
        // Start the component.
        component.start();
    }
 
    public static void main(String[] args) throws Exception {
        Example instance = new Example();
        instance.start();
    }
}