You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/12/25 20:21:45 UTC
svn commit: r1224632 - in /james/protocols/trunk/imap/src: ./ main/
main/java/ main/java/org/ main/java/org/apache/ main/java/org/apache/james/
main/java/org/apache/james/protocols/
main/java/org/apache/james/protocols/imap/ main/java/org/apache/james/...
Author: norman
Date: Sun Dec 25 19:21:44 2011
New Revision: 1224632
URL: http://svn.apache.org/viewvc?rev=1224632&view=rev
Log:
Start to add interfaces and classes for IMAP.See PROTOCOLS-73
Added:
james/protocols/trunk/imap/src/
james/protocols/trunk/imap/src/main/
james/protocols/trunk/imap/src/main/java/
james/protocols/trunk/imap/src/main/java/org/
james/protocols/trunk/imap/src/main/java/org/apache/
james/protocols/trunk/imap/src/main/java/org/apache/james/
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java (with props)
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java (with props)
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/
james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java (with props)
Added: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java?rev=1224632&view=auto
==============================================================================
--- james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java (added)
+++ james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java Sun Dec 25 19:21:44 2011
@@ -0,0 +1,143 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.protocols.imap;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.apache.james.protocols.api.Request;
+
+public class IMAPRequest implements Request {
+
+ private static final String US_ASCII = "US_ASCII";
+
+ private static final String CRLF = "\r\n";
+ private final Collection<ByteBuffer> lines;
+ private final String tag;
+ private final String command;
+
+ public IMAPRequest(Collection<ByteBuffer> lines) {
+ this.lines = lines;
+ ByteBuffer buf = lines.iterator().next();
+ buf.rewind();
+
+ this.tag = read(buf);
+ this.command = read(buf).toUpperCase(Locale.US);
+ }
+
+ public IMAPRequest(ByteBuffer line) {
+ this(Arrays.asList(line));
+ }
+
+ private String read(ByteBuffer buf) {
+ StringBuilder sb = new StringBuilder();
+ int i;
+ while ((i = buf.get()) != ' ') {
+ sb.append((byte) i);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Return the tag of the request
+ *
+ * @return tag
+ */
+ public String getTag() {
+ return tag;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.protocols.api.Request#getArgument()
+ */
+ public String getArgument() {
+ int tagOffeset = tag.length() + command.length() + 2;
+ StringBuilder sb = new StringBuilder();
+ Iterator<ByteBuffer> linesIt = lines.iterator();
+
+ while (linesIt.hasNext()){
+ ByteBuffer line = linesIt.next();
+ byte[] buf;
+ if (line.hasArray()) {
+ buf = line.array();
+ } else {
+ line.rewind();
+ buf = new byte[line.remaining() - tagOffeset];
+ line.get(buf, tagOffeset, line.remaining());
+ }
+ try {
+ sb.append(new String(buf, US_ASCII));
+ } catch (UnsupportedEncodingException e) {
+ // Should never happend
+ e.printStackTrace();
+ }
+ if (linesIt.hasNext()) {
+ sb.append(CRLF);
+ }
+ }
+ return sb.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.protocols.api.Request#getCommand()
+ */
+ public String getCommand() {
+ return command;
+ }
+
+ /**
+ * Return an {@link Iterator} which holds all argument lines. The returned {@link ByteBuffer}'s will be
+ * rewind by calling {@link ByteBuffer#rewind()} before return them
+ *
+ * @return arguments
+ */
+ public Iterator<ByteBuffer> getArguments() {
+ return new Iterator<ByteBuffer>() {
+ boolean first = true;
+ Iterator<ByteBuffer> buffIt = lines.iterator();
+
+ public boolean hasNext() {
+ return buffIt.hasNext();
+ }
+
+ public ByteBuffer next() {
+ ByteBuffer buf = buffIt.next();
+ buf.rewind();
+
+ if (first) {
+ first = false;
+ buf.position(getTag().length() + getCommand().length() + 2);
+ buf = buf.slice();
+ }
+ return buf;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+}
Propchange: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPRequest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java?rev=1224632&view=auto
==============================================================================
--- james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java (added)
+++ james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java Sun Dec 25 19:21:44 2011
@@ -0,0 +1,42 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.protocols.imap;
+
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.api.handler.LineHandler;
+
+public interface IMAPSession extends ProtocolSession{
+
+ /**
+ * Put a new line handler in the chain
+ * @param overrideCommandHandler
+ */
+ void pushLineHandler(LineHandler<IMAPSession> overrideCommandHandler);
+
+ /**
+ * Pop the last command handler
+ */
+ void popLineHandler();
+
+ /**
+ * Return the size of the pushed {@link LineHandler}
+ * @return size of the pushed line handler
+ */
+ int getPushedLineHandlerCount();
+}
Propchange: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/IMAPSession.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java?rev=1224632&view=auto
==============================================================================
--- james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java (added)
+++ james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java Sun Dec 25 19:21:44 2011
@@ -0,0 +1,81 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.protocols.imap.core;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.james.protocols.api.ProtocolSession.State;
+import org.apache.james.protocols.api.Request;
+import org.apache.james.protocols.api.Response;
+import org.apache.james.protocols.api.handler.CommandDispatcher;
+import org.apache.james.protocols.api.handler.MultiLineHandler;
+import org.apache.james.protocols.imap.IMAPRequest;
+import org.apache.james.protocols.imap.IMAPSession;
+
+public class IMAPCommandDispatcher extends CommandDispatcher<IMAPSession>{
+
+ private final static Pattern LITERAL_PATTERN = Pattern.compile(".*\\{(\\d+)\\}.*");
+
+ @Override
+ protected Request parseRequest(IMAPSession session, ByteBuffer buffer) throws Exception {
+ IMAPRequest request = new IMAPRequest(buffer);
+ Matcher matcher = LITERAL_PATTERN.matcher(request.getArgument());
+ if (matcher.matches()) {
+ final long bytesToRead = Long.parseLong(matcher.group(1));
+ MultiLineHandler<IMAPSession> handler = new MultiLineHandler<IMAPSession>() {
+
+ private static final String BYTES_READ = "BYTES_READ";
+
+ /*
+ * (non-Javadoc)
+ * @see org.apache.james.protocols.api.handler.MultiLineHandler#isReady(org.apache.james.protocols.api.ProtocolSession, java.nio.ByteBuffer)
+ */
+ protected boolean isReady(IMAPSession session, ByteBuffer line) {
+ long bytesRead = (Long) session.setAttachment(BYTES_READ, null, State.Transaction);
+ bytesRead += line.remaining();
+ if (bytesRead >= bytesToRead) {
+ return true;
+ } else {
+ session.setAttachment(BYTES_READ, bytesRead, State.Transaction);
+ return false;
+ }
+ }
+
+ @Override
+ protected Response onLines(IMAPSession session, Collection<ByteBuffer> lines) {
+ session.popLineHandler();
+ return dispatchCommandHandlers(session, new IMAPRequest(lines));
+ }
+ };
+ buffer.rewind();
+
+ // push the line to the handler
+ handler.onLine(session, buffer);
+
+ session.pushLineHandler(handler);
+ return null;
+
+ } else {
+ return request;
+ }
+ }
+}
Propchange: james/protocols/trunk/imap/src/main/java/org/apache/james/protocols/imap/core/IMAPCommandDispatcher.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org