## CPD Results The following document contains the results of PMD's CPD 5.2.3. ## Duplications
File | Line
--- | ---
org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java | 55
org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java | 50
                final Filter filter, final MemoryMappedFileManager manager, final String filename,
                final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
            super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
            if (advertiser != null) {
                final Map<String, String> configuration = new HashMap<String, String>(layout.getContentFormat());
                configuration.putAll(manager.getContentFormat());
                configuration.put("contentType", layout.getContentType());
                configuration.put("name", name);
                advertisement = advertiser.advertise(configuration);
            }
            this.fileName = filename;
            this.advertiser = advertiser;
        }

        @Override
        public void stop() {
            super.stop();
            if (advertiser != null) {
                advertiser.unadvertise(advertisement);
            }
        }

        /**
         * Write the log entry rolling over the file when required.
         *
         * @param event The LogEvent.
         */
        @Override
        public void append(final LogEvent event) {

            // Leverage the nice batching behaviour of async Loggers/Appenders:
            // we can signal the file manager that it needs to flush the buffer
            // to disk at the end of a batch.
            // From a user's point of view, this means that all log events are
            // _always_ available in the log file, without incurring the overhead
            // of immediateFlush=true.
            getManager().setEndOfBatch(event.isEndOfBatch());
            super.append(event);
        }

        /**
         * Returns the file name this appender is associated with.
         *
         * @return The File name.
         */
        public String getFileName() {
            return this.fileName;
        }

        /**
         * Returns the length of the memory mapped region.
         *
         * @return the length of the memory mapped region
         */
        public int getRegionLength() {
File | Line
--- | ---
org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java | 72
org/apache/logging/log4j/core/pattern/RootThrowablePatternConverter.java | 72
                final String trace = proxy.getExtendedStackTraceAsString(options.getPackages());
                final int len = toAppendTo.length();
                if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
                    toAppendTo.append(' ');
                }
                if (!options.allLines() || !Constants.LINE_SEPARATOR.equals(options.getSeparator())) {
                    final StringBuilder sb = new StringBuilder();
                    final String[] array = trace.split(Constants.LINE_SEPARATOR);
                    final int limit = options.minLines(array.length) - 1;
                    for (int i = 0; i <= limit; ++i) {
                        sb.append(array[i]);
                        if (i < limit) {
                            sb.append(options.getSeparator());
                        }
                    }
                    toAppendTo.append(sb.toString());

                } else {
                    toAppendTo.append(trace);
                }
            }
        }
    }
File | Line
--- | ---
org/apache/logging/log4j/core/filter/MapFilter.java | 130
org/apache/logging/log4j/core/filter/StructuredDataFilter.java | 114
org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java | 124
                LOGGER.error("keys and values must be specified for the MapFilter");
                return null;
            }
            final Map<String, List<String>> map = new HashMap<String, List<String>>();
            for (final KeyValuePair pair : pairs) {
                final String key = pair.getKey();
                if (key == null) {
                    LOGGER.error("A null key is not valid in MapFilter");
                    continue;
                }
                final String value = pair.getValue();
                if (value == null) {
                    LOGGER.error("A null value for key " + key + " is not allowed in MapFilter");
                    continue;
                }
                List<String> list = map.get(pair.getKey());
                if (list != null) {
                    list.add(value);
                } else {
                    list = new ArrayList<String>();
                    list.add(value);
                    map.put(pair.getKey(), list);
                }
            }
            if (map.isEmpty()) {
                LOGGER.error("MapFilter is not configured with any valid key value pairs");
File | Line
--- | ---
org/apache/logging/log4j/core/appender/RandomAccessFileManager.java | 76
org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java | 86
                    isFlush, bufferSize, advertiseURI, layout), FACTORY);
        }

        public Boolean isEndOfBatch() {
            return isEndOfBatch.get();
        }

        public void setEndOfBatch(final boolean isEndOfBatch) {
            this.isEndOfBatch.set(Boolean.valueOf(isEndOfBatch));
        }

        @Override
        protected synchronized void write(final byte[] bytes, int offset, int length) {
            super.write(bytes, offset, length); // writes to dummy output stream

            int chunk = 0;
            do {
                if (length > buffer.remaining()) {
                    flush();
                }
                chunk = Math.min(length, buffer.remaining());
                buffer.put(bytes, offset, chunk);
                offset += chunk;
                length -= chunk;
            } while (length > 0);

            if (isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) {
                flush();
            }
        }

        @Override
File | Line
--- | ---
org/apache/logging/log4j/core/appender/FileAppender.java | 48
org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java | 55
org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java | 50
        private FileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter, final FileManager manager,
                             final String filename, final boolean ignoreExceptions, final boolean immediateFlush,
                             final Advertiser advertiser) {
            super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
            if (advertiser != null) {
                final Map<String, String> configuration = new HashMap<String, String>(layout.getContentFormat());
                configuration.putAll(manager.getContentFormat());
                configuration.put("contentType", layout.getContentType());
                configuration.put("name", name);
                advertisement = advertiser.advertise(configuration);
            }
            this.fileName = filename;
            this.advertiser = advertiser;
        }

        @Override
        public void stop() {
            super.stop();
            if (advertiser != null) {
                advertiser.unadvertise(advertisement);
            }
        }
File | Line
--- | ---
org/apache/logging/log4j/core/appender/RollingFileAppender.java | 59
org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java | 60
                final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
            super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
            if (advertiser != null) {
                final Map<String, String> configuration = new HashMap<String, String>(layout.getContentFormat());
                configuration.put("contentType", layout.getContentType());
                configuration.put("name", name);
                advertisement = advertiser.advertise(configuration);
            }
            this.fileName = fileName;
            this.filePattern = filePattern;
            this.advertiser = advertiser;
        }

        @Override
        public void stop() {
            super.stop();
            if (advertiser != null) {
                advertiser.unadvertise(advertisement);
            }
        }

        /**
         * Write the log entry rolling over the file when required.

         * @param event The LogEvent.
         */
        @Override
        public void append(final LogEvent event) {
File | Line
--- | ---
org/apache/logging/log4j/core/filter/BurstFilter.java | 96
org/apache/logging/log4j/core/filter/ThresholdFilter.java | 48
        }

        @Override
        public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
                             final Object... params) {
            return filter(level);
        }

        @Override
        public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
                             final Throwable t) {
            return filter(level);
        }

        @Override
        public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
                             final Throwable t) {
            return filter(level);
        }

        @Override
        public Result filter(final LogEvent event) {
            return filter(event.getLevel());
        }

        /**
         * Decide if we're going to log <code>event</code> based on whether the
         * maximum burst of log statements has been exceeded.
         *
         * @param level The log level.
         * @return The onMatch value if the filter passes, onMismatch otherwise.
         */
        private Result filter(final Level level) {
File | Line
--- | ---
org/apache/logging/log4j/core/net/server/TcpSocketServer.java | 125
org/apache/logging/log4j/core/net/server/UdpSocketServer.java | 76
            return new TcpSocketServer<InputStream>(port, new XmlInputStreamLogEventBridge());
        }

        /**
         * Main startup for the server.
         *
         * @param args
         *        The command line arguments.
         * @throws Exception
         *         if an error occurs.
         */
        public static void main(final String[] args) throws Exception {
            if (args.length < 1 || args.length > 2) {
                System.err.println("Incorrect number of arguments");
                printUsage();
                return;
            }
            final int port = Integer.parseInt(args[0]);
            if (port <= 0 || port >= MAX_PORT) {
                System.err.println("Invalid port number");
                printUsage();
                return;
            }
            if (args.length == 2 && args[1].length() > 0) {
                ConfigurationFactory.setConfigurationFactory(new ServerConfigurationFactory(args[1]));
            }
            final TcpSocketServer<ObjectInputStream> socketServer = TcpSocketServer.createSerializedSocketServer(port);
File | Line
--- | ---
org/apache/logging/log4j/core/appender/RollingFileAppender.java | 155
org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java | 177
            if (name == null) {
                LOGGER.error("No name provided for FileAppender");
                return null;
            }

            if (fileName == null) {
                LOGGER.error("No filename was provided for FileAppender with name "  + name);
                return null;
            }

            if (filePattern == null) {
                LOGGER.error("No filename pattern provided for FileAppender with name "  + name);
                return null;
            }

            if (policy == null) {
                LOGGER.error("A TriggeringPolicy must be provided");
                return null;
            }

            if (strategy == null) {
                strategy = DefaultRolloverStrategy.createStrategy(null, null, null,
                        String.valueOf(Deflater.DEFAULT_COMPRESSION), config);
            }

            if (layout == null) {
                layout = PatternLayout.createDefaultLayout();
            }

            final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, isAppend,
File | Line
--- | ---
org/apache/logging/log4j/core/appender/RandomAccessFileManager.java | 105
org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java | 124
        }

        @Override
        public synchronized void flush() {
            buffer.flip();
            try {
                randomAccessFile.write(buffer.array(), 0, buffer.limit());
            } catch (final IOException ex) {
                final String msg = "Error writing to RandomAccessFile " + getName();
                throw new AppenderLoggingException(msg, ex);
            }
            buffer.clear();
        }

        @Override
        public synchronized void close() {
            flush();
            try {
                randomAccessFile.close();
            } catch (final IOException ex) {
                LOGGER.error("Unable to close RandomAccessFile " + getName() + ". "
                        + ex);
            }
        }
File | Line
--- | ---
org/apache/logging/log4j/core/appender/RollingFileAppender.java | 136
org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java | 161
                @PluginAttribute("immediateFlush") final String immediateFlush,
                @PluginElement("Policy") final TriggeringPolicy policy,
                @PluginElement("Strategy") RolloverStrategy strategy,
                @PluginElement("Layout") Layout<? extends Serializable> layout,
                @PluginElement("Filter") final Filter filter,
                @PluginAttribute("ignoreExceptions") final String ignore,
                @PluginAttribute("advertise") final String advertise,
                @PluginAttribute("advertiseURI") final String advertiseURI,
                @PluginConfiguration final Configuration config) {

            final boolean isAppend = Booleans.parseBoolean(append, true);
            final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
            final boolean isBuffered = Booleans.parseBoolean(bufferedIO, true);