//  [java]
	public void drawU(UGraphic ug, UmlDiagramType umlDiagramType, ISkinParam skinParam2) {
		if (group.isHidden())
			return;

		final String fullName = group.getCodeGetName();
		if (fullName.startsWith("##") == false)
			ug.draw(new UComment("cluster " + fullName));

		HColor borderColor;
		Style style = null;
		final double rounded;
		final double diagonalCorner;
		final double shadowing;
		if (UseStyle.useBetaStyle()) {
			final USymbol uSymbol = group.getUSymbol() == null ? USymbols.PACKAGE : group.getUSymbol();
			final StyleSignatureBasic tmp = getDefaultStyleDefinition(umlDiagramType.getStyleName(), uSymbol);
			style = tmp.withTOBECHANGED(group.getStereotype()).getMergedStyle(skinParam.getCurrentStyleBuilder());
			shadowing = style.value(PName.Shadowing).asDouble();
			if (group.getColors().getColor(ColorType.LINE) != null)
				borderColor = group.getColors().getColor(ColorType.LINE);
			else
				borderColor = style.value(PName.LineColor).asColor(skinParam2.getThemeStyle(),
						skinParam2.getIHtmlColorSet());
			rounded = style.value(PName.RoundCorner).asDouble();
			diagonalCorner = style.value(PName.DiagonalCorner).asDouble();

		} else {
			if (group.getUSymbol() == null)
				shadowing = skinParam2.shadowing2(group.getStereotype(), USymbols.PACKAGE.getSkinParameter()) ? 3 : 0;
			else
				shadowing = skinParam2.shadowing2(group.getStereotype(), group.getUSymbol().getSkinParameter()) ? 3 : 0;

			rounded = IEntityImage.CORNER;
			if (umlDiagramType == UmlDiagramType.STATE)
				borderColor = getColor(ColorParam.stateBorder, skinParam, group.getStereotype());
			else if (umlDiagramType == UmlDiagramType.ACTIVITY)
				borderColor = getColor(ColorParam.packageBorder, skinParam, group.getStereotype());
			else
				borderColor = getColor(ColorParam.packageBorder, skinParam, group.getStereotype());
			diagonalCorner = 0;

		}

		ug.startGroup(Collections.singletonMap(UGroupType.ID, "cluster_" + fullName));

		final Url url = group.getUrl99();
		if (url != null)
			ug.startUrl(url);

		try {
			if (entityPositionsExceptNormal().size() > 0)
				manageEntryExitPoint(ug.getStringBounder());

			if (skinParam.useSwimlanes(umlDiagramType)) {
				drawSwinLinesState(ug, borderColor);
				return;
			}
			final boolean isState = umlDiagramType == UmlDiagramType.STATE;

			if (isState && group.getUSymbol() == null) {
				UStroke strokeForState = getDefaultStyleDefinition(SName.stateDiagram, null)
						.getMergedStyle(skinParam.getCurrentStyleBuilder()).getStroke();
				if (group.getColors().getSpecificLineStroke() != null)
					strokeForState = group.getColors().getSpecificLineStroke();

				if (group.getColors().getColor(ColorType.LINE) != null)
					borderColor = group.getColors().getColor(ColorType.LINE);

				drawUState(ug, borderColor, skinParam2, strokeForState, umlDiagramType, rounded, shadowing);
				return;
			}
			PackageStyle packageStyle = group.getPackageStyle();
			if (packageStyle == null)
				packageStyle = skinParam2.packageStyle();

			if (border != null) {
				final HColor tmp = skinParam2.getHtmlColor(border, group.getStereotype(), false);
				if (tmp != null)
					borderColor = tmp;
			}

			final UStroke stroke;
			if (UseStyle.useBetaStyle())
				stroke = getStrokeInternal(group, skinParam2, style);
			else
				stroke = getStrokeInternal(group, skinParam2, null);

			HColor backColor = getBackColor(umlDiagramType, style);
			backColor = getBackColor(backColor, skinParam2, group.getStereotype(), umlDiagramType.getStyleName(),
					group.getUSymbol());
			if (ztitle != null || zstereo != null) {
				final double roundCorner;
				if (UseStyle.useBetaStyle())
					roundCorner = rounded;
				else
					roundCorner = group.getUSymbol() == null ? 0
							: group.getUSymbol().getSkinParameter().getRoundCorner(skinParam, group.getStereotype());

				final ClusterDecoration decoration = new ClusterDecoration(packageStyle, group.getUSymbol(), ztitle,
						zstereo, minX, minY, maxX, maxY, stroke);
				decoration.drawU(ug, backColor, borderColor, shadowing, roundCorner,
						skinParam2.getHorizontalAlignment(AlignmentParam.packageTitleAlignment, null, false, null),
						skinParam2.getStereotypeAlignment(), diagonalCorner);
				return;
			}
			final URectangle rect = new URectangle(maxX - minX, maxY - minY);
			rect.setDeltaShadow(shadowing);
			ug = ug.apply(backColor.bg()).apply(borderColor);
			ug.apply(new UStroke(2)).apply(new UTranslate(minX, minY)).draw(rect);

		} finally {
			if (url != null)
				ug.closeUrl();
			ug.closeGroup();
		}
	}