001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 package org.apache.directory.shared.ldap.message; 021 022 023 import java.io.OutputStream; 024 import java.nio.ByteBuffer; 025 026 import org.apache.directory.shared.asn1.codec.EncoderException; 027 import org.apache.directory.shared.asn1.codec.stateful.EncoderCallback; 028 import org.apache.directory.shared.asn1.codec.stateful.EncoderMonitor; 029 import org.apache.directory.shared.ldap.codec.LdapTransformer; 030 import org.apache.directory.shared.ldap.message.internal.InternalMessage; 031 import org.apache.directory.shared.ldap.message.spi.Provider; 032 import org.apache.directory.shared.ldap.message.spi.ProviderEncoder; 033 import org.apache.directory.shared.ldap.message.spi.ProviderException; 034 035 036 /** 037 * Encodes a Message instance into a binary message envelope using Basic 038 * Encoding rules flushing the PDU out to an OutputStream. 039 * 040 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 041 * @version $Rev: 905344 $ 042 */ 043 public final class MessageEncoder implements ProviderEncoder 044 { 045 /** the provider */ 046 private final Provider provider; 047 048 /** the provider's encoder */ 049 private final ProviderEncoder encoder; 050 051 052 /** 053 * Creates a MessageEncoder using default properties for enabling a BER 054 * library provider. 055 * 056 * @throws MessageException if the encoder cannot be created. 057 */ 058 public MessageEncoder() throws MessageException 059 { 060 this.provider = Provider.getProvider( Provider.getEnvironment() ); 061 this.encoder = provider.getEncoder(); 062 } 063 064 065 // ------------------------------------------------------------------------ 066 // ProviderEncoder 067 // ------------------------------------------------------------------------ 068 069 /** 070 * @see ProviderEncoder#encodeBlocking(Object, java.io.OutputStream, Object) 071 */ 072 public void encodeBlocking( Object lock, OutputStream out, Object obj ) throws ProviderException 073 { 074 // transform to build provider specific intermediate envelope 075 Object providerEnvelope = LdapTransformer.transform( ( InternalMessage ) obj ); 076 077 // now encode provider's intermediate stub into a PDU onto stream 078 this.encoder.encodeBlocking( lock, out, providerEnvelope ); 079 } 080 081 082 /** 083 * @see ProviderEncoder#encodeBlocking(Object) 084 */ 085 public ByteBuffer encodeBlocking( Object obj ) throws ProviderException 086 { 087 // transform to build provider specific intermediate envelope 088 Object providerEnvelope = LdapTransformer.transform( ( InternalMessage ) obj ); 089 090 // now encode provider's intermediate stub into PDU in a byte buffer 091 return this.encoder.encodeBlocking( providerEnvelope ); 092 } 093 094 095 // ------------------------------------------------------------------------ 096 // ProviderObject Methods 097 // ------------------------------------------------------------------------ 098 099 /** 100 * @see org.apache.directory.shared.ldap.message.spi.ProviderObject#getProvider() 101 */ 102 public Provider getProvider() 103 { 104 return this.provider; 105 } 106 107 108 // ------------------------------------------------------------------------ 109 // StatefulEncoder Methods 110 // ------------------------------------------------------------------------ 111 112 /** 113 * Encodes a Message object piece by piece often emitting chunks of the 114 * final PDU to the callback if present. 115 * 116 * @param obj the message object to encode into a PDU 117 * @throws EncoderException if there are problems while encoding 118 */ 119 public void encode( Object obj ) throws EncoderException 120 { 121 // transform to build provider specific intermediate envelope 122 Object providerEnvelope = LdapTransformer.transform( ( InternalMessage ) obj ); 123 124 // now give intermediate envelope to provider's encoder 125 this.encoder.encode( providerEnvelope ); 126 } 127 128 129 /** 130 * Sets the callback of the underlying implementation. There is no need for 131 * any special callbacks because when encoding we do not need to transform 132 * before a value return as we did in the decoder. 133 * 134 * @param cb the callback to set on the underlying provider specific encoder 135 */ 136 public void setCallback( EncoderCallback cb ) 137 { 138 this.encoder.setCallback( cb ); 139 } 140 141 142 /** 143 * Sets the monitor of the underlying implementation. 144 * 145 * @param monitor the monitor to set on the underlying implementation 146 */ 147 public void setEncoderMonitor( EncoderMonitor monitor ) 148 { 149 this.encoder.setEncoderMonitor( monitor ); 150 } 151 }